YAPC::Asia Tokyo 2009 スペシャルレポート

2日目レポート[随時更新]

昨日・本日と、東京工業大学大岡山キャンパス (東京都目黒区) でYAPC::Asia 2009 Tokyoが開催されています。本ページでは、2日目のレポートを随時掲載していきます!

※今回のレポートは全セッションを回れておりません。ご了承ください。

Daisuke Komatsuさん「FormValidator::LazyWay で検証ルールをまとめよう」

株式会社Plugin and Coreの小松大輔さんによる発表です。 今回はFormValidator::LazyWayというValidatorモジュールについてのお話でした。 なお小松さんによれば「lazy」の意味は「遅延」ではなく「怠けられる」ということでした。

FormValidator::LazyWayの特徴は、フォームごとに検証ルールを決めるのではなく、フィールド名ごとに検証ルールを決めて、それをサイト全体で使い回せるところにあります。便利だと思ったのは、以下の機能です。

  • 同じフィールドであっても、例えば登録時には必須項目(required)だが、検索時にはあってもなくてもよい(optional)というフィールドの設定も一箇所でできる。
  • 「年月日」のように、入力フィールドがそれぞれ分離しているような項目であってもマージして検証することができる。
  • フィールド名を正規表現でマッチさせることができる。
  • 同じフィールドに対して違う検証モジュールを指定できるように、⁠レベル」という仕組みが用意されている。

小松さんによれば今後の開発予定には多言語化、uploadフィールドの検証などが含まれているそうです。 FormValidato::LazyWayには日本語のPODも用意されていて、ソースコードはcodereposでも公開されています。

画像

画像

Kazuho Okuさん「A Clever Way to Scale out a Web Application」

サイボウズ・ラボ株式会社の奥一穂さんによる発表です。 今回は主にmysqlでのデータベース・シャーディングが中心で、現在開発中の3つのツールについて紹介がありました。

  • Incline
    • シャードされたDB間で一貫性を保持するツール。アプリケーションプログラマが非正規化のロジックを書かなくてもよい。
    • 開発状況はearly beta
  • Pacific
    • Range-based shardingにおいてダイナミックスケーリングを提供するツール。
    • 開発状況はearly beta
  • DBIx::ShardManager
    • Perlからシャーディングを扱えるようにするモジュール
    • 開発状況はalpha

以上の3つのツールを使えば、Perlでもシャーディングするシステムを簡単に書けるようになるとのことです。詳しくは奥さん御自身のブログを見て欲しいとのことでした。なお、9月25日に開催されるBPStudy#25でもデータベースのスケーリングについて2時間程度の発表をされるということです。

画像

画像

Kenichi Ishigakiさん「Practical Bug Reporting / もしもバグを見つけたら」

このセッションでは、Perlのテストやバグレポートに関する内容でした。

まずIshigakiさんが紹介されたのが、CPANモジュールのテストレポートの数。今までに500万件以上のテストレポートが届いており、今でも月に25万〜30万程度のオーダーでテストがされているというデータを取り上げ、CPANのすごさはモジュールや作者の多さではなく、これらのモジュールのテスト体勢が非常に充実していることである、と述べました。

次に、バグを見つけたときの対処法の一例として、見ざる・言わざる・聞かざる、を一番問題のある方法だと指摘。大事なのはホウ・レン・ソウであり、不具合があることを隠さずに必ず伝えるということを促していました。

その後、まずはテストへ参加する方法として、CPAN::Reporterについて説明がありました。また、テストの参加者は多い方がよく、特にマイナーな環境を持つ方はテストに参加した方がいいと語られました。

さらに、Perlの標準のバグトラッキングであるRTについて触れられ、RTへメールで不具合を報告する方法や、不具合報告をする前に同様の不具合がないかRTやその他のバグトラッキングを追いかけること、さらにgoogleなどで検索し、リポジトリやメーリングリストを探して、自分の不具合が既知のものではないか確認するのが大切だと述べられました。また、ブログに書いた不具合報告は、不具合の解決次第エントリを修正するべきであると、ブログのエントリに過去の不具合情報が氾濫する現状を問題点として指摘しておりました。

最後に、緊急を要する場合の方法として、作者に連絡をとるという方法を紹介していました。これには、perldocを参照したり、作者のblogやtwitterを探したり、p5pで聞くのもいいだろうとのことでした。しかし、やはり一番確実なのは、コミッタになるか、それも難しいようであれば自分で新しいモジュールを作り直すのがいいだろうと、無いものは作ればいいというクリエイティブな発想で、セッションを締めくくっていました。

画像

画像

Kazutake Hiramatsuさん「OpenGL Programming with Perl」

Perlで3Dプログラミングはできるのかという問いに、⁠当然できる」と自信を持って答えたHiramatsuさん。紹介して下さるのは、POGLというPerlからOpenGLを使うことができるモジュールです。このモジュールはOpenGLのPerlバインディングであり、このモジュールからOpenGLを使うことでPerlでも3Dプログラミングが可能になるとのことです。ただし、最新のPOGLですと、OS X Leopard上でデフォルトのOpenGLではコンパイルが通らないらしく、POGLの少し古いバージョンである0.56を使った方がいいようです。

そんなイントロダクションの後、POGLの実際の使い方が紹介されました。POGLのインタフェースはOpenGLとほぼ揃っており、glXXXX系のコマンドや、GLUやGLUTを実際に使ったコードが紹介されていました。このOpenGLとAPIが揃っているという利点を生かし、iPhoneのOpenGLを使ったアプリケーションのプロトタイプを、Perlで開発したりするのも便利ではないかと、使い道を提案されていました。

また、Perlならではの利点として、OpenGL::Imageでテクスチャを簡単に作れることが紹介されていました。このモジュールはプラガブルな構造になっており、ImageMagickがインストールされているとgifやjpegもそのままテクスチャとして使えるようになるそうです。

質疑応答では、GLUTを使った入力イベントに関する質問や当たり判定の方法に関する質問がなされ、参加者の3D分野への関心の高さが伺われました。

画像

画像

Tokuhiro Matsunoさん「Concurrent DB Access with Perl」

このセッションでは、重いDBクエリを複数投げる場合に、並列化することで時間を短くすると言うテクニックが紹介されました。このテクニックは、例えば、WEBアプリケーションでアカウントの情報と日記の情報、コメントの情報などを1つのページに表示するような場合に、それぞれのSELECT文を並列化して応答速度を速める、といったような用途で使うことができるとのことです。

まず最初に、PostgreSQLの場合の実現方法が紹介されました。PostgreSQLはライブラリ側もPerlモジュール側もノンブロッキングIOの対応がなされているそうで、 use DBD::Pg ':async'; のように:async を指定することでそのまま並列処理が実現できるようになるようです。この際、イベント処理にはAnyEventを用いており、pg_readyやpg_resultといったメソッドで非同期にクエリを投げる処理を実現していました。

その後、MySQLの場合の解説がありました。MySQLの場合は、残念ながらlibmysqlclientはノンブロッキングIOに対応していないので、これを使って非同期処理を行うことは不可能です。代わりに、libdrizzleというモジュールがあり、これを用いることで非同期の処理が実現できるそうです。

MySQLの非同期処理に対応したPerlモジュールは、Matsunoさんが自ら開発されたNet::DrizzleとDBD::drizzleというモジュールがありますが、DBD::drizzleに関しては現状では残念ながらノンブロッキング処理の対応は行われていないそうです。将来的には、DBD::drizzleにもノンブロッキング処理の対応がされ、こちらが使えるようになる(する?)のではと、おっしゃっていました。

質疑応答ではSQLiteについて触れられましたが、SQLiteではまだパッチを当てないと対応ができないそうです。このようにRDBMSによって対応がマチマチな技術でありますが、これによってWEBアプリケーションのパフォーマンス高めることができる可能性のある技術であり、今後とても期待できるものだと感じました。

画像

画像

ma laさん「Asynchronous Programming for (A)synchronous Communication」

株式会社ライブドアlivedoor開発部UIスペシャリストのmalaさんによる、サーバーサイドでの非同期処理を中心とした発表です。

非同期処理についてmalaさんは「簡単に出来れば意識せずに使われるようになる」とのことでした。 発表の中で紹介された技術で主なものは次の4つでした。malaさんは結論からおっしゃいましたが、AnyEventとCoroを使うと良いということです。

  • AnyEvent
    • イベント駆動型プログラミング
    • Coro使うならAnyEvent
    • AnyEvent::Introドキュメントが充実している
  • Coro
    • Continuation for Network Programming
    • Webアプリケーションにおける「継続」の利用
    • 「賢い」スレッド
    • Perlにおける本物のスレッドプログラミングを手に入れる(Perl標準のスレッド機能は使い物にならない)
    • 既存のコードをそのままで非同期化することが可能になる。
    • Coroはヤバイ
  • WebHooks
    • イベント駆動型プログラミングの概念をWebに適用したもの
    • データが更新されたりしたら通知
    • サービス間のリアルタイム連携
  • PubSubHubbub
    • HTTPベースのプロトコル
    • Blogが更新されたことを通知するための仕組み
    • livedoor Readerとlivedoor Blogも2009年08月に対応

また、Eventベースのプログラミングをする際の絶対条件として

  • 決してブロックしない
  • 重い処理は別プロセスに飛ばす

さらにベストプラクティスとして

  • HTTPリクエストを非同期化する前にタスクを分割せよ
  • メッセージキュー(あるいはジョブサーバー)を使うことでタスクを分割できる

という説明がありました。

最後にmalaさんは、同期処理と非同期処理の概念を人間に適用し、⁠Web上でのコミュニケーションの多くはコンピュータによる制約で非同期的にならざるを得なかったが、これからは人間の選択による同期/非同期コミュニケーションが可能になる。IRCを例にとると、リアルタイムで読んだり、ログを取ってあとで読んだり、キーワードでフィルタリングしてすぐに読んだりすることを選択できる。今後はリアルタイムで受取りたい情報とそうでない情報とを柔軟にコントロールできることが重要になるだろう」ということでした。

画像

画像

Dan Kogaiさん「Perl? Which Perl?」

小飼弾さんによるセッションです。会場は満席で立ち見の方もいらっしゃいました。 今回の発表のテーマは、現在いろいろなバージョンのPerlが存在する中で「どのPerlを使えば良いのか?」ということです。

まず弾さんは、現在使われているPerlのバージョンをリストアップして、それぞれについて解説されました。

  • 5.6.x
    • まだメンテされているが、まともなユニコードサポートが無い。使っている人はそろそろアップグレードを。
  • 5.8.x
    • 十分モダン。インダストリーデフォルトである。しかしuse featureは使えない。
  • 5.10.x
    • say "Hello";や//=などの文法が使える。正規表現が高速になっている。LinuxやMac OS Xもこちらへ移行を始めている。現代的なPerl Mongersのためのバージョン。
  • Pugs
    • Rakudoよりは機能が多いが、ビルドが大変。特に依存関係の解決が難しい。
  • Rakudo
    • ビルドは簡単だが、未だにPugsにしかできないことが多い。

Perl5 vs Perl6

次に、Perl5とPerl6のソースコードをそれぞれ比較しながら、早くPerl6に移行したい理由として、Perl6が持つ以下の機能について解説されました。

  • Object Orientation(OO)
    • 無名クラス(完全な無名クラス)も書ける
  • Function Orientation (FO)
    • 無名関数も書ける
    • 無名再帰関数も書ける
  • Reduce Operator
  • Hyper Operator
  • Junction

まとめ

このセッションのタイトルである「どのPerlか?」という問いに対する結論は以下のようになりました。

  • 保守的な人は5.8.9
  • ポストモダンな人は5.10.1 + Moose

ちなみにPerl6は2010年の第2四半期にリリース予定だということです。

画像

画像

makoto kuwataさん「Basic Mechanism of Object-Oriented Programming Language」

このセッションでは、さまざまな言語においてオブジェクト指向をどのように実装しているのかという、インターナルの部分が話題になりました。

まず、基本的な概念として、インスタンス構造体、クラス構造体、メソッド探索テーブルについて解説されました。さらに、インスタンスとクラスの間にはis-aの関連があり、クラスとクラスの間には親子関係があることが説明され、それを踏まえてメソッドがクラス構造体から参照されており、親子関係を辿りながら適応すべきメソッドを探すという説明がなされました。

さらに、発展的な話題として、メソッドシグネチャについての解説があり、さらにJavaのオーバロードの仕組みの詳しい説明がありました。ただし、PerlやRubyなどの動的言語にはオーバロードの仕組みはなく、メソッドシグネチャもメソッド名だけで決まる仕組みになっているとのことです。

また、Classクラスについても説明がありました。そして、ケーススタディとして各言語のオブジェクト指向実行が説明され、その中でPerlの@ISAについて、is-aはクラスとインスタンスの関係であるのに、親子関係を示すのに使われているのは少し特殊だ、と話されていました。

最後にプロトタイプベースのJavaScriptについて、ものとしては違うが手法は非常に似ていると、プロトタイプチェーンによる属性探索の仕組みを紹介し、セッションのまとめとしていました。

画像

画像

Naoya Itoさん「はてなブックマークのシステムについて」

Naoyaさんは、昨年リニューアルされたはてなブックマークのについて、発表して下さいました。このセッションには会場に入り切らないほど多くの人が聴講に来ており、同サービスの注目の高さを物語っていました。

最初に、サービスの概要が説明されました。はてなブックマークが始まったのは2005年だそうで、4年目を迎えている計算になります。昨年11月にはリニューアルされてバージョン2となり、最近マイブックマークの全文検索が有料サービスとしてリリースされたとのことです。また、DBはMySQLでデータは十数ギガバイト、サーバは70台程度でコードは10万行、開発体制は8名とのことでした。さらに言語はPerlと、最近ではC++で開発する部分も増えているそうです。

その後、実際の仕組みについて解説がありました。インデックシングするコンテンツを抜き出すHTML::LayeredExtractorや、全登録検索に利用しているSedue、そして、自社開発したPerlのマイブックマーク検索エンジンについて詳細が解説されました。

自社開発のPerlの検索エンジンは、N-gramと形態素解析の両方で転置インデックスを作っているそうです。また、検索結果のスコアリングにはヒューリスティックな方法を組み合わせており、クエリの距離や出現率といった標準的な手法からはてなブックマーク数やURLベースでの重み付けと言う変わったものまでを、ウエイト付きで算出しているそうです。ただ、現状ウエイトは固定値にしており、本当はこの値を機械学習させてもいいかもしれないと言われていました。

まとめとして、WEBとDBによるシステムから少し離れた部分に注力してきたが、それによって自分も楽しく、エンドユーザにも今までと違う新鮮な体験を提供できると、高度な技術に意欲的に取り組むことの意義を自らの体験から語っておられました。

画像

画像

Yuval Kogmanさん「記憶(KiokuDB)」

Yuval KogmanさんによるKiokuDBについてのセッションです。

KiokuDBはdocument/blob orientedあるいはObject Graph storage engineと呼ばれるアプローチをとるストレージエンジンです。Mooseをベースにしています。

KiokuDBの使い方はDirectoryを作って、その中でBackendとなるストレージを指定します。このBackendにはhash、dbi、bdb、file、couchdbなどの様々なストレージを指定することができます。 Mooseオブジェクトを作り、そのインスタンスをstoreメソッドを使ってKiokuDBに格納すると、オブジェクトは先程のストレージ内にシリアライズされたJSONオブジェクトとして格納されます。このフォーマットはJSPON(JavaScript Persistent Object Notation)と呼ばれています。もし、このときMooseオブジェクトがidをフィールドに持たなければ、uuidがいわゆるプライマリーキーになります。オブジェクトを取り出すときにはlookupメソッドを使います。

このように、とてもユニークなアプローチをとるKiokuDBでは、リレーションシップやトランザクションも実現しています。ソースコードおよびドキュメントはCPANおよびgithubで公開されています。興味のある方はKiokuDB::Tutorialから始めるとよいでしょう。

画像

画像

ライトニングトーク

Kenichi Ishigakiさん「Top Tens Of 2008-2009」

CPANに関する様々な数字を紹介するトークでした。⁠輝け!全日本最強 CPAN Author 決定選手権」の最新の結果も発表されました。

画像

Kazuhiro Osawaさん「hacking ngnix⁠

ngnixのプラグインの開発方法に関する内容でした。ZIGOROuさんのコスプレで登場し、memchachedを組み込んでmemcachedプロトコルでHTMLをとってくるデモを実演して下さいました。

画像

Kazuhiro Shibuyaさん「Mojo / Mojolicious hookout⁠

Mojoの活用に関してお話しして下さいました。Mojo::Server::Reversehttpを実装し、はてなスターがつくとPCに直接通知されるデモが実演されました。

画像

Takeshi Mikiさん「Hoppyではじめよう リアルタイムweb⁠

今日は虎のお面を脱いで来たというMikiさん。PerlのXMLSocketであるHoppyを紹介して下さいました。

画像

Daisuke Muraseさん「perl hacks on emacs⁠

vimを使ってる人が多いので、とemacsに関するお話をして下さいました。emacsでPerlを使うための様々なTipsを紹介して下さいました。

画像

Tokuhiro Matsunoさん「args.pm - a brand new argument validator ⁠

引数のパースをクールに書ける、args.pmを紹介して下さいました。PadWalkerを使って1つ上のスタックをとってくる"だけ"の、⁠hack的ではない」モジュールなので安心して使っていいそうです。

画像

Tatsuhiko Miyagawaさん「CPAN realtime feed⁠

CPANにアップロードをした後にユーザがダウンロードできるようになるまで48時間以上かかりますが、これを短縮する方法としてApp::CPAN::Freshが紹介されました。デモで、実際にアップしたばかりのモジュールが数分でダウンロード可能になると、会場からは大きな拍手が起こりました。

画像

Yusuke Wadaさん「IRC HTTP Stream⁠

昨日のセッションですっかりmiyagawanizeされたcoolな語り口で、Plackを使ってIRCの発言を捉えるデモを実演していました。さらに、⁠それPla」「それPla'ck'でできるよ」の略だと言い切り、Plackへ期待を寄せていました。

画像

基調講演「Why I Stick With Perl」(私がPerlにこだわる理由)

Jonathan Rockwayさんによる基調講演です。Perlとそのコミュニティに対する深い愛情と感謝の気持が伝わってくるような講演でした。

「なぜPerlを使うのか」を使うのかと言えば、書き易さやコミュニティの存在があげられると思いますが、その前に「なぜプログラミングをするのか?」と問われれば、そこに問題やアイデアがあって、それを片付けるためでしょう。そこで一番大事なのはライブラリの存在であるとReckwayさんは強調しました。⁠一番大事なものがPerlにはあるのです⁠⁠。

Perlの歴史をふり返ってみると、それはUNIXの「いいとこ取り」から始まりました。そのうちにライブラリが出始めてCPANが誕生したのです。Perlが新しいことをできるようになったのは素晴らしいことでした。我々はその恩恵を受けています。おかげで人助けの文化が生まれたのです。⁠これで土台の心配をしなくてもよくなった」とRockwayさんは説明しました。⁠コミュニティを助ければ、コミュニティが助けてくれる⁠⁠。

最初は手作りに近かったOOPが、Class::Accessorを経てMooseの登場を迎えました。しかしRockwayさんはこう言います「新しいやり方が登場しても、決して古いコードを捨てたりしないのがPerl」であると。時は流れて、コミュニティはPerlの改善を続け、そのうち新しいアイデアとして、例えば依存関係を減らしたり、アプリそのものの再利用を考えるようになりました。そこで、Catalyst、Moose、POE、そしてHTTP::Engineなどの「サブコミュニティ」が生れました。同じような考えを持つ仲間が互いに切磋琢磨する。知り合いかどうかなんて全く関係ない。⁠凄いことが起きるのがサブコミュニティ」とRockwayさんは言います。

Rockwayさんは続けて、⁠コミュニティがサポートしているコードを使うのは正しい。ライブラリは作者が一番得意なやり方で書かれているものだから、それを使えば作者の技術をそのまま使えることになる⁠⁠。続けて、CatalystやMooseを例に出しながら、⁠型制約や内部表現を隠す方法で、悪いコードを書くより簡単に良いコードを書けるようになる。そうすれば、他の人にも理解してもらえるし、他の人に使ってもらえるようになる」と説明しました。そしてRockwayさんは続けます「フレームワークはもういい⁠⁠。Rockway氏は「フレームワークに依存して、そこから駄目な機能を無くしたり、使うことを止めたりするのならライブラリに頼った方が良い」と述べます。そして「プログラミングがしたいんでしょう?Perlを使えば、つまんないことはコミュニティがやってくれるから」と言って会場の笑いを誘いました。

最後にRockwayさんはもう一度冒頭の問い「なぜPerl?」に答えました。

「それはみなさんがいるから」

「みなさんが、いろいろしてくれるから」

「みなさんが、いつも助けてくれるから」

「ありがとう。Perl大好き。」

画像

画像

画像

※ブラッシュアップする前にあったメモ書きは、a geek born in Tomakomaiへ移しました。

おすすめ記事

記事・ニュース一覧