運用まで一気通貫でWebアプリ周辺の教本を目指してアレンジしました。285Amazon.co.jpで詳細を見る目玉となるアプリケーションのプログラミングを行う第2章では、諸々の関係上、PHPとRubyのみの実装を扱っています。執筆時期の最後の方で「2ページ空きが出来たからなんか書いて!」と言われ悪あがき的にPerlの紹介を書きましたがそれではさすがにページ数が足りません。そこで今回は「PHP/Rubyによる速習プラン」に追加する形で「Perlによる速習プラン」をお届けいたします。言ってもPerlとはなんぞや?から入ると書くのが大変ですので、その辺りは「初めてのPerl」や「続・初めてのPerl」などで補ってください。今回は最も肝心なところの例として、Ruby編のサンプルアプリをつくる件、をPerlで実装してみたコードを紹介します。該当部分の作者であるすがさんによると...はてなブックマークには及びませんが、素敵なWebアプリケーションを作成してきましょう。いうことでShioriというブックマークWebアプリをつくります。あがっているコードはこちら。分かりやすいようにすがさんの書いた箇所を今回つくるアプリなりにアレンジしつつ列挙します。ユースケースは以下の2つ。URLを登録出来る登録したURLの一覧を参照出来る次にデータベースの構造はbookmarkテーブルひとつとなります。MySQL/InnoDBでの開発運用を見据えて、SQL文で書くとこんな具合になりました。engine=InnoDB;URLのエンドポイントは以下の3つです。上記フォームがPOSTする先Mojoliciousによる実装Perl編ってことでWAFは「Mojolicious」を使います。Amon2でもやり方はそんな変わらないはずです。Mojolicious付属のmojoコマンドで雛形をつくります。Shiori::Webディレクトリとファイルが生成されますが、これはそのまま使わず一部カスタムして利用します。最終的なディレクトリ構造は以下の通りです。完全僕の趣味が出てます。個別テンプレート.psgiの作成.psgiファイルをつくっておくとPlack::Middleware::*が使えたりして何かと便利なのでつくります。$app;};これをshiori_web.psgiという名前に保存してplackupするとよいでしょう。shiori_web.psgi設定ファイルのロードMojoliciousにも設定ファイルをロードする機能はありますが、これをそのまま使うとMojolicious依存が強すぎちゃうんで独自でつくりましょう。環境変数PLACK_ENVを覗いてその状態によりロードするファイルを分岐させています。Config::PLを使ったコードをlib/Shiori.pmに書いてます。$config;}1;この設定ファイルがしっかりロードさせれているか?をテストコード書いて確かめましょう。存在しつつハッシュリファレンスを返せないととテストが通らないという、ちょっとよろしくない実装になってますが、分かりやすいので紹介します。t/config.tがこちら。-lコマンドで実行します。MapperにはTengを利用してみましょう。lib/Shiori/DB.pm及びlib/Shiori/DB/Schema.pmを以下のように実装します。後ほどページャーをつくるのでPluginをロード1;Shiori::DB::Schemaは日付を扱うフィールドに対し、更新時DateTime型を与えられる、もしくは参照時にDateTime型で取得可能にするためにinflateとdeflateの設定をしています。$bookmark->url;のような操作を行うことでデータベースを操作可能です。モデルをつくる上記のShiori::DBを直接コントローラーで処理してもいいのですが、後の拡張性を考えた場合にもう一層モデルをかませた方がいいでしょう。パラメータを元にブックマーク一覧を返却するという二つのメソッドを持つモデルにします。この実装ではcreateメソッドで引数の検証を行います。コントローラーでも使うことが出来るFormValidator::Liteを利用してバリデーション。エラーだった場合とDBへのInsertが成功した場合で返却されるハッシュリファレンスの構造を変えることで呼び出し側が判断出来るようにしています。ちなみにこちらもMojolicious依存を避けるためにMojo::Baseは使わずにMouseなクラスにしています。);}__PACKAGE__->meta->make_immutable();さて、こちらもテストしていきましょう。DBを扱うのでローカルなどに立ててるテスト用のサーバーにアクセスさせてもいいですが、その都度追加したレコードを削除しなくてはいけなかったり扱いが面倒です。そこでTest::mysqldを使い専用のテンポラリなMySQLサーバをつくり出しそれを参照させます。'Data::Page::NoTotalEntries';};done_testing();Web.pmとコントローラをつくるモデルが出来ればあとはすんなりいくでしょう。lib/Shiori/Web.pmを以下のように変更します。Mojoliciousの機能であるhelperでモデルの呼び出しを可能にしています。コントローラー内で$self->modelメソッドが使えるようになるのです。$r->post('/create')->to('root#create');}1;まだブックマークが登録されていないと思いますが、トップページのコントローラに該当する部分はこうでしょう。$self->render();}対応するテンプレートは以下のとおりです。Mojo::Templateを使っているのでPerlが直接書けちゃいます。}</ul>投稿用フォームを表示する/newというパスに対応するコントローラーの/postメソッドはこれだけでよいです。$self->render();}諸事情でstashのmessagesという変数にundefを渡しております。テンプレートは以下のとおり。エラーが出た際の表示も担っています。/createに対するコントローラーメソッドは以下です。モデルからエラーが来た場合に適切に処理しています。$self->redirect_to('/');}完成これまで紹介した個別のテンプレートファイルの外枠となるべきtemplates/layouts/default.html.epにてCSSフレームワークのBootstrapを読みこませれば完成です。</body></html>ではplackupでアプリを起動し「http://localhost:5000/」などにアクセスしてみましょう!出来ましたね!まとめコードばかりでかつ駆け足になっちゃいましたが、分からないところは適宜ドキュメントやWeb上のリソースを見てください!また、Mojoliciousでいいのか?DateTimeでいいのか?画像やJSなど静的ファイルはどこに置くのか?subtestの粒度が荒いんだけどどうすれば?Test::mysqldを毎スコープごとに立ち上げるの辛いテーブルが増えた時Join的なのはどうするのか?本番サーバーで運用するには?などの課題があると思うのでその点も意識しつつ、徐々にノウハウを貯めていければよいでしょう。