>100 Views
February 25, 24
スライド概要
2012/05/13 に Hokkaido.pm#7 で発表したスライドです。
I like 🚌 and ☕
Perl WAF Overview, with mod_perl 株式会社fonfun 尾形 鉄次 (OGATA Tetsuji) Twitter: @xtetsuji 2012/05/12 Hokkaido.pm#7
*Preface for readers* • このスライドは 2012/05/13に行われた Hokkaido.pm#7にて「飛び入りLT」を 行った際に休憩時間中の10分で作った 即席スライドに、実際のトーク内容を 織りまぜて再編集したものです
自己紹介
自己紹介 • 尾形 鉄次 (OGATA Tetsuji) • Twitter: @xtetsuji • Blog: http://post.tetsuji.jp/ • 出身は北海道河東郡音更町(帯広市の隣) • 大学で上京して現在は東京の会社に勤務
自己紹介 • Hokkaido.pm 3回目の参加 • Hokkaido.pm#5「mod_perl温故知新」 • Hokkaido.pm#6「mod_perl Hacks PHP」 • モダンPerlに乗れていない30代 • mod_perl Hacker…なのか?
所属紹介 • 株式会社fonfun(フォンファン) http://www.fonfun.co.jp/ • 主力製品:リモートメール http://rmail.jp/
Perl WAF, ancient and modern
Perl WAF, ancient • raw (not WAF?) • CGI::Application • ...etc
Perl WAF, modern • Catalyst • Jifty • ...etc
Perl WAF, post-modern • Dancer • Mojolicious • Amon2 • Kossy • ...etc
What is WAF? • 「MVC分離」を促進するもの? • 違う • Catalystの失敗例? • ModelをWAFに密着させると、外側の 管理ツール等から使いづらくなる
What is WAF? • 私はこう思う… HTTP Request/Responseの抽象化
What is WAF? • HTTP Request/Responseの抽象化 • Web Serverごとの差異を吸収 • Catalyst::Engine:: とかのバッドノウハウ • PSGI/Plackの結実へ
そんな細かい事より mod_perl2
みんな大好き mod_perl2
Latest Perl WAF fashion • Sinatra (WAF, powered by Ruby) Like • Perl post-modern WAFs almost have Sinatratic syntax • Lightweight • Controller oriented
WAF by mod_perl2 • mod_perl1 は割愛、mod_perl2 を使う • mod_perl2 のResponseHandlerを Sinatra Like にすれば WAF って言っていいん ジャマイカ?
WAF by mod_perl2 • 「Web Serverごとの差異を吸収」とか さっき言っていた事は無視! • Apache2/mod_perl2べったり • mod_perl2の $r (Apache2::RequestRec)は Request/Responseを良く抽象化している
mod_perl2 handler’s simple “Hello world”
package MyApache2::Hello;
use strict;
use warnings;
use Apache2::RequestRec;
use Apache2::RequestIO;
use Apache2::Const -compile => qw(OK);
sub handler {
my $r = shift;
$r->content_type("text/plain");
$r->print("Hello, world");
return Apache2::Const::OK;
}
1;
__END__
<Location />
PerlResponseHandler MyApache2::Hello
</Location>
これをSinatra Likeに すればいい
ならばと書いてみた MyApache2::Sinatratic
package MyApache2::Sinatratic;
use strict;
use warnings;
# $CALLBACK->{$handler_package}->{$http_method} = [ [$url, $handler], ... ];
my $CALLBACK = {};
sub import {
my $pkg = shift;
my @args = @_;
my $callpkg = caller(0);
for my $method (qw(get post put del)) {
$CALLBACK->{$callpkg}->{$method} = [];
}
# sub handler definition
require Apache2::RequestRec;
require Apache2::RequestUtil;
require APR::Table;
no strict 'refs';
*{"$callpkg\::handler"} = \&import_handler;
for my $method (qw(get post put del)) {
*{"$callpkg\::$method"} = sub {
my ($url, $handler) = @_;
push @{$CALLBACK->{$callpkg}->{$method}}, [$url, $handler];
};
}
*{"$callpkg\::default"} = sub {
my $handler = shift;
$CALLBACK->{$callpkg} ||= {};
$CALLBACK->{$callpkg}->{default} = $handler;
};
}
概要はこんな感じ
mod_perl2 handler’s Sinatratic “Hello world”
package MyApache2::Hello2;
use strict;
use warnings;
use Apache2::RequestRec;
use Apache2::RequestIO;
use Apache2::Const -compile => qw(OK);
use MyApache2::Sinatratic;
get '/' => sub {
my $r = shift;
$r->content_type("text/plain");
$r->print("Hello, world");
return Apache2::Const::OK;
};
1;
__END__
<Location />
PerlResponseHandler MyApache2::Hello2
</Location>
Sinatraっぽくなった! mod_perl2もWAFだ!
MyApache2::Sinatratic • …というのは完全なるジョーク • 足りない機能、バグ満載 • プレースホルダに対応したつもり程度
MyApache2::Sinatratic • 物好きのためにGistに放り込んだ • 使う人はいないと思うけど、使おうと 思う勇者はCAVEATSを熟読して! • 勇者が集まればModPerl::Sinatratic(仮称) プロジェクトもやっちゃうかも!
MyApache2::Sinatratic • 書いていて思った事 • Sinatra LikeなWAFって、Plack無しでも こう作ればいいんだと勉強できた • シンボルテーブルいじり楽しい♪ • I ♡ Perl!
ご清聴 ありがとうございました