Ruby /
RubyCocoa
for iPhone
@takuma104
発端
iPhoneで
C#(CIL)が
動いてる
monoで
AOTで動く
らしい
じゃ
Rubyも
(もちろん)
動くよね??
では
移植
というか
なんとか
動かしたい
まず
Rubyの話
話は
OS1.0.x
時代 (JB)
Rubyを
動かすのが
流行った
が
irb
うごかねー
じゃん!!!
メモリ
足りないで
落ちる??
仕方無いので
eval.rbで
楽しむ
…うむむ。
捨て
話は戻って
iPhone
SDK 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
メソッド
呼び出し
[[UIView
alloc]

initWithFrame(CGRectZero)]
↓
OSX::UIView.alloc.
initWithFrame([0,0,0,0])
ほとんど
書き方が
一緒
かつ
[[ ]]
無い
!!!
型
つねにid型
になってる
イメージ
プリミティブ
型は自動変換
構造体は?
配列から
CGRectと
か自動変換
delegation
とか
どうなるの?
OSX::NSObjc
etを継承したク
ラスは普通に
受けられる
@interface
Hoge
@end
@implement
Hoge
‐
applicationDidFinishLaunching


(UIApplication
*app)
{


NSLog(“%s”,
class_getName(...
class
Hoge
<
OSX::NSObject

 def
applicationDidFinishLaunching(app)

 
 p
app

 end
end
OSX.UIApplicationMain(0,nil,nil,"H...
class
Fuga
<
OSX::UIView

 def
initialize

 
 @tv
=
OSX::UITableView.alloc.initWithFrame(OSX::UIScreen.
mainScreen.bounds)...
(そういえば)
念願の
GC
参照カウンタ
地獄からの
開放
そんなに上手
くいかない?
欠点
ネイティブ
Thread
使えない
Rubyの
使えばいい
じゃない
t
=
Thread.new
do

p
“hoge”
end
t.join
Cocoaの
セレクタ名
が長いので
Rubyでも長
さは変らない
という話
‐
tableView:
(UITableView*)v

cellForRowAtIndexPath:
(NSIndexPath)i;
def

tableView_cellForAtRowInde
xPath(v,i)
どうしよう
もなさそう
プロパティの
get/setの
書き方長い
[UIApplication

sharedInstance].delegate
↓
OSX::UIApplication.sharedI
nstance.valueForKey(‘deleg
ate’)
.delegate
=
self;
↓
.setValue_forKey(self,

‘delegate’)
この書き方はプ
ロパティと同じ
にできるかも?
ちなみに
HotCocoa.rb
MacRubyの
一部分
PureRuby実装
のCocoaラッパ
例
require
'hotcocoa'

include
HotCocoa


app
do



window
:title
=>
'Hello
World',





:frame
=>
[0,
0,
120,
120]
do
|w|


...
詳しくは
@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経由
にした
struct
objc_method
struct
objc_ivar
とかは
もはや使用で
きないらしい
動的クラス
生成
objc_allocateClassPair()

objc_registerClassPair()
クラスに
メソッドを
追加
class_addMethod()
クラスにメンバ
変数を追加
class_addIvar()
構造体などの
スタブを生成
しているRuby
コードを修正
ObjC黒魔術
vs
Ruby黒魔術
とりあえず
まだかなり
不十分だけど
helloWorld
レベルが動く
いちばん
やりたかった
事、それは…
リモートからirb
で実機で動いて
るアプリを動作
中に変更する
Inspired by
JSCocoaの
iPhone用インタラ
クティブコンソール
TCPサーバを
Rubyで書いて
eval.rbに
繋げただけ
(Macとかの)
telnetから
コードを弄れる
デモ
githubの
repoで
開発継続
Repository:
http://github.com/takuma104/
iphone‐rubycocoa
RubyCocoa0.4.2
to
4iPhone:
http://github.com/takuma104/
iphone‐r...
今後
楽
して
開発
可能
何か
纏め
Ruby
楽しいよ
Ruby
おしまい
Ruby/RubyCocoa for iPhone - UICoderz4
Ruby/RubyCocoa for iPhone - UICoderz4
Upcoming SlideShare
Loading in …5
×

Ruby/RubyCocoa for iPhone - UICoderz4

4,752
-1

Published on

this slide is written in Japanese

iphone-rubycocoa project (in English):
http://wiki.github.com/takuma104/iphone-rubycocoa

1 Comment
8 Likes
Statistics
Notes
  • Apple’s New iPod Touch
    A Worthy Innovation or a High Priced Techno Overload?
    http://www.slideshare.net/Zanura/new-i-pod-touch-review
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
4,752
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
25
Comments
1
Likes
8
Embeds 0
No embeds

No notes for slide

Ruby/RubyCocoa for iPhone - UICoderz4

  1. 1. Ruby / RubyCocoa for iPhone @takuma104
  2. 2. 発端
  3. 3. iPhoneで C#(CIL)が 動いてる
  4. 4. monoで AOTで動く らしい
  5. 5. じゃ
  6. 6. Rubyも (もちろん) 動くよね??
  7. 7. では
  8. 8. 移植
  9. 9. というか なんとか 動かしたい
  10. 10. まず Rubyの話
  11. 11. 話は OS1.0.x 時代 (JB)
  12. 12. Rubyを 動かすのが 流行った
  13. 13.
  14. 14. irb うごかねー じゃん!!!
  15. 15. メモリ 足りないで 落ちる??
  16. 16. 仕方無いので eval.rbで 楽しむ
  17. 17. …うむむ。
  18. 18. 捨て
  19. 19. 話は戻って iPhone SDK 2.x
  20. 20. ちょっと制限 きつくなった かも?
  21. 21. console がない
  22. 22. stdout/stderr はとりあえず Xcodeの Debug出力
  23. 23. 動的リンク できない
  24. 24. 全部 static link
  25. 25. アプリ外の領 域のファイル 読み書き不可
  26. 26. とかとか
  27. 27. configure との格闘
  28. 28. とりあえず いらない ヘッダ削る
  29. 29. 削る
  30. 30. なんか 要らない ヘッダ
  31. 31. なんかマクロ
  32. 32. なんとか動い た (1.8.7)
  33. 33. samples/ test.rb の8割動く
  34. 34. 8割
  35. 35. Process .kill($$) できない
  36. 36. リソース フォルダに ファイル 書けない
  37. 37. 外部の miniryby起動 できない
  38. 38. とりあえず動 いたといって いいかな…
  39. 39. irbモドキを アプリにした
  40. 40. 提出
  41. 41. 待機
  42. 42. 却下
  43. 43. 理由
  44. 44. 「どんなRubyの コードでも 動いちゃう っぽくね?(怒)」
  45. 45. (電卓とか作って 出したらどうな るんだろう…)
  46. 46. あとで。
  47. 47. TODO
  48. 48. test/ test_*.rb 動かす
  49. 49. irb動かす (ioをtelnet で)
  50. 50. longjmp() なんか おかしい問題
  51. 51. rubyの中だけで 完結したraiseの rescueは問題 ないっぽいが…
  52. 52. C側で rb_longjmpさ れたのが補足さ れないっぽい
  53. 53. 組込
  54. 54. 全部static linkにでき たので
  55. 55. .h 5コ ぐらいと、 .a 1コ
  56. 56. lib/用の tar1コ (resource)
  57. 57. ruby_init() rb_eval_string_protect()
  58. 58. Ruby Scriptを 文字列で渡してや ると実行してその まま値を返す
  59. 59. くわしくは irbアプリの EvalRuby クラス参照
  60. 60.
  61. 61. RubyCocoa のお話
  62. 62. Rubyで Cocoaを 使える
  63. 63. ?
  64. 64. ObjCな 人から見た メリット(?)
  65. 65.
  66. 66. ObjC メソッド 呼び出し
  67. 67. [[UIView
alloc]
 initWithFrame(CGRectZero)] ↓ OSX::UIView.alloc. initWithFrame([0,0,0,0])
  68. 68. ほとんど 書き方が 一緒
  69. 69. かつ
  70. 70. [[ ]]
  71. 71. 無い
  72. 72. !!!
  73. 73.
  74. 74. つねにid型 になってる イメージ
  75. 75. プリミティブ 型は自動変換
  76. 76. 構造体は?
  77. 77. 配列から CGRectと か自動変換
  78. 78. delegation とか どうなるの?
  79. 79. OSX::NSObjc etを継承したク ラスは普通に 受けられる
  80. 80. @interface
Hoge @end @implement
Hoge ‐
applicationDidFinishLaunching 

(UIApplication
*app)
{ 

NSLog(“%s”,
class_getName(app‐>isa)); } @end int
main() { 

return
UIApplicationMain(0,
nil,
 



nil,
@”Hoge”); }
  81. 81. class
Hoge
<
OSX::NSObject 
 def
applicationDidFinishLaunching(app) 
 
 p
app 
 end end OSX.UIApplicationMain(0,nil,nil,"Hoge")
  82. 82. class
Fuga
<
OSX::UIView 
 def
initialize 
 
 @tv
=
OSX::UITableView.alloc.initWithFrame(OSX::UIScreen. mainScreen.bounds) 
 
 @tv.setValue_forKey(self,
"delegate") 
 
 @tv.setValue_forKey(self,
"dataSource") 
 
 self.addSubview(@tv) 
 end 

def
tableView_numberOfRowsInSection(tableView,
section) 



return
10 

end 

def
tableView_cellForRowAtIndexPath(tableView,
indexPath) 



cellIdentifier
=
"Cell" 



cell
=
tableView.dequeueReusableCellWithIdentifier(cellIdentifier) 



if
(cell
==
nil)
then 







cell
=
OSX::UITableViewCell.alloc.initWithFrame_reuseIdentifier( [0,0,0,0],
cellIdentifier) 



end 



cell.setValue_forKey(indexPath.row.to_s,
"text") 



cell 

end end #
thnaks
to
@hitoriblog
  83. 83. (そういえば) 念願の
  84. 84. GC
  85. 85. 参照カウンタ 地獄からの 開放
  86. 86. そんなに上手 くいかない?
  87. 87. 欠点
  88. 88. ネイティブ Thread 使えない
  89. 89. Rubyの 使えばいい じゃない
  90. 90. t
=
Thread.new
do 
p
“hoge” end t.join
  91. 91. Cocoaの セレクタ名 が長いので
  92. 92. Rubyでも長 さは変らない という話
  93. 93. ‐
tableView: (UITableView*)v
 cellForRowAtIndexPath: (NSIndexPath)i;
  94. 94. def
 tableView_cellForAtRowInde xPath(v,i)
  95. 95. どうしよう もなさそう
  96. 96. プロパティの get/setの 書き方長い
  97. 97. [UIApplication
 sharedInstance].delegate ↓ OSX::UIApplication.sharedI nstance.valueForKey(‘deleg ate’)
  98. 98. .delegate
=
self; ↓ .setValue_forKey(self,
 ‘delegate’)
  99. 99. この書き方はプ ロパティと同じ にできるかも?
  100. 100. ちなみに
  101. 101. HotCocoa.rb
  102. 102. MacRubyの 一部分 PureRuby実装 のCocoaラッパ
  103. 103.
  104. 104. require
'hotcocoa'
 include
HotCocoa 
 app
do
 

window
:title
=>
'Hello
World',
 



:frame
=>
[0,
0,
120,
120]
do
|w|
 



button
:title
=>
'Click
me'
do
|b|
 





b.on_action
{
puts
'Hello
World!'
}
 





w
<<
b
 



end
 

end
 end
  105. 105. 詳しくは @lrzさんの 資料参照
  106. 106. http://chopine.be/lrz/ talks/RubyKaigi2008.pdf
  107. 107. 話は戻って
  108. 108. 移植
  109. 109. 最新 (0.13.2)で 調査
  110. 110. まずlibffi動 かないっぽい
  111. 111. orz
  112. 112.
  113. 113. 中川さん「古い 実装ならlibffi 使ってなかったと 思うよ?」
  114. 114. mjd
  115. 115. 0.4.2まで 使って なかった
  116. 116. 5年前の実装 だけど0.4.2 ベースで
  117. 117. ということで 修正点
  118. 118. ObjC runtime の構造体に直接 をやめてAPI経由 にした
  119. 119. struct
objc_method struct
objc_ivar
  120. 120. とかは もはや使用で きないらしい
  121. 121. 動的クラス 生成
  122. 122. objc_allocateClassPair()
 objc_registerClassPair()
  123. 123. クラスに メソッドを 追加
  124. 124. class_addMethod()
  125. 125. クラスにメンバ 変数を追加
  126. 126. class_addIvar()
  127. 127. 構造体などの スタブを生成 しているRuby コードを修正
  128. 128. ObjC黒魔術 vs Ruby黒魔術
  129. 129. とりあえず
  130. 130. まだかなり 不十分だけど helloWorld レベルが動く
  131. 131. いちばん やりたかった 事、それは…
  132. 132. リモートからirb で実機で動いて るアプリを動作 中に変更する
  133. 133. Inspired by JSCocoaの iPhone用インタラ クティブコンソール
  134. 134. TCPサーバを Rubyで書いて eval.rbに 繋げただけ
  135. 135. (Macとかの) telnetから コードを弄れる
  136. 136. デモ
  137. 137. githubの repoで 開発継続
  138. 138. Repository: http://github.com/takuma104/ iphone‐rubycocoa RubyCocoa0.4.2
to
4iPhone: http://github.com/takuma104/ iphone‐rubycocoa/commit/ 0960279bdfe5601e57b3c951f53b8d2e11 2a997a
  139. 139. 今後
  140. 140.
  141. 141. して
  142. 142. 開発
  143. 143. 可能
  144. 144. 何か
  145. 145. 纏め
  146. 146. Ruby 楽しいよ Ruby
  147. 147. おしまい

×