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使ってみるのもいいんではないでしょうか。