フレームワークの比較:PerlのAmon2
http://d.hatena.ne.jp/tokuhirom/20110715/1310600765 にあったコードをCatyと比較してみる。
なんでもPerlのコードで書けてしまう、のがCatyとは対極的。アプリケーションが1ファイルで済むのは魅力的だな。
# 設定 sub config { +{ DBI => [ "dbi:SQLite:dbname=$ENV{PLACK_ENV}.db", '', '' ], } }
↑は、_manifest.xjsonに相当するのだろう。
get '/' => sub { # / にたいする GET リクエストをフックする my $c = shift; return $c->render('index.tt'); # index.tt を描画してかえす }; post '/create' => sub { # /create にたいする POST リクエストをフックする my $c = shift; my $src = $c->req->param('url') || return $c->redirect('/'); my $key = sub { # dup check { my $key = $c->dbh->selectrow_array(q{ SELECT key FROM tinyurl WHERE url=? LIMIT 1 }, {}, $src); return $key if $key; }; # create new one. { my @chars = ( 'A'..'Z', 'a'..'z', '0'..'9' ); my $key; for (1..6) { $key .= $chars[int rand @chars]; } $c->dbh->do(q{INSERT INTO tinyurl (key,url) VALUES (?, ?)}, {}, $key, $src); return $key; } }->(); return $c->render('result.tt', {tinyurl => $c->req->base . 'g/' . $key}); }; get '/g/{key}' => sub { my ($c, $args) = @_; my $key = $args->{key} || die "oops"; my $url = $c->dbh->selectrow_array(q{ SELECT url FROM tinyurl WHERE key=? LIMIT 1 }, {}, $key); if ($url) { warn $url; return $c->redirect($url); } else { return $c->res_404(); } };
↑は、actions/ の下のファイルに相当。
builder { enable 'Plack::Middleware::Static', path => qr{^(?:/static/|/robot\.txt$|/favicon.ico$)}, root => File::Spec->catdir(dirname(__FILE__)); enable 'Plack::Middleware::ReverseProxy'; __PACKAGE__->to_app(); };
builderウンヌンはオマジナイですね。
__DATA__ @@ index.tt <!doctype html> <html> <head> <met charst="utf-8"> <title>TinyURL</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <h1>tinyurl</h1> <form method="post" action="/create"> <input type="text" name="url" /> <input type="submit" value="tiny!" /> </form> </body> </html> @@ result.tt <!doctype html> <html> <head> <met charst="utf-8"> <title>TinyURL</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <h1>tinyurl</h1> <div>[% tinyurl %]</div> <a href="/">back to top</a> </body> </html>
↑がいいなー。ソース内にリソースを書いてしまう。ファイルシステムに書く必要がない! 素晴らしい。
[追記]
Catyの場合、
- コマンドはアリモノを使うとしても、アクションファイルが必要。アクションファイルの書き方がCatyScriptだから、ここでCatyScriptを学ぶ必要がある。
- アクション内にテキストも書けるが、長いテキストは辛い。が、アクションファイル内にデータを書く手段がないので、includeの下にファイルが必要。
しょうがないことだとも言えるが、ナニカ考えたほうがいいかもしれない。
[/追記]