このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

フレームワークの比較: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の下にファイルが必要。

しょうがないことだとも言えるが、ナニカ考えたほうがいいかもしれない。

[/追記]