天然パーマです。

sinatra ライクな MojaMoja(実験的な) を使ってみた

tokuhirom が面白い名前の(実験的な)sinatraみたいなframeworkを作ってた。

MojaMoja - (PoC)yet another sinatra-ish framework built on CPAN modules

tokuhirom's MojaMoja at master - GitHub

このモジュールは実験的で且つ、 そのうち(近いうち)、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使ってみるのもいいんではないでしょうか。