malaさん 「Studying HTTP with Perl」
本セッションは,
非同期なものに関してはAnyEvent::HTTPが有名ですが,
その後,
話の最後には,
Jiro Nishiguchiさん 「Write Good Parser in Perl」
Jiro NishiguchiさんによるPerlでのパーサモジュールの紹介と、その実装方法についての解説でした。
まずはパーサとはなにかというところから始まりました。パーサとはなんらかの意味をもったテキストを、その後の処理に適した形にするためのものです。 そんなパーサのPerlでの実装例として、HTML::Parser、XML::LibXML、JSON, JSON::XS、HTTP::Parser::XS、Template-Toolkitといった定番モジュールの紹介がありました。またCache::Memcachedモジュールも紹介されていて、こちらはパーサモジュールではないが、内部でmemcachedプロトコルを解析するためにパース処理を行っており、その点でパーサ実装例として挙げられていました。
これらのモジュールの実装はXSを使ったものが多いようです。特に1文字ずつ処理していくようなタイプの処理はPerlで書くよりもCで書いたほうが高速に動作することが多いのがその理由のようです。とはいえPerlの正規表現でもかなり高速に動作するので、書き捨てのパーサなどを作る場合には正規表現は有効な手段として紹介されていました。また正規表現を最適化してくれるRegexp::Assembleについての紹介もありました。
続いて実装パートではRagelの紹介がありました。Ragelとは正規表現に似た文法を用いて比較的わかりやすく宣言的に書けるのが特徴のパーサジェネレータです。ただし、perlはサポートしていないため、利用するにはCで書いてXSで呼び出すなどひと工夫する必要があるそうです。XSといってもデータ構造を作って返すだけで複雑な処理は必要ないので恐れることはないとのことでした。実際にログ解析プログラムを書いたところ、正規表現と比べて5倍程度高速な物ができたそうです。ログ解析のようにフォーマットがあまり変わらなそうなところについては、パーサジェネレータとXSで高速化するのもお勧めとのことでした。
Seiji Haradaさん 「mixi チェックインの裏側」
mixiチェックインの裏側に関するトークです。スポット絞り込み検索機能を実現するための方法と、高速化するために行っている工夫について発表されました。
mixiチェックインでは現在の位置情報からスポットを検索する際に、geohashという手法を用いているそうです。geohashとは経度緯度の範囲を文字列で表現したもので、先頭からたどっていくと範囲が絞り込めるように表現されています。その性質により一定長さの文字列で前方一致検索をすることにより、高速に現在位置周辺の検索が実現できるそうです。実際のサービスではGeo::Hash::XSを使用されていて、とても高速に動作するそうです。ベンチマークをとったところ、Geo::Hashと比較して140〜200倍程度高速だったとのことです。
また高速化の手法としてmysqlまわりにも触れられていました。スポットの情報はそれほど頻繁には更新されないので、6文字のgeohashをキーにしてmemcachedにキャッシュしているそうです。ただし全ての地域についてキャッシュしてしまうとキャッシュ容量的に無駄が多くなってしまうため、特にスポットの多い関東、関西地区に限定している人のことでした。また検索範囲に関しては半径250mを規準にしているそうですが、これは厳密に指針があるわけではなく、実際に外にでて実機で検証したところGPSの最大誤差が250m程度だったので、それを規準にしたそうです。デバイス周りの開発ではコードの検証だけではなく、現実の世界での検証が重要だということを認識させられる一例だと思いました。
最後に位置情報サービスは難しくないので楽しみましょうと締めくくられていました。
伊藤直也さん 「Perl/ PHPと大規模Web開発」
最近PerlからPHPへシフトをしたことでPerlプログラマからもPHPプログラマからも注目されている伊藤直也さんのセッションは,
まずLLのWeb Application Frameworkについて最近の流行として,
また,
最後に,
keroyonnさん 「非同期タスクの通知処理 with Tatsumaki」
Hokkaido.
まずは簡単な通知の方法として、CGIベースによるブロッキング&ストリーミングの解説がありました。perlだと$|=1を設定して少しづつprint文などでコンテンツを出力していく手法です。この方法は手軽なのですがブラウザがずっと読み込み中になってしまいます。
続いてクライアント側を非同期化するためにmultipart/
しかしノンブロッキングなサーバには、同期IOを使えないため処理が複雑になる、CPUを占有するような処理も好ましくないといった欠点があります。それらを解決する手段としてTatsumaki, Gearman, WebService::Asyncの3モジュールが紹介されました。まずTatsumakiを使うと、ノンブロッキングなストリーミング処理を簡潔に記述することができます。続いてGearmanはノンブロッキングなサーバが苦手とするCPU負荷が高い処理を補うジョブキューサーバで、ストリーミングしているプロセスから処理を移譲するために使います。ジョブを登録するときにブロックしては意味が無いので、クライアントから呼び出すときはAnyEvent::Gearman::Clientを使うとよいそうです。最後にkeroyonnさんが作成されているWebService::Asyncが紹介されました。TatsumakiにはHTTPClientというモジュールも付いていますが、結果のパースなどは自分で実装しないといけません。WebService::Asyncを使うと非同期でWebサービスを呼び出して結果のパースまでをシンプルに行えるとのことです。
セッション中は
吉見 圭司(walf443)さん 「Webサービスのページング処理について」
吉見 圭司(walf443)さんによるページング処理のトークです。Webサービスでよく行われるページング処理について、いろいろな手法の紹介トークとなりました。
まずは一般的な方法の説明で、mysqldでのlimit offsetを使って1ページ分の結果を取得する処理と、limit句をつけないcount(*)文を発行してトータルの件数を取得する処理の二つを行ってページングを実現する手法を紹介されました。この手法は大抵の場合うまくいきますが、count処理が重いなど非効率な面もあります。
続いてmysqlの機能であるCALC_
吉見さんはこれらのページングロジックを必要に応じて切り替えられるようにDBIx::Skinny::Pagerというモジュールを開発されているそうです。
質疑応答では、ページング処理中にデータが増えた場合表示位置がずれる可能性があるがどう対処するかという質問がありました。それに対してページング処理をタイムスタンプなどを規準に行えばよいのではないかと回答されていました。