サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
Pixel 9
weblog.nqou.net
つい最近知ったのですが、history.pushStateとAJAXを組み合わせた、PJAXというjQueryのプラグインがあるようです。 PJAXは、history.pushStateでヒストリーを作りながらAJAXでページを遷移させずに更新することで、従来のAJAXの問題点をクリアさせるものです。 「戻る」もOK ソーシャルにも優しく クローラーへも対応 JavascriptoffのユーザもOK
Mojolicious::Liteネタですが、もう周回遅れ気味ですね。 6月3日にversion1.41になっています。 このスクリプトは、devel.nqou.netを作ったときに、ソースを見るビューアとして書いたものを、Mojolicious::Liteで書きなおしたものです。 サンプルばかりではなく、実際に使うもの(使えるものかどうかはともかく)を作ってみるのも良いものですね。
XREAからCORESERVERに引越ししました。 「XREA+(2400円/1年)」と「CORE-MINI(2500円/1年)」は、一年契約で100円しか違わないのに、サービス内容(サーバーの性能、容量等)は格段に違います。 サーバーの移転は面倒ですが、価値はあると思います。 サーバーを変えるにあたって、さっそくcpanmを導入しました。 レンタルサーバーでPerlを満足に使おうと思えば、cpanmは必須となりました。 CORESERVERではSSHが使えるので便利です。 また、一時期local::libと組み合わせて使う方法も色々と書かれていましたが、情報がかなり整理されていたので、改めてここにまとめておきます。 wget http://cpanmin.us perl cpanm --local-lib=~/perl5 local::lib App::cpanminus ech
JSONを返すスクリプトの記事で、リストを作るときに以下のようにしていたのですが。 my @json; for my $msg (@{$messages}) { push @json, { id => $msg->id, msg => $msg->msg, ts => $msg->ts, }; } $self->render(json => [@json]); レコードの情報は、get_columnsで取得できることがわかった。 それをふまえて書くと、上の処理に相当するコードは以下のようになります。 for my $msg (@{$messages}) { push @json, $msg->get_columns; } ここまで来たら、mapを使って書いてみたいですよね。 my @json = map { $_->get_columns } @{$messages}; $self->r
Mojoliciousが1.01になりましたね。 まあ、それとは関係ないですが、jQueryを使ってAJAXなチャットを作ってみたので晒してみようかと思います。 AJAX自体、やった事が無いので、もっと良いやり方があるとは思います。 値の受け渡しはJSONを使ったのですが、Mojolicious側の受け取り方法がよく分からなくて$self->req->jsonとか、Mojo::JSON->newとかやっていたのですが、結果的に普通に$self->paramで受け取れるのがわかって、凄いと思いました。 JavaScript側では、Perlからのtime値をどうやって渡すのかが、調べていてもよく分からなかったので、正解に行き着くのが大変でした。 ミリセカンドで渡す、というのは気づきませんでした。 常識すぎてあまり書かれないんでしょうか 。 #!/usr/bin/env perl #ut
基本的には前記事と同じです。 私の観測範囲ではData::ModelよりもDBIx::Skinnyの方がよく使われているような気がしますが、テーブルとschemaを両方作る必要があるのがちょっと微妙に感じます。 DBIx::Skinny::Schema::Loaderというschemaを自動的に設定してくれるモジュールもあるので、それを使えば問題ないわけですが。 ORLiteの記事を見て「いいな」と思ったのは、テーブルの定義をするだけで使えるところでした。 あと、テーブル毎にクラスを自動的に作ってくれるようで、それも面白い機能だと思います。 しかし、Skinnyなどで言うconnect_optionsが設定(簡単に言えばsqlite_unicodeを有効に)できないため、日本語には対応できていません。 ORLite.pmのソースコードを書き換えてやればうまく動くのは確認済みですが
先日1.0にバージョンアップしたMojolicious(::Lite)を本格的に触ってみようとアレコレやってみた。 MojoliciousのWikiにORLiteを使ったサンプルがあったのですが、残念ながらそのままでは日本語には対応していないので、他のORMを使ってみようという、そんな感じです。 ほとんどが元ネタのパクリですが。 #!/usr/bin/env perl #utf8 package DataModel; use utf8; use base 'Data::Model'; use Data::Model::Schema; use Data::Model::Driver::DBI; my $dbfile = qq{$0.db}; my $dsn = qq{dbi:SQLite:dbname=$dbfile}; my $driver = Data::Model::Driver::
ここのところ、CGIを書く場合は、NanoAのようなフレームワークばかり使っていたので知らなかったのだが、単純なCGIを書くときに、ど派手なデバッグスクリーンをだすモジュールがあった。 CGI::ExceptionManagerの原型とも言えるか。 PerlでCGIを作成するときに、殆どの人がお世話になるであろうモジュールは、CGI::Carpだろう。 このモジュールは、一般的に500エラーと言われている「Internal Server Error」からあなたを救ってくれる。 普通なら500エラーになってしまう以下のスクリプトを、ブラウザから実行してみると、どのように救われるのかがよくわかるだろう。 #!/usr/bin/perl use strict; use CGI::Carp qw/fatalsToBrowser/; die; で。 この魔法を進化させたのが「CGI::Carp
普段、MovableTypeのプラグインでお世話になっている「小粋空間」さんが、意外なところで躓いていた。 以上です。色々調べてこれが最適解と思ったのですが、より適切な解決方法がありましたらコメントください。 考え方としては、XML::SimpleのXMLinが内部文字列を返すのであれば、スクリプトを内部文字列化してやれば解決するのでは、という感じです。 まずは、スクリプトを「use utf8;」してしまいます。 そうすると、スクリプトに書かれている文字はPerlの内部空間と同じ状態(内部文字列)になります。 で、このまま出力すると「Wide Character」の問題が出ますので、出力時にはutf8でエンコードしてやります。 それを踏まえて書きなおすと以下のようになります。 #!/usr/bin/perl use strict; use utf8; binmode STDOUT =>
今まで、手動で「cp932」と入力していたのだが、Term::Encodingを使ってやれば自動的に文字コード(エンコーディング)を判別できるではないか、というわけです。 とりあえずやってみました。 # utf8 use 5.8.1; use strict; use warnings; use utf8; use Data::Dumper; use Term::Encoding qw(term_encoding); my $encoding = term_encoding; print Dumper $encoding; 実行結果は以下のとおり。 $VAR1 = 'cp932'; 文字コード(エンコーディング)を示す文字列が得られました。 というわけで、文字コード(エンコーディング)を直接書かずにTerm::Encodingを使って「ハローワールド」を表示してみると以下のようになりました
ちょっと前に作ったプログラムを見ていて、悪い習慣だなぁ、と思ったので、改めるためにメモ。 Perlを覚えていく中で、関数の返り値を偽として判定させたいときは「undefを返す」という事をやっていた。 return undef; しかし、これは返り値を配列で受け取るときに微妙になり、わかりにくいバグを発生させてしまう原因にもなる。 どういう場合に問題になるかを、実際にコードを書いて試してみる。 # utf8 use 5.8.1; use strict; use warnings; use utf8; use Perl6::Say; use Data::Dumper qw/Dumper/; my $charset = 'cp932'; binmode STDOUT => ":encoding($charset)"; sub return_less { my $a = 1; } sub ret
cpanm(cpanminusのコマンド名)と共によく使われているのを見るのだが、何をしているのかよくわかっていなかった。 で、ちゃんと検索したらあっさりと見つかった。 要するに cpan -r のminusバージョンという感じのアプリケーションでした。 で、これとcpanmを組み合わせることで、古いモジュールを楽に更新できる、という仕組みです。 Windowsではxargsがないので、以下のように試してみました。 cpan-outdated | cpanm 今、実施中ですが、upgradeをかなりサボっていたので結構時間がかかっています。 途中でミラーも設定できそうなことに気がついたので、minicpanの保存先を使って試してみました。 cpan-outdated --mirror file:///strawberry/minicpan | cpanm が、今度はなかなか動きません。
MENTAの新バージョンをインストールして、動いていたと思ったのだが、ちゃんと動いていなかったようだ。 app/controller/nanochat/main.plを実行するときにエラーが発生するようになっていた。 原因は今のところ、不明。 バージョンを0.14に下げても同じエラーになっているので、ひょっとして、最初から動いていなかったのではないかと打ちひしがれてみる。 で、NanoAといえば、サーバー上では動作するものの、手元のWindows上のローカルサーバーでは真っ白な画面になるだけで動かない。 過去の記事を見てうんうん唸っていたがヒントはない。 仕方が無いので、コマンドラインで実行してみると、どうやら一時ファイルを作れていないようだった。 ルートディレクトリに「tmp」というフォルダを作ってやって実行すると、動いた。 まあ、Windows仕様ではないから仕方が無いよ
普段から「binmode STDOUT => ":encoding(cp932)";」をよく使うので、なんとかならないかやってみました。 やってみればちゃんと出来るものです。 基本的には、Perlの内部形式の考え方をおさらいする形になった。 プログラムで扱う前にdecode、出力するときはencodeする。 それは、標準入出力だろうが、データベースだろうが、同じ扱い、ということ。 SQLiteはutf8の入出力が(少なくともver3.6.13では)可能のようだ。 まずは出力の時、データベースに渡すステートメントは「Encode::encode_utf8」してから出力する。 そして入力の時、つまり、データベースからデータを取る時は、とって来た後に「Encode::decode_utf8」する。 イメージは下の図。 今回は出力だけなのでSTDINは使っていないが、binmode S
Perlをツール的に使っていて、コードの中で複数の階層にあるファイルをディレクトリごと再帰的にコピーしたくなった。 以前、ファイルのコピーについて何か書いた気がして調べてみたのだが、大したことが書いていなかった 。 ファイルのコピーをする場合は、File::Copyというモジュールを使うのが良い。 ということで、他の方法を調べてみたところ、「File::Copy::Recursive」を使うのがよさそうだ、というところに行き着いた。 標準モジュールではないのでcpanからインストールする必要があったが、特に問題はなくスムーズにインストールできた。 現在のディレクトリ以下のファイルを、絶対パスの「/temp」へコピーする場合は、以下のようにする。 use strict; use warnings; use File::Copy::Recursive qw(rcopy); my $from
色々と触発されてやってみた。 参考: Perl で XML の処理はどれが速いかベンチ : NDO::Weblog iandeth. - XML::Simple は遅い説における意外な落とし穴 XML::Simple におけるパーサーの実行速度比較 - naoyaのはてなダイアリー Benchmark: running XML::FeedPP, XML::LibXML, XML::RSS, XML::RSS::LibXML, XML::RSS::Parser, XML::RSSLite, XML::Simple, regexp for at least 3 CPU seconds... XML::FeedPP: 2 wallclock secs ( 3.02 usr + 0.00 sys = 3.02 CPU) @ 55.37/s (n=167) XML::LibXML: 3 wal
先日のKansai.pmで発表されていた、ループアンローリングを試してみた。 発表のスライド:Cell Challenge 2009 参加記 Wikipedia:ループ展開 - Wikipedia ループアンローリング自体はWikipediaによればループ展開ということだが、目的としてはデータハザード(データ依存のために計算の並列処理が不可能になること)をなるべく回避するのが目的であった。 スライドの30枚目に展開の方法が書いてるので、それを実際に試してみた。 以下、ベンチマークの結果 Benchmark: running Unrolling1, Unrolling2, normal for at least 3 CPU seconds... Unrolling1: 3 wallclock secs ( 3.00 usr + 0.00 sys = 3.00 CPU) @ 429810.
MENTAを追いかける絡みでNanoAにも手を出しましたが、もし、今からこれらのフレームワークに入門(あるいは再入門)するのであれば、とりあえず最新版(MENTAは0.14、NanoAは0.17)にしたほうが良いでしょう。 というのは、これらの最新版で使われているテンプレートエンジンはText::MicroTemplateですが、それ以前のものはMENTA::Templateが使われています。 それに伴って、若干ですが文法にも違いがあります。 なので、古いMENTAやNanoAで作ったプログラムは、最新版ではエラーによって動かない場合があります。 文法の大きな違いは、HTMLエスケープについてです。 テンプレートファイルに埋め込んだPerlの出力は、デフォルトでHTMLエスケープされることになっています。これは、セキュリティと利便性が大きく関与しています。 参考:Kazuho@Cyb
NanoAの配布元は0.16が最新だったが、CodeReposにあるNanoAの最新版は、バージョンが0.17であった。 CodeRepos版は開発版ということで、そのまま使えるはずだったのだが、Windows上で使うには少し工夫が必要だった(詳しい説明は「lib/NanoA/Config.pm」に書いてあるので、そちらを読もう)ので、将来のため(?)に手順をメモしておく。 まず、CodeReposからsvnで外部参照ごとチェックアウトする。 svn co http://svn.coderepos.org/share/lang/perl/NanoA/trunk NanoA 次に「nanoa.cgi」と同じフォルダに「nanoa-conf.cgi」という名前のファイルを作成する。その中身はとりあえず以下のとおりにしておく。 data_dir = var ついでに、同じフォルダに新しく「var
NanoAを使ってみようと思って、最新版の0.16を入れてみたのだが、Windows上ではうんともすんとも反応しない。 install.cgiを試してみたが動かなかったので、tarballを取ってきて解凍。 nanoa.cgiにアクセスするも反応がない。 ANHTTPDを使ってるからかもしれないので、cgi版を取ってきて共用サーバー(ちなみにxrea)で実行してみたが、system/setupにアクセスした時点でエラーになった。 デバッグモードにしてどうにかエラーメッセージを見たら、pluginのsession.pmが犯人らしい(?)のだが 。 エラーメッセージ。 Modification of a read-only value attempted at app/plugin/session.pm line 38. 検索していたら、同じように困っていた人を発見した。 bulkit
日テレアプリで石原さとみを検索しようとしたら文字化けして困ってしまった。 どうにかURIモジュールを使ってやろうと思って調べたら、実はブックマークしていた記事にたどり着いた。 参考:URIモジュールにutf8フラグつきの文字列を食わせたらquery_formのエンコードが化けたでござるの巻 - とあるモバイル系エンジニアの日々 この記事を踏まえた結論としては、query_formを使うときは、「no utf8」のスコープでやるのが良い、ということ。 この記事の中では、utf8フラグを落としてからURIモジュールを使う、ということをしているのだが、今回、日テレアプリで使うAPIは、Shift_JISのURIエスケープで渡してやる必要があるので、少しだけ変更する。 # Webpage: http://appli.ntv.co.jp/appli/api/program/index.html u
最近からかもしれないけど、Last.fmでmp3の無料ダウンロードをやっているようだ。 参考:Last.fm からのおすすめ無料mp3 - Last.fm ちょうどWWW::Mechanizeを試していたので、それとWeb::Scraperを組み合わせてダウンロードするスクリプトを作った。 アカウントを持っているのが前提です。 アカウント情報は以下のように、YAMLで記述しておきます。 ソースコードをこのまま使う場合は、スクリプトのあるディレクトリに「lastfm.freemp3.yaml」という名前で保存しておきます。 --- config: id: xxxxxxxx pw: ******** 最後は改行で終了しておく必要があります。たぶん。 ソースコードをこのまま使う場合は、スクリプトのあるディレクトリに「lastfm」というディレクトリが必要です。 実行すると、そのディレクトリ
わかってしまえば単純なことでした。 process 'a[href=~/\.jpe?g$/]', 'urls[]' => '@href'; XPathでも同じようにできます。 process '//a[@href =~ /\.jpe?g$/]', 'urls[]' => '@href'; Web::Scraperにはフィルタの概念があって、取得してからごにょごにょできるので、そっちのほうばかり調べていました。 例えば以下のようなHTMLの場合、そのまま取得すると、前後に改行が入ってしまいます。 <title> タイトルなのだ </title> で、それを取得する時に、前後の改行を削除してやることができます。 process 'title', 'title' => ['TEXT', sub { s/^\s+//o; s/\s+$//o; } ]; こういう機能をフィルタと呼んでいます。 その
かなーり今更感がありますが。 モジュール自体は、大分前にウェブにあったスクリプトをコピペして使ったときにインストール済みでしたが、なんとなく難しそうで敬遠していたところもありました。 が、やってみると簡単かつパワフルなモジュールであることがわかりました。 参考:use Web::Scraper; - 今日のCPANモジュール XPathがなかなかわからないのですが、CSSセレクタでもいけるのが超絶簡単です。 例えば、aタグのhref属性を取得する場合のprocessは以下のとおり。 process 'a', 'urls[]' => '@href'; で、この場合だと、href属性がないaタグも対象になってしまうので、未定義(undef)が入る場合があります。 なので、href属性があるものだけを対象としたのが以下のprocessです。 process 'a[href]', 'url
名前付けに困っていたところに、CPAN 長いネームスペース大会 - にぽたん研究所やCPAN 階層の深いモジュール王選手権 - id:kazuhookuのメモ置き場をみて、CPANモジュールからアイデアをもらおうと思ってやってみた。 とりあえず1000回以上使われていたのは以下の名前。 (2009/02/20時点) 3060 times: Net 2581 times: XML 2287 times: Plugin 1964 times: Bio 1743 times: Data 1696 times: HTML 1427 times: API 1346 times: WWW 1310 times: Test 1296 times: Class 1176 times: eBay 1140 times: Apache 1105 times: DateTime 1083 times: Te
相変わらず「モダンPerl入門」を読み進めている。 「2.3 Composite」まで進んだが、ここのサンプルソースが結構間違っていた。 カンマが抜けていたり、関数名が違っていたり。 そのあたりは簡単に予想できたのだけど、大変だったのは「Shape::Composite」に 「use MooseX::AttributeHelpers」がなかったために、わけのわからないエラーに悩まされたことだ。 気づいてみれば、この章の始めのほうにもMooseX::AttributeHelpersを多用するとは書いてあるのだが、以下のようなエラーからはとても思いつかなかった。 Could not load class (Moose::Meta::Attribute::Custom::Collection::Array) because : Can't locate Moose/Meta/Attrib
どこで読んだか忘れましたが、Perlのコミュニティの中では中堅クラスが少ない、という話がありました。 私としては、CPANによる自由拡張性が、そもそも裾野を広げる障害ではなかったか、と思います。 これは、MENTAを使っていく中で色々と読んでの感想ですが、軽量フレームワークが誕生した背景にも同じことがあったと思います。 Perlでウェブアプリケーションを開発する時にCPANモジュールを多く使っていると、公開する時点でサーバーを選んでしまいます。 つまり、Perlを学んでいけばいくほど公開する場所に制限がかかっていきます。CPANが自由に使えるサーバーは自前で用意する必要があるでしょう。 例えばMooseを使ってスクリプトを作っても、公開できるレンタルサーバーとなると、サクラサーバーくらいしかないのではないでしょうか? 私は使ったことがないのでわかりませんが、ユーザー領域にインストー
調べ物をしていたら、画像の表示方法が格好良いサイトがあった。 いいなと思って調べてみたら、それは「LightBox」というライブラリらしかった。 prototype.jsをベースにしているらしい。 このブログではjQueryを使ってコードのハイライトをしているので、できればjQueryベースで似たような画像表示のライブラリがないかと思って調べてみたら、簡単に三つほど見つかった。 jQueryベースのLightBoxクローン「prettyPhoto」:phpspot開発日誌 jQueryでLightBoxを実現するjavascript「jQuery lightBox plugin」|skuare.net jQuery版のLightBox「ThickBox」[to-R] 三つとも試してみて、最も気に入ったのが「prettyPhoto」だった。 角丸は柔らかい感じで良いですね。 ただ、ブロ
flickr_fetcher.plは、元々は引数でキーワードを入れるという、とてもフレキシブルなスクリプトです。 元ネタ ゆーすけべー日記: Flickr からキーワードにマッチした写真を一括ダウンロードする Perl スクリプト「flickr_fetcher.pl」 が、前エントリーでは、プログラムの中に直接書き込む事を選んだので、別のキーワードで画像を探すときにはその部分を変更してやる必要が出てきます。 ローマ字や英語でキーワードを入れる場合はかまいませんが、日本語の検索は標準のコマンドプロンプトでは無理なのです。 本来なら配布されているプログラムの中身を変えるのは、配布元で更新があったときに、それに対応するのが面倒なので、できれば変えたくない。 実際、このスクリプトの場合はページの最大値を求める計算方法が変わった。 勝手に改造した部分には変更はなかったが、こういうのは精神衛生
次のページ
このページを最初にブックマークしてみませんか?
『日曜プログラマのそゞろ事』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く