― Web Technology and Life ―

モダンPerl製サイトのベース解説書『Plack Handbook』を読んだ

2012-10-30
Plack Handbookは、CGI以降の最近のPerlを使ったウェブサイトを作る上でベースとなるPSGIという仕様の実装であるPlackのまとまった(電子)書籍です。待ちに待ってましたという感じだったんですが、でやっと入手して読んだ感想とかをメモります。

といいつつPlackって何?詳しく教えて?

上述した通りなものがPlackなのですが、FTPでアップしてふんふんふん、という事をしている人にとって、いまいちピンとこないのがPlackだと思います。昔は、FTPを使って.cgiファイルみたいなのをアップしてちょっとした動的な動きをするページを作るには、PerlだとCGI.pmというCPANモジュールに準拠しながらいろいろと作っていたのです。ただ、ApacheのCGIという技術の上だと、何分毎回プログラムファイルの読み込みをとかを行うので遅かったりしたのです。そこで、FastCGIとかmod_perlとかCGIの代わりとなるApache上の技術がいくつか出ていたのですが、Perl側での実装は、FastCGIだったら、mod_perlだったら、とケースバイケースで変更しなくてはいけなくて、なかなかめんどかったんですね。そこで、どんなサーバー実装を行なってもPerlのプログラム実装は同じにできるというPlackがいい感じに広まったのです。これ以上は、Plack Handbookを読んでくださいw

Plack Handbookの目次

とにもかくにも目次で雰囲気をば。

  • イントロダクション
  • Day 1: Plackを入手
  • Day 2: Hello World
  • Day 3: plackupを使う
  • Day 4: アプリケーションのリロード
  • Day 5: Plackで静的サーバを起動する
  • Day 6: CGIアプリケーションをPSGIに変換
  • Day 7: WebアプリケーションフレームワークをPSGIで利用する
  • Day 8: WebフレームワークをPSGIに対応させる
  • Day 9: CGIスクリプトをPlackで走らせる
  • Day 10: Plackミドルウェアの利用
  • Day 11: Plack::Builderを使う
  • Day 12: 複数のアプリケーションをmountとURLMapでマウントする
  • Day 13: Plack::Test でアプリケーションをテストする
  • Day 14: Plack::Requestを利用する
  • Day 15: ミドルウェアでアプリケーションの認証
  • Day 16: アプリケーションにJSONPサポートを追加する
  • Day 17: 静的ファイルを配信する
  • Day 18: ミドルウェアを条件ロードする
  • Day 19: 複数のアプリケーションをカスケードする
  • Day 20: ローカルアプリケーションにインターネットからアクセスする
  • Day 21: アプリケーションとミドルウェアのLintチェック
  • Day 22: さらにミドルウェアの紹介
  • Day 23: ミドルウェアを書く
  • Day 24: まとめ

Plack Handbookの入手方法

Plackが日本語でまとまっている書籍は『Perl CPANモジュールガイド』くらいしかなかったのですが(他にあったら教えて下さい!)、Autherの宮川達彦さんが以前、英語で公開したPlackの記事をまとめて電子書籍化し、しかも日本語版までつけてくれたのが、このPlack Handbookです。このリンクからいけば、買えるのですが、gumroadの購入のためのUIがわかりづらくで、ページにいったら、「$5」か「欲しい」というボタンをクリックすれば買えるということをここにメモっておきますw

とにかく、英語の苦手なマジョリティープログラマーにとって、日本語の情報は貴重であり、この上ない喜びなのですね。英語がんばって読めというのは、アリアリなのですが、まぁ日本語のほうが勘違いなく理解できるんで、あればそっちを読もうと、あるいは、あるなら読もうかな、というのも、やっぱりアリアリです(苦笑

個人的なメモ

Plack Handbookを読んで、知らなかったこととか、「こういうのわからなくて調べたなー」こととか、「こういうのよかったなー」ということを個人的なメモ的にまとめておきます。

plackupコマンドがデフォルトで有効にするミドルウェア

  • Lint
  • AccessLog
  • StackTrace

開発時に役立つものたち(この前、Lintではまった)。向こうにするには、-Eオプションにdevelopment以外の値をセットするか、--no-default-middleware オプションを使う。※plackupのオプションは、plackup --helpで確認できる。

-rオプションと-L Shotgunの違い

両者も編集したコードがWebアプリのリクエスト毎に反映できるようにするオプション。(Plackは基本的には高速にレスポンスすることを目的としてplackupしてサーバーを立ち上げるとプログラムファイルはすべてメモリ上にロードされるようになっている)

-rはファイルの変更を監視しているので、CPUを食う。-L Shotgunはリクエスト毎に読み直す。その他、以下も参考になる。

plackupのワンライナー

plackupコマンドは、perlコマンド同様、-I(インクルードパス), -M(ロードするモジュール)や-e(実行するコード)を指定できるため、ワンライナーでPSGIアプリを書くことができます。

ということで、Plack::App::Directory が便利だった件とか読んで、シェル(zsh使ってます)の.zshrcに

     alias static_plackup="plackup -p 5555 -e \"use Plack::App::Directory; Plack::App::Directory->new({root=>'./'})->to_app\""

とつけてウハウハしています。

静的なファイル配信

以下のモジュールが便利とPlack Handbookで紹介されているんですが、

  • Plack::App::File
  • Plack::App::Directory

/にアクセスしたらindex.htmlにいってほしかったりというのがあったりするので、hide_o_55さんにPlack::Middleware::Rewriteっていうのを教えてもらって

use strict;
use warnings;
use Plack::App::Directory;
use Plack::Builder;

builder {
    enable 'Rewrite', rules => sub {
        return 301 if s{^(.*)/$}{$1/index.html};
    };
    Plack::App::Directory->new({ root => './' })->to_app;
};

という感じにしています。ワンライナー的には

 plackup -p 5555 -MPlack::Middleware::Rewrite -MPlack::App::Directory -e "Plack::Middleware::Rewrite->wrap(Plack::App::Directory->new({root=>'./'})->to_app,rules => sub { return 301 if s{^(.*)/$}{$1/index.html}})"

まぁ長いですね。。。

【追記:2012-10-30 17時頃】この記事書いたらhide_o_55さんにPlack::Middleware::DirIndexってのもあるよって教えて頂きましたー!

use strict;
use warnings;
use Plack::App::Directory;
use Plack::Builder;

builder {
    enable "Plack::Middleware::DirIndex", dir_index => 'index.html';
    Plack::App::Directory->new({ root => './' })->to_app;
};

/だったらindex.htmlにしたいというのは、どんぴしゃでこっちのほうがわかりやすいですねー♪ありがとうございますっ!!

CGIアプリケーションをPSGIに変換とか

CGI::PSGI を使うと、既存のCGI.pmベースのアプリケーションをPSGIに簡単に変換できる。CGI::Compile,CGI::Emulate::PSGI,Plack::App::CGIBinこのあたりを使うと、ホントに何もせずに、PlackベースでCGIスクリプトを起動できる。

Plack::Builderまわりのごにょごにょ

  • $appに近いほど、enableしたミドルウェアは内側になっている
  • enable "+MyFramework::PSGI::MW::Foo";できちゃう
  • builderで使えるmount関数は、Plack::App::URLMapのmountのショートカット

Plack::Utilとの合わせ技

Amon2のLargeフレイバーでやっているやつ

builder {
    mount '/admin/' => Plack::Util::load_psgi('admin.psgi');
    mount '/' => Plack::Util::load_psgi('pc.psgi');
};

オススメのPlack::Middleware::, Plack::App::

  • Plack::Middleware::Auth::Basic
  • Plack::Middleware::JSONP
  • Plack::Middleware::Static
  • Plack::Middleware::Lint
  • Plack::Middleware::ErrorDocument
  • Plack::Middleware::Session
  • Plack::Middleware::Debug(リクエスト時間、メモリ使用量がリクエスト毎にわかる)
  • Plack::App::File
  • Plack::App::Directory
  • Plack::App::Cascade(URLのChain of responsibility)
  • Plack::App::Proxy(プロキシの機能を単体でもてる)

加えて、ミドルウェアの書き方が載っていて、Plackのミドルウェア構造を理解するという意味でも大変うれしい。

最後に

『Perl CPANモジュールガイド』のPlackの解説も大変うれしい情報づくしなのですが、『Plack Handbook』にしか載っていない情報もあるんで、是非是非合わせてチェックしておきたい本だと思いました。

あとなんか、Perlってユーザー数少ないからなかなかリアルな本になりにくいって話はよく上がっていると思うのですが、そんな中で電子書籍っていう方法でまとめていくっていうのは、著者(有識者)にも読者(学びたい人たち)双方にとって、いい感じのインセンティブがとれてとてもいいと思っているので、とりあえず、寄付代わりにPlack Handbookを購入するなんて方法もいいんじゃないかなと思いました。

もうひとつ、そろそろperldoc.jpにも、PSGIとかの訳を書いてもいいなーと思いつつ、、、という感じですねー。来年は多少、PSGI/Plackに限らず、perldoc.jpに翻訳をあげる活動をしたいと思いますー。

Perl update_at : 2012-10-30T17:12:13
hirobanex.netの更新情報の取得
 RSSリーダーで購読する   
blog comments powered by Disqus