RubyKaigi2011 スペシャルレポート

日本Ruby会議2011 2日目レポート[更新終了]

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

Thomas E Eneboさん,大場光一郎さん「Java in Ruby:Scripting Java in JRuby」

「普段仕方なくJavaを使っている人も,JRubyで楽しく開発しよう」ということで,Thomas E Eneboさんと大場光一郎さんによる英語・日本語の2ヶ国語でのJRuby布教セッションでした。

2ヶ国語と言っても同内容を英語と日本語で説明するのではなく,2人が別々のことを喋る発表になりますと説明し,⁠これはRubyのカオスな状況を表しているんだ」とジョーク風の前置きをしていました。

なぜJavaを利用するのか

JRubyを使ってJavaをRuby風に使っていくことを,Javaスクリプティングと呼ぶそうです。なぜそうまでしてJavaを利用するかの理由として,Javaだけにあるライブラリ(例:HadoopLuceneNASA Worldwideがたくさんあること,同一VM上でのPolyglot(多言語)な開発はJavaではScala,Clojure,Groovyと当たり前であることなどを挙げました。

また,Javaスクリプティングは,RubyでいうところのCで拡張ライブラリを書くのに似ているそうです。しかしながら,JavaはCよりもRubyに近いとし,例えばどちらもVM層があるからPortabilityがあったり,GCがあることも共通している,といった点で親しみのある言語であることを強調しました。さらに,JavaスクリプティングではJavaインターフェースやJavaクラスをRubyのやり方のままで実装したり継承したりするが,C拡張の方ではCのコールバックを使用する必要があるなど,使い心地にアドバンテージがあることも指摘しました。

ただし,Javaスクリプティングをしてしまうと,コードがJRuby以外のRuby実装に持っていくことができなくなる,といった注意点にも触れました。

Rubyで利用

実際のやり方に入っていくためのスクリプト例としてbubblemarkベンチマークをJRubyで実装したものを用意し,実際に動かしたデモも行いました。これはArdor3DというJavaの描画ライブラリを利用して動かしているが,Javaコードを一切書かずRubyを書くだけで作れたとのことでした。ハードウェアアクセラレータも効いて,ぬるぬる動いていたのが印象的でした。

まず,RubyでJavaのサポートを開始するには最初にrequire 'java' が必要で,Javaライブラリの読み込みにはrequire 'lib/ardor3d-ui-0.8-SNAPSHOT.jar'のようにjarファイルを指定するようでした。驚きのポイントとして,Javaのメソッド名は普通キャメルケースで作られているのに,JRubyでJavaメソッドを呼び出す際はRuby風のアンダースコアで繋いだスネークケースで呼び出せるように自動変換されるとのこと。記述法だけでなく,getWidthのようなgetterメソッドもシンプルにwidthのみになったりするようです。

データ型についても,JavaにあるものがRubyで対応するものへ自動型変換してくれます。明示的に型を変えたい時は,to_javaメソッドを使って指定することもできるそうです。

Rubyで実装

JRubyならば,Javaコードを利用するだけでなく,Javaにある要素をRubyで実装することもできます。例えばJavaのインターフェースはincludeで持ってきて実装できると言います。また,イベントハンドラはクロージャのおかげでブロックを使っていい感じに書ける,と紹介しました。

そして「これが最も重要なフィーチャ」だとして,既存のJavaのクラスにRubyのメソッドを追加する方法も披露しました。普通にRubyでやる時と同じようにJavaのクラスを再オープンしてそこにメソッドを書いてしまえば追加でき,サンプルとしてjava::util::ArrayList#<<を実装した例を紹介しました。

もっとJavaを

その他のトピックとして,先述のArdor3Dに対してDSLの層を構築するThreepenceというライブラリを作ったことを宣伝しました。Javaは言語内DSLが苦手だけどRubyなら得意だから,Javaの機能を使いつつDSLなライブラリが作れてしまう。RubyとJavaの良いパートナーシップの実例とも言えるライブラリであると言及しました。

そして最後に,Javaに既にライブラリがあるのならそれを使いましょう,車輪の再開発はやめましょうと述べ,JavaのAPIをRubyのAPIのように飾りましょう,と提案しました。Javaの世界もRubyistにとって簡単に手を伸ばせる範囲にあるものなんだ,と気づかせてくれる発表だったのではないでしょうか。

画像

画像

Yehuda Katzさん「Advancing Net::HTTP」

Strobe, Inc.に勤めるYehuda KatzさんによるYehudaさんの拡張しているNet2::HTTPについての発表です。Yehudaさんはwycatsというハンドルネームで,Rails3リリース時に活躍されていました。

Net::HTTPについて

Yehudaさんは,Rubyには100近くのHTTPライブラリがあると言います。しかし,どのライブラリもNet::HTTPほど強力なものはないそうです。パフォーマンスもRubyで書かれているが十分で,Rubyで書かれているのでわかりやすいのがよいと述べます。

次にYehudaさんは,Net::HTTPのAPIについて紹介しました。Net::HTTPのAPIはブロックがたくさんでてくるため,煩雑に感じる人が多いです。しかし,ブロックの一つ一つがHTTPのリソースの取得・開放というふうに捉えると意味が理解できると説明しました。

Net2::HTTPの作成

では,なぜYehudaさんは,自身がよくできていると感じているNet::HTTPの改良を試みているのでしょうか?

それは, Yehudaさんは,Rackでリクエストとレスポンスが別々のスレッドで処理する必要があったそうです。そのとき,Net::HTTPのtransport_requestでリクエストがブロックされ思うようにいかなかったと言います。そこで,Net::HTTPの改良に手をだすようになったとのこと。また,Net::HTTPに対してパッチをあてる方法でなく,大きな改良をしたくなったため,フォークしNet2::HTTPを作るという手段に出たと話します。

リクエストの並列処理

Yehudaさんは,リクエストを並列に処理するためのキーワードとして,"Async"を挙げました。Fileのreadを例に挙げ,Rubyレベルで並列に処理するためのテクニックを説明しました。

まずは,Threadを使うやり方です。IOを発行する箇所をThreadで処理をさせることで,メインのThreadではIOのブロックが発生しないというものです。次にThread一つで並列に処理する方法を説明しました。Thread一つで処理する場合には,IO.selectを使うようです。IO.selectとIO#read_nonblockを使用することで非同期に処理が進められると言います。

このIO.selectの仕組みを使い,もっと汎用的なIOを非同期に扱うための仕組みとしてNet2::Reactorを作成したそうです。これにより,Net::HTTPがSocketやFileと同じような取り扱いが可能になります。Yehudaさんは,Net::HTTPのようなハイレベルな概念を持つライブラリもIOのように取り扱うことができたら,Net::FTPなどもNet2::Reactorで取り扱うことが可能だと述べます。また,このNet2::HTTPをRuby本体に取り込んで欲しいと,提案をしました。

画像

画像

高尾宏治さん「MacRuby on Rails~MacRubyから見たcRuby~」

cRubyのコミッタであり,今年の3月にMacRubyのコミッタにもなった高尾さんの発表です。

MacRubyとは

まず,MacRubyとは一体どんなものか,という説明から始まりました。 Ruby1.9とObjective-Cを融合させたもので,現在のMacRubyプロジェクトの目標は,Ruby1.9との100%互換を目指している,と説明しました。

そもそも MacRubyとはcRubyとまったく別物というわけではなく,cRubyとMacRubyは基本的なコードベースは同じものを使われています。違いはRubyVMの代わりにLLVMを,GCをAutoZone,組み込みライブラリ部分にFoundationと呼ばれる機能を追加をした実装のことだそうです。 MacRubyはMac OSX上でのGUIプログラミングに関しては実用的には問題ないレベルになっているとのことで,XCodeを使ってソースコードとGUIのアプリケーションを作ることが可能だと述べました。

MacRuby on Rails

2011年3月ころにふと思い立って,MacRubyでRails3が動くのかを試してみたところ,なんとかRailsのインストールができたそうです。しかし,実際に動かそうとするとエラーが発生したり,SEGVが発生していたと振り返ります。そこから原因の調査を初めたことがきっかけてで,MacRubyのコミッタになることができたと話します。 現在では MacRuby上でだいぶRailsが動きそうなところまでなってきているそうで,Railsが無事に動くようになることを機に MacRuby 1.0のリリースを行おうという話になっていると述べました。

また,MacRubyのコードを読む必要で必要な技術要素として,以下の理解が必要だと話していました。

  • cRuby
  • Objective-C
  • C++
  • LLVM

画像

画像

角谷信太郎さん「The Gate」

諸事情により来られなくなったDave Thomasさんに代わり,角谷さんがRubyコミュニティに向けて今後10年間の宿題を伝えたい,という発表になりました。

自己紹介

角谷さんはAsakusa.rbという地域Rubyist集団に所属しており,RubyKaigi2011のプラチナスポンサーでもある永和システムマネジメントで働いています。これまでのRubyKaigiの実行委員の経験やまつもとさんなどの会話を経て,最近は自身のことをRuby Evangelistだと思ってもいいのではないかと思っているがどうだろう,と述べていました。

Dave Thomasと私

本当ならばDave Thomasさんに基調講演をしてもらう枠だったのですが,諸事情によりキャンセルされてしまったので,代わりに話したいということが伝えられました。Dave Thomasさんを知らない方のために,まずDave Thomasさんについて紹介しました。

Dave Thomasさんは1999年に頭角を表したと言います。この年はAndrew Huntさんと『達人プログラマー』を書かれた年です。この達人プログラマーを自社の新入社員に買い与えられことという話です。この本を今読み直してみると,10年以上前に書かれた本でありながら未だに示唆に富む本であることに驚かれたとのことです。

2000年にはRubyについての本を出版されたり,アジャイルソフトウェア開発宣言を出した一員となり,アジャイル開発のスタート地点に立たれたと言います。2003年には,Pragmatic Bookshelfというプログラマ向けの書店を作ったことに触れ,今ではビジネス的に大きくかつつプログラマからの信頼を得る存在となったと紹介しました。2005年にPragmatic Bookshelfから『RailsによるアジャイルWebアプリ開発』という本を出版しました。

そして,こういった本の邦訳を読んでいるうちに,2007年頃,角谷さんは日本の方に良い技術書を届けたい,まともな日本語で技術を伝える活動がしたいと思われたそうです。そしているうちに,監訳の仕事をするようになったと言います。最近では『アジャイルサムライ』を監訳したことを紹介しました。

RubyKaigiと私

角谷さんの中で,RubyKaigi2007はやりきった感じがしたと言います。特にDave Thomasさんに来ていただいたのは非常によい点だったと語ります。当時はRailsがこれから日本で広がるかどうかという状況でした。そのような状況でDave Thomasさんは,これからRubyやRailsの世界に入ってくる人が多く出てくるだろうと指摘し,⁠これまでの自分たちのやり方を大事にしながら,新しく来た人たちから学んでいこう。今や孤島(Island of Ruby)は存在しない。新しくくる人たちをHappyに迎え入れる準備をしよう」と宿題を投げかけていったと振り返ります。

さらに2007年当時,角谷さんは仕事でRubyを使える状況にはなかったそうです。昼間はJavaを書き,夜にしかRubyを書けなかったときに,Railsだと素早くWebアプリケーションを作れると知ったと言います。そして,これを仕事でRubyを使うためのチャンスにしたい,Rubyの孤島へ行くために橋を架けたいと思うようになったそうです。さらに,JavaからRubyへどのような戦略を持ってシフトしていくかという視点に立つようになったことを話しました。

コミュニティの一員になる

Railsには,すごいたくさんの人が乗っている感じがすると言います。しかしそこで誰と仕事をやるかということが非常に大事であると話します。

Asakusa.rbやRails勉強会@東京での会場提供しコミュニティをホストするといろんな人がきてくれるのでいろんな人とコミュニケーションしやすくなっていると言います。そして,RubyやRailsに興味を持つ人たちとどう関わっていけるかということをよく考えているとのことでした。また,自社内というコミュニティでは楽しく仕事をするということが大事だとし,githubを使うことでコードレビューをしやすくしたり,楽しくしたり,楽しくて仕方ないという状態にすることが一番の目的だと言います。楽しんでる人たちがいるコミュニティの一員になるということが,一番大事だと思っていることと語りました。

また,楽しいということをみんなに見せていく場としてRubyKaigiは大事だと思われていると言います。楽しいということは、人間として根源的なことであり,楽しいからこそ世界中からみんなが練馬やつくばという場所にも集結するイベントになると語ります。しかし,この楽しさというものは,なかなか伝えることが難しいものだと述べました。

Dave Thomasさんからの宿題

アメリカではRubyのエコシステムが確立されているが,日本ではまだ確立されていないと言います。そのため,これから述べる宿題は少し早いように思えるけれども是非紹介したいと,以下の3つの問題を紹介しました。

  • 1.Inspire someone:似たような仲間以外にも影響を与える活動をしてほしい。Sarah Allenさんの"Find someone to inspire who's not like you"という言葉を紹介しました。
  • 2.Diversify:多様性を持たせなさい。これは自分自身に言えることです。Dave Thomasさんの"毎年一つの言語を学びなさい"という言葉で説明されました。日本ではLL文化があり,妙に言語に興味感心が高いので心配はないと思っていることも述べていました。
  • 3.Get out of the Rut:Railから降りるということ。前の人が走った轍から抜けてみること。"Ruby is *in danger of becoming* a Suburb" Ruby界隈でも何を作っても新しいという世界ではなくなってしまったそうです。

これら3つの宿題を楽しんでやること。それがDave Thomasさんからの宿題です。たのしいRubyということを僕等はどう続けていくかが大事だと語りました。

画像

画像

画像

画像

赤井駿平さん「Method Shelters :ClassboxesでもRefinementsでもない別のやり方」

赤井さんはまずはRubyのオープンクラスの説明として,既にあるクラスなどに対してメソッドを追加したり,既に存在するメソッドなどを上書きすることができると話しました。オープンクラスの例として,openメソッドを上書きするopen-uriや,Stringなどにメソッドを追加するRuby on RailsのActiveSupport,プログラマ自身によるモンキーパッチを挙げました。

オープンクラスは便利である一方,メソッドの衝突などの問題があると言います。例えば,複数のライブラリが同名のメソッドを追加する場合,後から読み込まれたライブラリで上書きされてしまい,上手く動作しないと説明しました。赤井さん自身の経験として,Railsとflvtoolというライブラリが両方ともStringにメソッドを追加するため問題が起きてしまい無理矢理解決したという話を挙げていました。

このような問題を解決するためにClassBoxやRefinementsなどが既に提案されていますが,赤井さんはLocal Rebindingが欲しいということで新しくMethod Sheltersを提案したそうです。Method SheltersはClassBoxと似ていて,メソッドに対してスコープを与える仕組みになっているそうです。Methodの単語があるように,クラスなどの定数や,インスタンス変数については取り扱わないとのことでした。

内部の実装の話として,Exposed ChamberとHidden Chamber,Global Methodを紹介しました。Exposed ChamberにはパブリックなAPIを記述するそうで,これだけだとClassBoxと変わらず,Hidden Chamberにはそのモジュールの中で使うAPIを記述するとのこと。

いくつかの図を用いて内部の実装について説明されたあと,パフォーマンスについても言及しました。メソッドを探しにいくルートが増える分やはりパフォーマンスは落ちるらしく,rails3のプロダクション環境では4%ほど低下するとのことでした。例外としてtDiaryをあげ,はかったベンチマークのうち唯一パフォーマンスが向上したそうです。

話のテーマ上,CRubyコミッタの参加が多く,頻繁にIRCで様々な突っ込みが入る発表でした。

画像

画像

小崎資広さん「CRubyのロックデザインの解説および改善案について」

2日目小ホール最後の発表は,LinuxのコミッタでありRubyのコミッタでもある,小崎さんの発表です。小崎さんは,RubyではスレッドとかIOとか,OS依存になりそうな箇所に関わっています。

今回話してくれたGVMというのは,GlovalVMロックのことです。ロックが必要な処理をVMで一つのロックを使用し保護することにより,簡単にマルチスレッドでの資源保護ができる手法です。多くの資源を同一のロックで保護するため,CPUが複数ある環境では競合が多くなり,スケールしないというのが,GVMを利用したときの問題点です。この問題点について,小崎さんは「OSのスケジューラーを持つ悩みと似ている」と語ります。

RubyのGVMの実装は,ロックを保持して続け,waitする可能性のあるシステムコールを実行したときにロックを話すという実装になっていました。これでは,あるスレッドがずっとロックを保持してしまい,動かないスレッドが存在するようになってしまいます。そこで,Ruby1.9.2からはTimerThreadというのが導入され,このTimerThreadが10msに一回,動作しているスレッドに対してロックの解放要求を出し,スレッドはロックを解放することにしたと言います。しかし,今主流となりつつあるマルチコアのアーキテクチャと相性が悪いそうです。CPUとメモリの距離により,TimerTheradを使った方法がうまくいかないことがあり,ロックを解放したスレッドが他のスレッドのロック獲得前にロックを獲得してしまうことがあると述べました。

この問題を解決するために,同じスレッドがGVLを連続して獲得しないような実装を試みたそうです。Pythonでは,このような実装が行なわれているとのこと。Rubyでこの実装をし,実験をしたところ,小さいIOをたくさん発行するようなケースでは,GVLを獲得・解放するコストが多くなり,性能が落ちてしまったと述べていました。

Linuxスケジューラは最小走行時間を保証するようにしている(一定時間走らないと解放しない)ため,Ruby1.9.3ではロックを解放する契機に取得・解放方法を変更したことを紹介しました。

  • IO等のシステムコールによるロック解放
    • 1.9.2と同様の取得・解放方法。
  • TimerThread経由によるロック解放
    • 同じスレッドが長時間動いていると判断された場合,強制的にロックを解放させ,他のスレッドがロックを獲得するまでスリープする。

この実装でも,特定ロック手法では最大速度が2倍落ちることがあったと言います。これは,コードが増えると遅くなるという現象が表われたと考えられるそうです。しかし,vm_thread_mutext3というロックを使用したケースでは,1.9.2で3000秒以上かかっていた処理が4.4秒で完了するようになったと補足しました。

最後に,小崎さんは覚えて帰ってほしいこととして,⁠GVLとイマドキのCPUでは相性が悪い」⁠使っている人が気持ちよくRubyを書けるように,コミッターは一生懸命がんばっています」と述べました。

画像

画像

著者プロフィール

KaigiFreaks レポート班

KaigiFreaksとは,会場に来れなかった人にも,雰囲気や内容を楽しんでもらえるように動画収録や配信を行うことをミッションに,RubyKaigi2008で結成された特別編成チーム。

RubyKaigi2009からはgihyo.jpを中心にテキストと写真で現場の様子を伝えるレポート班が加わり,現在のKaigiFreaksは配信班とレポート班の2班編成。


三村益隆(みむらみつたか)

(株)永和システムマネジメントサービスプロバイディング事業部所属。Asakusa.rb & Rails勉強会@tokyo。このところRailsのお仕事をしています。言語好き。

blog:http://d.hatena.ne.jp/takkan_m
twitter:http://twitter.com/takkanm


すがわらまさのり

ハンドルネームはsugamasao。

Mitaka.rb や 若手IT勉強会に参加しています。仕事では自社プロダクトのデーモンの開発あたりでRubyを使ったりしています。伊坂幸太郎さんと荒木飛呂彦さんが好きです。

blog:http://d.hatena.ne.jp/seiunsky/
twitter:https://twitter.com/sugamasao


小松崎典之(こまつざきのりゆき)

ハンドルネームはO-Show。

RubyKaigi2010に参加したことで触発されRubyistを自称するようになる。ブログでRubyやGit関連記事の翻訳をあげています。もっとRubyとGitの情報の流通増えろ!と願ってやまない。

blog:http://keijinsonyaban.blogspot.com/
twitter:http://twitter.com/oshow


菅井祐太朗(すがいゆうたろう)

仕事でも Ruby を使えたらいいなぁと考えている新社会人LOCAL 所属。この春からAsakusa.rbにjoin。

twitter:http://twitter.com/hokkai7go


赤松祐希(あかまつゆうき)

2010年よりRuby on RailsでのWebアプリケーションの開発を中心にフリーランスのRubyプログラマとして活動中。最近はHaskellに興味を持ち出し、勉強しはじめている。

blog:http://ukstudio.jp/
twitter:http://twitter.com/ukstudio