August 31, 2012

Mooseを利用するに変えるハッカソン

Oslo.pmが「Moving to Moose Hackathon(Mooseを利用するに変えるハッカソン)」という会議をノルウェーのプレーケストーレンにある山小屋で開催しました。私は参加したいでしたが、招待頂きました。Oslo.pm、どうもありがとうございます!

会議のテーマは二つありました。1つはRDFに興味あるコミュニティが、Mooseを利用するにモジュールを変えるつもりでした。あと1つは、p5mopを屈強化して、もう少しperl自体に追加できる状態に準備する予定たちました。

Day -3 (YAPC::EUの日)

ドイツのフランクフルトで開催されたYAPC::EUに参加できました。初めてYAPC::EUだったし、イギリス以外ヨーロッパに行ったことがなかったから、とても嬉しいでした。YAPCで「Mooseロール利用パターン」というトークをやっていきました。今回のトークは、全ての前回よりよくできたな!と私は思います。きっと来年のYAPC::Asiaに行くことがてきるので、たぶん日本語版を話そうとします。今年来られないのはすみません!

Day 0 (旅の日)

フランクフルトからスタヴァンゲルに飛んで行きました。ホテルからフランクフルト空港に、そして飛行機に通った道が分かりにくいと思いました。Hauptbahnhof(中央というか駅)で乗り換えの標識がちょっと読めませんでした。ドイツ語は全然分からないのでした。しかも、空港のゲートを越えた後、バス(!)で飛行機に運ばされまして、道路から階段で直接に乗りました。ビックリした!

結局、プレーケストーレンの山小屋に無事に到着しました。

参加者の皆さんが、自己紹介したり、喋ったり、一緒に夕食を食べました。p5mopに興味ある参加者が「基本的に、どうやってroleという概念はp5mopの仕組みに合う?」というを夜中すぎまで論じました。

@robinsmidsrodさんが「日本語で入力する方法を説明しませんか?」と聞いて、私はもちろん嬉しくなりました ;) その後、XPathとかXML::RabbitとかUnicode CLDRとかとかについて喋りました。

Day 1 (登山の日)

早起きして、プレーケストーレンという有名な崖にハイキングしました。眺めはとっっってもきれいでした!!!

旅立ちは10時から16時までかかりました。たいへん疲れました。(四日後でもまだ足が痛い!)

その後で、Fluxx(zombie版とcthulhu版組み合わせられた)というカードゲームをやりました。計画者はプログラマーですから、法則が面白い。しかもルールが進化することまであります。

Day 2 (ハッカソンの一日目)

朝食から昼食まで私が「Mooseロール利用パターン」というトーク拡張版を話してあげました。昼食の後で、@pmichaudさんがNQP言語について解説しました。プログラミング言語が作りたい方は、NQPを使うことで、きっととても早く計画できると思います。

@perlyargさんとMooseのロールテストをp5mopに変更して始まりました。p5mopではロール合成は不完全ですから、そのテストは便利だと思います。

最初のp5mopの拡張としてmopx::instance::trackingは、私が書いたことができました。Moose版よりも簡単でした。p5mopのClassというメタクラスをサブクラスして、create_instanceというメソッドにオブジェクトを見逃さない挙動を追加されます。

夕飯の後で、昨日の旅だし、朝のトークをしたから、たいへん疲れました。で、私がやったことは、Fluxxだけでした。

Day 3 (ハッカソンの二日目)

先日書いたDTraceプローブをPerlに追加するパッチをやっと送りました。p5pが受け入れたので、5.18からop-entry、loading-file、loaded-fileというプローブを使うようになります。

@RubenVerborghさんが「正規表現を使いこなす教師いますかー!」と聞いて、「私が手伝ってみてあげましょう」と私は答えました。問題は、テストが9秒以上で実行するので、ちょっと遅すぎました。役800回呼び出したregcomp(正規表現をコンパイルする関数)というopcodeに2秒以上部分があることをDevel::NYTProfで見つけました。でも、ちゃんとqr//を使ったので、regcompがほとんど呼ばないはずだと思いました。残念ですがDevel::NYTProfがopcode内に見ることができませんが、DTraceは各C関数でも見られます。そして私がperl providerのsub-entryとsub-returnというプローブをトレースして、pid providerのC関数のentryとreturnで、遅いマッチだけ内regcompをトレースしました。発見として、700部分のregcompは速いですけど、あと100部分のregcompはその速いregcompより100x以上遅い。なに。。。?後程、遅すぎた正規表現は記録括弧がありまして、その括弧を(?:...)に変更することで、とてみ速くなったことができました!実行は9秒から2秒まで減りました。

もう一つ問題に手伝ってあげました。AUTOLOADを使っているモジュールには、「URI::Namespace=HASH(0x7ff5fa032360) contains invalid characters for a type name. Names can contain alphanumeric character, ":", and "."」というエラーが発生していました。結局、原因は$obj->type呼び出して、AUTOLOADを実行するはずがあるけど、実は名前として$objを渡して、タイプを定義するMoose::Util::TypeConstraint::type($obj)を呼び出されました。no Moose::Util::TypeConstraintとかuse namespace::autocleanを追加すると、typeというメソッドはAUTOLOADを実行するので、よく解決しました。

Day 4 (ハッカソンの三日目)

p5mopはhas $foo宣言でアトリビュート定義します。メソッドを実行する時に、PadWalkerでオブジェクトの値をその変数に代入されます。メソッド内には、正しく変数を使うことができます。でも、@doysterさんたちがbootstrapを書きなおした後で、$self(PadWalkerで代入された変数)は時々間違うオブジェクトにあるが$::SELF(localで代入された変数)は正しいオブジェクトにあることになってしまいました。@doysterと@stevanlittle@nothingmuchと私とデバッグしようとしましたが、結局原因を見つかれませんでした。

しかし、@perlditionさんが書いている新しいモジュールにすることで、解決できるはずです。そのモジュールはlexical padで手動的に管理できます。具体的に、メソッド実行時に、カスタムpadをスタックにプッシュされ、そのブロックがオブジェクトの値を使えるになります。メソッドが返す時に、カスタムpadをポップされます。このモジュールでは、変数汚染が抜けられるはずです。

Day 5 (帰宅の日)

空港まで無事に着きました。でも、チェックインしようとしたら、「目的地:London/Gatwick」と表示されました。クソォォ!!と思って、不安感じきました。London/Heathrowからボストンまで飛ぶ飛行に乗り換える予定たったのです。Heathrowのターミナル5に乗り換えるのは、二時間でもちょっと足りないのですね。GatwickからHeathrowまで乗り換えるのは絶対無理です!原因は、予約には「London」だけ示して、ロンドンは航空5つまであると、全然考えなかったのです。

とにかく、カスタマーサービスに「飛行機の予約を変更してくれないか?」と聞いて、「新しい予約を取るしかできません」と答えました。で、新しくて高い予約を取りました。フランクフルトの代わりに、オスロで乗り換えまして、目的地はHeathrowにしました。

怒りを減るために、Heathrowでビールと二番好きなチキンカツカレーを食べました。結局、定刻通りに家に帰ったことができました。