コンピュータやソフトウェアのあれこれ@道民(&元道民)
hiratara
This user hasn't shared any biographical information
Homepage: http://d.hatena.ne.jp/hiratara/
Posts by hiratara
[perl+web][perl]WWW::Mechanize-1.66と文字コード
10月 21st
最近、LWPやWWW::Mechanizeを2007年頃のバージョンから最新のバージョンにしたら、文字コードで色々ハマったのでメモっておきます。
結論から言えば、最新のLWPやWWW::MechanizeはUnicode文字列を適切に扱えますので、以下を心得て使うとハマりどころが少ないかなと思います。
LWP-5.837
- $ua->decoded_contentはUnicode文字列*1
- Content-Typeでの指定やMETAタグの指定から推測してくれる
- $ua->content はバイト列
- ただし、$ua->contentはContent-Encoding(俗にいうgzip圧縮)の展開をしないので、decoded_contentが無難
WWW-Mechanize-1.66
- $mech->content は $ua->decoded_content
- つまり、Unicode文字列
- $mech->field, tick, valueとかには、Unicode文字列を渡す
- $mech->click とすると、その<form>にaccept-charset属性があればその値でencodeされて送信される
- そうでなければ、全て"UTF-8"でencodeされる
さて、このclickの動作には一つ問題があって、WWW::Mechanize-1.66では「<form>が表示されているドキュメントのcharsetを、送信するクエリのcharsetとする」という大多数のブラウザでの動作をエミュレートできていません。具体的には、以下のテストが通りません。サーバに届くのは「%E5%A3%B1=%E3%81%82」となります。
$Plack::Test::Impl = 'Server'; my $mech = WWW::Mechanize->new; test_psgi ua => $mech, app => sub { my $env = shift; if ($env->{PATH_INFO} eq '/post') { return [ 200, [ 'Content-Type' => 'text/html; charset=euc-jp', 'X-QStr' => $env->{QUERY_STRING}, ], [ "done\n" ] ]; } else { return [ 200, [ 'Content-Type' => 'text/html; charset=euc-jp' ], [ encode 'euc-jp', do { local $/; <DATA> } ] ]; } }, client => sub { my $cb = shift; my $res_form = $cb->(GET '/'); $mech->tick('壱' => 'あ'); my $res_posted = $mech->click; is scalar $res_posted->header('X-QStr'), '%B0%ED=%A4%A2'; done_testing; }; __DATA__ <form action="/post" method="GET"> <input type="checkbox" name="壱" value="あ"> </form>
こちらはパッチを送ってみましたが、適用されるかはわかりません。
*1:厳密にいえばLatin-1文字列が返ることもあるので、UTF-8フラグが立つとは限らない → UTF8 フラグあれこれ
[yapcasia]勉強会をメモして公開するということ
10月 17th
@yappoさんがいいことを言っていたので、思うとこを書いておきます。
あのレポートのクオリティは相当なものだけど、あなたがYAPCに参加して何を思ったのかまではレポートされていない、なぜならそっれはあなたにしか表現できないから
勉強会のメモは、読むことより書くことに意義があります。勉強会の内容を写経すれば、ただ漠然と聞くよりも内容が頭に入りやすくなります。人が書いたメモを読むだけでは、この効果は得られません。このブログのエントリのようなただ書きなぐっただけの内容を読むのであれば、なおさらです:p セッション内でスライドに映されたモジュール名を自分の手でタイプすると、そのことによって記憶が助けられ、いざというときにモジュールの存在を思い出すことができるようになります。また、終わった後に感想文を書くだけでも、見て来た内容を改めて整理することができ、知識として吸収しやすくなります。
書いたメモは、ブログに載せるには最高のネタです。ソースコードだと、ある程度面白みのある内容でなければネタにはなりにくいですが、イベントのメモは特に労せずともそれだけでネタになってくれます。ブログを書く大切さは、@yusukebeさんがYAPC Asia 2010の最終日のLTで述べた通り。エンジニアにとってブログは名刺の代わりに使えるコミュニケーションツールであり、「ああ、あのブログ見たことあります」とそれだけで初めての人とも話すことができます。
このように、メモを書いて公開することで、学習効果とコミュニケーションの手助けという効果の2つの効果が同時に得られます。他の人が読んでも楽しくないんじゃないかとか、誰かがすでに書いてしまっているんじゃないかとか、そういうことはまったく気にする必要はありません。メモを書いて公開するのは、自分のためにすることです。他人のためにすることではありません。
このブログでやってる実況レポートも、元は「イベントで寝たらもったいないから、手を動かして寝ないようにする」という考えがきっかけで初めています。読んだ人々から評価をもらえることはありがたいですが、それ以上に、手を動かすことで「これらのメモの内容が自分の頭に入る」というのが続けている一番大きな理由です。また、ブログでのアウトプットを続けているお陰で、懇親会でコミュニケーションをとるときのネタにも使えるようになりました。
YAPC Asia 2010に参加された皆さんも、手元にメモがありましたらぜひそのまま公開してみて下さい。感想を持ちましたら、どんどん公開して下さい。ブログはエンジニアにとって名刺になります。有効活用して、色々な人々とコミュニケーションをとるといいと思います。
[メモ]勉強会をメモして公開するということ
10月 17th
@yappoさんがとてもいいことを言っていたので、思うとこを書いておきます。
あのレポートのクオリティは相当なものだけど、あなたがYAPCに参加して何を思ったのかまではレポートされていない、なぜならそっれはあなたにしか表現できないから
勉強会のメモは、読むことより書くことに意義があります。勉強会の内容を写経すれば、ただ漠然と聞くよりも内容が頭に入りやすくなります。人が書いたメモを読むだけでは、この効果は得られません。このブログのエントリのようなただ書きなぐっただけの内容を読むのであれば、なおさらです:p セッション内でスライドに映されたモジュール名を自分の手でタイプすると、そのことによって記憶が助けられ、いざというときにモジュールの存在を思い出すことができるようになります。また、終わった後に感想文を書くだけでも、見てきた内容を改めて整理することで、知識として吸収しやすくなります。
書いたメモは、ブログに載せるには最高のネタです。ソースコードだと、ある程度面白みのある内容でなければネタにはなりにくいですが、イベントのメモは特に労せずともそれだけでネタになってくれます。ブログを書く大切さは、@yusukebeさんがYAPC Asia 2010の最終日のLTで述べた通り。エンジニアにとってブログは名刺の代わりに使えるコミュニケーションツールであり、「ああ、あのブログ見たことあります」とそれだけで初めての人とも話すことができます。
このように、メモを書いて公開することで、記憶の手助けとコミュニケーションの手助けという2つの効果が同時に得られます。他の人が読んでも楽しくないんじゃないかとか、誰かがすでに書いてしまっているんじゃないかとか、そういうことはまったく気にする必要はありません。メモを書いて公開するのは、自分のためにすることです。他人の目を気にすることはありません。
このブログでやってる実況レポートも、元は「イベントで寝たらもったいないから、手を動かして寝ないようにする」という考えがきっかけで初めています。読んだ人々から評価をもらえることはありがたいですが、それ以上に、手を動かすことで「これらのメモの内容が自分の頭に入る」というのが利点で、今でもメモを続けている一番大きな理由です。また、ブログでのアウトプットを続けているお陰で、懇親会でコミュニケーションをとるときのネタにも使えるようになりました。
YAPC Asia 2010に参加された皆さんも、手元にメモがありましたらぜひそのまま公開してみて下さい。感想を持ちましたら、文章を書いてどんどん公開して下さい。ブログはエンジニアにとって名刺になります。有効活用して、色々な人々とコミュニケーションをとるといいと思います。
[yapcasia]今年のYAPCも楽しかった
10月 16th
今年も怒濤の三日間が終わりましたので、感想を書いておこうと思います。
まず、スタッフとスピーカーのみなさんは本当にお疲れ様でした。お陰で今年も目一杯YAPCを楽しむことができました。素晴らしい三日間でした。
今回、個人的に一番印象深かったのは、charsbarさんが「ある連載の舞台裏 - History tells us ...」のトークで最初にアナウンスしたひとこと。「20分後*1に地方.pmのセッションがあるので、地方からいらしている方を優先して応援しにいってあげて下さい。」 同じ道産子として、とても嬉しい一言でした*2。トークの内容も、Perlを大切に考えていることが伝わる素晴らしい内容でした。
Jesseさんの話もmiyagawaさんの話もそうですが、今回のYAPCはコミュニティの温かさを感じるシーンが多かった気がします。いいYAPCでした。
他、箇条書きではありますが、気になったトークの一覧です。
- Larry Wallさん「That Goes Without Saying (or Does It?)」
- 日本の参加者を楽しませようとしてくれる、その温かさに感激
- 峰松 浩樹さん「基幹システムがperlでどうしてこうなった」
- 長崎でこんなディープなことをされているそのパワーに驚くばかり。うらやましい。
- Karen Pauleyさん「10 Things to Do with a conference T-shirt」
- PCに向かうだけがハックじゃない。技術者にも見習うべき点は多い。
- TAKESAKOさん「all your base16 are belong to us.」
- これだけ毎回聞いてもまだ楽しい、不動のLT王
- Kaoさん「AnyMQ, Hippie and the real-time web」
- これは触れてみたい
- Yappoさん「Ajax Application Testing」
- これはぜひ使ってみたい
- Jesseさん「Perl5 is Alive!」
- 実際に行動して物事を成し遂げた人の話は説得力がある
- xaicronさん「let's database testing!!」
- これはぜひ参考にしたい
- yusukebeさん「Facebookを流行らせたのはボクです」
- 技術者はブログを書くべき、に同意
- miyagawaさん「The Tale of Plack」
- たくさんの写真がmiyagawaさんの築いたものを物語っていた
最後に、今年もレポートを好き勝手にやらせて頂いたgihyo.jpさん、本当にありがとうございました!
[perl][yapcasia]今日はYAPC::Asia Tokyo 2010の最終日です
10月 16th
今日はYAPCの2日目です。昨日と同様に、gihyo.jpさんの特集にもレポートを掲載しますので、完成をお楽しみに!
Chia-liang Kaoさん「AnyMQ, Hippie and the real-time web」
電車遅延のため、開始が10分遅れるそうです。
- Plack/PSGI → アロンアルファ
- Streaming Interface がある
- CGI.pm は使うべきでない
- AnyEvent
- 様々なイベントループのサポート
- POEは面倒
- AnyMQ - Tatsumaki::MessageQueueをインスパイア
- Mooseを利用
- topicを作り、 new_listener でリスナを作り、pollで監視。publishで発火。
- キューバインディングを増やしてくれる人募集
- Comet
- 色々なとこで使われている
- 色んなハックで成り立っている → MXHR, iframe, スピナー, 接続数制限
- WebSocket
- ws://とかwss://とか
- Upgrade: WebSocket などのヘッダを追加して実現
- \x{00} \x{ff} で囲む
- Origin と Sec-WebSocket-Origin ヘッダ
- Web::Hippie
- Commetはロンゲの彗星、Hippieもロンゲ
- 永続接続を抽象化 → $env の hippie.args, hippie.handle
- ミドルウェア enable "+Web::Hippie"
- psgi.nonblocking インタフェースサポートがあるサーバを使わなければならない
- Web::Hippie::Pipe
- 双方向通信の抽象化 (MXHR, poll, Websocket, AnyMQ)
- これもミドルウェア(bus として AnyMQを指定)
- $env に hippie.listener, hippie.bus hippie.message のサポート
- JS側でもnew Hippie.Pipeをして、メッセージを受け取る
- デモ → 株価とチャット
Yappoさん「Ajax Application Testing」
- FICIA → Flash を使っていない写真共有サービス
- 既存のツール → JSUnit, Selenium, QUnit, Test::QUnit
- Test::QUnit はやりたいことに近い → MozReplだとIEで動く?
- QUnit-TAP : @t_wada さんの実装
- JSTAPd
- JavaScriptエンジンを通す、Ajaxコードのテスト、CLI(make test)
- Ajaxアプリテストツール、Tap対応、JSDeferred-ish
- モックアップを*.tに書ける
- テストサーバup、ブラウザ立ち上げ、テスト実行、ブラウザ終了(Fxは無理)
- ユーザが利用する可能性のある
- インストールはcpanmかgithubから
- 使い方
- jstapd -n プロジェクト名 で作成、--jstapd -d プロジェクト名 でサーバ起動
- 自動作成されるファイル。
- index はブラウザ用。触らなくてよい
- conf.pl JSTAPdが使うURLの変更、JSのディレクトリのマッピング、CLIの設定
- CLIの設定 → conf.pl 内の auto_open_command または JSTAP_AUTO_OPEN_COMMAND 環境変数
- 01_base.t
- includeがテスト対象、include_exはライブラリ
- 01_base.js テストコード
- 01_base.html テスト用html
- テストコードの記法
- Test::More-ish
- tap$ で jQueryのようにDOMがとれる
- jQueryプラグイン → is_likeやis_text、is_visible。
- include_ex に \'jquery-jstapd.js' (リファレンス)を渡す
- テストケースを増やす
- .tを増やし、 JSTAPd::Suiteをuse, tests {...} を指定
- .jsと.htmlも追加するとよい
- Ajaxのテスト
- JSDeferred 的な記法 → jstapDeferred
- wait, next は JSDeferred と同様
- 非同期となるため、jstapDeferredを使わないとすぐテストが終了してしまう
- pop_request で$.ajax 時のwaitが可能
- .tファイルには、server_api関数。戻り値はJSONとしてブラウザに戻る
- Makefile.PL → prove -vr で代用できる
- JSTAPdの実装
- Twiggy → テストが終わるまでlong polling
- 今後 → 他言語でのサーバ実装、開発者募集
- おまけ(時間がないのでまとめだけ) → 必要なデータだけを処理、ユーザ操作の邪魔にならないように
- 質疑応答
- Q. Ajaxじゃない部分のテストは?
- A. 普通に書けばいい。Ajax以外の部分も書きやすくなっている
- Q. ブラウザを複数試したければ?
- A. 環境変数を切り替える
Jesse Vincentさん「Perl5 is Alive!」
- @obra にtweetしましょう
- パンプキンとは? → 後で
- Perl5は16歳
- Perlは死んだっていうひとは、時代についていけてない
- CPANは今でも活発 → Moose, Plack, cpanm, AnyEvent, Devel::NYTProf
- 5.12.0をリリースするのは恐かった → 今ではPerlの安定板は 5.12.0
- Perl6は? → 別の言語。7/29にrakudo.orgがリリース済
- これからは Perl6 の時代でも Perl5 の時代でもある
- 5、6はバージョンではない。別の言語。6は妹。
- 作者はどちらもLarry Wall氏だが、Larry氏の脳のバージョンが違う
- 5.12系のいいことは?
- 5.10系の昨日を安心して使える
- use 5.12.0 で自動でuse strict
- package Foo::Bar 1.0;
- 2038年問題対応
- Unicode 5.2
- Pluggable Keywords
- Overridable Function Lookup
- Dtraceサポート
- コアからのモジュールの削除 → Class::ISA, Pod::Plainer, Shell, Switch (CPANにはすべてある)
- やだやだオペレータ
- pumpking → Pumpkin King, Patch pumpking
- 変なパッチを当てない、リリースをきちんとする
- 5.10系には5年がかかり、二人のpumpkingが変わっている
- 5.10.1はメンテナンスリリースだが、大量の修正があった(2,800 commits)
- →とてもメンテナンスじゃない
- pumpking を燃え尽きさせてはいけない
- 現在は @obra さん
- 今までのpumpkingはPerlを愛する、強烈な責任感を持つCハッカー
- Larry以降、2つ以上のメジャーバージョンのpumkingをやっている人はいない
- 「このシステムには問題がある」 → スクラッチから作り直す (Perl6)
- リファクタリングをする
- @obraさんは、Cハッカーではない → 誰かにお願いする
- Patch の適用 → 誰かにお願いする
- Release → 誰かにお願いする
- Language Designer → 一部をやる
- 好みの調停、論争の解決、人事、PM → @obraさんがやる
- 5.10に比べて、5.12以降の開発は非常にスムーズ。毎月20日前後にマイナーバージョンを出す
- 手順の明文化 → 今では、開発版は数時間でリリースできる
- pumpkingがリリースする必要はない
- メンテナンス版のポリシー
- 昔はなるべく多くの機能を入れていた → なるべく機能を入れない(不具合修正のみ)
- 5.12.1, 5.12.2 ではbugfixしかしていない。3ヶ月置きに出している。
- 2011-04-20 には、5.14系 が出る。
- ASTラウンドとリップの改善をしたい
- CPANモジュールインストールを簡単にしたい
- 他、HTTP Client, IPv6, SSL なども欲しい → パッチを送って
- perl5.12の試し方 → perlbrew
- 質問
- Q. unicode6はサポートするか?
- A. サポートしたいが、今のPerl実装と互換性に問題がある
- Q. 早いリリースはいいが、パッケージングされているバージョンの対応は?
- A. 10月のUbuntuには新しいバージョンは載るのでは。最新が載らなくても新しめなものを載せたい。大きいサイトではいきなりバージョンアップするのは進めない
- Q. JSON::PP がコアに入る。JSON::XS がなぜコアモジュールではないのか
- A. コアには最低限なものだけが入るべき。PPが安定しているので十分。
Kenichi Ishigakiさん「ある連載の舞台裏 - History tells us ...」
- 次の原稿はまだできていない(!)
- 「なぜ連載スタイルを変えないのか」
- 連載が始まった経緯 → Mojoliciousの連載
- モダンPerl連載の誘い → 条件: 隔週連載、数ヶ月
- 「モダン」の定義では? → 21世紀に産まれたもの。
- 古いPerlを打ち切るためのbuzz word → our, use warnings, Unicode
- 先進的な人は、5.6.xや5.8.x も捨てたい → 5.10も選択肢
- いいPerlを使って欲しい。更新をして欲しい
- コミュニティに注目している → Larry氏の言葉「Perl6はコミュニティに作って欲しい」
- modernism(ギークのため?機能美)とpostmodernism(スーツのため?)
- モダンPerlは、流行って意味だけではない
- strawbery perl → Perlを普及させるならWindowsは大事
- 取り上げたかったもの → Moose, Rakudo, Sub::*, Devel::*, Catalyst
- 動向が早過ぎるので、落ち着いてから
- 隔週 → 最新の情報を配布するには遅い(早いメディアの例: tokuhirom氏のブログ)
- 陳腐化しない内容
- 読者層 → ギークは飽きっぽい
- No Moose, no Catalyst, no DBIC
- YAPC::NA では、上の三つを扱っている。日本はいい意味で飽きっぽい
- ギーク向けにすると寿命が短くなる
- How Toをやるには人的リソースに限りがある
- WEB+DB PressやSoftware Designなどの雑誌や書籍に任せる
- perl-users.jp や perl-mongers.org
- 日本人が関与するものは改めて紹介は不要
- モダンPerlは「ビジネスツール」
- Perlは赤ちゃん言葉から大人の言葉まで話せる
- 仕事を終わらせる、仕事を得るツール
- やるべきこと → 偏見を無くす「遅い、醜い」
- history.perl.org - Perl Timeline
- perlには4つの時代がある
- 「Perl/CGI、Windows、PHP」の時代の人々は、今ある程度のポストにある
- →彼らに好かれないとPerlは使われない
- メインターゲットは、これらの人々。
- 「10年前」がテーマ
- いいことも悪いことも書く
- どのようにネタを仕入れているのか
- 20年の歴史。インタネットが始まったばかりの時代から。
- Googleはあまり使いたくない(正しい情報かが疑問)
- CPANから探すのがよい
- CPANのインデックスファイル → authors/00shois.xmlなど
- 検索サイトは、 search.cpan.org が有名
- search.cpan.org/dist/Foo-Bar, search.cpan.org/perldoc?Foo::Bar
- 「CHANGES」を初めに見る → 登場した日がわかる。最新更新日が古ければ使われてない。開きが大きい時期はメンテナが変わってるかも
- モジュールができた年代に、モジュールができた理由がある
- CHANGESにない場合 → MANIFESTを見る
- MANIFESTからテストの中身をそのまま見られる
- その他、AUTHORSやSYNONIPS
- CPANになければ・・・BackPANも利用
- さらに、ソース, DIFF, CPANTSも情報
- モジュールの情報が集まったら → ソース, Wikipedia, 過去のYAPC
- perlfoundation でお金の流れから注視しているとこがわかる
- ほか、youtubeやスライド、各プロジェクトのサイト(noc.perl.orgにも情報有り)
- www.perl.org/community.html
- lists.perl.org MLの一覧 → ただし、GMANE, MarkMailの方が見やすい
- IRCのログ irc.perl.org にチャネルがある → ただし、secretのチャネルもある。ブログに張り付けたりするのはマナー違反
- www.perl.comの記事 → 編集者さんのついている記事
- 雑誌類 → Perl Review, $foo(de)
- Advent calendar や use.perl.org(→ blogs.perl.org)
- これらは一部で、他にもたくさん読んでいる。1つの記事に1〜2日、1週間以上かかる
- 歴史を調べてると、色々なことがわかる → the futureやa future。
- 記事を読んで、今のPerlの姿を見て欲しい。
xaicronさん「let's database testing!!」
- DBのテスト → insert, update, trigger などの事故を未然に防げる
- 今日の話は、MySQL(ORMの話はなし。自社ではDBIをそのまま使うことが多いため)
- 鉄則 → ローカルでテストできること
- ステージング環境や自分PCで立ち上げっぱなしのDB → 毎回結果が変わるのでNG
- SQLiteはNG → 環境が違って意味がない
- Test::mysqld (@kazuhoさん作)
- mysqldの自動起動、終了。$mysqld->dsn で接続情報がもらえるのでそこにつなぐ
- デモ
- Text::Fixture::DBI を使ってデータ投入
- テーブル作成、triger や procedure、既存のDBからschema定義の取得など。YAML出力も。
- デモ
- これらを直接使うのは面倒。テスト用モジュールを作るのがオススメ。
- DBIと親和性が高いモジュール
- SQL::Abstract (SALの抽象化)
- DBIx::DBHResolver (複数のDBの切り替え)
- DBIx::Connector (DBハンドルの局所化、fixupによる再接続、トランザクション)
- テストの流れ
- mysqldを立ち上げ、 fixtureでデータを入れ、値を取得してそれが正しいかをチェック
- fixtureには接続情報を渡し、yamlで初期化
- Test::mysqldの問題点 → make test が遅い
- Maketestの変更にて対応可能 → Module::Install::ExtendsMakeTest を使うと簡単
- → replace_default_make_test がMakefile.PLから使えるようになる
- 高速化!
Dan Kogaiさん「use LLEval;」
- x86を話す予定だったが、カジュアルな内容に変更
- LLEvalは23言語のサポート(実際は26言語)
- 実は適当につけた名前だが、確定してしまった
- iPadは便利だが、Perlがない。なぜ? → Jobs「stay foolish!」
- LLEval経由なら動く → RMSの例
- デモ → LWP::Simpleを使う例
- 「1 while 1」 → 1秒後に終了する
- perl6のデモ -> 約3秒。Perl6だけ4秒ルールとなっている
- Haskell, JS, POST SCRIPT, Python, BF, iota, のデモ
- JS はspider monkeyを使っているが、 ary.reduce はデフォルトでは入ってない
- Mathmatica はLLEvalでは非対応。
- 「fork while 1」 システムコールは禁止
- LLEvalはライブドアの研究用のサーバで動いている
- LLEvalはMASHUP AWARDS 6の対象となっている
- 質疑応答
- Q. x86は?
- A. コメントアウトすればすぐ。セキュリティ的にちょっと恐かっただけ
- Q. 出力はSTDOUTのみ?
- A. 今はSTDOUTとSTDERR。他の出力方法もサポートしたい。
Toru Yamaguchiさん「Inside Mobage Platform」
- Open Social Container
- JS API, Gadget XML パースとレンダリング
- 画面、Activityフィード、Gadget管理ツール
- 用語
- Container(SNS本体)
- Gadget Server(Sindig担当)
- JS API(Social DataにアクセスするAPI)
- Core, Social API (JSON-RPCはバックエンド。RESTful APIはモバイル用)
- View: canvas, home, profile, mobile(ガラケー向け。Extension)
- ZOOKEEPERでのcanvasの例
- Apache Shindig とは
- オープンソース実装
- MySpaceは使っていないらしい
- DeNA, mixiはJava、GREEはPHP
- 認証部は自前で結合する必要がある
- JS APIは手直しが必要。RESTful + JSON-RPCのデータ取得部はJavaかPHPで実装が必要
- よくSpec違反がある → Shindigを真とする
- Gadget Parsing, Rendering は仕様が煩雑なので自分で実装しない方がいい
- Applicationは直接外に出れない(XHRの制約)ので、Gadgetサーバに代理してもらう
- 認証 - Security Token or OAuth
- Security Token をJSで使えるコードとして埋め込む
- Shindig::Authen::Java::XXXX のようなクラスを自作 → Javaとも互換性有。そのうち公開
- /social/* のリクエストだけ、リバースプロクシでShindigではなく自前のアプリに送る
- 他、config/container.js の更新、lockedDomain、features以下のJSの修正(Specに忠実になるよう直す)
- SocialAPIの作り方
- Spec準拠、テスト作成、シンプルかつ速く、可読性を高く
- 既存のWAFは不要
- lighttpd → 今ならApacheを使うが、最初のチョイスを利用
- Plack + FastCGI → 今ならStarman/Starletかも?(未検証)
- rpmでCPANモジュールを管理している → 今ならlocal::lib
- Dispatcher → 設定はすべて *.pl 。Router::Simpleの利用。
- Intercepting Filterパターンを利用
- モデル
- APIで必要なロジックの記載。戻り値はFormatterにてArrayRefやHashRefなどに整形
- オブジェクトは利用しない
- Object::Container にすべて突っ込む。fork前にやる(Copy on Write)。Configで制御
- DB, Memcachedへのアクセス
- DBIx::DBHResolver, DBIx::Connector
- SQL::Abstract, DBIx::AbstractSequence(社内)
- 接続情報はマスタとなるmemcachedに集中。Cache::Fileにキャッシュ。
- DBIx::DBHResolver
- オブジェクトとしてもクラスとしても動作
- 各種設定ファイルでの記述(Config::Any)
- DBIサブクラス、DBIx::Connectorでも接続可能
- ShardingしたDBの管理機能(予め分割方法は決めておく。JOINは適材適所)
- resolve_node_keys()
- DBIx::Connector → レキシカルなハンドル、txn + commit
- SQL::Abstract
- JOINやGROUP BY が複雑だと、ヒアドキュメント
- 表現力が足りない部分もある。新しいSQL作成モジュールがあってもいいかも
- Plugin::InsertMulti バルクインサート。ただし、1000件くらいを上限にすべき
- MySQLのパーティショニング → 日時の Range Partitioning が主
- トレードオフ → 意図するUNIQUE KEY制約が必要になったり
- EXPLAIN PARTITIONS でパーティションの選択が見られる
- MySQLのTRIGGER
- アプリケーションを変更しなくても特定の処理が可能 (逆にそれが気持ち悪いかも)
- スキーマ変更時に、トリガーを使って自動で親子関係の日付を入れたりできる
- TRIGGER + Q4M (検証中。古いテーブルにinsertがあった場合に必要なジョブをあげる)
- Worker
- Q4M, Gearman。原則すべてのサーバに同じコンテンツ。
- ラウンドロビンでは負荷分散しきれないことがある
- 最近の事例: Cache::Memcached::Fast に no_wait がなかった
- Q4Mは実績があり、十分信用できる。ただし、初めて経験するような動作も起きるので覚悟は必要
- 質疑応答
- Q. ShindigはJava? JavaからPerlを呼ぶ?
- A. いいえ。JSから呼ばれる口のみ
Lightning Talks
charsbarさん「Top tens of 2009-2010」
- (今年も)輝け全日本最強CPAN選手権
- HIROSEさんがTOP、MORIYAさんが2位。4名新しい人が!
- 他、台湾、ノルウェイ、オーストリア、イスラエル等のトップ10を集計
- 日本は264人(多い。ただし人口比の問題)。オランダ人は0。
- 面積比で考えるとIcelandic
ふしはらかんさん「opts.pm」
- 後夜祭来てね! 以上!!
- えーー(ブーイング)
- opts.pm → コマンドラインオプション
- Getopt::Long はまだまだ使いにくい
- 型、デフォルト値の指定、usage、オブジェクトへの変換
Cornelius (c9s)さん「vim & perl」
- PerlOmni -> Vim の保管
- Perl文法は複雑
- 動的言語。補完が遅い
- VimLは汚い
- クラス名、オブジェクトメソッド等の補完
- AutoComplPopとの組み合わせのデモ
- Moose のAtribute にもスマートに対応
- git から持って来てインストール。Windowsなら @mattn_jp さんのパッチを利用
- CPANモジュールの検索、インストール
- ゴーーン!(時間切れ)
上田智さん「もっとMySQL」
- WAFの目的「小規模」「大規模」
- リソース制限が厳しくなると、3層でやる必要はない
- MySQLだけでいいじゃないか! → HTTP Plugin
- HTTPをリスンするプラグイン
- 今後の目標
- ストアドプロシージャによるO/Rマッパ、キャッシュ機構、UDF-ng (MySQLでPerl(Catalyst)まで動かす)
Koichi Taniguchi (a.k.a. nipotan)さん「There are so many ways to shuffle it」
- 他の人が他の人のコミット履歴を見て説明する
- シャッフルが必要
- rand関数の利用を監視
- MD5を利用
- 可能な組み合わせを対象人数より多く
- Perl6では Z オペレータが可能
- TIME TRIAL → 6題目王者まで紹介
- 毎週使用する文字が禁止されて行く
- Livedoor では shuffleの名人を募集しています!
hakobeさん「ページャ実装マニアックス」
- ページャとは? → Googleとかで検索すればわかる
- 108のページャ実装を紹介
- Hatena::Bookmark::Pager (Data::Pageベース)
- Hatena::Diary::PagerMaker (HTMLを直接生成)
- Hatena::UgoMemo::Pager (データ生成までページャにやらせる)
- app->pager があったりする
- ページャとは → SQL結果、件数、日付、キャッシュ等の要素
- 残り105個
- Hatena::UgoMemo::Pager::Merged (SQLから)
- Hatena::UgoMemo::Pager::ArrayRef (ArrayRefから)
- CachedqueryOffset, Binary, Lite・・・
- ゴーーン!(時間切れ)
Tokuhiro Matsunoさん「液晶が割れたためスライドなしでトーク(仮名)」
- 速いHTTPクライアントが欲しい
- LWPは遅い。特にRPCで欲しい。Curlも遅い。
- WWW::Curlより25%以上速い → もっと速くなるはず
- 日本に色々な能力を持った人がいる → ブラウザが作れる人、ネットワークが強いkazuhoさん、XSのgfxさん、win32担当のmattn_jp, charsbar, xaicronさん
- 日本には素晴らしい能力を持った人が居るので、作りたいものがあったらどんどんハッカー達に伝えよう
Canada, Masakatzさん「岡山.pm。都会.pm。」
- 岡山.pmを主催した
- 岡山とは? → 中国地方、政令指定都市
- 参加者の推移 → 8倍以上に!(1名から8名)
- 問題点 → 人が集まらない。問題点すら集まらない
- mixiや知らない人の掲示板等にかいて怒られた
- 7/50人。本人+知人Yさん+その知人7名+牧さん
- 今後の展開 → 人を増やす。増やす方法をtwitterで募集する(した)
- ・・・TLには特に反応無し
まかまかさん「Perl同人誌の宣伝」
- (飛び込みのLT)
- Acmeモジュール
- 全部空でいうのは難しい → Acme大全2010
- Acme::CPANAuthors::Douchも
- バージョンアップ
- ダラク(キャラクター)が大きくなった
- 用語集
- デコシール付き → 貼って剥がせる
dameninngennさん「草とPerl」
- 草"植"系 「wの多用www」
- キーボードまで全部「w」に
- Glassでは物足りない
- Werlの実装
- 予約語が草 → print は WWwwWW
- 誰得? 俺得
- TAKESAKOさんの予約語プログラミングとの合体
- wwencode のデモ
大西康裕さん「Test::Apache::RewriteRules で mod_rewrite のテストを書こう」
- はてなでページャーをたくさん作った
- mod_rewrite → スイス製アーミーナイフ
- はてなではreverse proxy として活用
- Squidから同一URLで異なるコンテンツを返す時に変換しておく
- Rewrite定義が、179行も
- RewriteRule → テストツール。
- HTTPリクエストを投げ、どのURLにマップされるかをテスト
- Apacheが実際に起動される
- 本番のconfをテスト用に置換をしてテストできる
- is_redirect, with_request_method, with_docomo_browser, with_http_cookie など
- 自信を持ってhttpd.confに1行追加できるようになります
Yusuke Wadaさん「Facebookを流行らせたのはボクです」
- Facebookがすごい? → ブームを起こせるBlogがすごい
- HNS(ハイパーニッキシステム)でブログを始めた。BLOG HACKS。
- Perlを書き始めるきっかけに
- dankogaiさんの勝手に添削 → 一瞬腹が立つ → けど、納得
- 晒すのは大事
- YACP Asia 2009 → casual なPerlのエントリ
- miyagawaさん「On module writers and users」
- PerlCasualを興すきっかけになった
- ブログを書いているkoba04さんに声をかけたらやってくれた
- TwitterやSNSのmixi、Facebook ではそういうことはできない
- ブログは情報発信の場。まず、YAPC Asia 2010の感想を書いて下さい!
miyagawaさん「The Tale of Plack」
- 2本しか飲んでないそうです
- しばらくはSan Franciscoに住むが、日本には定期的に帰ってきたい
- six apartはSAY: (SAYMEDIA.COM)
- six apartの名前の由来 → 創業者2人の誕生日が6日離れていたから
- SAY: は ビルトイン関数だから、まあいい名前
- PSGI/Plack
- PSGIが仕様、Plackが実装。Wikipediaにも載ってる。
- コードの見本。(今日のコードはここまで。)
- Plackは受け入れられている
- 今回のPlackに関係するトーク → 10以上。
- 利用している企業も増えている → 11社の例
- なんでPlackが成功したのか?
- 1) 借りるより、盗む → HTTP::Engineは借りるだけで既存の部分は残っていた
- Plackは、RackとWebOb.py からほとんどを盗んだ。
- 2) 後発の利点
- WSGIは2003年、Rackは2009年
- 遅れていくと、いいものができている(鍋の例)
- RackやWSGIの成功、失敗がわかる
- 3) JFDI → Just F*cking Do IT
- やるしかない。やりたい人が勝手にやってよい「Don't ask us do it.」
- 4). stfuawsc "Shut the fuck up and write some code."
- 喋っている暇があればとにかくコードを書く
- 5). TIMTOWTDI (TimTowdy)
- BSCINABTE (But sometimes consistency is not a bad thing either) = bicarbonate?
- →流行っている。Moose などのコンテキストで使うことが多い。
- PSGI → サーバとクライアントで共通のインタフェースができた
- TIMTOWTDI かつ BSCINABTE
- 6). KISS(keep it si
nmple*1 and stupid) (UNIXの標語)- なぜOOにしないのか? → シンプルにしたほうがよい
- 7)Perl: a glue language
- PSGIも糊。
- 色んなフレームワークの間で共通APIを作るのは大変。
- HTTP::Engine → 既存のフレームワークが合わせるのは面倒
- インタフェースをシンプルにすると、糊を書くだけで既存のフレームワークは合わせやすい
- 8). 名前の付け方を変えている
- 今までの名前空間は長過ぎる(::が多い)
- タイプが面倒。会話もめんどくさい。省略形で書く。
- Rubyのやり方を真似る → トップレベルを積極的に使う
- Starman(Net::Server::HTTP::Prefork::PSGI、にはしない)
- トップレベルの名前を付けるのは、大変。しかし、愛着も沸く。
- 9). People
- たくさんの参加者との交流 → 世界各地で撮ったPerl Mongersの写真を次々と公開(何十枚?)
- 色んな人とチャット、プレゼン、ビールで交流
- 今日はなぜ集まっているのか?
- 仕事も出身もやってることも違う
- みんなPerlを使っている。Perlが人々を糊付けしている
- YAPC::Asia → 毎年大きくなって来ている
- 2回目以降の開催は大変
- 開催が大変であれば、Jesse氏のように適切な仕組みを整備し、みんなで続けて欲しい
- 次回以降も(日本か、どこかで)話ができることを楽しみにしている
941さん「クロージング」
- YAPCでのダメージ → 足と愛機(S90)が壊れた
- 開発チームだが開発はしない → ブログ、イベント担当
- YAPCが成功するより先に @941++ と言われて脅されて頑張ってるw
- YAPC 2010の某日
- 今夜開いてるか上司に呼ばれた。ただ酒を飲みにいくとJPA理事会だった
- 「今年のYAPCは厳しい」 → 誰もお酒を飲まない状態
- 「俺やりますよ」 → そのまま丸投げ
- Twitterで要望を聞いた → 0件
- Tシャツ変更タイム(何枚来てるの?)
- たくさんのスポンサー、東工大さんに感謝 → 東工大Tシャツ
- メインスピーカー、スピーカー、会場の人々、に感謝
- ボランティアスタッフは壇上に
- エンターテイナー賞の発表(SQL文で集計)
- cho45さん「映画に出てくるハッカーになりたい」 (iPad 16GB)
- ベストトーク賞 次点
- nekokakさん「省サーバ運用」 (Mac mini メモリ8GB)
- 抽選タイム
- LUFB9GXEの人 → iPod nano (use strict; の刻印入り)
- ベストトーク賞
- tokuhiromさん「モダンな Perl5 開発環境について」 → MacBook Pro 8GB
- 「頑張ってこれでみなさんの役にたつモジュールを書きます」
- 「来年のスピーカーはあなたです」 (c) yusukebe
- 最後に @941 さんに拍手 → 来年もお願いします
合わせて読みたい
- もう一人のgihyo.jpレポーター → YAPC::Asia Tokyo 2010にgihyo.jpさんのレポータとして参加させていただいた
- 動画 → YouTube
- スピーカのアカウントの一覧 → YAPC::Asia2010スピーカーの(Twitter/Blog/github/cpan)アカウント
- スピーカのスライドの一覧 → YAPC::Asia 2010
*1:Thanks to @techno_neko
[perl]今日はYAPC::Asia Tokyo 2010の初日です
10月 15th
今日からが本当のYAPCです。まもなく、東京工業大学大岡山キャンパスに向けて移動します。
昨日と同様に、gihyo.jpさんの特集にもレポートを掲載しています。gihyo.jpさんにはもう一人 @usuihiro さんもレポートを書かれていますので、そちらも合わせて会場の雰囲気を感じて頂ければと思います。
Daisuke Makiさん「Welcome, Perl!」
- Future, Past, Present Perls
- ゲスト → Larry, Jesse, Purple Master
- みんなにPerlを広めたい
- 今回は非エンジニアが企画した (941さん++)
- 518人の参加者 → 世界で一番大きなYAPC
- タグは #yapcasia で
- トークの投票をやる → 優秀者にはMacBook Pro
- 懇親会は19時より2,000yen
- android, iPhone の YAPCアプリがあるので使って! (有志の方の作成)
- ロケタッチもYAPC対応
- 謝辞 → ボランティア30名、tmix、スポンサー23社
- ハッカーと積極的に話して、楽しんで下さい
Larry Wallさん「That Goes Without Saying (or Does It?)」
- 日本語と英語の違い
- must <=> なければなりません (英語が短い)
- must not <=> いけない (日本語が短い)
- 英語には複数形がある
- RMS(Root Mean Square)
- 色々な言語で書き方に違いがある
- Perl、 Oz、 Lisp系 での違い
- FoldLについての解説
- Perlで必須な物
- @, $
- {}
- () → 必要な時と不要なときがある
- 「@ints = 1 .. 10」と書けるが、Perl5では「@ints = 1, 2, 3」と書けない
- 結果を格納する $r
- CPANモジュールを使う → List::Util の reduce
- Perl6では
- reduce を [+] と書ける
- map にはカンマが必要 → ただし、 @nums X** 2 と書ける
- 引数は、subの行に書ける
- $r を完全に消せる
- print "\n" → say
- Perl6では、 + はスカラコンテキストを与える
- Perl5ですでに使えるもの → say, smart matching, given/when, Moose
- 将来もPerl5でサポートされないもの → type system, multi method dispatch, lazy context
- Ada
- with と use, begin と end, nums'Range, 1..10が簡単に書けない
- ファットアロー =>
- Java
- import(java.*), class, "public static", 型, C形式のループ
- Math.とかSystem.outとか
- JS
- function(長い)
- reduceの初期値が必要(Perl6では+なら0、*なら1、<ならtrueが使われる)
- Python
- __future__ のインポート、インデント
- range(1, 11) (# 1 .. 10 とコメントしないとわからないよ)
- Perl6より短く書けるのは、Mathmatica (これは当たり前)
- J → 短過ぎる
- このような見本は、 http://rosettacode.org/ で見られる
―Sqiral matrix, Zig-zag matrix の例
- 「Please have a wonderful conference. You must!」
Jonathan Rockwayさん「Stylish: Perl ♥ Emacs」
このセッションはJonathan Rockwayさんがいらしていないということで、中止となりました。
石橋利真さん「最近のPerlな物作り事例」
- MTLでの業務
- 自前サービス - ATND、調整さん、演劇ライフ、ハモニナ、コマーシャライザー、docomo公式、モバゲー
- 社内コラボ - ポンパレ、suumo、WEB API、iPhoneアプリ ←今日の話はこちら
- suumoの事例
- 個社の物件+CMSの提供 → century21.on.s-bs.jp、athome.on.s-bs.jp 等、1,000個
- CMS、物件検索、Typepad
- デモ → 数社のページを表示。CMSの操作例。モバイル版。
- suumo的なサービスを横展開
- お店のミカタ → ページを作るとホットペッパーに引っかかる
- パチパチゼクシィ → 結婚式開催向けSNS
- 開発環境を整えると、長期に渡って開発を続けられる
- VMware。個人開発環境
- テストコードの充実 → ビジネスロジックのみテスト必須。画面系は妥協。
- 本番環境でもテストを回している → 設定、CPANモジュール漏れの発見。テスト用DBを用意。
- Subversion に CPANモジュールも投入。svn up でデプロイ。
- 同じOS、同じ環境である必要がある → VMWareによって揃える
- svn配下にインストールできるよう、MyConfig.pm をいじっておく。
- site_local_env にて環境変数等を設定(.bashrcより読み込み)
- 動的ライブラリも、.soをsvnへ登録
- *.conf もsvnへ。全環境分を登録し、symlinkで切り替え
- symlink 変更スクリプトを用意している
- 複数サービスによるロジックの共有
- Perl Framework 部分は、すべてのサービスに配備されている
- 認証、画像、Open Social系はWEB APIとして準備
- (環境まで含めた)フレームワーク
- 開発手法 > アーキテクチャ設計 > アプリフレームワーク > ASP + プロジェクト毎ロジック
- メンバーの入れ替え等にも強い
- インフラ
- Hardware + XenServer
- VMの複製コピーができるので楽
- 仕事の仕方 → 企画、サイト設計、業務フロー、開発、運用、すべてにエンジニアが参加
- 仕事のスケール → 営業、顧客サポートまで含む大きな体制
- 金銭的にも、大きな額が動く(1,000社程度の契約)
- 様々なオープンソースを利用している(Thanks To!)
質疑応答
- Q. 「CPANモジュールのアップグレード方針は?」
- A. 「上げない。必要な状況があれば上げる(セキュリティfix等)」
- Q. 「(デプロイ用の)svn upは手動?」
- A. 「はい。基本的にリーダーが。」
- Q. 「ブランチは使っていますか?」
- A. 「新機能はブランチで行っている。マージはリーダー。」
- Q. 「オープンソースの中で、オススメがあれば」
- A. 「backlog。cacooもオススメ。cpanminusも使いたい」
kawanetさん「Mashup Awards 6」
- Web アプリケーション開発コンテスト
- 62社のAPIのうち、1つ以上利用すること。動く場所は問わない(電子レンジ等でも)。
- 注目APIの紹介
- LLEval - 弾さん「明日トークします」
- R25 API → R25本文の提供
- NetVOCALOID-flex → 音声合成のAPI。MA6に参加すると特別に無償提供
- モバゲーオープンプラットフォーム → 会社名を「マッシュアップアワード6」とすれば特別に個人登録も可能
- NHKの非公開API → 通常は非公開
- Evernote API → Evernote社が使っているAPIをそのまま公開
- インクカートリッジ里帰りAPI → 回収拠点情報の提供
- 最優秀賞は100万円。11/8まで。
- 目的 → 技術者の支援、WEB業界の発展
- Hackathonも開催中
Kensuke Kanekoさん「30days Albumの裏側 後日談」
- 30days Album
- 写真共有サービス
- 表はRoR。裏はPerlbal や Gearmanなど。
- 過去の発表スライドも参照
- 素結合を意識したシステム構成
- HTTP APIでのやりとり。(Catalyst製)
- 利点 → スケールしやすい。開発能率が上がる(適材適所)。保守が楽。
- 欠点 → システムが複雑、サーバ台数の増加、障害時の影響範囲
- MogileFSの障害対応
- データアクセス不可の障害発生 → ストレージプールから切り離し、再度戻す
- mogadm にて deviceを "dead"にする。復帰時は"alive"に戻す
- コピーの確認 → X-REPROXY-URLヘッダを見る。又は、file_onテーブルを見る
- 障害が起きても、サービスは停止しない。
- perlbal の再起動(キャッシュのクリア)
- MogileFSのリバランス
- 使用量の少ないストレージへ、ファイルを分散して平準化
- リバランスが必要なタイミング → 新しいノードを追加、容量不足、class(多重度)の変更
- リバランスをすると、MySQLの負荷は上がる。新しいバージョンであれば改善
- ネットワーク大域も圧迫。モニタリングした方がいい(Mininの利用)
- 自作サーバ MP-100 (馬崎さんパワー100Kg、の略)
- HDDの固定にL字金具。リモート管理可能なマザーボード。
- 信頼性よりコストパフォーマンス(MogileFS頼り)
- Cerevoさんとはてなさんの事例を参照
- FLVの疑似ストリーミングとは
- シーク可能。リクエストにstart=*をつける
- lighttpd の mod_flv_streaming。Apache、nginxにもある。
- Perlbalにはない。
- Perlbalプラグインを作成した
- PerlbalとRangeヘッダ
- Perlbal は Rangeヘッダリクエストでエラーが出る → X-REPROXY-EXPETED-SIZE が原因
- Content-Length と一致するか比較していた。ストレージサーバがRangeヘッダを考慮してなかった。
- 複数のRangeヘッダについては無視(仕様がややこしい)
Tatsuro Hisamoriさん「ソーシャルアプリ向け システム監視運用の勘所」
- 事例の紹介
- 「正しくコンテンツを返しているのにタイムアウトが頻発 → ネットワークに問題があるのでは?」
- タイムアウトはしており、Platform側ネットワーク障害も特になし
- tcpdumpで調査
- コンテンツを返すのに5秒かかっているので切断
- しかし、200を返してしまっている
- アプリ側の処理遅延が原因(DBの性能劣化だった)
- コンテンツを返すのにかかる時間
- WAFでログに出す(request -> response)
- %DとGadgetServerが認識している時間は違う → 現状は、alarm()がSIGALRMを送るまでの時間
- tcpdump + wireshark で解析するとよい
- tcpdumpとwiresharkの利用のデモ
- -w でファイルに吐く
- TCP Conversations を表示し、 Duration でソートするとよい
- DB周りの処理時間
- DBI::ProfileはDBIと同梱。useするだけでよい。
- DBIx::ProfileManagerでは、profile_startからprofile_stopが統計対象
- slowlogを吐いていれば、mk-query-digest(maatkit)で解析
- 最終手段として、mk-query-digestにtcpdumpの結果を読ませることができる
- 性能劣化の把握も必要 → Connection QPS, I/O
- open Platform で参照している指標の紹介 → TableSpace usageなど
- ネットワークのレイテンシの把握
- ping, traceroute などで計る
- 自宅サーバ等でも10ms、EC2だと100ms〜200ms、GAEはバラツキが多い
- VMでもレイテンシとなる
- 画像キャッシュを利用するのもよい
malaさん「Studying HTTP with Perl」
- PerlのHTTPクライアント(非並列)
- LWP::UserAgent → デファクトスタンダード
- LWP::RobotUA → robot.txt を解釈
- URI::Fetch → グッドラッパー。キャッシュ等
- HTTP::Lite → シンプル。1ファイル。依存もない
- LWPx::ParanoidAgent → イントラネットへのアクセスを防ぐ。Net::OpenID::Consumerで利用
- WWW::Curl → libcurlのバインディング。高速。表記はcURL
- PerlのHTTPクライアント(並列)
- HTTP::Async, LWP::Parallel → 古く、オススメできない
- AnyEvent::HTTP → AnyEvent ware。コードを追いやすい
- Coro::LWP → LWPをCoro対応させる。ただしCoroは黒魔術。Perlプロセス全体に影響有。
- AnyEvent::Curl
- (今まで考えていた)前提 → I/O待ち時間がほとんど。実行速度は無問題
- しかし、実際はLWPの遅さは問題がある
- LWPでは性能限界(ネットワーク待ちが0の時の性能)が低過ぎる → CPU1つで秒間200回
- ネットワーク性能のよい、速いサーバを相手にするときに使う
- 負荷試験、DoS攻撃(!)に向いている
- 性能限界は、秒間2500回。LWP::Compatにすると、秒間1000回。WWW::Curlよりは遅い
- 使いどころ
- LWPの性能限界を超えている時
- ブロックしてはいけないとき(つまり、WWW::Curlでは駄目なとき)
- LWPを利用した機能があるときは、LWP::Compat
- curl_multi_fdset でとりだしたfdを AnyEventで監視
- Perl並列処理入門
- perlのthreadはバグッてるので使わないこと
- forkによるマルチプロセス
- イベント駆動(I/O多重化)
- forkの特徴
- スケジューリングはOS任せ
- マルチコアを生かせる
- forkのコストの高さ、メモリ消費の大きさ
- イベント駆動
- AnyEvent, POE → メモリが少なくて住む
- Coro → 直感的なコードを並列化できる・・・が、ハマりどころ多い
- 現実解 → イベント駆動 + prefork
- AnyEvent::DBI → forkして実行する
- prefork型 → mod_perl, starman, starlet, Paraller::Prefork, WWW::Curl
- DOS攻撃には弱い。プロセス枯渇する(特に遅いワーカーが多い場合)
- slowloris のようなツールに弱い
- 対策 → 個人の持てるIPアドレスは少ないのでIP辺りで資源を制限。タイムアウトの導入
- 1リクエスト処理時間、リクエスト数が予測できれば、preforkはよく機能する
- 外部APIのレスポンス時間に依存する場合は、向いてない
- イベント駆動 → Twiggy, Corona, AnyEvent::HTTP, Coro::LWP,AnyEvent::Curl
- スレッド間の強調動作をするときに向いている → 同一ホストへのリクエストを制限する時など
- クライアント → 相手の応答速度が予想できればWWW::Curl、そうでなければAnyEvent::Curl
- パフォーマンスチューニング
- HTTPヘッダのパースをXS化。ただし、パースしない方が速い
- まだXSで落ちたりするので注意
- デフォルトのcurlは名前解決でブロック
- enable-aresコンパイルオプションはまだお勧めできない(すべてのリクエストが落ちる)
- Squidを噛ませることで解決する → Squidがボトルネックになるけど
- RPCのプロトコルはHTTPの方が有利
- 例えば、 Kyoto Tycoon (mikio hirabayashiさん)
- アクセスが楽、表現力がある、非同期アクセスにも強い
- HTTPのオーバヘッドの解決 → Keep-alive、複数データをまとめて1リクエストで転送すればよい
- HTTPの性能限界 → echoサーバとHTTPをkazuhookuさんが比較。チューニングされたhttpdは十分に速い
- curlにはまだ高速化の余地がある → gfxさんがやってくれるのではないか
- HTTPクライアントのテスト方法
- Google などにリクエストを投げるべきでない
- Text::TCPやpsgi app を作ってテストするべき
伊藤直也さん「Perl/PHPと大規模Web開発」
- LLフレームワークの近況
- 中規模以上 → Rails的
- ちょっとした開発 → Sinatra
- 実行環境 → Rack
- Perlでは
- Catalyst, Jifty, Mojolicious
- Mojolicious::Lite, Dancer, Shenker
- Plack/PSGI
- Mojolicious
- Sebastien Riedel氏作
- Mojolicious::Lite → Sinatraライクな記法
- websocket 対応
- PHPでは
- CakePHP, CodeIgniter, Symfony → 作り込まれたWAFが多い
- Limonade, Fitzgerald
- まだない (需要が小さい)
- 言語によって大きな差異はないが、好みはある
- PHPの名前空間 namespace \My\Name\Class など
- 中から大規模とは → 500から10000台以上
- 収益化までに数年かかっている → 数人で立ち上げたシステムを数十人で運用開発
- 昔のアーキテクチャを使い続ける必要。運用を続けなければならい。
- 「レガシー」とは違う → プロトコルはHTTPであり、枯れている。LL言語は後方互換が高い
- フレームワークの内製バージョンができる理由 → 自社目的の拡張をしたいため。公開はしにくい
- アーキテクチャの刷新
- 独立性の高い案件で新しいものを採用 → 複数アーキテクチャによりメンテナンスコストが上がる
- 旧システムを進化 → 限界がある
- まず疎結合化してWEB APIで結ぶ。各部品を刷新 → パフォーマンスの問題。メンテナンスコスト
- スケーラビリティ
- 言語での優位性は低い
- I/Oの分散や全体の設計が大切
- 3層構造、スケールアウト、パーティショニング、キャッシュ、メッセージング
- 大規模Webサービスは、成長し続けることが大切
- レガシー部分を蘇らせるのが腕の見せ所
- 言語での優位性は少ない → 精神面では、好きな言語を使った方がよいけど
- Perl → PHP の移行コストは?
- 少ない。CPANは欲しい
- 次世代Web技術が大事で、言語の知識の比率は少ない
- ツールはPerlで作っている → メンテをどうするかが課題
- 質疑応答
- Q. use backslash はいつ公開?
- A. そのうち公開します
Lightning Talks
西林拓志さん「学生PHPプログラマーがPerlな会社に就職した!」
- PHP歴4年
- Perlの印象 → 難しい、重い、古い
- 生まれが一緒。高校の頃に触った印象
- 実際
- 思ったほど難しくない、正規表現がよい、CPAN
- オブジェクト指向の柔軟性。楽しい。
- PHPを使った人がハマる所
- リファレンス
- $this, super, self
- subとfunctionをtypo
- 最近ではPHPで my $self = shift; と書いてしまう
- DBIx::Skinny::ModelLoader ってのを書いてみた。githubを参照
- 趣味でBlogやゲームのファンサイトを作っている
Fumiko Kuranoさん「Inside webcast of Gozan-no-Okuribi in Kyoto」
- 京都送り火の中継 → 携帯電話向けの中継
- ビデオカメラ + PC の Ustream、ほぼ日刊イトイ新聞の読者さん
- 夕方まではバッテリの都合で静止画
- システム図 → 中継システムがPerl
- PerlMagick で画像処理、 Net::SFTP::Foreinで画像送信
- 結果分析
- Twitterのログ、アクセスログの分析
Yappoさん「Happy AnySan Hacking」
- tsudaさんのコスプレ
- AnySanとは? - AnyEvent のメッセージングフレームワーク
- 似ているもの → IKC, Bot::BasicBot, Morris など
- IRC以外の対応も可能
- メッセージの抽象化
- AnySan::Provider::IRC でIRCからのコールバック
- AnySan::Provider::Twitter → Twitter
- デモ: @dan_the_bot
Naoki Tomitaさん「OFPM」
- なぜ忍者 → 手裏剣選手権に出席したから
- 1日1個CPANモジュールの紹介 → 2008年で挫折 → 書籍化!!(100〜150個)
- CPANTS → CPANモジュールの統計情報
- ただし、モジュールで使うモジュールが多く出てしまう
- Gist から統計
- OFPMというサイトを立ち上げた
Kamipoさん「MySQLのPluginいろいろ」
- MySQLには5種類のプラグインがある → UDF, STORAGE_ENGINE, FTPARSER, DAEMON, INFORMATION
- UDFの例: mycached → memcached プロトコルで直接アクセス
- STORAGE ENGINEの例: SpiderとVP, groonga(全文検索エンジン)
- FTPARSERの例: full-text parser plugin collection
- DAEMONの例: HandlerSocket
- デモ: メッセージパックRPC
- ゴーーン!(時間切れ)
issmさん「「名古屋でPerlをゆるく語る会」をはじめました」
- 名古屋の事情 → Ruby, Python , PHP, Scala , Haskellは勉強会がある
- ゆるく語る会を開催 → スイーツ、パスタ、ポケモン
- 10/30に題4回を開催。Nagoya.pmになる?
吉川 毅さん「RubyプログラマがPHP大規模開発の会社に入って」
- GREEの方 ・・・ CTOの代打
- 図説
- OOPJog → OOPの話をしながらジョギング
- Sinatra
- 他の言語にも同様のものがある(Python(Flask), Java(Scalatra), Perl(Mojolicious::Lite))
- 直感的なインタフェース
- PHP版の実装はひど過ぎる。Sinatraじゃない → 作った Vicious
- PSGI も作った → Phack
- ゴーーン!(時間切れ)
bayashiさん「YAPC::EU 2010 Reports」
- ヨーロッパ最大のYAPC
- 今年はイタリアのピサ
- 片道13時間半
- YAPC::EUは食べ物が多い
- プレゼンは
- YouTube に動画が上がってる → Larryさん一家の動画が必聴
- 質問から議論に発展することが多い
- DeNAの会社の制度で行ってきた → ぜひDeNAへ!
- 来年はin Riga, Latvia
峰松 浩樹さん「基幹システムがperlでどうしてこうなった」
- 汎用機を2013年までになくしたい → OpenCOBOLへ
- Cobol, 500万行 JCLは100万行
- 解決策 → Perlでの自動変換
- JCLをPerlに変換(・・・変換できてるの?)
- OpenCOBOLへPerlを組み込むラッパ
- 文字コードもPerlが変換できる
- Apache → mod_php → opencobol → perl → MySQL ってシステム
zentoooさん「Test::QUnit - QUnit test via prove」
- 一部プラック企業
- JSのテスト
- YUI, QUnit, JSUnit, JSpec, Jasmine
- ブラウザ開きたくない。でも、ブラウザエミュレーションには問題が
- JSTestDriver → CUIからもブラウザからも
- CLIからブラウザのテストが叩ければよい → Test::QUnit
- QUnit.log をフックしてPerl側にデータを持ってくる。TAPにする。
- コードはgithub上
Karen Pauleyさん「10 Things to Do with a conference T-shirt」
- YAPCに20回以上出ている → Tシャツが余っている
- そのままでは大き過ぎる
- はさみでアレンジ
- 赤いリボンでアレンジ
- ヘアバンドに
- earingに
- バッグに
- 枕に
- 編み直してタオルに(!)
- 袖を切ってタンクトップに
- 二枚を合わせてパンツに
- 「There is more than one way to ware it!」
Yoshinori TAKESAKOさん「all your base16 are belong to us.」
- プログラミングで何文字使ってますか?
- 8文字 → Brainf'ck
- 52文字 → 多い
- Perlでは100文字以上 → 大き過ぎる
- Pythonは1000文字以上(emoji)
- Polyglitプログラミング
- Binaryを使わずに10文字でx86プログラム
- Brain-f*ck-f*ck
- gccでコンパイル可能な、10個の記号で書かれたCプログラム
- 使えるレジスタ、命令に制限が大きい
- バイナリアンは古い → ASCII文字でプログラミングしましょう
合わせて読みたい
- もう一人のgihyo.jpレポーター → YAPC::Asia Tokyo 2010にgihyo.jpさんのレポータとして参加させていただいた
- 動画 → YouTube
- スピーカのアカウントの一覧 → YAPC::Asia2010スピーカーの(Twitter/Blog/github/cpan)アカウント
- スピーカのスライドの一覧 → YAPC::Asia 2010
[perl]今日はYAPC::Asia Tokyo 2010前夜祭の日です
10月 14th
YAPCは2006年から出ているので今年で5回目になります。今夜東京工業大学大岡山キャンパスで開催される前夜祭に出席します。
なお、去年に引き続きgihyo.jpさんの特集にレポートを掲載させて頂けることになりました! このブログとgihyo.jpさんの方と両方にメモとりますので、合わせてご覧下さい。
yusukebeさん「イントロダクション」
- Ustreamはやってません。自分の回線で勝手にやるならOK。
- PerlCasualとは
- 意図 → 「カジュアルに」利用者としてPerlを使う
- 三度活動した
- 今日のテーマ → WAF
- Plack/はてPSGI
- PSGI の developer = WAF作成者
- Plackで直接Web Applicationを作りたくなりがちだが、違う。WAFを使うべき
- 今日のLTは初めての人もいる
- 岡田有花さんとの対談もおたのしみに!
WAF作者+利用者の集い
nekokakさん「神威 - Plack base frame work」
- Webだけでない。CLI(バッチ処理等)も意識したFramework
- PSGIへ対応
- 去年発表したSmorkerはHTTP::Engine
- 「それPla」 PlaggerではなくPlack
- Sledgeを使えれば、違和感なく使える
- 学習コスト面
- Sledgeが好き
- モバイルのプラグインが豊富
- モバイル実績も6公式サイト。今後もメンテされる
- config.pl/config_local.pl → Arkを参考にしたもの。perlコードをコンフィグにできる。
- YAMLより柔軟性が高い
- Kamui::Container → Object::Containerのようなもの
- Mooseへの依存をなくした
- viewはTT、Text::MicroTemplate::Extended、JSON のどれか
- distpatchのtableは集中管理する
- authorizerはSledgeより細かく設定が可能
- まとめ
- better Sledge。シンプル。
- Catalyst が苦手であればおすすめ
- CPANには上がってない。http://github.com/nekokak/p5-kamui
sugyanさん「Ark」
- 今回は全裸は封印
- Ark
- typesterさん作
- Catalyst like
- 実績も多数
- 資料は去年のAdvent Calenderにもある
- 変更点
- Plackベースに変更
- 非同期アプリも対応
- ark.plの廃止
- Path::AttrRouterを分離
- CPANにはもう少しで上がる→「去年も言っていた」
- 必要最低限 → app.psgi、lib/MyApp.pm, lib/MyApp/Controller/Root.pm
- デモ ((cat > でファイル書き込むのはecho使うより男らしいw)
- 最低限のファイルを作って、plackup -e で起動
- setup_minimal → 必要最小限だけのロード。Shotgun(plackup)向け
- 今後
- Model、Form などを分離
- View は考え中
- CPANへ載せる
- まとめ → 鎌倉移住キャンペーン!!
charsbarさん「Mojo」
- Mojoの情報 → Mojoに関してのcharsbarさんの過去のプレゼンも参照
- 実績
- インフラアプリ
- 不自由な環境でのモック
- さっくり → 気軽に作って、気軽に消す
- 問題もある
- アプリの書き換えが必要な変更もおこる
- 記事に書いた物がすぐに使えなくなることも
- スライドもMojo × Websocket にてやっている
- ケータイとかでも見られる
- 200行ほどで書かれている
- $app->secret → cookieを安全に使う
- HTTPもWebsocketも1つのスクリプトで対応可能
はてなおや@naoya_ito*1さんのMojoの記事は多数RTされ、有名に- 課題 → WebSocket に関しては Plackと連携できていない
- コミット履歴を見ると、「コードの整理」が20〜25%
- きれいにする、ということが重視されている
- 後方互換重視の人は、もう少し我慢をすると使える段階になる
- ドキュメント
- Mojolicious::Guide → id:perlcodesampleさんの和訳も参照
- CSSセレクタによるテストを実装中 → Mojo::DOM
- 最適化に関しては、不十分かもしれない
- 自前で最適化をするとよい。本家にフィードバック
- 元々は、フレームワーク for フレームワーク → 柔軟な作りとなっている
- APIの変更が不安な場合はサブモジュールとして使う → 例: bootylicious
tokuhiromさん「Amon」
- Amon 2.0 がさっきリリース
- WAFとは? → 感心ごとの集中、コードの重複を防ぐ
- 各自が好きに作ってよい
- WAF のベースとなる共通部分は、共通化 → Plackとか
- 感心ごとは人によって違う → 最適なWAFは個人によって違う
- Amon2のコンセプト
- Sledgeライク。Catalystは嫌い
- 有名なモジュールのみを使う (例えばpadwalkerは避ける)
- ミニマムに。758行
- XSは使わない。mo[ou]se は使わない。
- できるエンジニア向け
- 使う人は、コードを全部読むのが前提
- WAF依存のノウハウがないようにする
- Plack, Xslate(高速、開発が速い), DBIx::Skinny、
- Router::Simple Tiffany Log::Dispatch, .pl の設定ファイル
- 嫌なフレームワーク
- 依存が多い, 突然Moose依存, XS, 起動に1秒
- evalを使う, 後方互換がなくアプリを書き換えが必要
おしらせ
チェックインのときにもらったホルダーが入場証になるので、なくさないように。
(ホルダーの落とし物があるので、落とした人は名乗り出て下さい)
Lightning Talks
uzullaさん「Tatsumaki と Javascript で ウェブチャット(とか)」
- FaceBookが人気 → 「いいね!」
- Tatsumaki とは → Comet
- WebSocketは、動かないブラウザがある
- Flash は iPhoneでは動かない
- デモ → http://s.cfe.jp/chat
- 難しいのか?
- Perl側 → Handlerを用意するだけ
- JS 側 → コールバックを書くだけ
- 環境整備 → cpan -i で簡単。起動も plackup
- Cometの利用箇所
- チャット以外にも、メッセージ通知も
- いろんな環境で動くのがいい
- JSONP を使えるようにするクイックハック を紹介
kawanetさん「OSDC.TW に行ってきました - Shibuya.pm in Taipei 報告」
- 海外のYAPCで、英語を習得しよう!
- YAPCを海外で
- ハワイは大変なのでTaipeiで
- 日本の著名なハッカーが、英語でプレゼン
- kawanetさんのトーク
- Something Xiaolongbao → 枠をまずとるのが目的
- みなさんも、Perl Casual などを使ってどんどん発表するのがいいのではないか
- 今年のテーマ 三次元
- ニコニコ動画では、二次元が大人気
- 台湾は空前の3Dブーム → みんな眼鏡を持っている
- ブックマークレットで、世界のサイトを3Dに
- 実装方法
- Perlも利用
- CSS3 のドロップシャドウを利用
xaicronさん「簡単サブコマンド」
- サブコマンド → git add の 「add」
- CPANモジュールで実現
- App::Cmd → デファクトスタンダード。1コマンド1モジュール
- App::CLI → 作りがシンプル。ソースを読まないと理解できない
- CLI::DIspatch → charsbar氏のモジュール。Light App::Cmd?
- これらは、すべてモジュール化(.pm)が必要
- Getopt::Compact::WithCmd
- .pl 内だけで済ませる
- Getopt::Compact と同様の使い勝手
- サブコマンドごとのオプションに対応
- サブコマンドのネストに対応
- 必須オプション設定
- GetOpt::Long のようなオプションも利用可能
- Usageの表示にも対応
- デモ
- Dispatch は非対応。自前で
刺身さん「MaatkitでMySQLチューニング」
- Maatkit とは?
- MySQL用のユーティリティ集
- 実線ハイパフォーマンスMySQLの著者。ロゴはエジプトチック。
- Perlスクリプト
- mk-query-digest → スロークエリログの統計データの表示
- mk-query-profiler → EXPLAINより詳しい情報
- ディスクI/Oなど。プロファイリングによりわかる。
- 導入が非常に楽
- I/O周りに注目してプロファイリングする例
- 結論 → ランダムリードが発生していた。チューニング後高速になった。
koba04さん「モダンPerlの裏側で...」
- 外部の会社から納品されたコードのお話
- Case1: HTMLと仲良し (2010年納品)
- perl script内に HTML
- 「perl CGI」でググると、こういう記事が
- 2007年にtakesakoさんが書かれた「いまどきのPerlプログラミングについて」がよい
- Case2. ○○なPerl
- bareな文字列 trueの利用や $this や camelケース
- Case3. 脆弱
- CGI->redirect にて exit していない
- まとめ
- use strict だけはつけてほしい
- Perlベストプラクティス を参考
- 書いたコードに疑問を持って見て欲しい
ITMedia News記者「岡田有花」さんによるスペシャルゲスト対談
- なり染め(結婚報告?) → 2008年
- 当時はエロいサービスを作っていた → 今も
- 2年ぶり2回目の再開
- ネットで見るより地味でした。地味ですか? → 地味です
- Twitterで質問を募集した
- 「なんでそんなに美しいのですか?」 → 自作自演でした
- 他はなしw
- Facebookが流行るとかFacebookが流行るとか
- SNS → gree, mixi, DeNAの三大ソーシャル企業の方が参加している
- WAF(作る道具)は揃った → 最近面白いWeb Applicationは?
- 流行った後に紹介している。逆に聞きたい。何が流行っている?
- 「Facebookですね」
- mixi と同時期に始まった。当時はMySpaceに主導権があった
- 一週間前までは、FacebookのIDはあったけど使っていなかった
- 急にユーザが使い始めたので使った
- サービスの内容よりも、ユーザの人数で決まる
- 業界が乗っかって失敗したサービス → Second Life
- 広告業界が広告で汚染して、そのまま去った。
- 最近だと、Twitterに来ている。UStreamも。ただし、ユーザベースが固まっているので大丈夫か
- 電通さんは、ネット業界に資本を出してくれるので、それはありがたい
- 「Facebookからお金をもらってるわけではありません」
- Facebookをなぜ広めたのか → 面白かったから
- その前はアメーバピグを使っていた → 面白い
- JSとかJCとかで大変なことになった(記録は自主規制)
- ただし、知らない人とコミュニケーションはめんどくさい
- Facebookは、知っている人と素早いレスポンスができるのがよい
- IRCとかチャットも面白い。これらは古い仕組みだが、IRC最強説も。
- リアルタイムのネットサービスは、暇な人だけしかできない?
- 廃人になる。YAPCの準備ができなかったりする
- みんな廃人になるのはよくないのでは。
- ATNDはいいサービス → 人間のアクティビティを「サポート」するもの
- ATNDがサービス名とは知らなかった
- 普段見るウェブサービスは?
- Yahoo。もしくはTwitter。女子っぽいのがいい。Facebookは女子が居ない
- ユーザは、実は女性の方が多い。
- おっさんの日常も面白いよ! 「たらこ焼けた」
- 岡田有花さんは昨日誕生日
- 今年の「クリスマスは一人で楽しく過ごす」記事は、後輩に任せる
- 婚活系のサイトも面白い → インタネットは出会い系
- (男女ってわけでなく)インタネットの出会いが一般的になっている
- GreeはSNSではないんじゃないか。ゲームコミュニティでは?
- Greeの田中氏は「若い人は、ヴァーチャルとリアルの人間関係を分けない。だから、SNSだ」とおっしゃっていたそう
- 楽しんでいる人達は、実名を出すことは気にしないのでは?
- 学校で実名を出さないことを教育している。子供は実名を出さないと思う。
- 昔は、空き地のようにのびのびと実名でインタネットを使っていた
- 「あなたの知らないインタネット」もあるはずだが、どこに取材すればいいのか?
- 子供の世界は、大人からみた目線でしかわからない。が、あるはず。
- マックで見かけた東工大生(?)の帰国子女がFacebookを使っていた
- 開発者は、はてブがつきそうなサービスを作ってしまう
- クックパッド、@cosme とかはすごい
- 女子高生の知り合いを作って、利用されているサービスの実態を知りたい
- でも、若い社員にお願いしたい
- otsuneさん「iPhoneをDISった時の話を」
- 発売後、2年後に買った
- 当時は要らないと思った。ひろゆき氏も当時は同意見だった。
- Facebookやりましょう(お金はもらってません)
- ただし、 Facebook は PHP で動いている!!
- ItMediaのCMSはPerlらしい
- otsuneさん「TwitterをDISった話を」
- 友達がやってなかったから
- Facebookは、電話帳と連動する
- どこで儲けるのか? → 金儲けの話はちょっと・・・
- mixiも同じことを考えている。
- Facebookの「もしかしてともだちかも」は非常に正確すぎる
- skype等の情報とも連携している? mixiもそういうことをしている?
- mixiやTwitterでいい話
- uzullaさんの"美人な"奥さんは、mixiで再会した!skypeで愛を育んだ!
- 会場から拍手
- Q. mixiがiPhoneで使いにくいって話ですが、mixiタッチは使いやすいのでは?
- A. mixiアプリのことだった。mixiタッチが推奨
- Twitter に不用意に変なことを書くと、リプライがすごい → Facebook使いましょう
- 「将来の夢は?」「お嫁さんになりたい」
合わせて読みたい
- もう一人のgihyo.jpレポーター → YAPC::Asia Tokyo 2010にgihyo.jpさんのレポータとして参加させていただいた
- 動画 → YouTube
- スピーカのアカウントの一覧 → YAPC::Asia2010スピーカーの(Twitter/Blog/github/cpan)アカウント
- スピーカのスライドの一覧 → YAPC::Asia 2010
*1:Thanks to @otsune
[perl]Template::Plugin::Filterのリーク【再】
10月 11th
以前Template::Plugin::Filterのリークを直すパッチを書いて2.19_02で採用されていたのですが、不具合があってrevertされてしまってました*1。
2.22でリークするってのはこんなスクリプト書けばわかります。
for my $l (1 .. 1000) { my $tpl = Template->new( PLUGIN_BASE => 'test', ); $tpl->context->plugin('simple', []); warn `ps -o rss= -p $$` if $l % 10 == 0; }
ってことで、パッチを書いてリベンジ。リークがあるとどうしても MaxRequestsPerChild の値を極端に小さくしなければいけなかったりと色々困りもんなので、直って欲しいです。
もしかして: Xslate
*1:致命的な不具合なので、送ったパッチが悪かったです。
[perl]Template-Toolkit-2.22のメモリリーク【再】
10月 11th
以前Template::Plugin::Filterのリークを直すパッチを書いて2.19_02で採用されていたのですが、不具合があってrevertされてしまってました*1。
2.22でリークするってのはこんなスクリプト書けばわかります(test::simple は自分でTemplate::Plugin::Filterを継承して作って)。
for my $l (1 .. 1000) { my $tpl = Template->new( PLUGIN_BASE => 'test', ); $tpl->context->plugin('simple', []); warn `ps -o rss= -p $$` if $l % 10 == 0; }
ってことで、パッチを書いてリベンジ。リークがあるとどうしても MaxRequestsPerChild の値を極端に小さくしなければいけなかったりと色々困りもんなので、直って欲しいです。
もしかして: Xslate
2010-10-13 追記
ぼやいていたら @tokuhirom さんからアドバイスをもらいました。
それにしても TT 使ってる人はみんなどうしているんだろ。メモリリーク気にせず使っているのか、それとも、そもそも Filter のサブクラスなんて作ってないのかなあ。
filter のプラグインつくるだけなら Template::Plugin 直接つかってもいいですよね。
確かに、もともとのマツモさんのエントリでもそのような解決法をとっていました。
- 親クラスをTemplate::Plugin::FilterからTemplate::Pluginに
- initをnewに
- $self->install_filterを$context->define_filterに
*1:致命的な不具合なので、送ったパッチが悪かったです。
[perl]今日はShibuya.pm #14の日です
9月 30th
Shibuya Perl Mongersテクニカルトーク#14 に参加してくるつもりです。なんでこんな流れになっているのか全然理解してないですが、頑張って本を読まずに空気を読んできます。
本日のイベント開催趣旨について / 竹迫さん
- IPAとJPAがブログ等で混同されている
- 両団体に来て頂いている
Perl 6 Language Update / @dankogaiさん
- Perl6(Rakudo*) で FizzBuzz
- 三項演算子は??と!!
- 2.67秒。Perl5より1,000倍くらい遅い。ただし、夏の版より改善されている。
- Rukudoのビルドは、Perlとあまり変わらず、楽
- sub の中に sub を書ける
- スコープも正しく扱われる(外から見えない)
- $^n プレースホルダ → 引数であることを宣言
- 他の言語と違い、CATCH節はtryの中にある
- 無名関数.exception で直接例外を得られる
- 0..* → 無限リスト
- 無限リストへの map の適用は、現状ではまだできない
- ~~ any(<Fizz Buzz FizzBuzz>) → スマートマッチ
- multi sub → マルチディスパッチ。オーバーロード?
- infix:<!> → 演算子の定義
- Perl6のオブジェクト指向は、後付けではないのできれい
- 書式はほとんど Moose や Mouse に移植されている
- メソッド呼び出しは、ドット(.)
- self という予約語が使える
- .から始めると、オブジェクトの表記を省略可能
- Grammer → 正規表現をさらに強力にしたもの
- Perl6だと、 Combinatory Logic(組合せ論理) を楽に書ける
- 質疑応答
- Q. 後何分?
- A. もうオーバーしてます。
ぼくのかんがえたさいきょうのYAPC::Asia / @941さん
- 会場がすごい
- スピーカーがすごい
- Larry Wall も
- スピーカーがすごい2
- 協賛がすごい
- 景品がすごい
- MacBook Pro, Mac mini, iPad, ipod nano など
- チケットがすごい!
- 完売していたが、再販決定!! (18時より再販中)
- 数量限定なのでお早めに。「チケット買ってね」
JPA活動報告 / @lestrrat さん
- 活動したこと
- YAPC、地方ユーザグループで講演(Fukuoka, Hokkaido, Kansai, Okayama)
- WEB+DBプレス監修(最低来年の2月まではやる)
- セミナー、有料研修(Catalyst等)
- やりたいこと
- 新人向け教材 → 数社の協業による
- 技術認定試験
- 地方への講師派遣
- 定期的な勉強会
- 予算の拡大 → Tシャツ等販売や、寄付
- 他のイベント・団体との連携
- 財務状況
- 18社が協賛、YAPC収入
- 経費 → オフィス移転、YAPCなど
- 個人会員 → 還元方法を検討中
- まとめ
- Tシャツを買いましょう
memcached injection / 佐名木さん
- memchachedのプロトコルは、簡単なテキスト
- キーがエスケープできない。ライブラリによってはエスケープ処理が未実装。アプリで実装が必要
- さまざまな言語での実体
- Perl Cache::Memcached, C/C++ libmemcached, .Net Memcacheddotnet_clientlib はサニタイズ無
- カラムに対するSQL Injection
- パラメータを直接カラム名としているような場合
- 「あそこは攻撃が大好き」
memcachedの運用監視ノウハウ / @kazeburoさん
- mixiの障害 → memcachedが落ちた → Twitter で色んなエンジニアが原因究明
- 障害によってわかったこと → memcachedの重要性
- 安定稼働が焦点 → PDCA サイクル
- 「監視は継続的なテスト」 by 奥一穂さん
- 自動化し、それを可視化
- memcachedの監視
- プロセスの確認 → pgrepコマンドとその終了ステータス($?) + cronlog
- 死活監視 → nc -z にて11211を確認 (-wでタイムアウト指定可能)
- コマンドに対するレスポンス → Perlで "version\r\n" コマンドを投げて、結果が戻ってくるか
- NagiosPlugin 形式にする → 終了ステータス 0, 1, 2, 3 を割り当てる。(標準出力は補足情報)
- 接続ができない場合は、UNKNOWNとして扱う(コマンドのテストなので)
- コネクション数 → "status"コマンドを使い、最大接続数に対する接続数の割合を監視
- uptimeを監視する → 5分に1度確認、uptimeが310秒以下ならアラート
- daemontools で memcached を立ち上げると、死んだ後すぐ立ち上がるために死活監視が失敗する可能性
- まとめ
- 安定運用のためには、PDCAサイクル・自動化・可視化
IPA特別企画「身につけておきたい、今そこにあるシステムの救命措置」
IPA(独立行政法人情報処理推進機構)特別企画の、パネルディスカッションです。司会は園田さんです。
- 長期にわたって直してもらえない件がある
- エスケープのミス・忘れなのに、直せないのは何故
- 危険サイトとして公開すべき? → デスマの原因、業務妨害
- 安全なウェブサイトの作り方
- 仕分けの影響で有料に?
- 新規案件向け。稼働中案件に適用しにくい
- 「稼働中のシステムにセキュリティ対策をしたい」
- どういうプロセスが現実的か
- ネックはなんなのか (技術、予算、体制、顧客の理解)
- Twitter のボットに呟かせるのはどうか (by dankogaiさん)
- 公開するとすぐ攻撃の対象となる。IPAが情報を保護している
- 1000日ルールはどうか? 1000日経つと公開するとか。
- 脆弱性のあるサイトのうち、IPAが把握しているのは何割か
- 割合が低いとすれば、IPAに発見されるのが不運と捉えられる
- クローラ等で広範囲にスキャンをかけていくといい?
- →サンプリングは合法なのか。難しい。
- 「町を歩いて強盗に襲われた」ではなく「戸締まりをしようね」と思われるような対策がよい
- 現状は報告を受けているだけなので、サンプリングはしていいのか?
- IPAだからこそできるはず。個人だと難しい
- IPAとしてはちょっと苦しい結論
- はまちちゃんにチクる(by dankogaiさん)
- 昔のコードはひどい。5,000行程度あったり。「メンテして下さい」と頼まれるのは辛過ぎる。
- @kazuhoさんでもどうしようもないなら、しょうがないw
- 一定以上の基準をパスすれば入れる保険、とかはあるのか?
- 一時期はあった。今は聞かない。
- そういう保健等があると、モチベーションとなる。リスクヘッジとして使えるので。
- 社会調整的な動きしか方法がないのか。エスケープミスとかの防止方法は?
- Xslateなどは、エスケープ処理が初めから入っている。互換性は高いが、完璧ではない
- WEBブラウザ・HTMLの構造の問題。データとコードが混在しているために発生する
- アプリ開発者だけでなく、ブラウザ開発者を交えた方がやりやすい
- コードが受け渡しできなくなるのではないか?
- 受け渡したとしても、実行できなければよい
- 今までのブラウザは「なんでもあり」「なんでも実行」 → mozilla と MS に制限をかけるよう交渉?
- 開発側ではなく、プラットホーム側でなんとかするとよいのか
- IPAの報告がめんどくさい。報告が適切に来なかったりする。直接やり取りした方が早い方が多い。なんとかならないか
- 実際、時間がかかっている。「DNS特需」がきっかけ。IPAを介すだけでなく、直接報告することも推奨する
- IPAを経由すると報告者の保護ともなる。報告によって報告者が不利になる事例を知りたい
- IPAから警察に通報したりはしない。ただし、IPAに報告しても発見者は擁護されない
- 2003年11月に、カンファレンスで発表をしてしまって不正アクセス禁止法に引っかかって逮捕に至った事例がある
- IPAに報告したらIPAが代理で説明をしていると思うが、それは大変なのか?
- 最近はマシになったが、大変。なかなか正しい連絡先(技術部)に辿り着けない。(開発者がTwitterに出ていれば)Twitterに叶わない
- 技術的な説明では大変なことはないか?
- 相手による。理解できる・メンテできる人・会社が居ないパターンもある。
- ブログパーツのようなクロスサイトだと、切り分けはどうしているのか?
- クロスサイトスクリプティングの説明自体が難しい。ハードルが高い
- 新しく出てくる用語が多過ぎて、追いつけない部分もある。啓蒙も必要か
- WEBアプリケーションのセキュリティには、色んな要素がある。アプリだけでなくブラウザも関連する
- ブラウザを作っている人に言わせれば、HTMLをきちんと作っていないのが悪い。
- 責任の所在が不明確だが、被害を被るのはユーザ
- ブラウザのプラグインは、変なものは作りにくくなって来ている。よくなってきている。
- 萌えキャラはどうか? → 人形で失敗したことがあるw
Perl 1,2,3,4 の歴史 / @mad_pさん
- 1,2 は知らないので、3くらいから
- 元ネタ → perldoc perlhist、history.perl.com、モダンPerlの世界へようこそ、など
- 黎明期(インタネット前)、普及期(CGI爆発)、発展期(WEBサービス、構造化)
- Perl1 1987年 基本的な機能
- Perl2 1988年 subの再帰、local, \d, \s
- Perl3 pack, unpack, foreach, GPL, ユーザ定義サブルーチン(XSの前身)
- Perl4 1991年 Camel Book の発売に合わせただけ。エンディアンの解説が有名!
- if + 巨大な正規表現の最適か機能はPerl5ではなかった
- format 機能, awkの代わり、oraperl
- JPerl 2バイト文字の扱い
- 1995年 CGIインタフェースの登場 → KENT・・・
- Perl5 1994 オブジェクト指向、use, my, perldoc
- Perl5の普及は遅かった・・・'99にPerl5が何かの紹介のトークがあった
- DBIの登場、BioPerl
- 1995年 CPAN解説。anonymous FTP
- Perl本が大量に登場
- コミュニティが盛んに。1999年、YAPC。
- 1998年 Perl Conference Japan, 2000年 Perl/Ruby Conference, YARPC19010
- miyagawaさんにShibuya.pmを作らせたのはTokyo.pmの大きな業績w
- これからのPerlは皆さんが作って下さい!
Android + Perl / @naoya_ito さん
- SL4A Androidデバイス上で、Perlや"PHP"を実行する
- Android のネイティブAPIを呼べる
- RPCで投げている
- Android SDK を利用
- emacsで書いて、adb pushで送り込む
- Perlモジュール → いくつか組み込みの。Socket.pmは入っている
- telnetがないので、echoクライアントも書く必要がある
- Publicなサーバも作れる(Pythonで5分で遠隔カメラサーバを作ったり)
- PerlからWebViewのコールバックを呼んだり
- SL4A for PHPもあります
- SL4A for 「PHP」もあります
Data::MessagePack / tokuhiromさん
- バイナリの永続化フォーマット
- PHP, Java, Perl, Haskell, C++・・・大体の言語で使える
- 非常にデータが小さい
- ストリーミングデシリアライザ。ネットワーク向き
- 使い方 → pack, unpack
- Storable に比べた利点 → 速い、他言語との交換、データが小さい
- 欠点 → blessが使えない
- JSON::XS に比べた利点 → ちょっと速い、データサイズが小さい
- 欠点 → 人間が読めない(バイナリなので)
- 最近のData::MessagePackの動向
- Pure Perlサポート
- 高速化
String::Filter 構造化テキストの正しいエスケープについて / @kazuho さん
- Twitter事件 @の直後の文字のエスケープ
- ツイートをHTML化するアルゴリズムの不具合
- HTMLへの変換が複数会行われていた
- 対策 → 設計をなんとかする
- 正しい設計をするだけじゃなく、「XSSが起きにくい設計」をする
- Tweetをパースする
- 次にHTMLをエンコードする
- →利点「エンコードさえ正しければXSSは発生しない」
- パース処理は難しいかもしれないが、バグは起きてもXSSは発生しない
- エンコード処理は、なるべく最後にまとめて行う
- Template-Toolkitは避け*1、Text::Xslate,
Template-Toolkit, Text::MicroTemplateの利用 - ORM・DBIのプレースホルダ
Perl Parser Hacks vol.2 - @__gfx__さん
- 前回は perly.y をいじった
- 全コンパイルが発生して大変。他の方法が欲しい
- pluggable keyword の利用 (Perl 5.12.0より)
- デモはトラブルのため中止...
- 欠点 → 使いにくい
- parse_fullstmt() API (Perl5.13.5) → parseして構文木を返せる
- Void.pm ・・・もデモできず
- 単位がステートメントで、荒い。
- Method signeture の実装に使われるAPIなのかも → 5.14に期待!?
- 次回予告 → YAPCではXslateの話します
おまけ
@mad_pさんに、新Perlの国へようこそへサインをして頂きました。10年以上使っていて思い入れのある本だったので、とても嬉しいです。ありがとうございました!
