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

  • スクリプタブルなアプリケーションの制御

伝統的にアプリケーションは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 をよろしくです。

Macの開発基盤には、ほとんどの人がObjective-Cを使っています。RubyCocoaRuby/Objective-C間のブリッジです。今ではアップルからのサポートで活発に開発されています。Rubyプロキシに対応するObjective-Cのクラスを生成することができ、逆もまた然りです。メッセージと例外はフォワードされ、型は変換されます。

メッセージ規約を用います。メソッド名(selector)の中で、':'は'_'で代替されます。最後の'_'は、あいまいさを招くかもしれませんが、省略することもできます。今後のリリースでは必須になるかもしれません。


Ruby/Objective-Cブリッジにはいくつかの課題が残っています。

問題: メソッド呼び出しの性能。
解決策: gccのlibffiを利用することで、任意の外部関数インターフェースの呼び出しができます。

問題: 保守。現在のRubyCocoaは新しいAPIを考慮にいれて作る必要があります。解決するために、メタデータ基盤にはより動的な記述を許し、メタデータ生成ツールには新しいAPIのためのメタデータファイルの作成を支援するよう開発を進めています。


最新版はrubyforgeSVNapple-unstableブランチから取得可能です。

  • 今後
    • "コストのかからない(toll-free)ブリッジ" - CoreFoundationオブジェクトでRubyのプリミティブな型を実装し、型の変換をなくすことが必要です。
    • GC - Objective-Cは将来的にガベッジコレクションを持つようにします。アイデアとしては、Objective-CAPIを通じてRubyでObj-Cのガベッジコレクタを実装します。