ホーム > perl
perlのアーカイブ
YAPC::Kyoto 2023参加してきました
- 2023/3/24 金曜日 16:25:51
- perl
YAPC::Kyoto 2023に参加してきました。YAPCにはYAPC::Asia Tokyo 2015以来の参加なので、なんと8年ぶり(!)。
トーク応募もせずに京都までいくのはどうなんだろうとも思ったのですが、実は京都に一度も訪問したことがなかったため家族も呼び寄せ京都旅行も兼ねて行ってきました。
聞いた発表からいくつか感想
2023年春のPerl
Perl最新情報ぜんぜん追えてないマンとしてはすごくためになりました。
売上と開発環境を同時に改善するために既存のPerl Web アプリケーションをどのようにリプレイスするか
Perlでつくられた古いサービスをどうやって持続的に運用していくのか…。おそらくYAPCに参加されている方の多くに共通する悩みですよね。言語としてはPerlを維持しつつモダンにしていくという選択とその方法とても参考になりました。
ORM – Object-relational mapping
Tengだ!
テーブル名が文字列指定だと静的解析がしづらいからRepository層を作るというのはなるほどな〜となりました。
デプロイ今昔物語 〜CGIからサーバーレスまで〜
2000年ごろのCGI時代からPerlの世界にはいった自分としては懐かしい思いもありつつ眺めていました。
push型deployのデメリットとして、オートスケール構成にしている場合にdeployのタイミングでスケールが起こった場合を挙げられていたのは、意識したことがなかったので勉強になりました。
DNS権威サービスへのDDoSとハイパフォーマンスなベンチマーカ
ベンチマーカーのチューニングをしていく手順がすごかったです(小並感
nekokakさんのゲストトーク
nekokakさんはDBIx::SkinnyやTengの開発で十数年前にはIRCでよくやりとりをしていたのですが、バリバリのPerlハッカーというイメージでした。その後自分も(おそらく)nekokakさんもCPANモジュールのOSS開発を活発に行わなくなりどうされているのかな〜と思っていた期間のミッシングピースがすこし知れたような思いがしました。バリバリのPerlハッカーから経営にも参画するCTOになられるというのは、エンジニアの一つのモデルケースとして素晴らしいですね。
onishiさんのキーノート
2000年代初期からPerlに触れている者としては”はてな”や”オン・ザ・エッジ”という会社には特別な思いがあるわけです。たとえば2002年にperl-oo MLでjkondoさんがデザインパターンをPerlで書くということを披露されているのをリアルタイムで見ていたりもしました。いまだにはてなに憧れはあるわけです。そんなはてな創業期から参加されいまは取締役 組織・基盤開発本部長として引っ張っておられる大西さんのはてなとご自身の歴史を振り返られたキーノートでした。自分もモブキャラと自認していることもあり、それじゃ駄目だと行動を変えていくという姿勢にとても感銘をうけました。YAPC2010のmiyagawaさんのキーノートに自分も感動していたのですが、遅くてもやらないよりマシ、いい言葉ですよね。
感想など
せっかく来たのだからトークはせずとも参加感を出そうということで、3回ほど質問はさせていただきました。良い質問とは言えなかったと思いますが、登壇者の方々には真摯に回答していただきました。ありがとうございます。
やはり、こういうカンファレンスに参加すると刺激をうけますね。YAPCでの登壇はYAPC::Asia Tokyo 2012で唯一やっているわけですが(11年前!)、いまさら自分がなにか話せることはあるのだろうかと思いつつ、次回の開催があればばトーク応募できるようにしたいと思いました。
開催者、ボランティアスタッフ、発表者の皆様お疲れさまでした&ありがとうございました。素晴らしいイベントでした。
YAPC::Asia Tokyo 2015に参加してきました
- 2015/8/24 月曜日 3:01:10
- perl
8月20日から3日間にわたって東京ビッグサイトで開催されたYAPC::Asia Tokyo 2015に参加してきました。
2012年にスピーカーで参加してから、2回連続で足が遠のいてしまっていましたが、やはり参加すると刺激をうけてよいものですね。
3年前の自分のトークのようなPerl製の(モジュール|プロダクト)名がタイトルに入っているトークはほとんどなくて(あ、LTではcpmがありましたね!)何とも言えないわびしい気持ちになったりもしましたが、その多様性を受け入れる文化も日本のPerlCommunityの素晴らしさなのかなと思ったりもしたり。自分が参加したトークの中ではやはりGoの話が多くなっていて、そろそろ手を付けるか…という気分になって帰ってきました。
YAPC::Asia、lestrratさん(JPA?)が主催するものとしては10回目の今回で最後とのことで、いままで主催されてきたmiyagawaさんTAKESAKOさんlestrratさん941さんyusukebeさんによる【特別企画】YAPCあるあるもみてきました。自分は2007年からの参加ですが、過去のすべてのトークで一番印象に残っているのは、2009年のPSGI – Perl Server Gateway Interfaceです。もともと別の内容のトークが予定されていた枠を変更して発表の数日前に誕生したばかりのPSGIとPlackの紹介を、miyagawaさんとtokuhiromさんがライブコーディングも混じえながら行うというものでした。その後PSGI/Plackは驚くべき速度で普及しましたが、YAPC::Asiaという場がその普及の役割の一翼を担ったことは間違いないでしょう。
なにはともあれ、何年にもわたり主催されてきたlestrratさんはじめ、スタッフのみなさま、本当にありがとうございました!
YAPC::Asia Tokyo 2012に参加してきました
- 2012/9/30 日曜日 20:13:06
- perl
参加してきました。YAPC::Asia Tokyo 2012。
初発表してきました
Tengにpull requestをよく送っていたからか、nekokakさんにやりませんかとIRCで声をかけて頂いて、やりますーと軽く答えて参加申し込みをしたはいいものの、ちゃんとした話ができるのか不安でしかたがなく、直前は緊張で吐きそうになるなどしつつ、発表者席に向かったところ目の前にnekokakさんが陣取っており(その場ではじめましてのご挨拶(!))、プレッシャーでクラクラしながらも、なんとか発表させていただきました。
反省点は多々ありますが、なんとか最後まで喋りきることはできたので一応満足はしています。今後は自分のプロダクトでの発表や、40分枠で喋れるような濃い発表ができるように日々意識して活動していこうと気持ちを新たにしました。
プレゼン資料公開しておきます。
追記: 2012/10/6 動画アップロードされたみたいです。
聞いてきた
もろもろのお仕事の事情により、参加は発表日の午後から。(発表日午前いけなかったのは起きれなかっただけだけど!)
Perl 今昔物語
僕はYAPCは2007年の津田塾以降の参加。ここ数年(PSGI/Plack以降って感じなのかな)新しいPerlのプロダクトとかでてきてないよねーという話はまあそうなのかもなと。
他の言語でも最近は落ち着いてるんじゃない、という話もあったけど印象としてRuby界隈は活発に見えるし、実際RubyGemsの数がCPANモジュール数を超えている(count方法に異議はあるとのこと)という話をその後のLTでcharsbarさんがされていましたね。
10 more things to be ripped off
スライドはこちらのようです
裏番組のPerl と SQL のいろいろは自分の発表と内容も関係ありそうだし、場合によっては発表中で触れるためにも見ておきたかったんですが、miyagawaさんのこのトークはmiyagawaさんだからってのを差し引いても、内容的にやっぱりどうしても見ておきたかったので。
bundler to Cartonの話は今一番興味がある話で(これの話とかcpanfileの100%実装とか)、未実装の部分を開発してくれる人歓迎というようなことをおっしゃっていたので一念発起してみるつもりです。他のプロダクトも興味あるものがいくつかあったので要チェックでしたね。
Perlハッカーは息をするようにCPANモジュールを書く。
まとめが、githubに眠っているモジュールをドキュメントをちゃんとかいてCPANにアップしよう!というような話だったので、勢い余って質問で「githubに眠っているPath-AttrRouterはいつCPANにアップされますか?」という嫌がらせのような質問をしてしまい、流れでドキュメントを書きますと宣言をしてしまいました…。や、やりますよ!そ、そのうち!
— 発表が近づきおぼつかない足取りで外をふらふらとうろつくなど記憶が曖昧な時間帯 —
Lightning Talks Day 2
あいかわらずみなさんおもしろい。正直あそこには一生立てる気がしないです。あ、途中karupaneruraさんがTengを絡めた話をされてましたが、自分の理解力が足りず内容が半分も理解できなかったのでスライドの公開を待ちます!
How Perl Changed My Life
やっぱりmiyagawaさんには影響されちゃいますよねー、あるあるという感じでした。
また来年?
また来年も開催されるのかはやはり明言されなかったみたいですが、あるときに備えておきます!
こんなに素晴らしいイベントを運営されているボランティアスタッフの皆様、本当にお疲れ様でした!
ところで、このブログはすっかりイベント参加報告ブログと化していますが、最近はheboi blogのほうでカジュアルに書いています。
YAPC::Asia Tokyo 2011に参加してきました
- 2011/10/16 日曜日 19:36:39
- perl
YAPC::Asia Tokyo 2011に参加してきました。
ブログ書くまでがYAPCというわけで印象にのこったセッションを中心に参加報告を。
前夜祭
myfinderさんの「サービス運用者のための継続的監視」はさすが日本で1番目か2番目か3番目のSNSの運用をされてるだけあってさすがという感じでした。自分は小規模システムばかりやっていて開発者も運用についてかなりコミットしなきゃいけない状況で働いているのですが、ここまできちんとできてないなーと痛感。さっそく監視項目をどんどん増やしていこうと思いました。
会場外のプチ懇親会的なものでは、ほぼボッチでしたが夏菜子推しTを装備していたsugyanさんと初めて挨拶させていただくなど。
一日目
寝坊&体調不良で昼から参加。Jesse Vincentさんの「Perl 5.16 and beyond」とmalaさんの「Webアプリケーション高速化」が聞けなかったのが残念。動画とか公開されるのかな。
onishiさんの「新はてなダイアリーの裏側」では、はてなダイアリーが今秋Hatena Blogになることが発表されたりしていて、ユーザ毎サブドメイン運用でjavascript解禁なんて話があってセキュリティ対策とかどーなのかなーと興味深かったです。二日目のcho45さんの「ぼくがかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく 」でそこらへんの話も詳しくされたぽいのですが裏セッションを聞いてて見れなかったです。
徳丸さんの「Webアプリでパスワード保護はどこまでやればいいか」ではレインボーテーブルの原理を丁寧に説明されていて(徳丸本にも書いてあるのですが読み飛ばしてしまっていたので)、なるほどなーと思ったり、高速化するGPUの脅威に対抗するためにサービス側でもGPUを使ってハッシュ生成(ストレッチング回数を増やす)するという対策を示しておられたのが印象的でした。
makamakaさんの「Perl Mongerなりきりカードゲームの考案と実践」はとにかく面白すぎましたw会場のウケをとった回数だけならきっとベストスピーカー賞なんじゃないでしょうか。
懇親会ではほぼボッチでしたが、miyagawaさんに僕のビール持って行っちゃってませんかという(濡れ衣の)難癖をつけるなどしました。(わざとじゃありません。すみません)
二日目
若干遅刻気味だったので大岡山駅からダッシュで会場に向かい、ぎりぎりkazuhoさんの「続 Unix Programming with Perl」の開始に間に合いました。昨年の発表もそうでしたが正しくプログラミングするとはどういうことなのかということを徹底的に意識されている感じで非常に勉強になりました。
Ricardo Signes(rjbs)さんの「闇のEメール伝説」はEmail::モジュールの話をするのかなーと思って行ってみたら、SMTPやMIMEのRFCにまつわるメールのカオス状況をおもしろおかしく発表されるという感じでした。英語は正直ほぼ聞き取れてなかったのですがスライドを見るとだいたいは把握できたし、メールアドレスの正規表現をやってたときにRFCがupdateされて古いRFCがobsoleteになっても新しいRFC自体にobsなsyntaxが残ってたりしてカオスってるのを把握してたのでそうそうそうだよねーという感じで楽しく聞けました。
スイーツエリアで開催されたmotemenさんの「Teto でニコニコ音声ストリーミング 」は便利そうだし、技術的にも面白そうなので是非使ってみてコードも読みたいなーと思いました。
勝手に後夜祭では、ほぼボッチは回避しつついろんな方と話すことができました。途中YappoさんとEmail::Senderの非Moose化てどうなんでしょうねーという話をしていたらcharsbarさんに折角本人がいるんだから直接いいなよとrjbsさんの前に連れていかれcharsbarさんに通訳をしてもらいながらお話を聞くことができました。RoleがMooseとMouseで完全に共通化されてないからAny::Mooseは使えないよねーという話だと理解したのですが正直完全には理解できず。英語ェ…。周りに集まってきたPerlHackerの面々が直接英語で議論しているのを目の当たりにしてほんと英語どうにかしないと駄目だなと再度感じた次第。charsbarさんその節はありがとうございました。力不足で大して議論を深める役には立てませんでしたが貴重な経験になりました。
というわけで三日間非常に楽しめました。
牧さん櫛井さんをはじめJPAのみなさん、ボランティアスタッフのみなさん、スピーカーのみなさん、お疲れ様でした&ありがとうございました。
来年はスピーカーとして若干でも貢献したいとおもいます!
DBD::mysql 4.020がリリースされました
DBD::mysqlの4.020が昨日リリースされました。
このリリースにはmysql_server_prepare=1を使っている場合のバグの修正が5件ほど含まれています。(ChangeLog)
DBD::mysql で mysql_server_prepare=1 のとき TEXT 型の欄が自動 utf8::decode されなくなる
こちらのブログで指摘されていた件を直してパッチを送ろうと思っておもむろにmysql_server_prepare=1の状態でDBD::mysqlのテストを実行したら失敗しまくったため、もう駄目かもしれないと思ったのですが、何故かmysql_server_prepareと心中する腹をくくり一応すべてのテストを通すようにパッチを送りまくってみたところ取り込まれたという感じになりました。(リリース後に2つほどさらにpull reqしていますが…。)
TEXT型がdecodeされない件はユーザ側で回避できない話ではないんだと思いますが、LONGBLOBで4GBのメモリをアロケートしようとする件はDB構成によっては回避のしようもなく、mysql_server_prepare=1はほとんど使われてないんだなぁという印象を持ちました。
一応改めて整理しておくと、mysqlのサーバーサイドのPrepared Statementは以前はクエリキャッシュがされないというかなり致命的なデメリットがありましたがバージョン5.1.17以降でC API等から利用されるバイナリプロトコルではキャッシュされるようになり、また5.1.22以降からはテキストプロトコル上でのPREPARE, EXECUTEでもキャッシュされるようになっています。(詳細はクエリキャッシュの動作を参照してください。)
mysqlのPrepared Statementはbind値を展開した後のクエリの結果をキャッシュしてくれるいわゆるQueryCacheのみの対応となっています。パラメータ値に依存しない実行計画をキャッシュしてくれるわけでは無いのでメリットは薄いと思われる部分はあるとは思うのですが、通信データが大きい場合には速いというメリットも持っています。(今回のDBD::mysqlのバグはそのメリットを享受するべきLONGBLOBがほぼ動かないというひどいものではありましたが)
memory leakのような現象が起きるという中の人の指摘もあったりしますが、これはステートメントハンドルやコネクションの管理をクライアント側できちんと行えば問題ないと思っていたりもします。(大規模環境でどうなのかというわれるとちょっとどうなのかなと思わなくもないですが)
というわけで、やはりまあ積極的に利用を勧める理由も無いのですが、積極的に回避する理由も無いとも思ってますので是非使えるかたは使ってみてください。で、DBD::mysql的にもMySQL本体的にも枯れてくれるとうれしいなと思ってます。
Gearmanのはまりどころ
- 2011/1/22 土曜日 21:19:36
- perl
最近Gearmanに入門しているのですが、いろいろとはまったのでメモ。
$worker->workは”Do one job”ではなくDo job loop
$worker->work while 1;
みたいなサンプルが書いてあったり
Gearman::Job->work(%opts) Do one job and returns (no value returned). You can pass "on_start" "on_complete" and "on_fail" callbacks in %opts.
って書いてあるのですが(しかもこれは、Gearman::JobではなくてGearman::Workerだし、、、)
workはオプション無しで呼ばれた場合はwhile 1なんかなくてもloopします。
work_once的な動きにしたいのであれば
$worker->work(stop_if => sub { 1 });
とすればいいです。stop_ifをmax_requests_per_child的な動きにしたい場合はkazeburoさんのgearman-starter.plを参考にするといいです。
ちなみにこれは作者にメールでパッチも送ったりもしたのですがこのRTが同じ内容。1年半ぐらい放置みたいなので直る気配なし。
Gearman::Client->job_serversはArrayRefを受け取れるけど、Gearman::Worker->job_serversは受け取れない
結構はまりました。
my $clinet = Gearman::Clinet->new; $client->job_servers(['127.0.0.1']);
はokだけど
my $worker = Gearman::Worker->new; $worker->job_servers(['127.0.0.1']);
は駄目。正しくは
my $worker = Gearman::Worker->new; $worker->job_servers('127.0.0.1');
としなければならない。これもRTにあがってますね。
Gearman::Workerはfork safeじゃないんでfork後生成
まぁDBIのdbhとかと一緒ですね。いくつかのネット上の例でParallel::Preforkなんかと組み合わせて使う時に
親プロセスで$worker作って共有している例注1があったのですが、ちゃんとやるなら子供で生成すること。
一見普通に動いちゃうのですが通信がまざって変になるかもしれないです。
まとめ
あたらしくCPANモジュールを使い出す時にはPODと共にRTも一緒に見ておくとよい。
注1
ここの11pとかここ(もう直ってる)とか。ちなみにkazuhoさんの書いたものだと去年のadvent calendarのWriting a prefork server / daemon using Parallel::Preforkは子供でworker生成してます。この記事は、graceful shutdownやSIGHUPによるconfig reloadへの示唆が含まれているので必見ですです
日本の休日をPerlから求める
- 2010/11/15 月曜日 18:11:18
- perl
日本の休日には「国民の祝日」と「振替休日」と「国民の休日」ってのがあるのですがそれをPerlから求めるにはどうしたらいいんだという話。
#perl-casualでたずねたところいろいろと方法を教えてもらいました。
定番ネタだし、それ三週目といわれたりしたのでまとめてみますたという流れ。
そもそも休日というのは法律で決められるものなので、改正もあり最近だと2005年に改正があったりしています。
また、「国民の祝日」の中には「春分の日」や「秋分の日」のように翌年分を2月に官報で発表なんてものもあったりします。
やっかいですね。
CPANモジュールを使う
Calendar::Japanese::Holiday
最終更新日が2007年なようですが
use Calendar::Japanese::Holiday; say isHoliday(2011, 3, 21); say isHoliday(2011, 9, 23);
こんな感じで未来の秋分・春分の日も計算で求められているのでそれなりに信頼感はあるかと思います。
ただし、「振替休日」に関しては下記のように第三引数に1をいれないと求めてくれないので注意。
use Calendar::Japanese::Holiday; say isHoliday(2009, 5, 6); # これだと駄目 say isHoliday(2009, 5, 6, 1); # これならOK
DateTime::Holiday::Japanese
CPANモジュールではないですが、coderepos上にfbisさん作のモジュールもあがっています。
use DateTime::Holiday::Japanese qw/is_holiday/; say is_holiday(year => 2011, month => 3, day => 21); say is_holiday(year => 2011, month => 9, day => 23);
Calendar::Japanese::Holidayと同様に更新は2007年からされていないようですが秋分春分の日は計算で出しています。
今日2009-2011のテストデータを追加してパスするのは確認しています。coderepos上にあるので法律変わったら誰かが更新してくれるんじゃないかという期待感あり。DateTime依存。
ネット経由で情報を定期的にとってくる
Google Calendar Data API
japanese@holiday.calendar.google.com
=> 「振替休日」「国民の休日」には非対応(「国民の祝日」カレンダーだからそれが正しいんだよ派)
outid3el0qkcrsuf89fltf7a4qbacgt9@import.calendar.google.com
=> 「振替休日」「国民の休日」にも対応。使えそう
https://www.mozilla.org/projects/calendar/holidays.htmlのJapan Holidaysと同じデータぽいのかな。
政府
「国民の祝日」についてが一番信頼できそうなネット上の情報な気もするが、別にこのページを維持すること自体を法律で定めているわけでもないし今年と来年のデータしかないのでそこまで使えるってわけでもない。「振替休日」と「国民の休日」については例だけなので将来的にどう表示されるのかも判然としない。
目視確認なら法律と官報を確認するに次いで信頼性はあるかと。
休日DBを独自に作成して運用者がメンテ
最強
まとめ
CPANモジュールの”その時点での法律計算”系は手軽さはあるが、今後の法改正を見越すと若干難ありか。
モジュール自体が毎年来年分のテストを追加してリリースされることが保障されていて、
使う側も毎年保守ができるのであれば特に問題はなさそう。
さらにモジュール自体もgithubなんかで複数人で保守されているといいなという話。
API系は信頼できるものを政府が出してくれるとうれしいなーというところ。
XslateはSyntaxを変えても基本的には実運用上の速度は変わらない
- 2010/8/13 金曜日 19:54:00
- perl
TTの158倍速いというxslateですが、このベンチマークはSyntax::Kolonを使っています。
TT互換なSyntaxであるところの、Syntax::TTerseを使うとどうなるのかなということでhttp://github.com/nihen/p5-Text-Xslate/tree/add_tterse_benchのbenchmark/x-rich-enc.plとbenchmark/x-poor-env.plにTTerseも追加してみました。
以下結果
%perl benchmark/x-rich-env.pl Perl/5.12.1 i686-linux Text::Xslate/0.1056 Text::MicroTemplate/0.15 Text::MicroTemplate::Extended/0.11 Template/2.22 Text::ClearSilver/0.10.5.4 HTML::Template::Pro/0.9502 1..5 ok 1 - TTerse: Text::Xslate::Syntax::TTerse ok 2 - TT: Template-Toolkit ok 3 - MT: Text::MicroTemplate ok 4 - TCS: Text::ClearSilver ok 5 - HTP: HTML::Template::Pro Benchmarks with 'include' (datasize=100) Rate TT MT TCS HTP Xslate TTerse TT 78.6/s -- -69% -94% -95% -99% -99% MT 257/s 227% -- -82% -84% -98% -98% TCS 1412/s 1697% 450% -- -11% -89% -89% HTP 1586/s 1918% 517% 12% -- -88% -88% Xslate 13241/s 16752% 5054% 838% 735% -- -1% TTerse 13397/s 16951% 5115% 849% 745% 1% --
%perl benchmark/x-poor-env.pl Perl/5.12.1 i686-linux Text::Xslate/0.1056 Template/2.22 HTML::Template/2.9 Text::MicroTemplate/0.15 Text::MicroTemplate::Extended/0.11 1..4 ok 1 - TTerse: Text::Xslate::Syntax::TTerse ok 2 - TT: Template-Toolkit ok 3 - MT: Text::MicroTemplate ok 4 - HT: HTML::Template Benchmarks with 'include' (datasize=100) Rate TT TTerse Xslate HT MT TT 49.5/s -- -27% -28% -61% -80% TTerse 67.9/s 37% -- -1% -47% -73% Xslate 68.5/s 38% 1% -- -46% -73% HT 127/s 157% 88% 86% -- -50% MT 253/s 411% 273% 269% 99% --
このように誤差の範囲ぐらいの差しか無く同様に速い。
これはなぜかというと、Xslateは様々なSyntaxで書かれたテンプレートを共通の中間コードにコンパイルし、それをキャッシュしているためその中間コードはほぼ同一のものになるからです。
一応そのコンパイル部分には差が現れるが、ファイルキャッシュもできない環境というのはほぼありえないので実運用上、速度の差は無いと言ってよいとおもわれる。というわけでTT使ってる人は安心してTTerseに移行してみるといいと思うです。(互換性がどの程度あるのかは使ってないから知らないけど!)
ちなみにコンパイル部分のみのベンチマーク
% perl author/bench_compile.pl Parser: Kolon v.s. TTerse Rate tterse kolon tterse 80.1/s -- -42% kolon 139/s 74% --
Path::AttrRouterにHTTPメソッド制限できる機能を追加してみた
- 2010/7/10 土曜日 23:53:26
- perl
Path::AttrRouterというtypesterさんが開発されているdispatcherがあって、Catalyst-likeなControllerのattributeを拾ってきてルーティングテーブルを作成してくれるのが便利で使っています。
で、HTTPメソッドを考慮したルーティングを行ってくれる機能が欲しかったので追加してみました。
method_supportブランチとしてforkしてgithubにあげてあります。
使い方はこんな感じです。
use Path::AttrRouter; { package MyController; use base 'Path::AttrRouter::Controller'; sub index :Path { print "index\n" } sub post :Path Method('POST') { print "post\n" } } my $router = Path::AttrRouter->new( search_path => 'MyController' ); my $m; $m = $router->match('/', 'GET'); $m->dispatch; # index $m = $router->match('/', 'POST'); $m->dispatch; # post
Methodが指定されなかったsubroutineはGET, HEADがデフォルトになるようになってます。
一応後方互換性は考慮してあり、$router->matchの第二引数が空の場合は
どのメソッドでもマッチするようになっています。
本家にとりこまれればうれしいけれど取り込まれなければ別distとして継承使って作り直すかもです。
ところで、諸事情により前職を退職していまして、ブログURLを移転しています。
RSSリーダーに登録されていた方等は再度登録お願い致しますです。
一応302飛ばすようにしてはあるんですが、RSSリーダーって自動的にそこらへん追跡してくれないんすかね。
追記(2010-07-11 17:17)
http://twitter.com/#!/typester/status/18255875606
とのことです。確かにPath::名前スペースなのでHTTPメソッドに依存するのは筋悪でした。
HTTP::AttrRouterとかで作ってみようかなーと考え中。
PlackにおけるCSRFとDNS-Rebinding対策
- 2009/12/20 日曜日 11:32:53
- perl
最近のwebセキュリティ界隈ではCSRFやDNS-Rebindingが話題ですが、Plackでアプリケーションサーバを立ち上げる際にこれらの対策をどのように行うかについてまとめてみました。
まず、CSRF対策ですが、拙作のPlack::Middleware::RefererCheckを使うことにより、RefererのチェックによるCSRF対策が行えます。CSRF対策としては、onetime token方式も存在しますが、個人的にはRefererチェックが導入が楽で好きではあります。Refererを送信しないクライアントを対象にしたサービスを運営される方は別途onetime token方式の対策をおこなってください。
Plack::Middleware::RefererCheckの使い方はこのようになります。(SYNOPSYSからの抜粋)
use Plack::Builder; builder { enable 'RefererCheck', host => 'www.example.com', same_scheme => 1, error_app => sub { [403, [], ['Forbidden']] }; $app; }; # or more simply(host from $env->{HTTP_HOST} and same_scheme => 0) # this is vulnerabilly for DNS Rebinding builder { enable 'RefererCheck'; $app; };
さて、コード中にも書いてあるように後者のチェック用hostをHTTP_HOSTから取得する方法はDNS-Rebindingに脆弱です。しかし前者のように固定hostを設定することにより、DNS-Rebindingへの対策も同時にできることになります。尚、onetime token方式ではXHRのsame originポリシーの崩壊によりDNS-Rebindingへの対策を単体で行うことはできません。
このようにRefererCheckを固定hostで行うことによりCSRF対策においてはDNS-Rebindingに対応できますが、CSRFから保護されるページ以外についても当然DNS-Rebindingでのアクセスははじきたいところです。apache等においてはname base virtual hostを活用することにより、期待するホスト名以外のアクセスをはじくことができますが、PlackでもPlack::App::URLMap(mount)を使うことにより同様のことが可能です。
use Plack::Builder; builder { mount 'http://example.com/' => builder { mount '/app' => $app; mount '/admin' => $admin_app; } }
このようにすることにより、example.com以外のHOSTでのアクセスは404となります。mountは上記の例のように、hostの指定とpath_infoの指定を同時に行えるもので、apacheでいうとVirtualhostとLocationを一緒にしたような機能になります。なので、上記のコードは下記のコードと等価です。
use Plack::Builder; builder { mount 'http://example.com/app/' => $app; mount 'http://example.com/admin/' => $admin_app; }
もちろんホスト名を違うものをmountできますのでPlack単体でVirtualhostな運用もできます。URLMap便利ですね。
ホーム > perl
- 検索
- フィード
- メタ情報