Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Ruby/RubyCocoa for iPhone - UICoderz4

5,039 views

Published on

this slide is written in Japanese

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

  • 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

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. おしまい

×