xtetsuji) です。
こんにちは、遅筆癖を直したい おがた (@2012年5月13日に行われた Hokkaido.pm#7 に行ってきました。
…;と、このブログを投稿している7月末になって「何をゴールデンウィーク明2ヶ月前の話をしているんだ!」とお叱りを受けるかもしれません。ごめんなさい。遅筆な上に、ついつい文章を書き始めると長文になってしまって時間がかかるので、書き始めるまでの心理的障壁が大きいんです。
あとブログ記事が遅れた要因として
- 会社が「おまえよく発表後に体調崩すから発表しちゃダメ」と言われたのに飛び入りLTした事を会社に律儀に報告して許しを乞う(5月中旬)
- 発表に使ったMyApache2::Sinatraticに大バグ発見。Apache上の複数のVirtualHostで使っただけで崩壊なのには自分ながらガッカリした。修正開始。(5月下旬)
- 体調を崩す。元々弱い腹に胃腸炎が襲来。(6月上旬から中旬)
- 胃腸炎の後遺症で戻りかけていた睡眠リズムが崩壊して体調が中々戻らない(6月下旬)
- MyApache2::Sinatraticさらに修正(7月上旬)
- 忙しかったり体調不良が続いたり(7月中旬)
といった事情もあります。言い訳。MyApache2::Sinatraticはなんとか「動くように見える」レベルまで修正しました。後述。
今回は簡潔に行きます!要約大切!(いまのところの意気込み) → …;と思って書き始めましたが、結構な長文になってしまいました…;。とばし読み流し読み大歓迎!もしくは「あとで読む」に放りこんで、時間のあるときにどうぞ!
Hokkaido.pmは #5 から連続3回目の参加です。今回も東京から札幌へ遠征をしました。
このブログの過去記事より過去のHokkaido.pm。
今回は公式サイトの開催報告が良くまとまっていて見やすいです。動画もスライドも開催概要もここからたどることができます。私もトゥギャッターで協力しました。今回のテーマは「Webアプリ「再」入門」。特にWAF(Web Application Framework)の話が多くをしめました。
今回も各トークの私なりの感想を簡潔に書いてみたいと思います。
Contents
「ゼロからはじめるAmon2」@akiymさん
Hokkaido.pmの高校生Perlハッカー@akiymさん。「WAF初心者」とのこと。
「WAFとは?」という問いかけから、Amon2の基本的な使い方を紹介。
「Perl WAF といえば Catalyst?」という時代もあったけど、「なるべく学ぶことは少なくしたい。再入門に時間なんてかけてられない」。確かにそうです。
Perlにおける軽量WAFとして、「Amon2」「Dancer」を例示。Amon2がjQueryやTwitter Bootstrapを同梱していたり、Text::Xslateを標準テンプレートに採用しているといったメリットを提示。
スケルトン生成からデモへ。
flavorとしてBasic(デフォルト)とLarge、Liteがある。Amon2::Lite # Mojolicious::Liteっぽい。
コード例から、コンテキストオブジェクト $c からの基本を解説してくださいました。RequestやResponseはPlackからのシンプルな継承。設定ファイル config/{development,deployment,test}.pl を紹介して、これを PLAC_ENV で切り替えられるというお話。
% plackup -E deployment app.psgi
dispatcherはRouter::Simple。
詳細はスライドを見ていただければよくわかりますが、基本的なスケルトンコードを例示。いわゆるSinatraライクですね。
プラグインも紹介。
- Web::CSRFDeefender → CSRF対策(トークンを埋め込む)
- Web::FillInFormLite → $c->fillin_form(); # HTML::FillInForm::Lite
- Web::JSON → $c->render_json();
- Amon2::Auth → Twitter, Github, Facebook, Loctouch をサポート
- Amon2::DBI → $c->dbi
実際にウェブアプリを作ってみるというデモもありました。
まずは「オレオレGyazo」を 「% amon2-setup.pl Gyazo」 として生成。FillIn や CSRF は要らないので削除、dispatcher にべた書き(このあたりはスライドが詳しいです) → 短縮URLの実装もやる → SQLite
ネタ的なおまけとして「KENT WEB」をAmon2で書きなおそう!なんてのもあって会場は爆笑。
- Amon2::DBI
- Teng
- Form::Validator::Lite
素材はこれら。「KENT WEB」が最先端の技術で蘇りました。スゴイ。
まとめ:
- Amon2は非常にシンプルなWAFで、使い勝手がいいのでおすすめ。
- WAFは好み e.g. Catalyst, Mojolicious
- Amon2はコードも読みやすいし複雑なことをしていないのでオススメ
簡単なWAFと呼ばれたAmon2のことが概観できて楽しかったです。
「DancerでWebアプリ再入門」 @aloelightさん
こちらもHokkaido.pmの顔ともいえる@aloelightさんのお話。札幌の会社でPerlの開発やインフラまわりをお仕事にされている方です。
今回のHokkaido.pm#7のテーマ「Webアプリ「再」入門」ということでDancerを使ってみた話。
先行の発表者が宣言したWAFを除いて、残ったものがCatalyst、CGI::Application、Kossy あたり…; その中で一番簡単そうで世界で知名度が高かったのが Dancer だったとのこと。
早速ウェブアプリを作ってみたとのことです。文字通りの機能を持つ「AWS Health Info」
- Twitterアカウントでログイン
- AWS Service Health をチェック
- 登録者にお知らせ
次の一声「間に合いませんでした!」惜しい!業務でAWS触り始めた私も「AWS Health Info」に興味津々だったのに…;。
次にDancer の紹介と特色を紹介。特徴としては以下のようです。
- Sinatra系のPerl整WAF # 最初から
- すっごくシンプル
- 豊富なプラグイン
- 意外と豊富なドキュメント
インストールは簡単「$ cpanm Dancer」。依存 CPAN モジュールも少ないのだそうです。
Sinatraライクな文法なのは前述で触れられましたが、まさかサブルーチンリファレンスで文字列を返却するだけでレスポンスが書けるとは…; → use Dancer; get ‘/’ => sub { return “Hello, world”; }; dance; # これだけのスクリプトで 5000 番ポートで待ち受けるdaemonの完成。
もう少し複雑なアプリケーションの場合は「$ dancer -a MyApp」とするとスケルトン雛形が作成されるのでMyApp/lib/MyApp.pm にアプリを書くとよいそう。シンプル。基本は use Dancer; するだけ。
豊富なプラグインもあります。現時点で Dancer::Plugin 系が 94件。
メジャーなPluginのご紹介。
- Dancer::Plugin::Database
- Dancer::Plugin::DBIC
- Dancer::Plugin::Email
- Dancer::Plugin::Thubnail
- Dancer::Plugin::Facebook
もっと知りたい方は「Dancer plugins ecosystem」http://advent.perldancer.org/2011/17 へGo!、だそうです。
Pluginの作り方も簡単とのこと。
ドキュメントも豊富。
- Dancer::Introduction
- Dancer::Tutorial
- Dancer::Cookbook
- Dancer::Plugins
- Dancer::Deployment
Dancerの基本文法をご紹介。ここらへんは上述のように簡単。詳しくはスライドや動画を御参照いただけると良いと思います。Config、Cookie、Session、Templateにもそれぞれ独特のDSL構文(所定のオブジェクトを返す0以上の引数サブルーチン)があって、簡潔さを目指しているなぁというところが伝わりました。
ちなみに標準のテンプレート Dancer::Template::Simple には IF,LOOPが無いので Dancer::Template::TemplateToolkit を代わりに使いましょう、とのことでした。
データベースもやっぱりシンプル。use Dancer::Plugin::Database; をすると database というDSL構文が使えるようになってシンプル。前述の Config 等についても、use Dancer::Config をすると config 構文が使えて同様、等々。
これも前述のようなDSL構文が徹底されたリダイレクトやロギングといった部分を解説し終えた後、AWS Health Info のソースコードを読みながら、その雰囲気を味わいました。
やはり前述のような構文が多様されているため「MojoliciousやAmon2と違って $ が少ない」のが特長とのこと。
Twitter連携についてアドバイス。
- Net::Twitter は Moose 依存
- Net::Twitter::Lite はそうじゃないのでそっちを使おう
テストには Dancer::Test というのが用意されているので、それを調べて使いましょう、とのことでした。
感想としては、インポートされるDSL構文(詳細を説明すればオブジェクトを返すサブルーチン型のシンボルようなもの)が多くなるものの、メモリ等のコストとしては大したこと無いでしょう。こういうコンセプトのWAFも興味深い。ただ、日本での使用者人口がまだそれほど居なさそうで、何か困ったときの拠り所や頼れる人が不足しているのではないかという一点のみが懸念点でした。それ以外については、これほどシンプルさを目指したことに感心しきりでした。
「Mojoliciousをウェブ制作現場で使ってみてる」@jamadamさん
前回の Hokkaido.pm#6 の二次会で「初対面」して熱いトークをしたのが @jamadam さんでした。その時は全然知らなかったのですが、氏は Mojolicious のヘビーユーザ。英語のMojolicious ML へのコミットや、GitHub に自作の Mojolicious アプリケーションを精力的にアップしている方でした。私も @jamadam さん作だと知らずに使っていた Mojolicious アプリケーションもあって驚いたくらいです。北海道、Hokkaido.pmは、知れば知るほど猛者の集まりです。北海道出身の私は当然北海道ひいきですが、東京の人は地方を見くびっちゃいけない!
Mojolicious は現在の Perl WAF の中でも情報がいっぱいあります。
- Mojoliciousアプリを簡素に記述できるMojolicious::Lite
- MojoliciousというWAF
- Mojoというモジュール群
このあたりの話をまずざっくりと解説されました。モジュール群の継承関連図の美しさ(本人作)には会場も息を飲みました。
最小のMojoliciiousアプリの例示「use Mojolicious::Lite; app->start;」
話はMojoliciousのモジュールMojoの構造の話へ。このあたりは内部設計まで踏み込んで解説されました。そしてMojoやMojolicious関連クラス群の親クラスMojo::Baseの使い方へ。
Mojoliciousはバージョン2.0からPerl5.8サポートが切られ、Perl5.10以上を必要とするようになってしまい、困ったのでmojo-legacyを作ったとのこと。レガシーな環境へのデプロイの仕事を多く持つ @jamadam さんならではの作品ですが、その原動力には感心するばかりです。ただし、本家Mojoliciousのいくつかのテストが失敗するのが困っているとのこと。それでもmojo-legacyは実践投入されているようです。mojo-legacy の話は紹介で終わり。
本題は「ウェブ制作の現場ではデザイナー主導で組みあがったサイトに動的コンテンツを後付けすることが多い。」「それってPHPが最適解」「でもPerlでやる」という一連の流れ。やっぱりPerl!
実践コードをいくつかご紹介されました。紹介された処理をプラグインにまとめたりもしたそうです。詳細はスライドや動画を御参照ください。
感想としては、WAF素人の私としては、今使うなら日本でも使用者人口が増えてきた Mojolicious かなぁ…;と考えていたので、非常に参考になるトークでした。@jamadam さんが内部設計に詳しくそこにフォーカスをあてたトークだったため、前2つのAmon2やDancerのトークよりも難解さを感じはしましたが、まずは Mojolicious::Lite からコツコツとためしてみようと思います。
「Ops Tools with Perl」@riywoさん
東京から招待されたDeNAの @riywo さんによる Ops (運用) 関連のトークです。
Ops に役立つ Perl 製ツールの紹介をしてくださいました。
まずは有名な @kazeburo さんによる作品 CloudForecast。中身のウェブインターフェースはWAFなのですが、Kossyの元祖であるShirahata.pmというものを使っているのだそうです。Shirahata.pm、名前すら聞いたことありませんでした。
次は GrowthForecast の紹介。こちらのウェブインターフェースは WAF Kossy とのこと。
話はウェブから離れつつ、「はかどる系」のお話へ。
Alien::RRDtool の紹介。名前の通り RRD のモジュール。
chase-tail というツールの紹介。@hirose31 さん作。tail をしながら、指定したものがあればお知らせしてくれる系(だったかな)。これはシンプルなツールゆえ、すぐに活用ができそうです。以下のようなコマンドラインですぐに使えるそうです。
$ tail -f error_log | chase-tail -l 10 -t various_error
そして App::Ikachan のお話。@yappo さん作。これは私も使っています。簡単なHTTPでしゃべらせることができるIRCボット。障害が起こった時等、curl 等のよくあるHTTPクライアントツールで ikachan を叩けば、ikachan が IRC 上ですぐに教えてくれるといった使い方。
@riywo さんは「Touryo」というツールを作っているそうです。コンフィグ管理ツール。ただ、まだソースコードを出すことができないそう。会社でコンフィグ管理の必要性が発生した際に、ChefやPappetでは収まらない要求があったために自作したとのこと。基本はCLIツールだが、ウェブ管理画面もあって、それはAmon2中心に作っているのだそうです。
コンフィグはサーバごとに微妙に違ってくるケースがあって、それが既存ツールでうまくできない部分なのだそう。Touryo、公開が待たれますね!
内部的にはサーバにSSHしているけど、Net::SSH は ~/.ssh/config を読まないので使わなかったとのこと。そういう制限があるんですね。IPC::Cmd で ssh を呼び出すというスタイルを取っているそうです。これなら ~/.ssh/config も反映される。
最後に「どんな言語を使えば良いか?」という問いかけ。色々なスタイルの言語がある。スクリプト型、コンパイル型といった分類。手続き型、オブジェクト指向、関数型言語といった分類。普及しているか否かといった分類。
やはり選ぶとしたら普及している言語を選ぶべきという話。ライブラリが充実していることと、みんなが読めることがその理由。
そしてTouryo等でPerlを採用したのは「I love Perl」だから。早く書けるし、なにより自分の周りにPerl Mongerがたくさんいたこと、そしてCPANの存在。
感想としては、私の会社ではインフラや運用はプログラマや開発とは部署が完全に分かれていて、インフラや運用で専用ツールを作るといった発想が無かったです。インフラ部署に行くとプログラムからは離れてしまって寂しいのではという印象すら持っていた。もちろん、既存ツールを使うという選択肢はインフラ部署で取られてはいますが(Nagiosとか)。私も元々インフラ志望だったこともあり、プログラムで「はかどる系」を促進していく、@riywo さんのようなインフラ運用を担うプログラマに憧れを抱きました。
LT
ここはメモが欠落しているのですが、記憶では1枠のLTがあったのみで今回は枠が2つ余っていました。冒頭で書いた通り、会社から「発表すんな」と言われていたのですが、こっそり秘蔵ものを持っていたので、空いているLT枠の話を聞いた時に休憩時間の10分間で簡単なスライドを作って「飛び入りLT」をやってのけました。
このLTには動画がありません。会社にバレたときに怒られる可能性があったので、Ustreamを切ってもらったのでした。その後、会社から「それくらいいいんじゃない」と言われたので安堵しましたが…;。また、当初のスライドは10分で作った15枚くらいのスライドで、実際は後半3分ほどは拡大したEmacsにコードを移してカーソルを動かしながら解説したのでした。
私は mod_perl Hacker (Baka) として Hokkaido.pm で前2回トークをしているので「今回もmod_perlで無茶しやがって…;」といった笑いを頂くことができて嬉しかったです。テーマに従って、素の mod_perl を WAF っぽくするという無茶ネタ。興味ある方はぜひスライドをご覧ください。
その後
それでも余ったLT枠の時間で @onagatani さんが Hokkaido.pm についてのお話をされて、さらにそれでも余った時間のため、いつも押し押しになるにも関わらず時間を余しての終了。
懇親会までの時間も必然的に余るわけで「もう懇親会の会場に行っちゃおうか」という声が自然と沸き起こり、普段は19時あたり開始の懇親会をが17時45分に始まることになりました。
懇親会
居酒屋の座敷部屋での懇親会でした。東京からいらっしゃった@riywoさんのために、北海道の海の幸が存分に振舞われました。「カニの刺身が食べられるのはHokkaido.pmだけ」。美味しいものが食べたい方はぜひHokkaido.pmへ行きましょう!トークの質も(私は置いといて)みんな濃い!今最も熱い地方.pmのひとつと断言して良いのではないでしょうか。
二次会
バーのようなところに入ったのですが、すし詰め部屋に押し込まれてトイレに行くだけで大混乱、しかも外野が騒々しい(ダーツやってた?)という中々の環境でしたが、懇親会で入ったアルコールで皆さん打ち解けて話ができました。
三次会
三次会恒例のラーメン。@onagatani さん自信のコースです。東京からいらっしゃった方々も札幌ラーメンに舌鼓を打っていました。
そして、開始が早かったことで、Hokkaido.pm にしては異例の23時解散となりました。結果的に開始が早かったことで解散も早く、身体への負担も減った感じです。次回も懇親会は17時45分開始くらいにしても良いのではないでしょうか。
まとめ
結局長文になってしまいましたね…;。ここまで熟読してくれた方、飛ばしながらも読んでくださった方、ありがとうございます。
当日リアルタイムにEvernoteにメモを取っていたので、トークの概要の大方はコピペ修正で編集しています。それでも執筆時間は2時間ほど。遅筆…;(なのかな)。でもせっかくの熱いHokkaido.pmの活動、なるべく活字として残しておきたいという思いをどうか汲みとってやってください。
Hokkaido.pm#5 で初pm参加 + 初トークをしてPerl仲間が劇的に増えました(YAPC::Asia Tokyo は2007年から参加しているけどいつもぼっちでした)。東京在住ですが北海道出身の私にとって、Hokkaido.pmは文字通り私の故郷でありパワースポットであり、意欲や情熱などの大切なものを色々頂いている本当に素晴らしい場所です。主催の @onagatani さん、@aloelight さん、その他常連の皆さん、本当にいつもありがとうございます。次回も都合をつけて絶対に参加します!今から本当に楽しみです。