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

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

この記事を読むのに必要な時間:およそ 13.5 分

overlastさん「Perl で自然言語処理」

overlastさん「Perl で自然言語処理」による、自然言語処理の基本の解説と学び方、そしてperlで実装されているモジュールの紹介トークでした。

自然言語処理とは、人間が普段意思疎通に使っている自然言語をコンピュータに処理させるためのもので、プログラミング言語とは明確に区別されています。自然言語処理を行う上で必要な知識は、対象言語にたいする知識、確率統計の知識、プログラミングスキルの3点を挙げられていましたが、前者2つは少しでよくプログラミングスキルが重要ということでした。

続いて実際に自然言語処理を始める際の3つの心構えとして

  • 最初は簡単に実装し、徐々に洗練する
  • 機械はミスをする
  • データは自前であつめて、自前で管理する

ということを述べられていました。1点目についてはスモールスタートで導入し、ユーザの動向を見てから洗練させるのがよいということでした。2点目については特にコンピュータに詳しくない人などは過剰な期待をしてしまいがちだが、コンピュータに誤った文章を判断させるというのは難しく、ある程度割り切りが必要とのことでした。3点目については自然言語処理はしばしば計算量が多くなるため、ローカルに蓄積しておくほうが有利であるとのことでした。

後半はWebサービスにありがちな悩みと、その解決に活用できるCPANモジュールの紹介でした。ユーザの回遊性を高めたいという悩みには、レコメンドやはてなキーワードのようなアンカーテキストが有効とし、Algorithm::NaiveBayesやText::Dartsを挙げられていました。その他ソート順を変えるのも有効で、ソート順を機械学習させたいといった要件にはAlgorhithm::SVMLightが使えるそうです。またデータを近いものから結合してデータの塊をつくっていくクラスタリングに使えるモジュールとして、Text::Bayonを挙げられていました。

画像

画像

cho45さん「映画にでてくるハッカーになりたい」

cho45さん「映画にでてくるハッカーになりたい」と題したトークです。ジョークを交えたトークで、非常に楽しいトークとなりました。

まず映画にでてくるハッカーのイメージ像の話からで、⁠映画に出てくるハッカーって、なんかわからない文字が流れていて、ものすごい可視化がされていて、よくわからない方法で暗号をといたりでなんだか怪しいけど、もうちょっと現実的にカッコよく仕事できるツールはつくれないか」ということで、cho45さんが作られている「使えそうで使えない、でもちょっと使えるツール群」の紹介でした。

まずはrealtimeresponsegraph.plというツールです。これはtail -fからレスポンスタイムを即座にグラフ化するもで、Webサービスでチューニングした結果を即座に確認したいときに便利なように作られているそうです。デモではアクセスログをこのスクリプトに流し込むと、OpenGLを使った動的なグラフがリアルタイムで表示されていました。実装面ではuse OpenGL;のほかは、select関数やvec関数、fileno関数といった低レベルな関数を直接駆使して作成されたそうです。

つづいてrealtimeaccesstracker.plです。これはユーザごとにアクセスログを可視化するものです。こちらも同様にデモが実施され、同じURLにばかりアクセスしているDOS攻撃っぽいのがすぐわかると行って会場から笑いがおこっていました。

最後はDevel::KTYProfで、こちらはonishiさんが作成されたものだそうです。DBIやmemcachedといった、IOに関わる処理を処理時間とともにターミナルに出力するもので、どこから呼び出されているかも出力されるそうです。こちらもデモが披露され、select文やmemcachedのget処理といったものがカラーでターミナルに出力されていました。

終始会場から笑いが起こるトークで、クロージングでは投票によるエンターテナー賞を受賞されていました。

画像

画像

Kenichi Ishigakiさん「ある連載の舞台裏 - History tells us ...」

「モダンPerlの世界へようこそ」の連載のライターであるKenichi Ishigakiさんは,連載をどんな考えで続けているのか,そしてどのように取材を行っているのかを紹介して下さいました。⁠モダンPerlの世界へようこそ」の記事に書かれている豊富な蘊蓄に関しては筆者も常日頃から感服しており,大変興味深く聞かせていただきました。

まず,この連載についてIshigakiさんが挙げていたキーワードは「コミュニティ」です。Larry WallさんがPerl6の開発にあたり「Perl6はコミュニティが作るものだ」という趣旨のコメントをしていますが,そのコメントを意識してのキーワードです。また,YAPC Asia 2010のタイムテーブルにはMoose,Catalyst,DBIx::Classの題目が含まれていないのに対し,YAPC::NA 2010のトークの題目にはこれらが多く含まれることを紹介し,日本のギークは(いい意味で)飽きっぽいことを指摘。ギークだけが喜ぶ記事は陳腐化しやすく,ターゲットをギークとするのは難しい,としていました。

そこでIshigakiさんが考えたのはPerlの歴史。CGIの全盛期にPerlを使っていた世代が現在では社会でそれなりの権限を持っていることを取り上げ,⁠10年前」というキーワードを挙げていました。この世代にPerlのいい面,悪い面を正しく伝えることが,誤解を解いて案件にPerlを使ってもらえるように促すことにつながる,と考えているそうです。

その後,Ishigakiさんがどのように連載記事のネタを拾っているのかを紹介。CPANはもちろん,ソースコード,Wikipedia,メーリングリスト,IRC,過去のYAPC,など,非常に多岐に渡ることがわかりました。⁠記事を書くには2から3日,長いときは一週間かかる」とのことで,すばらしい連載の裏では大変な労力と,Perlコミュニティへの愛情が注がれているのだということがよくわかるセッションでした。

画像

画像

kazuhoさん「perl-casual特別企画 Unix Programming with Perl」

perl-casual特別企画と冠したセッションです。まずはkazuhoさんより、⁠Unix Programming with Perl」と題して発表がありました。

まずは正しいコードを書くためにはperlの知識やOSの知識が必要であるとし、今回はOS周りの話でも間違いを起こしやすいケースとして、errno、forkとファイルハンドル、シグナルの3点について解説がありました。

まずはerrnoについてです。ディレクトリを作成する際に、下記のようなコードを書いてしまうことがありがちです。

if ( ! -d $dir ) {
  mkdir $dir or die $!
}

しかし、このコードでは複数のプロセスから同時にコードが実行される環境ではうまくうごかないケースがあります。正しい対処方法はmkdirの実行後エラーを判定することです。その際エラーメッセージ文字列で判定すると環境やロケールによって異なるってくるため、errnoを使う必要があります。perlではuse Errno ()ををすると各種定数が利用できるようになり、$! == Errno::EEXISTとして比較するとよいそうです。補足としてこの$!はdualvarと呼ばれるもので、数値として評価した場合は数字で、文字列として評価した場合は文字列として返って来るようになっていることを述べられました。またerrnoの一覧を調べる方法ですが、この情報はperldocには記述されていないため、man 2 mkdirで確認する必要があります。manの引数の2はOSマニュアルのsection 2を見るという意味で、section 2にはシステムコール、section 3はCのライブラリ関数の一覧があるとのことです。

続いてforkとファイルハンドルについてです。forkをすると子プロセスには親プロセスのメモリ空間全体がコピーされると思われがちですが、ファイルハンドルに関しては親子で共有されるため注意が必要ということです。たとえばこれが原因でSQLiteのファイルが壊れたり、mysqlへの接続でエラーが起こったりということがあるそうです。正しい対処法として、まずファイルの場合は共有したくない場合はforkした後にどちらかのプロセスがファイルハンドルをクローズすればいいとのことです。特によくあるケースとしてfork後execをする際には、子プロセス側のファイルルハンドルをexec前にクローズするのがよいと仰っていました。ただしデータベースハンドルの場合は、単純に$dbh = undef;などとするとだめで、$dbh->{InactiveDestroy} = 1; してからundefする必要があるとのことです。基本的にはforkした直後に行うのがよいですが、fork処理がモジュール内で行われているなど直接変更できない場合は、*CORE::GLOBAL::forkを書き換えるか、POSIX::AtForkを使う方法を紹介されていました。

最後にシグナルについてのTIPSとして、SIGPIPEとSIGALRMの話をされました。SIGPIPEはプロセスがファイルハンドルに書き込めなくなった場合に受け取るシグナルで、デフォルトの動作はプロセスの停止になります。ネットワークプログラムなどでこの動作が困る場合は$SIG{PIPE}='IGNORE';とすればよいとのことでした。ただしこれを行うとprintなどの戻り値をチェックする必要があることを述べられていました。つついてSIGALRMを使ったタイムアウト処理についての紹介があり、$SIG{ALRM}とErrno::EINTRを組み合わせたタイムアウト処理が紹介されました。これは便利な半面、SIGALRMはプロセス空間でひとつしか使えないため、本格的に実装するにはselectシステムコールを使うほうが良いということでした。また長時間かかる処理をキャンセル可能にする方法として、Gearman::Workerなどで実装されている方法の紹介もありました。最後にwaitシステムコールの注意点について、これはシグナルを無視してしまうので、Proc::Wait3を使うのが良いとのことです。

普段何気なく使っているOSのシステムコールなども、正しく理解して使わないといろいろ落とし穴があることを再認識出来る有意義なトークでした。

画像

画像

著者プロフィール

本間雅洋(ほんままさひろ)

北海道苫小牧市出身のプログラマー。好きな言語はPerlやPython,Java,Objective-C,Haskellなど。在学中には数学を専攻しており,余暇の楽しみは圏論や論理学を学ぶこと。現在はオンライン不動産株式会社にて自社システムの開発に従事している。

共訳書に「実用Git」(オライリー・ジャパン)、共著書に「FFmpegで作る動画共有サイト」(毎日コミュニケーションズ)がある。

blog:http://d.hatena.ne.jp/hiratara/


臼井洋文(うすいひろふみ)

WEBアプリケーションエンジニア。京都府京都市出身。仕事ではPerlでサーバサイドプログラムを書きつつ,Objective-CでiPhoneアプリケーションの開発を行っている。最近の興味は統計,機械学習など。

twitter:usuihiro
blog:http://d.hatena.ne.jp/usuihiro1978/