Mojoliciousを最近では利用しています。Webアプリケーションの開発を効率的に行うためのライブラリ群(つまりフレームワーク)で、これがなければ少しでも大きめのアプリになると大変な思いをします。以下Mojoliciousについてとりあえずの、参考リンクです。ちなみに昨日かな?Mojoliciousはバージョン3.0が出ました。実用的なチュートリアルを載せてみます。Mojoliciousの他にもCPANモジュールをいくつか使っています。作るアプリは「Nopaste」アプリと言って、タイトルとコメントを入力するとユニークなURLでページを生成して表示させるという代物です。プログラミングのコードの一部などをコメント欄に入力して、出来たページを他の人に見せるなどという使われ方をされますね。駆け足になるかもしれませんが、行ってみましょうー!インストール&ひな形を生成するMojoliciousはCPANモジュールなので、cpanmコマンドなどからインストールできます。Mojoliciousとしてください。正常にインストールされれば、「mojo」コマンドが使えるようになりますので、プロジェクトのひな形を作ります。本当に小さいアプリならば、Mojolicious::LiteというRubyで言うSinatraチックな記述の仕方が出来ますが、今回は通常の「アプリ」としてひな形を生成します。Nopaste::Webここで、ネームスペースをNopaste「::Web」としているのは、個人的な趣向で、Webのライブラリを置く領域とその他DBなどをしっかりと分けたいからです。作られる「nopaste_web」ディレクトリに潜ると以下のファイルがあると思います。これらがWebアプリを作るためのひな形となります。default.html.epアプリを立ち上げるひな形の状態でテストとしてアプリを立ち上げてみましょう。Mojoliciousには「morbo」というサーバコマンドが付属しているのでそれを使います。script/nopaste_webすると、デフォルトだと起動したホストの「3000」番ポートでアプリが立ち上がります。framework!」と書かれたWelcomeページが見えると思います。ちなみに「plackup」でもアプリを立ち上げることが出来ます。script/nopaste_webトップページを作るトップページではタイトルとコメントを受け付けるフォームを表示します。トップページを作ってみましょう。「lib/Nopaste/Web.pm」を編集します。このファイルはアプリのセットアップをする部分ですが、その中のルーティングと呼ばれる部分を記述するのです。アクセスされるURLとそれに対応するコントローラの対応付けをします。いらない部分を消して以下のようにします。$r->get('/')->to('root#index');}1;「$r->get('/')->to('root#index')」の部分が「/」というパス、つまりトップページにGETでアクセスされた時に、「Nopaste::Web::Root」というコントローラの「index」メソッドを呼び出すという意味になります。次にNopaste::Web::Rootコントローラを作りましょう。いっても、現段階ではindexメソッドがHTMLを描画するだけなので、こんな感じになります。「lib/Nopaste/Web/Root.pm」というファイルです。「templates/root/index.html.ep」をいじります。Mojoliciousのテンプレートファイルの拡張子は「.html.ep」なのです。'default';」という記述がありますね。Mojoliciousのテンプレートでは「%」などを駆使して、変数を展開したり、Perlコードを書いたり、レイアウトに使用するテンプレートを選択したりします。」というテンプレートをレイアウトに使うという意味です。余裕があったらレイアウトファイルをいじってみてください。入力値チェックを行う「lib/Nopaste/Web.pm」を再びいじり、トップページからのPOSTを受け付けるようにしましょう。ここを追加する次にRootコントローラに追加します。先ほど作った「lib/Nopaste/Web/Root.pm」というファイルですね。何を追加するかと言うと、入力値のチェック(=ヴァリデーション)をするロジックです。タイトルが空だったり、コメントが空だったりしたら、エラーを表示させます。「ベタ」で書いてもいいのですが、今回は拡張性も考えてFormValidator::Liteというモジュールを使ってみましょう(これから紹介する足りないモジュールについてはcpanmなどを利用してインストールしてください)。エラーメッセージを表示する時に、入力された値が消えないようにHTML::FilInForm::Liteというモジュールを使って工夫をします。読み解くのに時間がかかるかもしれませんがRootコントローラは以下のメソッドを追加します。続きは後ほど}1;先ほど作った「templates/root/index.html.ep」テンプレートをエラーの時にも利用しています。エラーメッセージを表示させるためにも、以下のように編集します。%>」を利用してエラーメッセージを描画しています。この状態では、ヴァリデーションがうまく行かない場合、つまりタイトルとコメントが空の時、指定したエラーメッセージが表示されます。逆にどちらも内容が入っていて、ヴァリデーションを通ったケースには何も記述していません(分かりにくい感じになっちゃいましたがその場合「Mojolicious」のエラーが出るかもです)。DBを扱う入力値が妥当であればそれをDBに格納しないといけません。Mapperと呼ばれるモジュールなどを使うとよいでしょう。今回は詳しい記述はしませんが、十分枯れているDBIx::Skinnyを使います。その前にSQLのテーブル定義です。MySQLを一応想定しています。CHARSET=utf8;仮として、「nopaste」という名前のデータベースを作って上記のSQLを実行したとしておきます。次にDBIx::Skinnyのところ。「lib/Nopaste/DB.pm」を作ります。DBIx::Skinny;1;これだけ。「lib/Nopaste/DB/Schema.pm」というファイルも作らなくてはいけません。body/;1;ふぅ。今度はこのデータベースを操作するクラスのインスタンスをMojoliciousのコントローラから利用できるようにします。データベースの設定を読み込ますための設定ファイルを書きましょう。これはMojoliciousの機能で後ほど読み込むことが出来ます。アプリケーションのディレクトリの直下に「nopaste.conf」というファイルを作り、各自の設定にあわせて記述します。}};そして、「lib/Nopaste/Web.pm」に以下を追加です。タイトルとコメント欄の値をユニークなIDと共に「insert」しましょう。「lib/Nopaste/Web/Root.pm」のpostメソッドに以下を追加します。);}お分かりの通りDBIx::Skinnyを継承して作った「Nopaste::DB」のインスタンスはコントローラから「$self->app->db」でアクセス出来るのですね。postメソッドの最後には、生成されたページへリダレイクトさせています。仕上げタイトル、コメントを含むエントリーを投稿、つまりDBにinsert出来たら、次はページの表示です。Foundな状態なので描画するようにしましょう。ルーティングの記述、コントローラへのメソッドの追加、テンプレートを書く、この順序で行きましょう。「lib/Nopaste/Web.pm」。最後に一行追加します。$r->route('/paste/:id')->to('root#entry');}1;次に「lib/Nopaste/Web/Root.pm」に「entry」メソッドのコードを書きます。無駄にシャレてコメント欄(bodyフィールドの値)をText::VimColor使ってシンタックスハイライトさせてます。$entry;}1;次に「templates/root/entry.html.ep」を作ります。%></pre></div>これで、一通り完成です。トップページに行き、タイトルとコメントを埋めて投稿して見てください。ページが生成され入力した値が見れるはずです。CSSを調整すればコメント欄に入れたPerlコードがシンタックスハイライトされてかっこよく表示されると思います。Framework「Mojolicious」やその他CPANモジュールを使って、入力値の妥当性チェックやDB操作を行う機能を持ったWebアプリのチュートリアル?を解説しました。サンプルとなるNopasteアプリは以下のgithubにあげてありますのでご参考にしてください。yusukebe/Nopasteなんか駆け足というか舌足らずというかやってることのボリュームがありすぎる感じだったりとかで、うまく伝わらないかもしれませんが、気になる人はMojoliciousをチェックしてみるといいんじゃないでしょうか。ちなみに、メルマガでPerl初心者向けコンテンツを開始しました、という通りなんで有料で申し訳ないのですが、興味のある方はお試し購読してみてください。