2013年7月29日
Puncheurのご紹介改めオレオレWAFを作ってしまった件
職質テックトークでもちょっと話したのですが、 PuncheurというWAFを作ってCPANにもあげてしまいました。
読み方はパンチャーですが、パンツァーでもパンチラでもなんでもいいです。
気軽に開発を始められてカスタマイズ可能なWAFとなっております。 最低限のユーティリティーを提供しつつ、DispatcherとViewは差し替え可能になってるという、最近よくあるあれです。 実際かなりAmon2からコピペです。
ちょっとしたPSGIアプリケーションをCPANで配布する的な用途に向いているのが大きな特徴となっています。
主な特徴としては以下。
- Perl5.8切り捨て
- すべて
MyApp->new(%opt)
から始まる- MyApp->new(%opt)->to_psgi; って書ける
- my $c = MyApp->new(%opt); ってCLIで書ける
- Lite的な奴も.psgiにべろっと書かずに、ちゃんとpackage書いて、
plackup -MMyApp -e 'MyApp->new->to_psgi'
すればいい
- configファイル決め打ちじゃなくて、指定もできるように
- myapp.pl みたいなサーバー起動スクリプトが書きやすい
- プロジェクトディレクトリ前提ではない
- 比較的一枚岩。あんまFlavor有りきにはしない
- Puncheur::Requestが高速(なはず)
Perl5.8切り捨て
//
とかstate
とかsay
とかが使えると捗りますね。
すべてMyApp->new(%opt)
から始まる
MyApp->new(%opt)->to_psgi
とか書くのが分かりやすいんじゃないかなーと思います。コンストラクタにオプションとか渡せると分かりやすそう。
my $c = MyApp->new(%opt)
とかやればそのままコンテキストオブジェクトとしてCLIでも使える感じ。Plugin::Modelを使えば、
$c->model(...)
みたいなやつもできます。
1ファイルアプリみたいなのもPuncheur::Lite
を使えば書けますが、psgiにベロっと書くんじゃなくて、ちゃんとpackage書いてplackup -MMyApp -e 'MyApp->new->to_psgi'
すればいいんじゃないか的な思想になっております。
configファイルも決め打ちじゃなくて指定できるように
従来の多くのWAFだとconfigファイルが規約で決まっていたりするわけですが、同じリポジトリでメインアプリと管理画面を管理したいみたいなときに困ることがあります。
Puncheurでは、MyApp->new(config => $conf:filename|HashRef)
などとすることにより設定を差し替えることが可能です。
Amon2と同様にload_config
をオーバーライドすることで設定読み込みを変更することも可能です。
myapp.plみたいなサーバー起動スクリプトが書きやすい
割と目玉機能のつもりですが、以下の様なスクリプトを書けば簡単にサーバーとして使うことができます。plackupに指定するオプションや、MyApp->new
に渡すオプションを
混ぜこぜで使うことができます。(ちょっとこの辺りは変更の可能性があります)
% cat my-app.pl
#!/usr/bin/env perl
use strict;
use warnings;
use Puncheur::Runner;
# MyAppはPuncherアプリ
Puncheur::Runner->new('MyApp', {
# default plack settings
server => 'Starlet',
port => 1988,
})->run;
% ./myapp.pl -p 9955 --config my_config.pl
プロジェクトディレクトリ前提ではない
単なるプロジェクトディレクトリ形式だけではなく、CPANで配布する用のアプリを作りやすくなっています。例えばテンプレートディレクトリの デフォルト配置配置が share/tmpl になっているところもそんな狙いが伺えます。
比較的一枚岩。あんまFlavor有りきにはしない
Puncheur.pmを読めば比較的処理が分かるんじゃないかと思います。Flavorとか使わないでも気軽に書き始められる感じになっております。 現状Flavor機構はないのですが、そのうち追加はしたいなーとは思っています。
Puncheur::Requestが高速(なはず)
req->uri
やreq->base
をキャッシュしたり、クエリのパースにURL::Encodeを利用したりと高速な感じになっております。
この辺はNephia::Requestで得られた知見を盛り込んでおります。
クエリのパースに関しては、Plack::MiddlewareのどこかでPlack::Requestが使われたりするとあんま意味が無かったりします。
Plack::Requestが自動的にPlack::Request::XSとかに差し替わるようになってると嬉しいのかなーとか思ったりもしましたが、
クエリのパースコストがそこまで支配的になることは少ないのかも知れません。
テストがない。ドキュメントがない。メモリリーク周りケアできてるかよくわかってないと三重苦ですが、その辺を解決しつつ、 その後はflavorとかPluginとか多少充実させるかなーとか思っております。
Puncheurを使った、RijiというBlogアプリケーションもCPANに上げてありますがその説明はまたそのうち。
Puncheurの名前の由来としては、元々PHPっぽい名前ってことで、PhiloPurple(紫が好き、的な造語)という名前にしていたのですが 覚えづらいし、思ったよりまともな出来になってきたので、ちゃんとした名前にしたいなーと思ったので変更した次第。
“Roadie”という名前も考えたのですが、RubyにHTMLメールを配信するための同名のgemがあり、メンテもしっかりされている 感じだったので諦めた感じでした。Puncheurも自転車用語ですがそのへんの話も職質テックトークで 軽く触れていますので、お聞きいただければと思います。