Takuji->find;

株式会社はてなでアプリケーションエンジニアやってます、技術的な記事を書いているつもり

Perl5でWebアプリケーションの開発を環境構築からやり直してみる - Perl5 Advent Calendar 2015

こんにちは、3年くらいPerlを書いていないtakuji31です。

これはPerl5 Advent Calendar 2015 14日目の記事です。

qiita.com

13日目はpine613さんの「CentOS 標準搭載の Perl に負けないで強く生きる」でした。

qiita.com

今日は近々Perlを書く機会ができるかもしれないので、リハビリとして環境構築からNoPasteを作るところまでをやってみました。

環境構築

plenvでPerl5.22.0とcpanmを入れます。

今回はCartonとMojoliciousを使うのでcpanmでインストールしましょう。

plenvは更新止まってるみたいですけど、最近は別のツールが使われてるのかな…?Google力不足で発見できませんでした。

 curl -L http://is.gd/plenvsetup | bash
. $HOME/.zprofile
plenv install 5.22.0
plenv global 5.22.0
plenv install-cpanm
cpanm Carton Mojolicious

プロジェクトを作る

mojoコマンドを叩くとペライチのスクリプトファイルが1枚できあがります。

mojo generate lite_app

バージョン固定のためにCartonを使いましょう、以下のようにcpanfileを書きます。

requires 'Mojolicious', '6.36'

とりあえず動かしてみましょう。

carton install
carton exec morbo myapp.pl

http://localhost:3000/を開いてページが出てきたら成功です。

データーを保存する

雑な感じですがデーターを保存してみましょう。

保存にはRedisを使います、brew辺りで適当にインストールしておきましょう。

cpanfileにはRedis::FastとData::UUIDを追加します。

requires 'Mojolicious', '6.36';
requires 'Redis::Fast', '0.16';
requires 'Data::UUID', '1.221'

DATAセクションのテンプレートを書き換えてformを作って

@@ index.html.ep
% layout 'default';
% title 'NoPaste';
<h1>No Paste</h1>

%= form_for '/' => (method => 'POST') => begin
    %= text_area 'body', cols => '100', rows => '20'
    %= submit_button 'Paste'
% end

保存のコードを書きます。入力されているかくらいはチェックしておきましょう。

post '/' => sub ($c) {
    my $body = $c->param('body');
    my $redis = Redis::Fast->new;
    if ($body) {
        my $uuid = Data::UUID->new->create_str;
        $redis->set($uuid, $body);
        $c->redirect_to('showuuid', {uuid => $uuid});
    } else {
        $c->redirect_to('/');
    }
};

これでとりあえず、「POSTしたらRedisにsetしてリダイレクトする」だけのページが完成しました。

あとはリダイレクト先で表示してやりましょう。

@@ show.html.ep
% layout 'default';
% title 'NoPaste';
<h1>No Paste</h1>

<pre>
%= $body
</pre>
get '/show/:uuid' => sub ($c) {
    my $redis = Redis::Fast->new;
    my $body = $redis->get($c->param('uuid'));
    if ($body) {
        $c->stash('body' => $body);
        $c->render(template => 'show');
    } else {
        $c->redirect_to('/');
    }
};

渡されたキーを元にRedisからデーターを引っ張ってきて、表示してやります。

これで簡単なNoPasteが完成しました。

サンプルコード

サンプルコードはGithubに置いてあります。

github.com

まとめ

3年も書いてないから忘れてるかなぁと思いましたが、割と忘れてませんでした。

最近Perl書いてないよ、という方もこれを機に書いてみてはいかがでしょうか。

明日はxtetsujiさんの「標準添付の Math:: 系モジュールの解説」です、お楽しみに。