iPhone で Ruby/RubyCocoa を動かしてみた

iPhoneでC#アプリが審査に通るワケという記事に刺激されて、CILが動くんだったらRubyも動くよな、とか思って、iPhone SDKで、Rubyの移植から始めてみました。結論から言うと、Ruby / RubyCocoa ともに、実機/シミュレータともなんとなく動いてます。

スクリーンショット

これだけだと、何のことか分りませんね。。

上のスクリーンショットのアプリを書くのに必要なRubyコード

こんな感じです。Mac版のRubyCocoaの書き方をそのまま踏襲できます。

require 'rubycocoa'
 
class MyAppDelegate < OSX::NSObject
  def applicationDidFinishLaunching(application)
    @window = OSX::UIWindow.alloc.initWithFrame(OSX::UIScreen.mainScreen.bounds)
    @window.setBackgroundColor(OSX::UIColor.darkGrayColor)
    @window.makeKeyAndVisible
 
    @textView = OSX::UILabel.alloc.initWithFrame(OSX::UIScreen.mainScreen.bounds)
    @textView.setText("hello RubyCocoa world")
    @textView.setTextAlignment(OSX::UITextAlignmentCenter)
    @textView.setFont(OSX::UIFont.boldSystemFontOfSize(24))
    @textView.setTextColor(OSX::UIColor.whiteColor)
    @textView.setBackgroundColor(OSX::UIColor.clearColor)
 
    @window.addSubview(@textView)
   end
end
 
OSX.UIApplicationMain(0, nil, nil, "MyAppDelegate")

要するに?

要するにiPhone SDKRubyRubyCocoaが(なんとなく)動きました。Ruby本体は、拡張(ext/)を含め、すべて static link にしています。RubyCocoaのほうは、最新のものは libffi というライブラリがiPhone実機で動かないため、0.4.2という5年前ぐらいの実装からちょっとパッチをあてていった感じです。

コード

http://github.com/takuma104/iphone-rubycocoa/tree/master

github に上げておきました。(gitめんどくさい人は、downloadボタンでtarballとれますよ) ここで開発を継続予定です。とりあえずiPhone SDKがあればコンパイルして、main.rbをいろいろ書き換えとかで遊べるかもしれません。Device2.0およびSimulator2.0で動作を確認しています。

この RubyCocoa のライセンスはRubyと同じにしたいのですが、RubyCocoa 0.4.2 は LGPL だったみたいです。最新はRubyと同じようです。*1 RubyCocoaのオリジナルの作者の藤本さんに確認して、どうやら、RubyCocoaのライセンスをLGPLからLGPL+RubyLicenseのdual licenseにした時点で過去に遡って適用したとのことでした。ので、現状githubのライセンスファイルをそのように入れ換えてあります。ということで、Ruby本体も含め、Ruby Licenseを選択可能となりました。

今できていること

  • Ruby本体:samples/test.rbがほぼ動いている。test/test_*.rbは未テスト。socketもなんとなく動いてるっぽい。
  • RubyCocoa:あんまりテストしてない。とりあえずこのhello world出たレベル。

今できてないこと

  • Ruby本体:実機でなんか例外処理のtrapがヘン?? 実機での longjmp() の動作に何か問題があるのかも。解決しました http://d.hatena.ne.jp/takuma104/20090301/1235927945
  • RubyCocoa:BridgeSupport相当が入ってないので、その辺手作業でなんとかするorBridgeSupportをbackportする
  • AppStore審査通るかの確認 ;)

UICoderz4発表資料

はしょりすぎて良くわからない資料を置いておきますね。

Ruby/RubyCocoa for iPhone - UICoderz4

あとで経緯とか詳細とか書きまっす。

*1:この辺どなたにご相談すれば良いんでしょうかねえ??