• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Mojolicious::Liteを使ってみよう
 

Mojolicious::Liteを使ってみよう

on

  • 5,851 views

Hokkaido.pm #4

Hokkaido.pm #4

Statistics

Views

Total Views
5,851
Views on SlideShare
5,846
Embed Views
5

Actions

Likes
7
Downloads
59
Comments
0

3 Embeds 5

http://orhowilearnedtolovetheperl.com 2
http://s.deeeki.com 2
http://www.slideshare.net 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Mojolicious::Liteを使ってみよう Mojolicious::Liteを使ってみよう Document Transcript

    • 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/mojohttp://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/downloadsStrawberry 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!