本を読む

読書やコンピュータなどに関するメモ

RubyKaigi 2010(初日)参加しました

 Rubyのイベント「RubyKaigi 2010」に参加してきました。都合により今年は初日のみ参加。しょぼん。

 といいつつ、その初日(しかも午後から)に遅刻するというありさま。やれやれ。

 以下、メモ。ちゃんとしたレポートはgihyo.jpの記事あたりを。

jpmobile on Rails 3.0 (conceal_rs)

 Tokyu.rbのツートップのひとり、小川さんによる、jpmobileとそのRails 3.0対応について。Rails 3.0対応の苦労話を主目的に聴いてみました。

 jpmobileは、携帯向けWebアプリを作るときに、文字コードや絵文字、メールのコードなどの差を吸収し、あるいはセッション管理やview切りかえ、リンクヘルパーなどを提供するRailsプラグイン。このへんで、各キャリアごとのコードの違いやformから送信されるテキストの挙動などが細かく説明されました。au端末から送信される絵文字がコードがシフトされているとか、ドコモの2G端末が面倒とか。あと、暗黙のview切りかえとか、GPS link helperとかも便利そう。

 あと、最近はコード変換など一部の機能をRackミドルウェアに移しているという話で、へーすごいなと。Sinatraとかからも使えるんだとか。キャリアごとの端末クラスを定義していたのに加えて、JPMobile::AbstractMobile::SmartPhoneクラスを作って、それを継承した::IPone/::Android/::WindowsPhoneクラスを作ったという話もしてました。herokuでテスト中とか。

 会場を唖然(慄然?)とさせたのが、タイトルにもあるRails 3.0対応にからんで、Railsのバージョンが変わるたびにフックポイント(というかオーバーライドすると都合のいいメソッド)が変わって大変という話。実際に、view切りかえに使うためにviewが選ばれるロジックを追って、数十メソッドをクラスを横断して探す様子を説明していました。AbstractControllerこわい(半分違う)。

Ruby on Railsではじめる携帯電話向けオープンソーシャルアプリケーション開発(Masaki Yamada)

 モバゲーとかmixiとかグリーとかのソーシャルアプリのうち、モバイル用の開発をRailsでやる話でした。「ゲーム=UIが超不親切なCMS」という位置づけが面白かった。

 PC用のオープンソーシャルアプリとモバイル用ソーシャルアプリとは仕組みからしてだいぶ違って、そもそもモバイル用はSNSサーバーとアプリのサーバーが通信する仕組みになっているとのこと。サーバーは大変だけど開発者はモバイル版が楽だという話でした。

 で、オープンソーシャル用のURLでlink_toを使うためにact_as_opensocialプラグインを作ったとか(いわく「acts」にすればよかった、と)、OAuthのプラグインを作ったとか(質疑応答で、既存のものあるじゃんと突っ込まれてたり)。でも自然にRails化したので、普通のRailsアプリとコードの見た目が同じになったそうです。ほか、DBを簡易シャーディングするacts_as_multi_connectionとか、EC2管理スクリプトec2toolsとかを作った話もしてました。

 大変そうだなーと思ったのが、プラットフォームの仕様(エンドポイントURLとか)をどこまでソース中に書いていいかわからないので抽象化を躊躇するという話でした。

Rubygems, Bundler, and the future(Carl Lerche)

 Rails 3で採用された、gem管理機構のBundlerの話でした。英語なのでよくわかってません。

 ライブラリから別のライブラリを呼んでいるときに、依存しているライブラリのバージョンが別だと面倒、と。特に、Rails 3は一枚岩からたくさんのライブラリを組み合わせるようになったので、よりややこしい。rackのバージョン問題とか、ぐぐってみても世界がハマってる。しかも組み合わせの数が爆発するので、gemのNP完全問題や~、と。

 なので、Rails 3ではBundlerを採用したよ、と。Gemfileに依存情報を書いて、アプリ側では「require 'bundler/setup'」とかしておいて(Railsのboot.rbとか)、bundle installでgemを取得、gemfile.lockに依存情報を出力、だそうです。

 あと、Railsのdevelopmentではgemはシステムにインストールするけどproductionではvendor/bundleにインストールしたほうがデプロイしやすいとか、特定のgemを更新するときに全部が変わっては困るのでbundle update rackみたいにするとか、build dependenciesの記述とか、Optional /Recomended dependenciesの記述とか、meta gems(jsonとjson_pureとか)とか、よくわからないながらも興味深く聴きました。

われわれは、GCをX倍遅くできる(nari)

 GC本が3刷だそうで、おめでとうございます。会場でも買った人が多数でしたが、通読した人は少なかった様子。…すみません、ようやくDalvik VMの章まで読んだところです。

 内容は毎年恒例のCRubyのGC話。保守的GCを戸籍問題にからめて笑いをとってました。

 本題は、去年のRubyKaigiでコミットするという話になったLazySweep GCの話。フルでMark-Sweepすると停止時間が長くなるので、Markは一度にするけどSweepはアロケーションのタイミングでブロック単位でやるということでした。これにより、停止時間の合計は長くなるものの、1回の停止時間が短かくなるのがメリットと。けっこうマークしたままスイープが走らないブロックもあったりして、そういうところで速度的には有利なのかなと思いました。そのへんを、ヒープのビジュアライザとかゲームソフトとかでデモしてたのもウケてました。ちなみに、Ruby 1.9.2では入らなかったけど、1.9.3には順調に行けば入るとか。

 あと、ファイナライザはフルスイープのときだけ走る仕様だそうで、どうしてそうなってるのかがRubyのメンテナやコミッタの方々の間で議論になってたりしました。

 LazySweepの採用にあたっては、ヒープスロットの構造も変えて、ソートされた配列から、双方向リスト+それぞれのエントリを指すソートされた配列にしたとか。で、Ruby(自身の)開発者への注意として、マークとスイープとで時間差があるのでその間の処理でSEGVを起こさないように、という話もありました。

 これからのCRuby GCについては、保守的GCの問題とか(でも実はそんなに問題なんじゃないか)、停止型のGCの問題(でもライトバリアが面倒)とかが上げられました。GC本の共著者の相川さんが、ライトバリア記述支援の研究をしているそうです。

 そのほか、マーク時間を短縮するために、マーク並列化とか、マークの再帰をやめるとか、シンボルなどをマーク対象から外すとか、Stringなど特定の型を専用のヒープにするとか、Boehm GC採用とかいう話がありました。

 最後に、Rubyプログラマには「"こんなアプリでGCが遅い"という実例を公開してほしい」、研究者には「rejectされたものも含めてGCの論文を公開してほしい」とメッセージが語られました。

Rubyで作るDSLの基礎(Yasuko Ohba)

 プログラムっぽい書き方とDSLっぽい書き方の違い、あるいはDSLの考え方をRubyのコードにどう生かすか、といったあたりを解説しました。DSLの実装方法というより、DSLの設計というか命名規則というか、そういう作法の部分についての話が参考になりました。裏番組を断念して聴いて、得るものがありました。

 いいDSLというのは、読みやすい、記述量が少ない、メンテナンスしやすいと。普通のRubyの式は「レセプタよ、これをせよ/くれ」という記述なのに対して、DSLは「宣言的な記述」「ブロック」「特定概念を表すメソッド」というのが記述の特徴、と。そのへん、発想を変える必要があるとか、実装としてはモジュール向きという話がありました。

 考え方として、「宣言的な記述には形容詞や受動態、三人称単数が似合う」というのは、ハッとさせられました。

 最後に、「DSL的な考えをとりいれて、いいコードを」というメッセージで締めました。

君のクラスの最高の偽物(Shugo Maeda)

 個人的に、初日のいろいろ面白そうなセッションがある中で一番期待のセッションでした。

 Rubyではオープンクラスによって、たとえばStringクラスにどんどんメソッドを追加できます。アプリならまだいいのですが、ライブラリを作るときにそれをやっちゃうとグローバル汚染によりライブラリを使うアプリにも影響しちゃいます。それを、限定した静的スコープの中でだけ使えるようにするclassboxを実装したという話です。

 といいつつ、最初に、レシーバーにメソッドを追加しなくてもいいんじゃないかとか、is-a(継承)やhas-a(移譲)ではだめなのかと釘を刺していましたが。でもそれでも必要なときはある(to_xmlとか)、と。

 考え方としては、特定の静的スコープのみ作用するModuleのinclude。具体的には、「Kernel#overlay_module(klass, module)」というのをCで実装したそうです。そのために、crefのレキシカルな構造にメソッド探索を追加したり、メソッキャッシュをクリアする工夫をしたり、superの探索順序がどうなるかとか、iseq->klassとかいう話でした。

 あと、複数のクラスをまとめて拡張するために、overlay_moduleを使ってclassbox.rbを作ったという話も。なんとRubyのコード47行で実現しているそうです。

 そのほか、evalの第2引数のバインディングに使えるbinding(1)(1レベル外のバインディング)とか、最適化されたメソッドを置きかえるためにいちど:method_addedで置きかえて戻すとか、defの中のdefのレシーバーとかいう議論がなされていました。

 ちなみに、tesst-allが通ったけどたまにSEGVする(GCがらみ)とのことでした。

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/798-84ac0eaa

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad