Upload
takuma-mori
View
7.794
Download
1
Embed Size (px)
DESCRIPTION
this slide is written in Japanese iphone-rubycocoa project (in English): http://wiki.github.com/takuma104/iphone-rubycocoa
Citation preview
Ruby / RubyCocoafor iPhone
@takuma104
発端
iPhoneでC#(CIL)が動いてる
monoでAOTで動くらしい
じゃ
Rubyも(もちろん)動くよね??
では
移植
というかなんとか動かしたい
まずRubyの話
話はOS1.0.x時代 (JB)
Rubyを動かすのが流行った
が
irbうごかねーじゃん!!!
メモリ足りないで落ちる??
仕方無いのでeval.rbで楽しむ
…うむむ。
捨て
話は戻ってiPhoneSDK 2.x
ちょっと制限きつくなった
かも?
consoleがない
stdout/stderr はとりあえずXcodeのDebug出力
動的リンクできない
全部static link
アプリ外の領域のファイル読み書き不可
とかとか
configureとの格闘
とりあえずいらないヘッダ削る
削る
なんか要らないヘッダ
なんかマクロ
なんとか動いた (1.8.7)
samples/test.rbの8割動く
8割
Process.kill($$)できない
リソースフォルダにファイル書けない
外部のminiryby起動
できない
とりあえず動いたといっていいかな…
irbモドキをアプリにした
提出
待機
却下
理由
「どんなRubyのコードでも動いちゃう
っぽくね?(怒)」
(電卓とか作って出したらどうなるんだろう…)
あとで。
TODO
test/test_*.rb 動かす
irb動かす(ioをtelnet
で)
longjmp()なんか
おかしい問題
rubyの中だけで完結したraiseのrescueは問題ないっぽいが…
C側でrb_longjmpされたのが補足されないっぽい
組込
全部static linkにできたので
.h 5コぐらいと、.a 1コ
lib/用のtar1コ
(resource)
ruby_init()
rb_eval_string_protect()
Ruby Scriptを文字列で渡してやると実行してそのまま値を返す
くわしくはirbアプリのEvalRubyクラス参照
次
RubyCocoaのお話
RubyでCocoaを使える
?
ObjCな人から見たメリット(?)
例
ObjCメソッド呼び出し
[[UIViewalloc]initWithFrame(CGRectZero)]↓OSX::UIView.alloc.initWithFrame([0,0,0,0])
ほとんど書き方が一緒
かつ
[[ ]]
無い
!!!
型
つねにid型になってるイメージ
プリミティブ型は自動変換
構造体は?
配列からCGRectとか自動変換
delegationとか
どうなるの?
OSX::NSObjcetを継承したクラスは普通に受けられる
@interfaceHoge@end
@implementHoge‐applicationDidFinishLaunching(UIApplication*app){NSLog(“%s”,class_getName(app‐>isa));}@end
intmain(){returnUIApplicationMain(0,nil,nil,@”Hoge”);}
classHoge<OSX::NSObject defapplicationDidFinishLaunching(app) papp endend
OSX.UIApplicationMain(0,nil,nil,"Hoge")
classFuga<OSX::UIView definitialize @tv=OSX::UITableView.alloc.initWithFrame(OSX::UIScreen.mainScreen.bounds) @tv.setValue_forKey(self,"delegate") @tv.setValue_forKey(self,"dataSource") self.addSubview(@tv) end
deftableView_numberOfRowsInSection(tableView,section)return10end
deftableView_cellForRowAtIndexPath(tableView,indexPath)cellIdentifier="Cell"cell=tableView.dequeueReusableCellWithIdentifier(cellIdentifier)if(cell==nil)thencell=OSX::UITableViewCell.alloc.initWithFrame_reuseIdentifier([0,0,0,0],cellIdentifier)endcell.setValue_forKey(indexPath.row.to_s,"text")cellendend#thnaksto@hitoriblog
(そういえば)念願の
GC
参照カウンタ地獄からの
開放
そんなに上手くいかない?
欠点
ネイティブThread使えない
Rubyの使えばいいじゃない
t=Thread.newdop“hoge”end
t.join
Cocoaのセレクタ名が長いので
Rubyでも長さは変らないという話
‐tableView:(UITableView*)vcellForRowAtIndexPath:(NSIndexPath)i;
deftableView_cellForAtRowIndexPath(v,i)
どうしようもなさそう
プロパティのget/setの書き方長い
[UIApplicationsharedInstance].delegate↓OSX::UIApplication.sharedInstance.valueForKey(‘delegate’)
.delegate=self;↓.setValue_forKey(self,‘delegate’)
この書き方はプロパティと同じにできるかも?
ちなみに
HotCocoa.rb
MacRubyの一部分
PureRuby実装のCocoaラッパ
例
require'hotcocoa'includeHotCocoaappdowindow:title=>'HelloWorld',:frame=>[0,0,120,120]do|w|button:title=>'Clickme'do|b|b.on_action{puts'HelloWorld!'}w<<bendendend
詳しくは@lrzさんの資料参照
http://chopine.be/lrz/talks/RubyKaigi2008.pdf
話は戻って
移植
最新(0.13.2)で
調査
まずlibffi動かないっぽい
orz
が
中川さん「古い実装ならlibffi使ってなかったと
思うよ?」
mjd
0.4.2まで使ってなかった
5年前の実装だけど0.4.2ベースで
ということで修正点
ObjC runtimeの構造体に直接をやめてAPI経由
にした
structobjc_methodstructobjc_ivar
とかはもはや使用できないらしい
動的クラス生成
objc_allocateClassPair()objc_registerClassPair()
クラスにメソッドを
追加
class_addMethod()
クラスにメンバ変数を追加
class_addIvar()
構造体などのスタブを生成しているRubyコードを修正
ObjC黒魔術vs
Ruby黒魔術
とりあえず
まだかなり不十分だけどhelloWorldレベルが動く
いちばんやりたかった事、それは…
リモートからirbで実機で動いてるアプリを動作中に変更する
Inspired byJSCocoaの
iPhone用インタラクティブコンソール
TCPサーバをRubyで書いてeval.rbに繋げただけ
(Macとかの) telnetから
コードを弄れる
デモ
githubのrepoで開発継続
Repository:http://github.com/takuma104/iphone‐rubycocoa
RubyCocoa0.4.2to4iPhone:http://github.com/takuma104/iphone‐rubycocoa/commit/0960279bdfe5601e57b3c951f53b8d2e112a997a
今後
楽
して
開発
可能
何か
纏め
Ruby楽しいよRuby
おしまい