tokuhirom が面白い名前の(実験的な)sinatraみたいなframeworkを作ってた。
MojaMoja - (PoC)yet another sinatra-ish framework built on CPAN modules
このモジュールは実験的で且つ、 そのうち(近いうち)、miyagawaさんがある意味似た様なPSGI micro web framework kit「Piglet」というものを出すと思われ、 特にMojaMoja使え!っていうエントリーじゃないのでご了承を。
まぁ何が面白いって、その名前と、 アプリの最後に
zigorou;
って書くところですね! zigorou;って書くと、plackup等で利用可能なアプリケーションハンドラを返してくれます。 使いかたしごく簡単で、
use MojaMoja; get '/' => sub { return [ 200, [], ['Hello ZIGOROu'] ]; }; zigorou;
と書いた zigorou.psgi を保存して、
plackup zigrou.psgi
として http://localhost:5000/ とかにアクセスすれば「Hello ZIGOROu」が表示されます。 get '/' ...; の部分がルータ/ディスパッチャの役目を果たしているわけですね。 それと面白いのが、__DATA__以下のDATAセクションにテンプレート書ける点ですね。
use MojaMoja; get '/hoge' => sub { my $req = shift; my $name = $req->param('name'); render('hoge.mt'); }; zigorou; __DATA__ @@ hoge.mt hogehoge <?= $name ?>
という.psgiを作って、今度は http://localhost:5000/hoge?name=ZIGOROu にアクセスすると「hogehoge ZIGOROu」が表示されます。 一つの.psgiファイルの中に全て書けますね。
で、さっきMojaMojaアプリの「2個目」として作ったのが、 YouTubeのビデオを連続再生するという代物。まぁグリモンとかJSでやれる範囲ですが、 どうしても.psgiでPerfumeをループで見たかったので作ってみました。
use MojaMoja; get '/' => sub { my $html = render('index.mt'); res( 200, [ 'Content-Type' => 'text/html' ], [$html] ); }; get '/loop' => sub { my ($req) = @_; my $url = $req->param('url') or return [ 302, [ 'Location' => $req->base ], [] ]; my ($video_id) = $url =~ m!watch\?v=([^&]+)!; my $html = render('loop.mt'); res( 200, [ 'Content-Type' => 'text/html' ], [$html] ); }; zigorou; __DATA__ @@ index.mt <html> <body> <form action="/loop"> <label>Enter YouTube Video URL</label> <input type="text" name="url" size="80" /> <input type="submit" /> </form> </body> </html> @@ loop.mt <html> <body> <object width="640" height="385"> <param name="movie" value="http://www.youtube.com/v/ $video_id ?>&loop=1&autoplay=1"></param> <param name="allowFullScreen" value="true"></param> <embed src="http://www.youtube.com/v/ $video_id ?>&loop=1&autoplay=1" type="application/x-shockwave-flash" allowfullscreen="true" width="640" height="385"></embed> </object> </form> </body> </html>
このサクっと作れる感がいいですね。 で、上記した通りPigletというPSGI web micro framework kitがでてくるのし、 Mojolicious::Lite でも似た様なことできるので、 真似してもらわなくてもいいですが、 こういう大小フレームワークがあってそれぞれが使いやすくて場合によって使い分けをして、 それでいて全てがPSGI互換であったりするといい感じだと思ったというわけでした。
ただ、Perfumeを今すぐ.psgiでループ再生したい人、zigorou;とコードに書きたい人は、 MojaMoja使ってみるのもいいんではないでしょうか。