@takuma104 log Twitter

2009-02-25

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

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

スクリーンショット

f:id:takuma104:20090226022028p:image:w200

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

上のスクリーンショットアプリを書くのに必要な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出たレベル。

今できてないこと

UICoderz4発表資料

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

Ruby/RubyCocoa for iPhone - UICoderz4

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

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

kimurawkimuraw 2009/02/28 00:36 RubyCocoaのメンテナやってる木村(わ)というものです。素晴らしいです!!

いくつかすぐにお答えできるものについて。
◎ライセンス
libffi(apple-unstableブランチ)がマージされる前にライセンスの変更が行われた(ChangeLogで2006-05-29)ので、そこをベースにすればRubyライセンスと見なせるのではと思います。心配であればメーリングリストrubycocoa-develまでご相談いただければと。
◎BridgeSupport
0.4.x以前のバージョンでしたらtool/och_analyzer3.rbという、ヘッダファイルからRubyモジュール定義するCコードを生成するツールがついています。もしかしたら少しなおせばObjective-C 2.0でも動くかもしれません。

makotomakoto 2009/02/28 08:48 こんにちは
英語でRubyのMobile関係ブログを書いています。森さんのiphone-rubycocoaも記事にしてみました。よろしければ一度御参照下さい。
http://rubyonmobile.wordpress.com/2009/02/27/ruby-ruby-cocoa-runs-on-iphone-too/

takuma104takuma104 2009/03/01 17:42 kimurawさん>

RubyCocoaお世話になってます! ライセンスのほう、藤本さんにメールで確認させていただいて、
変更時点のライセンスは、過去に遡って変更したはず、とのことでした。
ので、とりあえず僕のgithubのほうですが、変更時点の差分をマージしてみました。

http://github.com/takuma104/iphone-rubycocoa/commit/9e2bc6985fe78989312bc6f14f1baf52274faa30

このr980付近は、ちょうど0.4.2が出た数ヶ月後ぐらいの時系列のようです。

BridgeSupportのアドバイスありがとうございます。och_analyzer3.rbを改造して、
これはなんとか動いているようなので、構造体やC関数のアクセスについては
動いているようなのですが、DummyProtocolHandler.mを生成している
gen_dummy_handler.rbが、うまく動いていないので、現状空になっています。
なので、たとえばdelegateなどで受けようとすると上手く動かなかったりします。
手作業でこのDummyProtocolHandler.mに追加すれば動くようなので、
なんとgen_dummy_handler.rbを動かせば良いのかもです。
(が、それよりは最新のBridgeSupportをbackportしたほうがよいのかなあ、、とか、、。)

あと色々アドバイスいただいていて、もしかするとlibffiが実機でそれなりに動く
可能性もあり、最新版を動かす方向で進めた方がより良いかなあとか
思いはじめています。


makotoさん>

記事ありがとうございます! そうJRuby on Adnroidと偶然に時期がかぶりましたねw
いろいろモバイル分野でのLLという意味でも面白いことになってきている気がしますね。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証