Leveraging Mac OS X from Ruby
- Posted by Nick Sieger
http://blog.nicksieger.com/articles/2006/10/21/rubyconf-mac-os-x-and-ruby
Speaker: Laurent Sansonetti
アップルコンピュータに勤めてるLaurent Sansonettiは、今やOSに搭載されたRubyを支える仕事を担っています。
- OSとRubyの歴史
- 10.2はRuby1.6.7を標準搭載
- 10.3はRuby1.6.8を標準搭載
- 10.4は1.8.4を標準搭載し、最新のソフトウェアアップデートではRubyのC拡張の編集までできます
アップルはいくつかの領域で今後のOSバージョンにおけるRubyサポートの改善を積極的に検討しています。
なぜフレームワークがいるのか?Macでの開発がより簡単になります。複数バージョンに対応でき、開発したアプリケーション内でRubyをバンドルしやすくなります。従来のレイアウトとの互換性もあります。
/usr/bin/ruby => /System/Library/Frameworks/Ruby.framework/Current/bin/ruby
- その他
- IRBのサポートを含め、RubyGemsに加え重要なgemsのサポート: たとえば、Rake、Rails、libxml2、そしてsqlite3やDNSSD(ゼロコンフィギュレーション)など
- スクリプタブルなアプリケーションの制御
伝統的にアプリケーションはAppleScriptによって書かれてきました。Apple Eventが2つのアプリケーション間の糊(IPC glue)となります。
RubyAEOSAはApple Eventのラッパーです。(サポートは)2001年から始まりましたが、2003年以降は使えなく(使わなく?)なっていました。必要なコードが無駄に冗長です。代替手段としてAppleScriptでラップして実行できましたが、性能が悪く、AppleScriptをよく知っていないとできないという制約もありました。
RubyOSAはアップルによって創設された新しいプロジェクトで、今日の活発な開発と利用のもと、RubyAEOSAの後継となることを目指しています。非常にRuby的なAPIをもち、素早くRubyコードを生成してゆっくりイベントを送ります。Apple Eventは完全に隠蔽されています。
require 'rbosa' itunes = OSA.app('itunes') itunes.current_track itunes.current_track.name itunes.current_track.artist itunes.current_track.size itunes.play itunes.pause itunes.sound_volume = 0 100.times {|i| itunes.sound_volume = i; sleep 0.1 }
まもなく0.1.0がリリースされます。gem install rubyosa をよろしくです。
- Cocoa開発
Macの開発基盤には、ほとんどの人がObjective-Cを使っています。RubyCocoaはRuby/Objective-C間のブリッジです。今ではアップルからのサポートで活発に開発されています。Rubyプロキシに対応するObjective-Cのクラスを生成することができ、逆もまた然りです。メッセージと例外はフォワードされ、型は変換されます。
メッセージ規約を用います。メソッド名(selector)の中で、':'は'_'で代替されます。最後の'_'は、あいまいさを招くかもしれませんが、省略することもできます。今後のリリースでは必須になるかもしれません。
Ruby/Objective-Cブリッジにはいくつかの課題が残っています。
問題: メソッド呼び出しの性能。
解決策: gccのlibffiを利用することで、任意の外部関数インターフェースの呼び出しができます。
問題: 保守。現在のRubyCocoaは新しいAPIを考慮にいれて作る必要があります。解決するために、メタデータ基盤にはより動的な記述を許し、メタデータ生成ツールには新しいAPIのためのメタデータファイルの作成を支援するよう開発を進めています。
最新版はrubyforgeのSVNのapple-unstableブランチから取得可能です。
- 今後
- "コストのかからない(toll-free)ブリッジ" - CoreFoundationオブジェクトでRubyのプリミティブな型を実装し、型の変換をなくすことが必要です。
- GC - Objective-Cは将来的にガベッジコレクションを持つようにします。アイデアとしては、Objective-CのAPIを通じてRubyでObj-Cのガベッジコレクタを実装します。