SlideShare a Scribd company logo
1 of 11
Download to read offline
Mojolicious::Lite を使ってみよう
                                                          February 19, 2011
                                                           Hokkaido.pm #4
                                                 Kenichi Ishigaki (charsbar)



はじめに
Hokkaido.pm #4 の午前の部では Mojolicious::Lite を使って簡単なウェブアプリケーショ
ンをつくってみます。わからないことがあったら遠慮なく質問してください。また、ある
程度わかっている方はどんどん先に進んでいただいて結構です。


なお、今回の講習ではほとんどの作業をコマンドプロンプト/シェルから行います。みな
さんご存じと思いますが、Windows をお使いの方はスタートメニューから「すべてのプロ
グラム」などと書かれたメニューを開き、「アクセサリ」の中に入っている「コマンドプロ
ンプト」(または「Windows PowerShell」)というアプリケーションを、MacOSX を含む
Unix 系の方はターミナル、端末等々の名前がついているアプリケーションを起動してくだ
さい。以下、コマンドプロンプトから実行するコマンドについては、下記のように表記し
  「>」は Windows のコマンドプロンプトです(Unix 系 OS をお使いの方は適宜読み
ます。
替えてください)。



 (コマンド名) (引数...)




Mojolicious(::Lite)について
Mojolicious(::Lite)は、Perl 界でもっとも有名なウェブアプリケーションフレームワークの
ひとつである Catalyst の原作者ゼバスティアン・リーデル(Sebastian Riedel)氏が 2008 年
から開発しているウェブアプリケーションフレームワークです。過去の経緯については
gihyo.jp の特集記事、連載記事にまとめてありますが、これらはすでに古くなっているので
参考程度にとどめてください。


http://gihyo.jp/dev/feature/01/mojo
http://gihyo.jp/dev/serial/01/modern-perl/0022
いま Mojolicious(::Lite)を使う理由としては、たとえば次のようなものがあげられます。


- インストールが簡単
 - 昔の CGI スクリプトと同じく、簡単なサイトならファイルひとつで配布可能
 - Mojolicious そのもののインストールも外部依存がないので簡単
   - Windows 環境でも問題なくインストールできます
 - 小規模サイトなら Apache などの外部サーバも必要ありません
- サイトの成長にあわせて Mojolicious::Lite から Mojolicious に移行可能
 - 簡単なことは簡単にできますし、複雑なことにも対応できます
- ドキュメントも少しずつ充実してきました
 - http://mojolicio.us/perldoc
 - https://github.com/kraih/mojo/wiki
   - http://wiki.livedoor.jp/mojolicious/
- ウェブ標準に敏感で、最近の仕様にもわりと早く追随してくれます
 - WebSocket とか HTML5 とか


一方で、このような批判もありました。


- 開発中の仕様変更やファイルの再配置が多かった
 - 連載記事などのサンプルコードには半年ともたず古びたものもありました
 - バージョン 1.0 になったので、今後極端に大きな仕様変更は減ると期待されます
   - それでもリーデル氏の過去の言動から安定性を不安視する人はいるのですが…
- 遅い
 - まだ十分な最適化が行われていない場所はあるかもしれません
 - 必要に応じて外部モジュールで高速化することはそうむずかしくありません
 - そもそもどのくらいの速度が必要ですか?
- 独自モジュールが多く学習コストが高い
 - 既存の古いモジュールの置き換えがひとつの目的なのである意味仕方ありません
 - 必要に応じて外部モジュールを利用することはそうむずかしくありません


この原稿を書いている現在、Mojolicious の最新版はバージョン 1.1 です。お手元のバージ
ョンが古い場合、細かな挙動が異なる可能性がありますので、なるべく最新版に更新して
ください。
今回つくるアプリケーションについて
今回は自宅でも手軽に利用できるものとして、Wiki っぽいアプリケーションをつくってみ
ます。時間も限られていますので、最初は特定のディレクトリ配下のファイルの内容をブ
ラウザ経由で表示・更新できるだけのものをつくり、そこから順に発展させていくことに
しましょう。


初期の要件は以下の通りとします。


- 指定したディレクトリ配下のファイルとサイトの URL が一対一対応するものとします
 - 「http://.../html/(ファイル)」でファイルの内容を表示してください
 - 「http://.../html/(ファイル)/update」で内容を更新したいです
 - 「http://.../html/(ファイル)/delete」でファイルの削除
 - 「http://.../html/(ファイル)/create」で新規ファイルを作成
 - 「http://.../html/(ディレクトリ)」の場合はファイル一覧を表示しましょう


時間に余裕があったらこのあたりまで対応できるといいですね
- もちろん見栄えはよくしておくにこしたことはありません
 - 静的ファイルをいくつか追加しましょう
- POD や markdown テキストが含まれていたら HTML にレンダリングした方がよいかも
- 知らない拡張子の場合は更新できないようにした方が無難でしょう
 - バイナリとしてダウンロードさせる手もありそうですが
- 特定のユーザのみ閲覧・更新可能なページがあるといいかも
 - ファイルのパーミッションも確認しましょう(読み込み専用コンテンツ)
- 「http://.../api/...」にアクセスしたらコンテンツを JSON で返してほしいです
- 検索もできるにこしたことはありません
- Wiki というなら更新履歴や差分もほしいところでしょう
 - ディレクトリをまるごと git 管理してみましょうか
- 更新時の衝突回避はどうしましょうか
- XSS や CSRF の対策は十分ですか
 - cf. Mojolicious::Plugin::CSRFDefender
  (https://github.com/shiba-yu36/p5-Mojolicious-Plugin-CSRFDefender)
Perl と Mojolicious のインストール
Windows をお使いの方で Perl のインストールが済んでいない方は下記サイトから
ActivePerl ないし Strawberry Perl をインストールしてください。


ActivePerl: http://www.activestate.com/activeperl/downloads
Strawberry Perl: http://strawberryperl.com/


Mojolicious(::Lite)は CPAN からダウンロードできます。コマンドプロンプトから以下のコ
マンドを実行してください。



 (sudo) cpan Mojolicious



また、公式サイトから tarball をダウンロードすることもできます。


http://latest.mojolicio.us/


最新の開発版は github からチェックアウトしてください。



 git clone git://github.com/kraih/mojo




ひな形をつくる
Mojolicious のインストールが済んだら、適当なディレクトリに移動して、以下のコマンド
を実行してください。myapp.pl の部分はお好きな名前に変えていただいて結構です。



 mojo generate lite_app myapp.pl



# カレントディレクトリのファイル一覧を表示して、myapp.pl というファイルができてい
ることを確認してください。
ブラウザで確認してみよう
Mojolicious::Lite アプリケーションには標準でウェブサーバ機能が用意されています。コマ
ンドプロンプトから以下のコマンドを実行してください。



 perl myapp.pl daemon



# ウェブブラウザを起動して、実際にサイトが表示できるか確認してください。


http://localhost:3000


サーバを止めたい場合はコマンドプロンプトで Ctrl+C などを入力します。


Plack をインストール済みの方は以下のコマンドも実行してみましょう。



 plackup -a myapp.pl



# こちらもウェブブラウザを起動して、実際にサイトが表示できるか確認してください。


http://localhost:5000



ひな形アプリケーションのお役立ち機能
ひな形アプリケーションを起動したあと、下記の URL に移動するとインストール済みの
Mojolicious のドキュメントを読むことができます(古い Perl をお使いの方は CPAN から
Pod::Simple の最新版をインストールする必要があるかもしれません)。


http://localhost:3000/perldoc


この機能はおもに Mojolicious::Plugin::PodRenderer のなかで実装されています。今回のサ
ンプルアプリケーション作りの参考になりそうですね。


確認が済んだら、pod_renderer というプラグインを読み込んでいる行は消してしまってく
ださい。
ふたつの道
ここから先はふたつの道があります。


目で動作確認しながらでないと落ち着かない方はディスパッチャの設定からしてしまいま
しょう。仮テンプレートの作成などが必要になるのでいくらか余計に手間はかかりますが、
実際に動いているのが確認できるので、不慣れなうちはこちらの方が楽しく書けますし、
上司や顧客が相手でも途中経過を見せやすいです。ただし、こちらの道を通ると、なまじ
目チェックが入るせいで、特に異常時のテストがおろそかになりがちですし、どうしても
ウェブの事情を優先してしまいがちなので、あとで拡張に苦労することも多くなります。
また、バグが出たときに問題の切り分けがややむずかしくなります。


ある程度開発に慣れている方ならモデルを書いていく方が早道です。関心を分離しながら
の作業になるので、最終的に表示部分を作るまで人には見せられないのが難点ですが、こ
のモデル部分はウェブの表示以外にも使えますから、自動テストはもとより、データの収
集や加工用のスクリプトなどが必要な場合にも対応しやすくなります。



ディスパッチャ(ルータ)を用意する
Mojolicious::Lite のディスパッチャについては、Mojolicious::Lite のドキュメントのほか、
Mojolicious::Guides::Routing というドキュメントによくまとまっています。ごく基本的な
構成は次の通りです。



get (または post、any など) '/(対象となるパス)' => sub { ... };



パスにはさまざまなプレースホルダを利用できます。今回の例ではいちばんゆるいワイル
ドカード型のプレースホルダを利用するのが楽でしょう。サブルーチンの中身はひとまず
最初に用意されていた「/welcome」のものをコピーしておいてください。




get '/html/(*path)/create' => sub { ... };
get '/html/(*path)'          => sub { ... };




なお、このように変化しない共通の部分がある場合は under コマンドを利用すると便利で
す。




under '/html'; # 以下のパスはすべて /html 配下になります。
get '/(*path)/create' => sub { ... };
get '/(*path)'          => sub { ... };




また、特にワイルドカード型のプレースホルダを使う場合、条件のゆるいルートを先に書
いてしまうと、後続のパスが無視される結果になることがあります。設定の記載順には注
意してください。


必要なパスの設定が済んだら、コマンドラインから以下のコマンドを実行して、ルートが
正しく設定されているか確認しましょう。期待通りの正規表現が表示されていますか?



 perl myapp.pl routes



ルーティングの際に受け取ったパスは、stash、あるいは param から取り出せます。index
テンプレートに手を入れてどんなパスを受け取ったか確かめてみましょう。




@@ index.html.ep
% layout 'default';
% title 'Welcome';
Welcome to Mojolicious!
<%= stash 'path' %>




Mojolicious::Lite のテンプレートについては、Mojolicious::Lite のドキュメントのほか、
Mojolicious::Guides::Rendering というドキュメントによくまとまっています。基本的には
必要なところに「<%= (Perl の変数、式) %>」を埋め込んでいくだけですが、条件文など、
より複雑な式を書く場合は、行頭を「%」で始めると、その行はそのまま Perl として解釈
されます。また、stash をはじめ、Mojolicious の標準テンプレートにはヘルパーコマンド
が い く つ か 用 意 さ れ て い ま す 。 詳 し く は Mojolicious::Plugin::DefaultHelpers と 、
Mojolicious::Plugin::TagHelpers をそれぞれ確認してみてください。
Mojolicious の テ ン プ レ ー ト に な じ め な い 方 は 、 MojoX::Renderer::TT や
MojoX::Renderer::Xslate といった代替品もありますが、なかには最新版に対応していない
ものもあるかもしれません(TT の最新版は Windows だとテストに失敗するようです)。



ディスパッチャのテストを書く
ディスパッチャを書いたら、期待通りの動作をしているか、テストしてみましょう。先ほ
どのようにサーバを起動してブラウザで確認してもかまいませんが、Mojolicious に同梱さ
れている Test::Mojo を使うとあたかも人間が実際にアクセスしたかのようなテストコード
を書くこともできます。試しに myapp.pl と同じディレクトリに test.t というテストスクリ
プトを用意してみましょう。




use strict;
use warnings;
use Test::More;
use Test::Mojo;


require 'myapp.pl';


my $t = Test::Mojo->new;
$t->get_ok('/html/foobar')->status_is(200);


done_testing;




ここではまだステータスコードの確認しかしていませんが、Mojo::DOM の機能を使うと
CSS セレクタを利用して HTML の中身を細かく調べることもできます。詳しくは
Test::Mojo と Mojo::DOM をそれぞれ確認してみてください。



モデルをつくる
モデリングの仕方にもさまざまな流儀がありますが、ここではあまり細かなことは考えず、
モデルの適切なメソッドに「/foo/bar」のようなパス情報(と、必要に応じて更新用のデー
タ)を渡したら、該当するファイルの内容を取り出したり、更新したりできるようになっ
ていればよしとしましょう。
また、テストのしやすさを考えて、表示・更新に使うファイルを格納するディレクトリは
オブジェクト作成時に変更できるようにしておくのが無難です。


本当に小さなアプリケーションで、モデルクラスもそれほど大きくならないことがわかっ
ている場合は、myapp.pl スクリプトと同じディレクトリに MyApp.pm のようなモジュー
ルを用意してもかまいませんが、ここではいずれほかのモジュールも追加することになる
ことが予想できますので、CPAN モジュールで一般的に使われているレイアウトにあわせ
ることにしましょう。lib ディレクトリを掘って、lib/MyApp.pm というファイルを用意し
ます。




package MyApp;
use strict;
use warnings;
use File::Spec;


sub new {
     my $class = shift;
     bless {@_}, $class;
}
sub home { shift->{home} || '.' }
sub read {
     my ($self, $path) = @_;
     my $file = File::Spec->catfile($self->home, $path);
     open my $fh, '<', $file or die $!;
     local $/;
     return <$fh>;
}
sub create {
     my ($self, $path, $content) = @_;
     my $file = File::Spec->catfile($self->home, $path);
     open my $fh, '>', $file or die $!;
     print $fh $content;
}


1;
モデルをテストする
モデルが書けたらテストもしましょう。CPAN のレイアウトにあわせてテストファイルは t
ディレクトリ以下に置くことにします。t/model.t というスクリプトを用意してください。




use strict;
use warnings;
use FindBin;
use lib "$FindBin::Bin/../lib";
use MyApp;
use Test::More;


my $testdir = "$FindBin::Bin/test";
mkdir $testdir unless -d $testdir;
my $m = MyApp->new(home => $testdir);
$m->create('foo', 'foobar');
is $m->read('foo') => 'foobar';


done_testing;




Mojolicious::Lite アプリにモデルを組み込む
最後に Mojolicious::Lite アプリからモデルを呼び出せるようにしましょう。


まずは myapp.pl の先頭の方にこのようなコードを追加します。




use lib 'lib';
use MyApp;


my $model = MyApp->new(home => app->home);


app->helper(model => sub {return $model});
これで app->model からモデルを呼び出せるようになりました。正しくファイルが読み込め
ているか確認しましょう。




get '/(*path)' => sub {
     my $self = shift;
     my $content = app->model->read($self->param('path'));
     $self->stash(content => $content);
     $self->render('index');
};




@@ index.html.ep
% layout 'default';
<%= stash 'path' %>
<pre>
<%= stash 'content' %>
</pre>




この変更を加えたことで、先ほど書いたディスパッチャのテストが通らなくなったはずで
す。ファイルが存在している場合、していない場合等々、さまざまな条件を考慮したテス
トを書いてみましょう。また、モデルの設計として、最初はあっさり die させておきました
が、本当にこれでよかったでしょうか?


Mojolicious はデフォルトのままだと utf8 が前提になっているため、このままだと、環境に
よっては日本語を含むファイルなどが文字化けします。Encode や Mojo::ByteStream を利
用して文字コードまわりの対応も強化する必要があるはずです。また、utf8 以外の文字コ
ードを利用するなら Mojolicious::Plugin::Charset を組み込む必要もあるでしょう。


今回は時間がたりず、紙の資料はここまでしか用意できていませんが、このセッション内
でも、そのあとでも、わからないことがあったら遠慮なく質問してください。


Happy Hacking!

More Related Content

What's hot

エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜Yuji Nojima
 
SeleniumIDEとSelenium WebDriver × Node.js Seleniumで業務効率化する15分
SeleniumIDEとSelenium WebDriver × Node.js Seleniumで業務効率化する15分SeleniumIDEとSelenium WebDriver × Node.js Seleniumで業務効率化する15分
SeleniumIDEとSelenium WebDriver × Node.js Seleniumで業務効率化する15分松田 千尋
 
Introduction to Favmemo for Immature Engineers
Introduction to Favmemo for Immature EngineersIntroduction to Favmemo for Immature Engineers
Introduction to Favmemo for Immature EngineersTakeshi Arabiki
 
Perl Beginners #7 おとなのWAF
Perl Beginners #7 おとなのWAF Perl Beginners #7 おとなのWAF
Perl Beginners #7 おとなのWAF Munenori Sugimura
 
クリーンな WordPress サイトのための PHP コーディングのお作法 ― 計画的に WordPress を拡張していくためのフレームワーク思考 |...
クリーンな WordPress サイトのための PHP コーディングのお作法 ― 計画的に WordPress を拡張していくためのフレームワーク思考 |...クリーンな WordPress サイトのための PHP コーディングのお作法 ― 計画的に WordPress を拡張していくためのフレームワーク思考 |...
クリーンな WordPress サイトのための PHP コーディングのお作法 ― 計画的に WordPress を拡張していくためのフレームワーク思考 |...Kazuhiro Hara
 
「新しい」を生み出すためのWebアプリ開発とその周辺
「新しい」を生み出すためのWebアプリ開発とその周辺「新しい」を生み出すためのWebアプリ開発とその周辺
「新しい」を生み出すためのWebアプリ開発とその周辺Yusuke Wada
 
0から学んだポストモダンPerl @ YAPC::Asia Tokyo 2013
0から学んだポストモダンPerl @ YAPC::Asia Tokyo 20130から学んだポストモダンPerl @ YAPC::Asia Tokyo 2013
0から学んだポストモダンPerl @ YAPC::Asia Tokyo 2013Tasuku Suenaga
 
とある Perl Monger の働き方
とある Perl Monger の働き方とある Perl Monger の働き方
とある Perl Monger の働き方Yusuke Wada
 
JavaOne2013報告会 JavaFX Update
JavaOne2013報告会 JavaFX UpdateJavaOne2013報告会 JavaFX Update
JavaOne2013報告会 JavaFX UpdateTakashi Aoe
 
続・Twitter bootstrap入門 #html5j
続・Twitter bootstrap入門 #html5j続・Twitter bootstrap入門 #html5j
続・Twitter bootstrap入門 #html5jToshiaki Maki
 
20140405 mavenセントラルリポジトリへの登録のコツ 第5回渋谷java
20140405 mavenセントラルリポジトリへの登録のコツ 第5回渋谷java20140405 mavenセントラルリポジトリへの登録のコツ 第5回渋谷java
20140405 mavenセントラルリポジトリへの登録のコツ 第5回渋谷javaY Watanabe
 
Java Day Tokyo 2013 Java the Night 監視ツールでみるJavaFXとJava EEの魅力
Java Day Tokyo 2013 Java the Night 監視ツールでみるJavaFXとJava EEの魅力Java Day Tokyo 2013 Java the Night 監視ツールでみるJavaFXとJava EEの魅力
Java Day Tokyo 2013 Java the Night 監視ツールでみるJavaFXとJava EEの魅力Takashi Aoe
 
え?まだMAMPで消耗してんの?
え?まだMAMPで消耗してんの?え?まだMAMPで消耗してんの?
え?まだMAMPで消耗してんの?Takayuki Miyauchi
 
究極にして至高のWAF
究極にして至高のWAF究極にして至高のWAF
究極にして至高のWAFYuki Ishikawa
 
【B-1】kintoneでお手軽コールセンター!
【B-1】kintoneでお手軽コールセンター!【B-1】kintoneでお手軽コールセンター!
【B-1】kintoneでお手軽コールセンター!Sakae Saito
 
ブラウザだけで学ぶWebアプリ開発
ブラウザだけで学ぶWebアプリ開発 ブラウザだけで学ぶWebアプリ開発
ブラウザだけで学ぶWebアプリ開発 schoowebcampus
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Tokuhiro Matsuno
 

What's hot (20)

エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
 
SeleniumIDEとSelenium WebDriver × Node.js Seleniumで業務効率化する15分
SeleniumIDEとSelenium WebDriver × Node.js Seleniumで業務効率化する15分SeleniumIDEとSelenium WebDriver × Node.js Seleniumで業務効率化する15分
SeleniumIDEとSelenium WebDriver × Node.js Seleniumで業務効率化する15分
 
2479
24792479
2479
 
Introduction to Favmemo for Immature Engineers
Introduction to Favmemo for Immature EngineersIntroduction to Favmemo for Immature Engineers
Introduction to Favmemo for Immature Engineers
 
Perl Beginners #7 おとなのWAF
Perl Beginners #7 おとなのWAF Perl Beginners #7 おとなのWAF
Perl Beginners #7 おとなのWAF
 
クリーンな WordPress サイトのための PHP コーディングのお作法 ― 計画的に WordPress を拡張していくためのフレームワーク思考 |...
クリーンな WordPress サイトのための PHP コーディングのお作法 ― 計画的に WordPress を拡張していくためのフレームワーク思考 |...クリーンな WordPress サイトのための PHP コーディングのお作法 ― 計画的に WordPress を拡張していくためのフレームワーク思考 |...
クリーンな WordPress サイトのための PHP コーディングのお作法 ― 計画的に WordPress を拡張していくためのフレームワーク思考 |...
 
JavaScript 研修
JavaScript 研修JavaScript 研修
JavaScript 研修
 
「新しい」を生み出すためのWebアプリ開発とその周辺
「新しい」を生み出すためのWebアプリ開発とその周辺「新しい」を生み出すためのWebアプリ開発とその周辺
「新しい」を生み出すためのWebアプリ開発とその周辺
 
0から学んだポストモダンPerl @ YAPC::Asia Tokyo 2013
0から学んだポストモダンPerl @ YAPC::Asia Tokyo 20130から学んだポストモダンPerl @ YAPC::Asia Tokyo 2013
0から学んだポストモダンPerl @ YAPC::Asia Tokyo 2013
 
とある Perl Monger の働き方
とある Perl Monger の働き方とある Perl Monger の働き方
とある Perl Monger の働き方
 
JavaOne2013報告会 JavaFX Update
JavaOne2013報告会 JavaFX UpdateJavaOne2013報告会 JavaFX Update
JavaOne2013報告会 JavaFX Update
 
続・Twitter bootstrap入門 #html5j
続・Twitter bootstrap入門 #html5j続・Twitter bootstrap入門 #html5j
続・Twitter bootstrap入門 #html5j
 
20140405 mavenセントラルリポジトリへの登録のコツ 第5回渋谷java
20140405 mavenセントラルリポジトリへの登録のコツ 第5回渋谷java20140405 mavenセントラルリポジトリへの登録のコツ 第5回渋谷java
20140405 mavenセントラルリポジトリへの登録のコツ 第5回渋谷java
 
Java Day Tokyo 2013 Java the Night 監視ツールでみるJavaFXとJava EEの魅力
Java Day Tokyo 2013 Java the Night 監視ツールでみるJavaFXとJava EEの魅力Java Day Tokyo 2013 Java the Night 監視ツールでみるJavaFXとJava EEの魅力
Java Day Tokyo 2013 Java the Night 監視ツールでみるJavaFXとJava EEの魅力
 
Electron early 2019
Electron early 2019Electron early 2019
Electron early 2019
 
え?まだMAMPで消耗してんの?
え?まだMAMPで消耗してんの?え?まだMAMPで消耗してんの?
え?まだMAMPで消耗してんの?
 
究極にして至高のWAF
究極にして至高のWAF究極にして至高のWAF
究極にして至高のWAF
 
【B-1】kintoneでお手軽コールセンター!
【B-1】kintoneでお手軽コールセンター!【B-1】kintoneでお手軽コールセンター!
【B-1】kintoneでお手軽コールセンター!
 
ブラウザだけで学ぶWebアプリ開発
ブラウザだけで学ぶWebアプリ開発 ブラウザだけで学ぶWebアプリ開発
ブラウザだけで学ぶWebアプリ開発
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)
 

Viewers also liked

Json(::PP) is a-changing
Json(::PP) is a-changingJson(::PP) is a-changing
Json(::PP) is a-changingcharsbar
 
2017年夏のPerl
2017年夏のPerl2017年夏のPerl
2017年夏のPerlcharsbar
 
JSON, JSON::PP, and more
JSON, JSON::PP, and moreJSON, JSON::PP, and more
JSON, JSON::PP, and morecharsbar
 
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいCPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいcharsbar
 
2016年のPerl (Long version)
2016年のPerl (Long version)2016年のPerl (Long version)
2016年のPerl (Long version)charsbar
 
2017年春のPerl
2017年春のPerl2017年春のPerl
2017年春のPerlcharsbar
 

Viewers also liked (6)

Json(::PP) is a-changing
Json(::PP) is a-changingJson(::PP) is a-changing
Json(::PP) is a-changing
 
2017年夏のPerl
2017年夏のPerl2017年夏のPerl
2017年夏のPerl
 
JSON, JSON::PP, and more
JSON, JSON::PP, and moreJSON, JSON::PP, and more
JSON, JSON::PP, and more
 
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいCPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したい
 
2016年のPerl (Long version)
2016年のPerl (Long version)2016年のPerl (Long version)
2016年のPerl (Long version)
 
2017年春のPerl
2017年春のPerl2017年春のPerl
2017年春のPerl
 

Similar to Mojolicious::Liteを使ってみよう

Eclipse xtext 紹介
Eclipse xtext 紹介Eclipse xtext 紹介
Eclipse xtext 紹介Akira Tanaka
 
Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中Takako Miyagawa
 
今時のDev opsの取り組み事例集
今時のDev opsの取り組み事例集今時のDev opsの取り組み事例集
今時のDev opsの取り組み事例集Wataru NOGUCHI
 
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1Atsushi Tadokoro
 
大規模ソフトウェア開発とテストの経験について
大規模ソフトウェア開発とテストの経験について大規模ソフトウェア開発とテストの経験について
大規模ソフトウェア開発とテストの経験についてRakuten Group, Inc.
 
継続的インテグレーション3分クッキング
継続的インテグレーション3分クッキング継続的インテグレーション3分クッキング
継続的インテグレーション3分クッキングTakayuki Kondou
 
XpagesDay 2014 [A-2] スタンダードクライアントで xpages を使ってみよう
XpagesDay 2014 [A-2] スタンダードクライアントで xpages を使ってみようXpagesDay 2014 [A-2] スタンダードクライアントで xpages を使ってみよう
XpagesDay 2014 [A-2] スタンダードクライアントで xpages を使ってみようTakeshi Yoshida
 
Jenkins study 7 2013-01-28
Jenkins study 7 2013-01-28Jenkins study 7 2013-01-28
Jenkins study 7 2013-01-28Ato ARAKI
 
Jenkins+Play!で気軽にCI
Jenkins+Play!で気軽にCIJenkins+Play!で気軽にCI
Jenkins+Play!で気軽にCITakafumi Ikeda
 
Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦urasandesu
 
Test Plugins
Test PluginsTest Plugins
Test Pluginsykhr
 
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門sandai
 
Firefoxの開発プロセス
Firefoxの開発プロセスFirefoxの開発プロセス
Firefoxの開発プロセスMakoto Kato
 
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築Hideharu MATSUFUJI
 
Node.js Tutorial at Hiroshima
Node.js Tutorial at HiroshimaNode.js Tutorial at Hiroshima
Node.js Tutorial at HiroshimaYoshihiro Iwanaga
 
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々torutk
 
Power shellmemo
Power shellmemoPower shellmemo
Power shellmemoytanno
 
Windowsにpythonをインストールしてみよう
WindowsにpythonをインストールしてみようWindowsにpythonをインストールしてみよう
WindowsにpythonをインストールしてみようKenji NAKAGAKI
 
12 総合演習Word Pressの利用
12 総合演習Word Pressの利用12 総合演習Word Pressの利用
12 総合演習Word Pressの利用文樹 高橋
 

Similar to Mojolicious::Liteを使ってみよう (20)

Eclipse xtext 紹介
Eclipse xtext 紹介Eclipse xtext 紹介
Eclipse xtext 紹介
 
Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中
 
今時のDev opsの取り組み事例集
今時のDev opsの取り組み事例集今時のDev opsの取り組み事例集
今時のDev opsの取り組み事例集
 
Hudson (JJUG CCCにて)
Hudson (JJUG CCCにて)Hudson (JJUG CCCにて)
Hudson (JJUG CCCにて)
 
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
 
大規模ソフトウェア開発とテストの経験について
大規模ソフトウェア開発とテストの経験について大規模ソフトウェア開発とテストの経験について
大規模ソフトウェア開発とテストの経験について
 
継続的インテグレーション3分クッキング
継続的インテグレーション3分クッキング継続的インテグレーション3分クッキング
継続的インテグレーション3分クッキング
 
XpagesDay 2014 [A-2] スタンダードクライアントで xpages を使ってみよう
XpagesDay 2014 [A-2] スタンダードクライアントで xpages を使ってみようXpagesDay 2014 [A-2] スタンダードクライアントで xpages を使ってみよう
XpagesDay 2014 [A-2] スタンダードクライアントで xpages を使ってみよう
 
Jenkins study 7 2013-01-28
Jenkins study 7 2013-01-28Jenkins study 7 2013-01-28
Jenkins study 7 2013-01-28
 
Jenkins+Play!で気軽にCI
Jenkins+Play!で気軽にCIJenkins+Play!で気軽にCI
Jenkins+Play!で気軽にCI
 
Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦
 
Test Plugins
Test PluginsTest Plugins
Test Plugins
 
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門
 
Firefoxの開発プロセス
Firefoxの開発プロセスFirefoxの開発プロセス
Firefoxの開発プロセス
 
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
 
Node.js Tutorial at Hiroshima
Node.js Tutorial at HiroshimaNode.js Tutorial at Hiroshima
Node.js Tutorial at Hiroshima
 
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々
 
Power shellmemo
Power shellmemoPower shellmemo
Power shellmemo
 
Windowsにpythonをインストールしてみよう
WindowsにpythonをインストールしてみようWindowsにpythonをインストールしてみよう
Windowsにpythonをインストールしてみよう
 
12 総合演習Word Pressの利用
12 総合演習Word Pressの利用12 総合演習Word Pressの利用
12 総合演習Word Pressの利用
 

More from charsbar

Common boolean class_for_perl5
Common boolean class_for_perl5Common boolean class_for_perl5
Common boolean class_for_perl5charsbar
 
2018年夏のPerl5
2018年夏のPerl52018年夏のPerl5
2018年夏のPerl5charsbar
 
萬國之津梁
萬國之津梁萬國之津梁
萬國之津梁charsbar
 
Better detection of what modules are used by some Perl 5 code
Better detection of what modules are used by some Perl 5 codeBetter detection of what modules are used by some Perl 5 code
Better detection of what modules are used by some Perl 5 codecharsbar
 
perl language update
perl language updateperl language update
perl language updatecharsbar
 
2013年のCPANモジュール作成事情
2013年のCPANモジュール作成事情2013年のCPANモジュール作成事情
2013年のCPANモジュール作成事情charsbar
 
What you need to remember when you upload to CPAN
What you need to remember when you upload to CPANWhat you need to remember when you upload to CPAN
What you need to remember when you upload to CPANcharsbar
 
On UnQLite
On UnQLiteOn UnQLite
On UnQLitecharsbar
 
typemap in Perl/XS
typemap in Perl/XS  typemap in Perl/XS
typemap in Perl/XS charsbar
 
Analyze CPAN, Analyze Community
Analyze CPAN, Analyze CommunityAnalyze CPAN, Analyze Community
Analyze CPAN, Analyze Communitycharsbar
 
Annual Report 2012
Annual Report 2012Annual Report 2012
Annual Report 2012charsbar
 
DBD::SQLite
DBD::SQLiteDBD::SQLite
DBD::SQLitecharsbar
 
CPANTS: Kwalitative website and its tools
CPANTS: Kwalitative website and its toolsCPANTS: Kwalitative website and its tools
CPANTS: Kwalitative website and its toolscharsbar
 
CPANTS 2012
CPANTS 2012CPANTS 2012
CPANTS 2012charsbar
 
Revisiting ppm
Revisiting ppmRevisiting ppm
Revisiting ppmcharsbar
 
変数、リファレンス
変数、リファレンス変数、リファレンス
変数、リファレンスcharsbar
 
關於perl的 文件翻譯
關於perl的文件翻譯關於perl的文件翻譯
關於perl的 文件翻譯charsbar
 
Practical Bug Reporting
Practical Bug ReportingPractical Bug Reporting
Practical Bug Reportingcharsbar
 
Top Tens of 2008/2009
Top Tens of 2008/2009Top Tens of 2008/2009
Top Tens of 2008/2009charsbar
 

More from charsbar (19)

Common boolean class_for_perl5
Common boolean class_for_perl5Common boolean class_for_perl5
Common boolean class_for_perl5
 
2018年夏のPerl5
2018年夏のPerl52018年夏のPerl5
2018年夏のPerl5
 
萬國之津梁
萬國之津梁萬國之津梁
萬國之津梁
 
Better detection of what modules are used by some Perl 5 code
Better detection of what modules are used by some Perl 5 codeBetter detection of what modules are used by some Perl 5 code
Better detection of what modules are used by some Perl 5 code
 
perl language update
perl language updateperl language update
perl language update
 
2013年のCPANモジュール作成事情
2013年のCPANモジュール作成事情2013年のCPANモジュール作成事情
2013年のCPANモジュール作成事情
 
What you need to remember when you upload to CPAN
What you need to remember when you upload to CPANWhat you need to remember when you upload to CPAN
What you need to remember when you upload to CPAN
 
On UnQLite
On UnQLiteOn UnQLite
On UnQLite
 
typemap in Perl/XS
typemap in Perl/XS  typemap in Perl/XS
typemap in Perl/XS
 
Analyze CPAN, Analyze Community
Analyze CPAN, Analyze CommunityAnalyze CPAN, Analyze Community
Analyze CPAN, Analyze Community
 
Annual Report 2012
Annual Report 2012Annual Report 2012
Annual Report 2012
 
DBD::SQLite
DBD::SQLiteDBD::SQLite
DBD::SQLite
 
CPANTS: Kwalitative website and its tools
CPANTS: Kwalitative website and its toolsCPANTS: Kwalitative website and its tools
CPANTS: Kwalitative website and its tools
 
CPANTS 2012
CPANTS 2012CPANTS 2012
CPANTS 2012
 
Revisiting ppm
Revisiting ppmRevisiting ppm
Revisiting ppm
 
変数、リファレンス
変数、リファレンス変数、リファレンス
変数、リファレンス
 
關於perl的 文件翻譯
關於perl的文件翻譯關於perl的文件翻譯
關於perl的 文件翻譯
 
Practical Bug Reporting
Practical Bug ReportingPractical Bug Reporting
Practical Bug Reporting
 
Top Tens of 2008/2009
Top Tens of 2008/2009Top Tens of 2008/2009
Top Tens of 2008/2009
 

Mojolicious::Liteを使ってみよう

  • 1. Mojolicious::Lite を使ってみよう February 19, 2011 Hokkaido.pm #4 Kenichi Ishigaki (charsbar) はじめに Hokkaido.pm #4 の午前の部では Mojolicious::Lite を使って簡単なウェブアプリケーショ ンをつくってみます。わからないことがあったら遠慮なく質問してください。また、ある 程度わかっている方はどんどん先に進んでいただいて結構です。 なお、今回の講習ではほとんどの作業をコマンドプロンプト/シェルから行います。みな さんご存じと思いますが、Windows をお使いの方はスタートメニューから「すべてのプロ グラム」などと書かれたメニューを開き、「アクセサリ」の中に入っている「コマンドプロ ンプト」(または「Windows PowerShell」)というアプリケーションを、MacOSX を含む Unix 系の方はターミナル、端末等々の名前がついているアプリケーションを起動してくだ さい。以下、コマンドプロンプトから実行するコマンドについては、下記のように表記し 「>」は Windows のコマンドプロンプトです(Unix 系 OS をお使いの方は適宜読み ます。 替えてください)。  (コマンド名) (引数...) Mojolicious(::Lite)について Mojolicious(::Lite)は、Perl 界でもっとも有名なウェブアプリケーションフレームワークの ひとつである Catalyst の原作者ゼバスティアン・リーデル(Sebastian Riedel)氏が 2008 年 から開発しているウェブアプリケーションフレームワークです。過去の経緯については gihyo.jp の特集記事、連載記事にまとめてありますが、これらはすでに古くなっているので 参考程度にとどめてください。 http://gihyo.jp/dev/feature/01/mojo http://gihyo.jp/dev/serial/01/modern-perl/0022
  • 2. いま Mojolicious(::Lite)を使う理由としては、たとえば次のようなものがあげられます。 - インストールが簡単 - 昔の CGI スクリプトと同じく、簡単なサイトならファイルひとつで配布可能 - Mojolicious そのもののインストールも外部依存がないので簡単 - Windows 環境でも問題なくインストールできます - 小規模サイトなら Apache などの外部サーバも必要ありません - サイトの成長にあわせて Mojolicious::Lite から Mojolicious に移行可能 - 簡単なことは簡単にできますし、複雑なことにも対応できます - ドキュメントも少しずつ充実してきました - http://mojolicio.us/perldoc - https://github.com/kraih/mojo/wiki - http://wiki.livedoor.jp/mojolicious/ - ウェブ標準に敏感で、最近の仕様にもわりと早く追随してくれます - WebSocket とか HTML5 とか 一方で、このような批判もありました。 - 開発中の仕様変更やファイルの再配置が多かった - 連載記事などのサンプルコードには半年ともたず古びたものもありました - バージョン 1.0 になったので、今後極端に大きな仕様変更は減ると期待されます - それでもリーデル氏の過去の言動から安定性を不安視する人はいるのですが… - 遅い - まだ十分な最適化が行われていない場所はあるかもしれません - 必要に応じて外部モジュールで高速化することはそうむずかしくありません - そもそもどのくらいの速度が必要ですか? - 独自モジュールが多く学習コストが高い - 既存の古いモジュールの置き換えがひとつの目的なのである意味仕方ありません - 必要に応じて外部モジュールを利用することはそうむずかしくありません この原稿を書いている現在、Mojolicious の最新版はバージョン 1.1 です。お手元のバージ ョンが古い場合、細かな挙動が異なる可能性がありますので、なるべく最新版に更新して ください。
  • 3. 今回つくるアプリケーションについて 今回は自宅でも手軽に利用できるものとして、Wiki っぽいアプリケーションをつくってみ ます。時間も限られていますので、最初は特定のディレクトリ配下のファイルの内容をブ ラウザ経由で表示・更新できるだけのものをつくり、そこから順に発展させていくことに しましょう。 初期の要件は以下の通りとします。 - 指定したディレクトリ配下のファイルとサイトの URL が一対一対応するものとします - 「http://.../html/(ファイル)」でファイルの内容を表示してください - 「http://.../html/(ファイル)/update」で内容を更新したいです - 「http://.../html/(ファイル)/delete」でファイルの削除 - 「http://.../html/(ファイル)/create」で新規ファイルを作成 - 「http://.../html/(ディレクトリ)」の場合はファイル一覧を表示しましょう 時間に余裕があったらこのあたりまで対応できるといいですね - もちろん見栄えはよくしておくにこしたことはありません - 静的ファイルをいくつか追加しましょう - POD や markdown テキストが含まれていたら HTML にレンダリングした方がよいかも - 知らない拡張子の場合は更新できないようにした方が無難でしょう - バイナリとしてダウンロードさせる手もありそうですが - 特定のユーザのみ閲覧・更新可能なページがあるといいかも - ファイルのパーミッションも確認しましょう(読み込み専用コンテンツ) - 「http://.../api/...」にアクセスしたらコンテンツを JSON で返してほしいです - 検索もできるにこしたことはありません - Wiki というなら更新履歴や差分もほしいところでしょう - ディレクトリをまるごと git 管理してみましょうか - 更新時の衝突回避はどうしましょうか - XSS や CSRF の対策は十分ですか - cf. Mojolicious::Plugin::CSRFDefender (https://github.com/shiba-yu36/p5-Mojolicious-Plugin-CSRFDefender)
  • 4. Perl と Mojolicious のインストール Windows をお使いの方で Perl のインストールが済んでいない方は下記サイトから ActivePerl ないし Strawberry Perl をインストールしてください。 ActivePerl: http://www.activestate.com/activeperl/downloads Strawberry Perl: http://strawberryperl.com/ Mojolicious(::Lite)は CPAN からダウンロードできます。コマンドプロンプトから以下のコ マンドを実行してください。  (sudo) cpan Mojolicious また、公式サイトから tarball をダウンロードすることもできます。 http://latest.mojolicio.us/ 最新の開発版は github からチェックアウトしてください。  git clone git://github.com/kraih/mojo ひな形をつくる Mojolicious のインストールが済んだら、適当なディレクトリに移動して、以下のコマンド を実行してください。myapp.pl の部分はお好きな名前に変えていただいて結構です。  mojo generate lite_app myapp.pl # カレントディレクトリのファイル一覧を表示して、myapp.pl というファイルができてい ることを確認してください。
  • 5. ブラウザで確認してみよう Mojolicious::Lite アプリケーションには標準でウェブサーバ機能が用意されています。コマ ンドプロンプトから以下のコマンドを実行してください。  perl myapp.pl daemon # ウェブブラウザを起動して、実際にサイトが表示できるか確認してください。 http://localhost:3000 サーバを止めたい場合はコマンドプロンプトで Ctrl+C などを入力します。 Plack をインストール済みの方は以下のコマンドも実行してみましょう。  plackup -a myapp.pl # こちらもウェブブラウザを起動して、実際にサイトが表示できるか確認してください。 http://localhost:5000 ひな形アプリケーションのお役立ち機能 ひな形アプリケーションを起動したあと、下記の URL に移動するとインストール済みの Mojolicious のドキュメントを読むことができます(古い Perl をお使いの方は CPAN から Pod::Simple の最新版をインストールする必要があるかもしれません)。 http://localhost:3000/perldoc この機能はおもに Mojolicious::Plugin::PodRenderer のなかで実装されています。今回のサ ンプルアプリケーション作りの参考になりそうですね。 確認が済んだら、pod_renderer というプラグインを読み込んでいる行は消してしまってく ださい。
  • 6. ふたつの道 ここから先はふたつの道があります。 目で動作確認しながらでないと落ち着かない方はディスパッチャの設定からしてしまいま しょう。仮テンプレートの作成などが必要になるのでいくらか余計に手間はかかりますが、 実際に動いているのが確認できるので、不慣れなうちはこちらの方が楽しく書けますし、 上司や顧客が相手でも途中経過を見せやすいです。ただし、こちらの道を通ると、なまじ 目チェックが入るせいで、特に異常時のテストがおろそかになりがちですし、どうしても ウェブの事情を優先してしまいがちなので、あとで拡張に苦労することも多くなります。 また、バグが出たときに問題の切り分けがややむずかしくなります。 ある程度開発に慣れている方ならモデルを書いていく方が早道です。関心を分離しながら の作業になるので、最終的に表示部分を作るまで人には見せられないのが難点ですが、こ のモデル部分はウェブの表示以外にも使えますから、自動テストはもとより、データの収 集や加工用のスクリプトなどが必要な場合にも対応しやすくなります。 ディスパッチャ(ルータ)を用意する Mojolicious::Lite のディスパッチャについては、Mojolicious::Lite のドキュメントのほか、 Mojolicious::Guides::Routing というドキュメントによくまとまっています。ごく基本的な 構成は次の通りです。 get (または post、any など) '/(対象となるパス)' => sub { ... }; パスにはさまざまなプレースホルダを利用できます。今回の例ではいちばんゆるいワイル ドカード型のプレースホルダを利用するのが楽でしょう。サブルーチンの中身はひとまず 最初に用意されていた「/welcome」のものをコピーしておいてください。 get '/html/(*path)/create' => sub { ... }; get '/html/(*path)' => sub { ... }; なお、このように変化しない共通の部分がある場合は under コマンドを利用すると便利で
  • 7. す。 under '/html'; # 以下のパスはすべて /html 配下になります。 get '/(*path)/create' => sub { ... }; get '/(*path)' => sub { ... }; また、特にワイルドカード型のプレースホルダを使う場合、条件のゆるいルートを先に書 いてしまうと、後続のパスが無視される結果になることがあります。設定の記載順には注 意してください。 必要なパスの設定が済んだら、コマンドラインから以下のコマンドを実行して、ルートが 正しく設定されているか確認しましょう。期待通りの正規表現が表示されていますか?  perl myapp.pl routes ルーティングの際に受け取ったパスは、stash、あるいは param から取り出せます。index テンプレートに手を入れてどんなパスを受け取ったか確かめてみましょう。 @@ index.html.ep % layout 'default'; % title 'Welcome'; Welcome to Mojolicious! <%= stash 'path' %> Mojolicious::Lite のテンプレートについては、Mojolicious::Lite のドキュメントのほか、 Mojolicious::Guides::Rendering というドキュメントによくまとまっています。基本的には 必要なところに「<%= (Perl の変数、式) %>」を埋め込んでいくだけですが、条件文など、 より複雑な式を書く場合は、行頭を「%」で始めると、その行はそのまま Perl として解釈 されます。また、stash をはじめ、Mojolicious の標準テンプレートにはヘルパーコマンド が い く つ か 用 意 さ れ て い ま す 。 詳 し く は Mojolicious::Plugin::DefaultHelpers と 、 Mojolicious::Plugin::TagHelpers をそれぞれ確認してみてください。
  • 8. Mojolicious の テ ン プ レ ー ト に な じ め な い 方 は 、 MojoX::Renderer::TT や MojoX::Renderer::Xslate といった代替品もありますが、なかには最新版に対応していない ものもあるかもしれません(TT の最新版は Windows だとテストに失敗するようです)。 ディスパッチャのテストを書く ディスパッチャを書いたら、期待通りの動作をしているか、テストしてみましょう。先ほ どのようにサーバを起動してブラウザで確認してもかまいませんが、Mojolicious に同梱さ れている Test::Mojo を使うとあたかも人間が実際にアクセスしたかのようなテストコード を書くこともできます。試しに myapp.pl と同じディレクトリに test.t というテストスクリ プトを用意してみましょう。 use strict; use warnings; use Test::More; use Test::Mojo; require 'myapp.pl'; my $t = Test::Mojo->new; $t->get_ok('/html/foobar')->status_is(200); done_testing; ここではまだステータスコードの確認しかしていませんが、Mojo::DOM の機能を使うと CSS セレクタを利用して HTML の中身を細かく調べることもできます。詳しくは Test::Mojo と Mojo::DOM をそれぞれ確認してみてください。 モデルをつくる モデリングの仕方にもさまざまな流儀がありますが、ここではあまり細かなことは考えず、 モデルの適切なメソッドに「/foo/bar」のようなパス情報(と、必要に応じて更新用のデー タ)を渡したら、該当するファイルの内容を取り出したり、更新したりできるようになっ ていればよしとしましょう。
  • 9. また、テストのしやすさを考えて、表示・更新に使うファイルを格納するディレクトリは オブジェクト作成時に変更できるようにしておくのが無難です。 本当に小さなアプリケーションで、モデルクラスもそれほど大きくならないことがわかっ ている場合は、myapp.pl スクリプトと同じディレクトリに MyApp.pm のようなモジュー ルを用意してもかまいませんが、ここではいずれほかのモジュールも追加することになる ことが予想できますので、CPAN モジュールで一般的に使われているレイアウトにあわせ ることにしましょう。lib ディレクトリを掘って、lib/MyApp.pm というファイルを用意し ます。 package MyApp; use strict; use warnings; use File::Spec; sub new { my $class = shift; bless {@_}, $class; } sub home { shift->{home} || '.' } sub read { my ($self, $path) = @_; my $file = File::Spec->catfile($self->home, $path); open my $fh, '<', $file or die $!; local $/; return <$fh>; } sub create { my ($self, $path, $content) = @_; my $file = File::Spec->catfile($self->home, $path); open my $fh, '>', $file or die $!; print $fh $content; } 1;
  • 10. モデルをテストする モデルが書けたらテストもしましょう。CPAN のレイアウトにあわせてテストファイルは t ディレクトリ以下に置くことにします。t/model.t というスクリプトを用意してください。 use strict; use warnings; use FindBin; use lib "$FindBin::Bin/../lib"; use MyApp; use Test::More; my $testdir = "$FindBin::Bin/test"; mkdir $testdir unless -d $testdir; my $m = MyApp->new(home => $testdir); $m->create('foo', 'foobar'); is $m->read('foo') => 'foobar'; done_testing; Mojolicious::Lite アプリにモデルを組み込む 最後に Mojolicious::Lite アプリからモデルを呼び出せるようにしましょう。 まずは myapp.pl の先頭の方にこのようなコードを追加します。 use lib 'lib'; use MyApp; my $model = MyApp->new(home => app->home); app->helper(model => sub {return $model});
  • 11. これで app->model からモデルを呼び出せるようになりました。正しくファイルが読み込め ているか確認しましょう。 get '/(*path)' => sub { my $self = shift; my $content = app->model->read($self->param('path')); $self->stash(content => $content); $self->render('index'); }; @@ index.html.ep % layout 'default'; <%= stash 'path' %> <pre> <%= stash 'content' %> </pre> この変更を加えたことで、先ほど書いたディスパッチャのテストが通らなくなったはずで す。ファイルが存在している場合、していない場合等々、さまざまな条件を考慮したテス トを書いてみましょう。また、モデルの設計として、最初はあっさり die させておきました が、本当にこれでよかったでしょうか? Mojolicious はデフォルトのままだと utf8 が前提になっているため、このままだと、環境に よっては日本語を含むファイルなどが文字化けします。Encode や Mojo::ByteStream を利 用して文字コードまわりの対応も強化する必要があるはずです。また、utf8 以外の文字コ ードを利用するなら Mojolicious::Plugin::Charset を組み込む必要もあるでしょう。 今回は時間がたりず、紙の資料はここまでしか用意できていませんが、このセッション内 でも、そのあとでも、わからないことがあったら遠慮なく質問してください。 Happy Hacking!