Ruby        Mac OS X
                による
      デスクトップアプリケーション開発入門
                             -- Snow Leopard対応版




                      関西Ruby会議02 ­ 2009年11月7日
                      ネットワーク応用通信研究所 研究員
                         高尾 宏治<kouji@netlab.jp>




2009年11月8日日曜日
Ruby        Mac OS X
                による
      デスクトップアプリケーション開発入門
                             -- Snow Leopard対応版




                      関西Ruby会議02 ­ 2009年11月7日
                      ネットワーク応用通信研究所 研究員
                         高尾 宏治<kouji@netlab.jp>




2009年11月8日日曜日
Ruby        Mac OS X
                による
      デスクトップアプリケーション開発入門
                             -- Snow Leopard対応版




                      関西Ruby会議02 ­ 2009年11月7日
                      ネットワーク応用通信研究所 研究員
                         高尾 宏治<kouji@netlab.jp>




2009年11月8日日曜日
RubyとMac




2009年11月8日日曜日
RubyとMac




2009年11月8日日曜日
RubyとMac

       OS X 10.2
       Ruby 1.6.7

                2002




2009年11月8日日曜日
RubyとMac

       OS X 10.2
       Ruby 1.6.7
                          2005
                2002
                       OS X 10.4
                       Ruby 1.8.2


2009年11月8日日曜日
RubyとMac
                                  OS X 10.5
                                 Ruby 1.8.6
       OS X 10.2                 RubyCocoa
       Ruby 1.6.7                   Rails
                          2005
                2002                2007
                       OS X 10.4
                       Ruby 1.8.2


2009年11月8日日曜日
RubyとMac
                                  OS X 10.5
                                 Ruby 1.8.6
       OS X 10.2                 RubyCocoa
       Ruby 1.6.7                   Rails
                          2005                2009
                2002                2007
                       OS X 10.4            OS X 10.6
                       Ruby 1.8.2          Ruby 1.8.7
                                           RubyCocoa
                                              Rails
2009年11月8日日曜日
RubyistとMacユーザ




2009年11月8日日曜日
RubyistとMacユーザ
         Rubyは世界ランク10位
         1位はJava




                         http://www.tiobe.com/index.php/paperinfo/tpci/Ruby.html




2009年11月8日日曜日
RubyistとMacユーザ
         Rubyは世界ランク10位
         1位はJava


         Macの世界シェアは10%以下
         90%以上がWindows




                           http://www.tiobe.com/index.php/paperinfo/tpci/Ruby.html




2009年11月8日日曜日
RubyistとMacユーザ
         Rubyは世界ランク10位
         1位はJava


         Macの世界シェアは10%以下
         90%以上がWindows


         海外のRubyist≒Macユーザ
         Ruby Conf 2008に出席したある人の感想



                                     http://www.tiobe.com/index.php/paperinfo/tpci/Ruby.html




2009年11月8日日曜日
RubyistとMacユーザ
         Rubyは世界ランク10位
         1位はJava


         Macの世界シェアは10%以下
         90%以上がWindows


         海外のRubyist≒Macユーザ
         Ruby Conf 2008に出席したある人の感想


         NaClのMacユーザ=Rubyist
                                     http://www.tiobe.com/index.php/paperinfo/tpci/Ruby.html




2009年11月8日日曜日
RubyによるMacアプリ開発




2009年11月8日日曜日
RubyによるMacアプリ開発




2009年11月8日日曜日
RubyによるMacアプリ開発

         標準の開発ツール(Xcode)がRuby対応
         ただし、Mac OS X 10.5だけ...




2009年11月8日日曜日
RubyによるMacアプリ開発

         標準の開発ツール(Xcode)がRuby対応
         ただし、Mac OS X 10.5だけ...

         Rubyを使ってMacアプリを開発できる
         RubyとRubyCocoa
         MacRuby




2009年11月8日日曜日
RubyによるMacアプリ開発

         標準の開発ツール(Xcode)がRuby対応
         ただし、Mac OS X 10.5だけ...

         Rubyを使ってMacアプリを開発できる
         RubyとRubyCocoa
         MacRuby

         とにかくGUI




2009年11月8日日曜日
開発ツール:Xcode




2009年11月8日日曜日
開発ツール:Xcode



                グループ




2009年11月8日日曜日
開発ツール:Xcode

                       ファイル一覧



                グループ




2009年11月8日日曜日
開発ツール:Xcode

                       ファイル一覧



                グループ

                       エディタ




2009年11月8日日曜日
開発ツール:Interface Builder




2009年11月8日日曜日
開発ツール:Interface Builder



            メインウインドウ




2009年11月8日日曜日
開発ツール:Interface Builder



            メインウインドウ
                       プロパティ




2009年11月8日日曜日
開発ツール:Interface Builder


                               GUI部品
            メインウインドウ
                       プロパティ




2009年11月8日日曜日
公式開発言語:Objective-C




2009年11月8日日曜日
公式開発言語:Objective-C

         Macアプリの公式開発言語




2009年11月8日日曜日
公式開発言語:Objective-C

         Macアプリの公式開発言語

         C言語にオブジェクト指向機能を追加
         C言語の上位互換言語




2009年11月8日日曜日
公式開発言語:Objective-C

         Macアプリの公式開発言語

         C言語にオブジェクト指向機能を追加
         C言語の上位互換言語

         C++とは異なるオブジェクトシステム
         Smalltalk由来




                         参考画像:CちゃんとSqueakのコラボ、絶妙なバランス
                             http://www.limo.fumi2kick.com/forum/glang/glang17.jpg


2009年11月8日日曜日
公式開発言語:Objective-C

         Macアプリの公式開発言語

         C言語にオブジェクト指向機能を追加
         C言語の上位互換言語

         C++とは異なるオブジェクトシステム
         Smalltalk由来

         Cocoa:Objective-C用のライブラリ

                          参考画像:CちゃんとSqueakのコラボ、絶妙なバランス
                              http://www.limo.fumi2kick.com/forum/glang/glang17.jpg


2009年11月8日日曜日
RubyとObjective-C
                Ruby                   Objective-C
                   self.width   [self width];




2009年11月8日日曜日
RubyとObjective-C
                Ruby                   Objective-C
                   self.width   [self width];

         オブジェクトシステムはSmalltalk由来




2009年11月8日日曜日
RubyとObjective-C
                Ruby                      Objective-C
                   self.width      [self width];

         オブジェクトシステムはSmalltalk由来

         相性は抜群
         『RubyとCocoa(Objective-C)は、非常に幸運な組み合わせだったと言えるでしょう』
                                    -- 中川智史:RHC本より




2009年11月8日日曜日
RubyとObjective-C
                Ruby                      Objective-C
                   self.width      [self width];

         オブジェクトシステムはSmalltalk由来

         相性は抜群
         『RubyとCocoa(Objective-C)は、非常に幸運な組み合わせだったと言えるでしょう』
                                    -- 中川智史:RHC本より


         Rubyが理解できていればObjective-Cの理解は早い
         ただし、C言語の知識があることが前提

2009年11月8日日曜日
RubyとObjective-C
                Ruby                      Objective-C
                   self.width      [self width];

         オブジェクトシステムはSmalltalk由来

         相性は抜群
         『RubyとCocoa(Objective-C)は、非常に幸運な組み合わせだったと言えるでしょう』
                                    -- 中川智史:RHC本より


         Rubyが理解できていればObjective-Cの理解は早い
         ただし、C言語の知識があることが前提

2009年11月8日日曜日
RubyとObjective-C
                Ruby                      Objective-C
                   self.width      [self width];

         オブジェクトシステムはSmalltalk由来

         相性は抜群
         『RubyとCocoa(Objective-C)は、非常に幸運な組み合わせだったと言えるでしょう』
                                    -- 中川智史:RHC本より


         Rubyが理解できていればObjective-Cの理解は早い
         ただし、C言語の知識があることが前提

2009年11月8日日曜日
RubyCocoaとMacRuby




2009年11月8日日曜日
RubyCocoaとMacRuby

         RubyCocoa
                RubyとObjective-Cの橋渡しを行うライブラリ




2009年11月8日日曜日
RubyCocoaとMacRuby

         RubyCocoa
                RubyとObjective-Cの橋渡しを行うライブラリ



         MacRuby
                Macに特化したRubyの処理系

                                     http://www.macruby.org/




2009年11月8日日曜日
RubyCocoaとMacRuby

         RubyCocoa
                RubyとObjective-Cの橋渡しを行うライブラリ



         MacRuby
                Macに特化したRubyの処理系

                                     http://www.macruby.org/




2009年11月8日日曜日
MacRubyの特徴
                   http://www.macruby.org/




2009年11月8日日曜日
MacRubyの特徴
                                  http://www.macruby.org/




         CRuby 1.9ベース、100%互換を目標




2009年11月8日日曜日
MacRubyの特徴
                                  http://www.macruby.org/




         CRuby 1.9ベース、100%互換を目標

         LLVMで再実装されたVM




2009年11月8日日曜日
MacRubyの特徴
                                  http://www.macruby.org/




         CRuby 1.9ベース、100%互換を目標

         LLVMで再実装されたVM

         Rubyスクリプトをコンパイル可能




2009年11月8日日曜日
MacRubyの特徴
                                          http://www.macruby.org/




         CRuby 1.9ベース、100%互換を目標

         LLVMで再実装されたVM

         Rubyスクリプトをコンパイル可能

         Mac OS Xにプリインストールされる(かも?)

         メイン開発者のLaurent Sansonetti氏はAppleの社員




2009年11月8日日曜日
MacRubyのデモ



                class AppController
                  attr_accessor :textField

                  def hello(sender)
                    @textField.stringValue = "Hello,MacRuby!"
                  end
                end



2009年11月8日日曜日
MacRubyの情報源




2009年11月8日日曜日
MacRubyの情報源




2009年11月8日日曜日
MacRubyの情報源




2009年11月8日日曜日
MacRubyの情報源
         『RubyによるMac OS Xデスクトップアプリケーション開発入門』
         通称RHC本
         ISBN: 978-4839931780
         9月25日発売 3,570円(税込み)




2009年11月8日日曜日
MacRubyの情報源
         『RubyによるMac OS Xデスクトップアプリケーション開発入門』
         通称RHC本
         ISBN: 978-4839931780
         9月25日発売 3,570円(税込み)


         MacRuby:世界に1冊




2009年11月8日日曜日
MacRubyの情報源
         『RubyによるMac OS Xデスクトップアプリケーション開発入門』
         通称RHC本
         ISBN: 978-4839931780
         9月25日発売 3,570円(税込み)


         MacRuby:世界に1冊

         RubyCocoa:日本に1冊




2009年11月8日日曜日
MacRubyの情報源
         『RubyによるMac OS Xデスクトップアプリケーション開発入門』
         通称RHC本
         ISBN: 978-4839931780
         9月25日発売 3,570円(税込み)


         MacRuby:世界に1冊

         RubyCocoa:日本に1冊

         6F展示会場にてサイン会



2009年11月8日日曜日
Macアプリの配布
         Bodega:Macアプリ版AppStore




2009年11月8日日曜日
Mac OS X 10.6




2009年11月8日日曜日
Mac OS X 10.6




                      http://www.apple.com/jp/macosx/uptodate/




2009年11月8日日曜日
Mac OS X 10.6

         2009/8/28リリース
         Snow Leopard:雪




                          http://www.apple.com/jp/macosx/uptodate/




2009年11月8日日曜日
Mac OS X 10.6

         2009/8/28リリース
         Snow Leopard:雪

         GCD(Grand Central Dispatch)




                                 http://www.apple.com/jp/macosx/uptodate/




2009年11月8日日曜日
Mac OS X 10.6

         2009/8/28リリース
         Snow Leopard:雪

         GCD(Grand Central Dispatch)

         OpenCL



                                 http://www.apple.com/jp/macosx/uptodate/




2009年11月8日日曜日
Mac OS X 10.6

         2009/8/28リリース
         Snow Leopard:雪

         GCD(Grand Central Dispatch)

         OpenCL



                                 http://www.apple.com/jp/macosx/uptodate/




2009年11月8日日曜日
GCDとは




                http://www.apple.com/jp/macosx/technology/




2009年11月8日日曜日
GCDとは


         並列処理を行うためのライブラリ




                           http://www.apple.com/jp/macosx/technology/




2009年11月8日日曜日
GCDとは


         並列処理を行うためのライブラリ

         C言語の拡張とランタイム




                           http://www.apple.com/jp/macosx/technology/




2009年11月8日日曜日
GCDとは


         並列処理を行うためのライブラリ

         C言語の拡張とランタイム

         MacRuby 0.5以降で利用できる


                               http://www.apple.com/jp/macosx/technology/




2009年11月8日日曜日
GCDのサンプル
         素数の数を求める処理をGCDを使って実装する

           # 整数numが素数かどうかを判定する
           # 戻り値がtrueであれば素数
           def prime?(num)
             (2...num).each do |i|
               return false if num % i == 0
             end
             return true
           end




2009年11月8日日曜日
GCDのサンプル
           # 10_000_000から10_000_299までの素数の数を求める
           prime = []
           for i in 0...300
             n = i + 10_000_000
             prime << n if prime?(n)
           end
           puts(prime.length)


           $ time macruby count-prime.rb
           14
           macruby count-prime.rb 14.86s user 0.12s system 93% cpu 16.016 total



2009年11月8日日曜日
GCDのサンプル
           # 10_000_000から10_000_299までの素数の数を求める

           prime = []
           for i in 0...300
                n = i + 10_000_000
                prime << n if prime?(n)
           end
           puts(prime.length) #=> 14



2009年11月8日日曜日
GCDのサンプル
           # 10_000_000から10_000_299までの素数の数を求める

           prime = []
           for i in 0...300          ループの並列処理
                n = i + 10_000_000
                prime << n if prime?(n)
           end
           puts(prime.length) #=> 14



2009年11月8日日曜日
GCDのサンプル
           # 10_000_000から10_000_299までの素数の数を求める

           prime = []
           for i in 0...300          ループの並列処理
                n = i + 10_000_000
                prime << n if prime?(n)   ロック
           end
           puts(prime.length) #=> 14



2009年11月8日日曜日
ループの並列処理
           # 10_000_000から10_000_299までの素数の数を求める

           q = Dispatch::Queue.concurrent
           prime = []
           q.apply(300) do |i|
                n = i + 10_000_000
                prime << n if prime?(n)
           end
           puts(prime.length) #=> 14



2009年11月8日日曜日
ループの並列処理
           # 10_000_000から10_000_299までの素数の数を求める

           q = Dispatch::Queue.concurrent
                                          並列処理用のオブジェクトの取得

           prime = []
           q.apply(300) do |i|
                n = i + 10_000_000
                prime << n if prime?(n)
           end
           puts(prime.length) #=> 14



2009年11月8日日曜日
ループの並列処理
           # 10_000_000から10_000_299までの素数の数を求める

           q = Dispatch::Queue.concurrent
                                          並列処理用のオブジェクトの取得

           prime = []
           q.apply(300) do |i|
                                                    並列ループ

                n = i + 10_000_000
                prime << n if prime?(n)
           end
           puts(prime.length) #=> 14



2009年11月8日日曜日
グローバルディスパッチキュー
            グローバルディスパッチキュー


                10000000
                 素数?
                             10000001
                              素数?
                                        10000002
                                         素数?
                                                   …   10000299
                                                        素数?




                           ワーカースレッド1               ワーカースレッド2




         処理(ブロック)をディスパッチキューに登録
         FIFO
         CPUのコア数などを考慮して自動で並列処理




2009年11月8日日曜日
グローバルディスパッチキュー
            グローバルディスパッチキュー


                10000000
                 素数?
                             10000001
                              素数?
                                         10000002
                                          素数?
                                                    …   10000299
                                                         素数?




                           ワーカースレッド1                ワーカースレッド2


                              10000000
                               素数?




         処理(ブロック)をディスパッチキューに登録
         FIFO
         CPUのコア数などを考慮して自動で並列処理




2009年11月8日日曜日
グローバルディスパッチキュー
            グローバルディスパッチキュー


                10000000
                 素数?
                             10000001
                              素数?
                                         10000002
                                          素数?
                                                    …     10000299
                                                           素数?




                           ワーカースレッド1                ワーカースレッド2


                              10000000                  10000001
                               素数?                       素数?




         処理(ブロック)をディスパッチキューに登録
         FIFO
         CPUのコア数などを考慮して自動で並列処理




2009年11月8日日曜日
ループの並列処理の詳細
           # 10_000_000から10_000_299までの素数の数を求める

           q = Dispatch::Queue.concurrent
           prime = []
           q.apply(300) do
                n = i + 10_000_000
                prime << n if prime?(n)
           end
           puts(prime.length) #=> 14



2009年11月8日日曜日
ループの並列処理の詳細
           # 10_000_000から10_000_299までの素数の数を求める

           q = Dispatch::Queue.concurrent
                                          グローバルディスパッチキューの取得

           prime = []
           q.apply(300) do
                n = i + 10_000_000
                prime << n if prime?(n)
           end
           puts(prime.length) #=> 14



2009年11月8日日曜日
ループの並列処理の詳細
           # 10_000_000から10_000_299までの素数の数を求める

           q = Dispatch::Queue.concurrent
                                          グローバルディスパッチキューの取得

           prime = []
           q.apply(300) do
                n = i + 10_000_000
                prime << n if prime?(n)
           end                       ブロックをグローバルディスパッチキューに登録


           puts(prime.length) #=> 14



2009年11月8日日曜日
ロック
           # 10_000_000から10_000_299までの素数の数を求める

           q = Dispatch::Queue.concurrent
           prime = []
           q_prime = Dispatch::Queue.new("com.example.prime")
           q.apply(300) do
                n = i + 10_000_000
                q_prime.dispatch { prime << n } if prime?(n)
           end
           q_prime.dispatch(true) { puts(prime.length) }




2009年11月8日日曜日
ロック
           # 10_000_000から10_000_299までの素数の数を求める

           q = Dispatch::Queue.concurrent
           prime = []
           q_prime = Dispatch::Queue.new("com.example.prime")
                                                    ロック用のオブジェクトの取得
           q.apply(300) do
                n = i + 10_000_000
                q_prime.dispatch { prime << n } if prime?(n)
           end
           q_prime.dispatch(true) { puts(prime.length) }




2009年11月8日日曜日
ロック
           # 10_000_000から10_000_299までの素数の数を求める

           q = Dispatch::Queue.concurrent
           prime = []
           q_prime = Dispatch::Queue.new("com.example.prime")
                                                    ロック用のオブジェクトの取得
           q.apply(300) do
                n = i + 10_000_000
                q_prime.dispatch { prime << n } if prime?(n)    ロック

           end
           q_prime.dispatch(true) { puts(prime.length) }




2009年11月8日日曜日
ロック
           # 10_000_000から10_000_299までの素数の数を求める

           q = Dispatch::Queue.concurrent
           prime = []
           q_prime = Dispatch::Queue.new("com.example.prime")
                                                    ロック用のオブジェクトの取得
           q.apply(300) do
                n = i + 10_000_000
                q_prime.dispatch { prime << n } if prime?(n)      ロック

           end
           q_prime.dispatch(true) { puts(prime.length) }       処理完了待ち




2009年11月8日日曜日
プライベートディスパッチキュー
         グローバルディスパッチキュー
           10000000
            素数?
                         10000001
                          素数?
                                      10000002
                                       素数?
                                                 …            10000299
                                                               素数?




                      ワーカースレッド1                    ワーカースレッド2


                                                            10000200
                                                             素数?




                      プライベートディスパッチキュー
                       10000019
                       配列に追加
                                    10000079
                                    配列に追加
                                                 10000103
                                                 配列に追加
                                                                  …
         ディスパッチキューに登録した順に1つずつ処理
         プライベートキューは何個でも生成可能
         ワーカースレッドはグローバルとプライベートで共通




2009年11月8日日曜日
プライベートディスパッチキュー
         グローバルディスパッチキュー
           10000000
            素数?
                         10000001
                          素数?
                                      10000002
                                       素数?
                                                 …            10000299
                                                               素数?




                      ワーカースレッド1                    ワーカースレッド2


                         10000019                           10000200
                         配列に追加                               素数?




                      プライベートディスパッチキュー
                       10000019
                       配列に追加
                                    10000079
                                    配列に追加
                                                 10000103
                                                 配列に追加
                                                                  …
         ディスパッチキューに登録した順に1つずつ処理
         プライベートキューは何個でも生成可能
         ワーカースレッドはグローバルとプライベートで共通




2009年11月8日日曜日
プライベートディスパッチキュー
         グローバルディスパッチキュー
           10000000
            素数?
                         10000001
                          素数?
                                      10000002
                                       素数?
                                                 …          10000299
                                                             素数?




                      ワーカースレッド1                    ワーカースレッド2




                      プライベートディスパッチキュー


                                                               …
                       10000019     10000079     10000103              10000271   素数の
                       配列に追加        配列に追加        配列に追加                 配列に追加      数を出力




         ディスパッチキューに登録した順に1つずつ処理
         プライベートキューは何個でも生成可能
         ワーカースレッドはグローバルとプライベートで共通




2009年11月8日日曜日
プライベートディスパッチキュー
         グローバルディスパッチキュー
           10000000
            素数?
                         10000001
                          素数?
                                      10000002
                                       素数?
                                                 …          10000299
                                                             素数?




                      ワーカースレッド1                    ワーカースレッド2


                         10000103
                         配列に追加




                      プライベートディスパッチキュー


                                                               …
                       10000019     10000079     10000103              10000271   素数の
                       配列に追加        配列に追加        配列に追加                 配列に追加      数を出力




         ディスパッチキューに登録した順に1つずつ処理
         プライベートキューは何個でも生成可能
         ワーカースレッドはグローバルとプライベートで共通




2009年11月8日日曜日
ロックの詳細
           # 10_000_000から10_000_299までの素数の数を求める

           q = Dispatch::Queue.concurrent
           prime = []
           q_prime = Dispatch::Queue.new("com.example.prime")
           q.apply(300) do
                n = i + 10_000_000
                q_prime.dispatch { prime << n } if prime?(n)
           end
           q_prime.dispatch(true) { puts(prime.length) }




2009年11月8日日曜日
ロックの詳細
           # 10_000_000から10_000_299までの素数の数を求める

           q = Dispatch::Queue.concurrent
           prime = []
           q_prime = Dispatch::Queue.new("com.example.prime")
                                                プライベートディスパッチキューの生成
           q.apply(300) do
                n = i + 10_000_000
                q_prime.dispatch { prime << n } if prime?(n)
           end
           q_prime.dispatch(true) { puts(prime.length) }




2009年11月8日日曜日
ロックの詳細
           # 10_000_000から10_000_299までの素数の数を求める

           q = Dispatch::Queue.concurrent
           prime = []
           q_prime = Dispatch::Queue.new("com.example.prime")
                                                プライベートディスパッチキューの生成
           q.apply(300) do
                n = i + 10_000_000
                q_prime.dispatch { prime << n } if prime?(n)
                                             配列への要素追加をキューに登録(非同期)
           end
           q_prime.dispatch(true) { puts(prime.length) }




2009年11月8日日曜日
ロックの詳細
           # 10_000_000から10_000_299までの素数の数を求める

           q = Dispatch::Queue.concurrent
           prime = []
           q_prime = Dispatch::Queue.new("com.example.prime")
                                                プライベートディスパッチキューの生成
           q.apply(300) do
                n = i + 10_000_000
                q_prime.dispatch { prime << n } if prime?(n)
                                             配列への要素追加をキューに登録(非同期)
           end
           q_prime.dispatch(true) { puts(prime.length) }
                                               素数の数の出力をキューに登録(同期)




2009年11月8日日曜日
使用したGCDのメソッド




2009年11月8日日曜日
使用したGCDのメソッド
         Dispatch::Queue.concurrent(priority = :default)
         並列処理用のグローバルディスパッチキューを取得する




2009年11月8日日曜日
使用したGCDのメソッド
         Dispatch::Queue.concurrent(priority = :default)
         並列処理用のグローバルディスパッチキューを取得する

         Dispatch::Queue#apply(amount_size)
         並列ループを実行する




2009年11月8日日曜日
使用したGCDのメソッド
         Dispatch::Queue.concurrent(priority = :default)
         並列処理用のグローバルディスパッチキューを取得する

         Dispatch::Queue#apply(amount_size)
         並列ループを実行する

         Dispatch::Queue.new(label)
         シリアル処理用のプライベートディスパッチキューを生成する




2009年11月8日日曜日
使用したGCDのメソッド
         Dispatch::Queue.concurrent(priority = :default)
         並列処理用のグローバルディスパッチキューを取得する

         Dispatch::Queue#apply(amount_size)
         並列ループを実行する

         Dispatch::Queue.new(label)
         シリアル処理用のプライベートディスパッチキューを生成する

         Dispatch::Queue#dispatch(synchronicity = false)
         ディスパッチキューにブロックを登録する



2009年11月8日日曜日
GCD vs. Thread

         無駄に複数のスレッドを起動せずOS(中央)が制御

         ロック不要
         デッドロックが発生しない

         スレッド直接を使った方が効率がよいアプリが書けるが...
         高い技術力やスレッドに関する知識が必要



2009年11月8日日曜日
まとめ




2009年11月8日日曜日
まとめ

         RubyとMac
         Rubyist≒Macユーザ




2009年11月8日日曜日
まとめ

         RubyとMac
         Rubyist≒Macユーザ

         RubyによるMacアプリ開発
         MacRubyを使おう




2009年11月8日日曜日
まとめ

         RubyとMac
         Rubyist≒Macユーザ

         RubyによるMacアプリ開発
         MacRubyを使おう

         Mac OS X 10.6
         GCDは並列処理を行うライブラリ



2009年11月8日日曜日
質疑・応答
      RHC本サポート:http://www.takao7.net/rhcbk/
      kouji@takao7.net、@takaokouji、id:kouji0625
      Pokenでハイホー!

      RHC本のサイン&販売会はこのあとすぐ!!



                                                  関西Ruby会議02 ­ 2009年11月7日
                                                  ネットワーク応用通信研究所 研究員
                                                     高尾 宏治<kouji@netlab.jp>




2009年11月8日日曜日

RubyによるMac OS Xデスクトップアプリケーション開発入門--Snow Leopard対応版

  • 1.
    Ruby Mac OS X による デスクトップアプリケーション開発入門 -- Snow Leopard対応版 関西Ruby会議02 ­ 2009年11月7日 ネットワーク応用通信研究所 研究員 高尾 宏治<kouji@netlab.jp> 2009年11月8日日曜日
  • 2.
    Ruby Mac OS X による デスクトップアプリケーション開発入門 -- Snow Leopard対応版 関西Ruby会議02 ­ 2009年11月7日 ネットワーク応用通信研究所 研究員 高尾 宏治<kouji@netlab.jp> 2009年11月8日日曜日
  • 3.
    Ruby Mac OS X による デスクトップアプリケーション開発入門 -- Snow Leopard対応版 関西Ruby会議02 ­ 2009年11月7日 ネットワーク応用通信研究所 研究員 高尾 宏治<kouji@netlab.jp> 2009年11月8日日曜日
  • 4.
  • 5.
  • 6.
    RubyとMac OS X 10.2 Ruby 1.6.7 2002 2009年11月8日日曜日
  • 7.
    RubyとMac OS X 10.2 Ruby 1.6.7 2005 2002 OS X 10.4 Ruby 1.8.2 2009年11月8日日曜日
  • 8.
    RubyとMac OS X 10.5 Ruby 1.8.6 OS X 10.2 RubyCocoa Ruby 1.6.7 Rails 2005 2002 2007 OS X 10.4 Ruby 1.8.2 2009年11月8日日曜日
  • 9.
    RubyとMac OS X 10.5 Ruby 1.8.6 OS X 10.2 RubyCocoa Ruby 1.6.7 Rails 2005 2009 2002 2007 OS X 10.4 OS X 10.6 Ruby 1.8.2 Ruby 1.8.7 RubyCocoa Rails 2009年11月8日日曜日
  • 10.
  • 11.
    RubyistとMacユーザ Rubyは世界ランク10位 1位はJava http://www.tiobe.com/index.php/paperinfo/tpci/Ruby.html 2009年11月8日日曜日
  • 12.
    RubyistとMacユーザ Rubyは世界ランク10位 1位はJava Macの世界シェアは10%以下 90%以上がWindows http://www.tiobe.com/index.php/paperinfo/tpci/Ruby.html 2009年11月8日日曜日
  • 13.
    RubyistとMacユーザ Rubyは世界ランク10位 1位はJava Macの世界シェアは10%以下 90%以上がWindows 海外のRubyist≒Macユーザ Ruby Conf 2008に出席したある人の感想 http://www.tiobe.com/index.php/paperinfo/tpci/Ruby.html 2009年11月8日日曜日
  • 14.
    RubyistとMacユーザ Rubyは世界ランク10位 1位はJava Macの世界シェアは10%以下 90%以上がWindows 海外のRubyist≒Macユーザ Ruby Conf 2008に出席したある人の感想 NaClのMacユーザ=Rubyist http://www.tiobe.com/index.php/paperinfo/tpci/Ruby.html 2009年11月8日日曜日
  • 15.
  • 16.
  • 17.
    RubyによるMacアプリ開発 標準の開発ツール(Xcode)がRuby対応 ただし、Mac OS X 10.5だけ... 2009年11月8日日曜日
  • 18.
    RubyによるMacアプリ開発 標準の開発ツール(Xcode)がRuby対応 ただし、Mac OS X 10.5だけ... Rubyを使ってMacアプリを開発できる RubyとRubyCocoa MacRuby 2009年11月8日日曜日
  • 19.
    RubyによるMacアプリ開発 標準の開発ツール(Xcode)がRuby対応 ただし、Mac OS X 10.5だけ... Rubyを使ってMacアプリを開発できる RubyとRubyCocoa MacRuby とにかくGUI 2009年11月8日日曜日
  • 20.
  • 21.
    開発ツール:Xcode グループ 2009年11月8日日曜日
  • 22.
    開発ツール:Xcode ファイル一覧 グループ 2009年11月8日日曜日
  • 23.
    開発ツール:Xcode ファイル一覧 グループ エディタ 2009年11月8日日曜日
  • 24.
  • 25.
    開発ツール:Interface Builder メインウインドウ 2009年11月8日日曜日
  • 26.
    開発ツール:Interface Builder メインウインドウ プロパティ 2009年11月8日日曜日
  • 27.
    開発ツール:Interface Builder GUI部品 メインウインドウ プロパティ 2009年11月8日日曜日
  • 28.
  • 29.
    公式開発言語:Objective-C Macアプリの公式開発言語 2009年11月8日日曜日
  • 30.
    公式開発言語:Objective-C Macアプリの公式開発言語 C言語にオブジェクト指向機能を追加 C言語の上位互換言語 2009年11月8日日曜日
  • 31.
    公式開発言語:Objective-C Macアプリの公式開発言語 C言語にオブジェクト指向機能を追加 C言語の上位互換言語 C++とは異なるオブジェクトシステム Smalltalk由来 参考画像:CちゃんとSqueakのコラボ、絶妙なバランス http://www.limo.fumi2kick.com/forum/glang/glang17.jpg 2009年11月8日日曜日
  • 32.
    公式開発言語:Objective-C Macアプリの公式開発言語 C言語にオブジェクト指向機能を追加 C言語の上位互換言語 C++とは異なるオブジェクトシステム Smalltalk由来 Cocoa:Objective-C用のライブラリ 参考画像:CちゃんとSqueakのコラボ、絶妙なバランス http://www.limo.fumi2kick.com/forum/glang/glang17.jpg 2009年11月8日日曜日
  • 33.
    RubyとObjective-C Ruby Objective-C self.width [self width]; 2009年11月8日日曜日
  • 34.
    RubyとObjective-C Ruby Objective-C self.width [self width]; オブジェクトシステムはSmalltalk由来 2009年11月8日日曜日
  • 35.
    RubyとObjective-C Ruby Objective-C self.width [self width]; オブジェクトシステムはSmalltalk由来 相性は抜群 『RubyとCocoa(Objective-C)は、非常に幸運な組み合わせだったと言えるでしょう』                            -- 中川智史:RHC本より 2009年11月8日日曜日
  • 36.
    RubyとObjective-C Ruby Objective-C self.width [self width]; オブジェクトシステムはSmalltalk由来 相性は抜群 『RubyとCocoa(Objective-C)は、非常に幸運な組み合わせだったと言えるでしょう』                            -- 中川智史:RHC本より Rubyが理解できていればObjective-Cの理解は早い ただし、C言語の知識があることが前提 2009年11月8日日曜日
  • 37.
    RubyとObjective-C Ruby Objective-C self.width [self width]; オブジェクトシステムはSmalltalk由来 相性は抜群 『RubyとCocoa(Objective-C)は、非常に幸運な組み合わせだったと言えるでしょう』                            -- 中川智史:RHC本より Rubyが理解できていればObjective-Cの理解は早い ただし、C言語の知識があることが前提 2009年11月8日日曜日
  • 38.
    RubyとObjective-C Ruby Objective-C self.width [self width]; オブジェクトシステムはSmalltalk由来 相性は抜群 『RubyとCocoa(Objective-C)は、非常に幸運な組み合わせだったと言えるでしょう』                            -- 中川智史:RHC本より Rubyが理解できていればObjective-Cの理解は早い ただし、C言語の知識があることが前提 2009年11月8日日曜日
  • 39.
  • 40.
    RubyCocoaとMacRuby RubyCocoa RubyとObjective-Cの橋渡しを行うライブラリ 2009年11月8日日曜日
  • 41.
    RubyCocoaとMacRuby RubyCocoa RubyとObjective-Cの橋渡しを行うライブラリ MacRuby Macに特化したRubyの処理系 http://www.macruby.org/ 2009年11月8日日曜日
  • 42.
    RubyCocoaとMacRuby RubyCocoa RubyとObjective-Cの橋渡しを行うライブラリ MacRuby Macに特化したRubyの処理系 http://www.macruby.org/ 2009年11月8日日曜日
  • 43.
    MacRubyの特徴 http://www.macruby.org/ 2009年11月8日日曜日
  • 44.
    MacRubyの特徴 http://www.macruby.org/ CRuby 1.9ベース、100%互換を目標 2009年11月8日日曜日
  • 45.
    MacRubyの特徴 http://www.macruby.org/ CRuby 1.9ベース、100%互換を目標 LLVMで再実装されたVM 2009年11月8日日曜日
  • 46.
    MacRubyの特徴 http://www.macruby.org/ CRuby 1.9ベース、100%互換を目標 LLVMで再実装されたVM Rubyスクリプトをコンパイル可能 2009年11月8日日曜日
  • 47.
    MacRubyの特徴 http://www.macruby.org/ CRuby 1.9ベース、100%互換を目標 LLVMで再実装されたVM Rubyスクリプトをコンパイル可能 Mac OS Xにプリインストールされる(かも?) メイン開発者のLaurent Sansonetti氏はAppleの社員 2009年11月8日日曜日
  • 48.
    MacRubyのデモ class AppController attr_accessor :textField def hello(sender) @textField.stringValue = "Hello,MacRuby!" end end 2009年11月8日日曜日
  • 49.
  • 50.
  • 51.
  • 52.
    MacRubyの情報源 『RubyによるMac OS Xデスクトップアプリケーション開発入門』 通称RHC本 ISBN: 978-4839931780 9月25日発売 3,570円(税込み) 2009年11月8日日曜日
  • 53.
    MacRubyの情報源 『RubyによるMac OS Xデスクトップアプリケーション開発入門』 通称RHC本 ISBN: 978-4839931780 9月25日発売 3,570円(税込み) MacRuby:世界に1冊 2009年11月8日日曜日
  • 54.
    MacRubyの情報源 『RubyによるMac OS Xデスクトップアプリケーション開発入門』 通称RHC本 ISBN: 978-4839931780 9月25日発売 3,570円(税込み) MacRuby:世界に1冊 RubyCocoa:日本に1冊 2009年11月8日日曜日
  • 55.
    MacRubyの情報源 『RubyによるMac OS Xデスクトップアプリケーション開発入門』 通称RHC本 ISBN: 978-4839931780 9月25日発売 3,570円(税込み) MacRuby:世界に1冊 RubyCocoa:日本に1冊 6F展示会場にてサイン会 2009年11月8日日曜日
  • 56.
    Macアプリの配布 Bodega:Macアプリ版AppStore 2009年11月8日日曜日
  • 57.
    Mac OS X10.6 2009年11月8日日曜日
  • 58.
    Mac OS X10.6 http://www.apple.com/jp/macosx/uptodate/ 2009年11月8日日曜日
  • 59.
    Mac OS X10.6 2009/8/28リリース Snow Leopard:雪 http://www.apple.com/jp/macosx/uptodate/ 2009年11月8日日曜日
  • 60.
    Mac OS X10.6 2009/8/28リリース Snow Leopard:雪 GCD(Grand Central Dispatch) http://www.apple.com/jp/macosx/uptodate/ 2009年11月8日日曜日
  • 61.
    Mac OS X10.6 2009/8/28リリース Snow Leopard:雪 GCD(Grand Central Dispatch) OpenCL http://www.apple.com/jp/macosx/uptodate/ 2009年11月8日日曜日
  • 62.
    Mac OS X10.6 2009/8/28リリース Snow Leopard:雪 GCD(Grand Central Dispatch) OpenCL http://www.apple.com/jp/macosx/uptodate/ 2009年11月8日日曜日
  • 63.
    GCDとは http://www.apple.com/jp/macosx/technology/ 2009年11月8日日曜日
  • 64.
    GCDとは 並列処理を行うためのライブラリ http://www.apple.com/jp/macosx/technology/ 2009年11月8日日曜日
  • 65.
    GCDとは 並列処理を行うためのライブラリ C言語の拡張とランタイム http://www.apple.com/jp/macosx/technology/ 2009年11月8日日曜日
  • 66.
    GCDとは 並列処理を行うためのライブラリ C言語の拡張とランタイム MacRuby 0.5以降で利用できる http://www.apple.com/jp/macosx/technology/ 2009年11月8日日曜日
  • 67.
    GCDのサンプル 素数の数を求める処理をGCDを使って実装する # 整数numが素数かどうかを判定する # 戻り値がtrueであれば素数 def prime?(num) (2...num).each do |i| return false if num % i == 0 end return true end 2009年11月8日日曜日
  • 68.
    GCDのサンプル # 10_000_000から10_000_299までの素数の数を求める prime = [] for i in 0...300 n = i + 10_000_000 prime << n if prime?(n) end puts(prime.length) $ time macruby count-prime.rb 14 macruby count-prime.rb 14.86s user 0.12s system 93% cpu 16.016 total 2009年11月8日日曜日
  • 69.
    GCDのサンプル # 10_000_000から10_000_299までの素数の数を求める prime = [] for i in 0...300 n = i + 10_000_000 prime << n if prime?(n) end puts(prime.length) #=> 14 2009年11月8日日曜日
  • 70.
    GCDのサンプル # 10_000_000から10_000_299までの素数の数を求める prime = [] for i in 0...300 ループの並列処理 n = i + 10_000_000 prime << n if prime?(n) end puts(prime.length) #=> 14 2009年11月8日日曜日
  • 71.
    GCDのサンプル # 10_000_000から10_000_299までの素数の数を求める prime = [] for i in 0...300 ループの並列処理 n = i + 10_000_000 prime << n if prime?(n) ロック end puts(prime.length) #=> 14 2009年11月8日日曜日
  • 72.
    ループの並列処理 # 10_000_000から10_000_299までの素数の数を求める q = Dispatch::Queue.concurrent prime = [] q.apply(300) do |i| n = i + 10_000_000 prime << n if prime?(n) end puts(prime.length) #=> 14 2009年11月8日日曜日
  • 73.
    ループの並列処理 # 10_000_000から10_000_299までの素数の数を求める q = Dispatch::Queue.concurrent 並列処理用のオブジェクトの取得 prime = [] q.apply(300) do |i| n = i + 10_000_000 prime << n if prime?(n) end puts(prime.length) #=> 14 2009年11月8日日曜日
  • 74.
    ループの並列処理 # 10_000_000から10_000_299までの素数の数を求める q = Dispatch::Queue.concurrent 並列処理用のオブジェクトの取得 prime = [] q.apply(300) do |i| 並列ループ n = i + 10_000_000 prime << n if prime?(n) end puts(prime.length) #=> 14 2009年11月8日日曜日
  • 75.
    グローバルディスパッチキュー グローバルディスパッチキュー 10000000 素数? 10000001 素数? 10000002 素数? … 10000299 素数? ワーカースレッド1 ワーカースレッド2 処理(ブロック)をディスパッチキューに登録 FIFO CPUのコア数などを考慮して自動で並列処理 2009年11月8日日曜日
  • 76.
    グローバルディスパッチキュー グローバルディスパッチキュー 10000000 素数? 10000001 素数? 10000002 素数? … 10000299 素数? ワーカースレッド1 ワーカースレッド2 10000000 素数? 処理(ブロック)をディスパッチキューに登録 FIFO CPUのコア数などを考慮して自動で並列処理 2009年11月8日日曜日
  • 77.
    グローバルディスパッチキュー グローバルディスパッチキュー 10000000 素数? 10000001 素数? 10000002 素数? … 10000299 素数? ワーカースレッド1 ワーカースレッド2 10000000 10000001 素数? 素数? 処理(ブロック)をディスパッチキューに登録 FIFO CPUのコア数などを考慮して自動で並列処理 2009年11月8日日曜日
  • 78.
    ループの並列処理の詳細 # 10_000_000から10_000_299までの素数の数を求める q = Dispatch::Queue.concurrent prime = [] q.apply(300) do n = i + 10_000_000 prime << n if prime?(n) end puts(prime.length) #=> 14 2009年11月8日日曜日
  • 79.
    ループの並列処理の詳細 # 10_000_000から10_000_299までの素数の数を求める q = Dispatch::Queue.concurrent グローバルディスパッチキューの取得 prime = [] q.apply(300) do n = i + 10_000_000 prime << n if prime?(n) end puts(prime.length) #=> 14 2009年11月8日日曜日
  • 80.
    ループの並列処理の詳細 # 10_000_000から10_000_299までの素数の数を求める q = Dispatch::Queue.concurrent グローバルディスパッチキューの取得 prime = [] q.apply(300) do n = i + 10_000_000 prime << n if prime?(n) end ブロックをグローバルディスパッチキューに登録 puts(prime.length) #=> 14 2009年11月8日日曜日
  • 81.
    ロック # 10_000_000から10_000_299までの素数の数を求める q = Dispatch::Queue.concurrent prime = [] q_prime = Dispatch::Queue.new("com.example.prime") q.apply(300) do n = i + 10_000_000 q_prime.dispatch { prime << n } if prime?(n) end q_prime.dispatch(true) { puts(prime.length) } 2009年11月8日日曜日
  • 82.
    ロック # 10_000_000から10_000_299までの素数の数を求める q = Dispatch::Queue.concurrent prime = [] q_prime = Dispatch::Queue.new("com.example.prime") ロック用のオブジェクトの取得 q.apply(300) do n = i + 10_000_000 q_prime.dispatch { prime << n } if prime?(n) end q_prime.dispatch(true) { puts(prime.length) } 2009年11月8日日曜日
  • 83.
    ロック # 10_000_000から10_000_299までの素数の数を求める q = Dispatch::Queue.concurrent prime = [] q_prime = Dispatch::Queue.new("com.example.prime") ロック用のオブジェクトの取得 q.apply(300) do n = i + 10_000_000 q_prime.dispatch { prime << n } if prime?(n) ロック end q_prime.dispatch(true) { puts(prime.length) } 2009年11月8日日曜日
  • 84.
    ロック # 10_000_000から10_000_299までの素数の数を求める q = Dispatch::Queue.concurrent prime = [] q_prime = Dispatch::Queue.new("com.example.prime") ロック用のオブジェクトの取得 q.apply(300) do n = i + 10_000_000 q_prime.dispatch { prime << n } if prime?(n) ロック end q_prime.dispatch(true) { puts(prime.length) } 処理完了待ち 2009年11月8日日曜日
  • 85.
    プライベートディスパッチキュー グローバルディスパッチキュー 10000000 素数? 10000001 素数? 10000002 素数? … 10000299 素数? ワーカースレッド1 ワーカースレッド2 10000200 素数? プライベートディスパッチキュー 10000019 配列に追加 10000079 配列に追加 10000103 配列に追加 … ディスパッチキューに登録した順に1つずつ処理 プライベートキューは何個でも生成可能 ワーカースレッドはグローバルとプライベートで共通 2009年11月8日日曜日
  • 86.
    プライベートディスパッチキュー グローバルディスパッチキュー 10000000 素数? 10000001 素数? 10000002 素数? … 10000299 素数? ワーカースレッド1 ワーカースレッド2 10000019 10000200 配列に追加 素数? プライベートディスパッチキュー 10000019 配列に追加 10000079 配列に追加 10000103 配列に追加 … ディスパッチキューに登録した順に1つずつ処理 プライベートキューは何個でも生成可能 ワーカースレッドはグローバルとプライベートで共通 2009年11月8日日曜日
  • 87.
    プライベートディスパッチキュー グローバルディスパッチキュー 10000000 素数? 10000001 素数? 10000002 素数? … 10000299 素数? ワーカースレッド1 ワーカースレッド2 プライベートディスパッチキュー … 10000019 10000079 10000103 10000271 素数の 配列に追加 配列に追加 配列に追加 配列に追加 数を出力 ディスパッチキューに登録した順に1つずつ処理 プライベートキューは何個でも生成可能 ワーカースレッドはグローバルとプライベートで共通 2009年11月8日日曜日
  • 88.
    プライベートディスパッチキュー グローバルディスパッチキュー 10000000 素数? 10000001 素数? 10000002 素数? … 10000299 素数? ワーカースレッド1 ワーカースレッド2 10000103 配列に追加 プライベートディスパッチキュー … 10000019 10000079 10000103 10000271 素数の 配列に追加 配列に追加 配列に追加 配列に追加 数を出力 ディスパッチキューに登録した順に1つずつ処理 プライベートキューは何個でも生成可能 ワーカースレッドはグローバルとプライベートで共通 2009年11月8日日曜日
  • 89.
    ロックの詳細 # 10_000_000から10_000_299までの素数の数を求める q = Dispatch::Queue.concurrent prime = [] q_prime = Dispatch::Queue.new("com.example.prime") q.apply(300) do n = i + 10_000_000 q_prime.dispatch { prime << n } if prime?(n) end q_prime.dispatch(true) { puts(prime.length) } 2009年11月8日日曜日
  • 90.
    ロックの詳細 # 10_000_000から10_000_299までの素数の数を求める q = Dispatch::Queue.concurrent prime = [] q_prime = Dispatch::Queue.new("com.example.prime") プライベートディスパッチキューの生成 q.apply(300) do n = i + 10_000_000 q_prime.dispatch { prime << n } if prime?(n) end q_prime.dispatch(true) { puts(prime.length) } 2009年11月8日日曜日
  • 91.
    ロックの詳細 # 10_000_000から10_000_299までの素数の数を求める q = Dispatch::Queue.concurrent prime = [] q_prime = Dispatch::Queue.new("com.example.prime") プライベートディスパッチキューの生成 q.apply(300) do n = i + 10_000_000 q_prime.dispatch { prime << n } if prime?(n) 配列への要素追加をキューに登録(非同期) end q_prime.dispatch(true) { puts(prime.length) } 2009年11月8日日曜日
  • 92.
    ロックの詳細 # 10_000_000から10_000_299までの素数の数を求める q = Dispatch::Queue.concurrent prime = [] q_prime = Dispatch::Queue.new("com.example.prime") プライベートディスパッチキューの生成 q.apply(300) do n = i + 10_000_000 q_prime.dispatch { prime << n } if prime?(n) 配列への要素追加をキューに登録(非同期) end q_prime.dispatch(true) { puts(prime.length) } 素数の数の出力をキューに登録(同期) 2009年11月8日日曜日
  • 93.
  • 94.
    使用したGCDのメソッド Dispatch::Queue.concurrent(priority = :default) 並列処理用のグローバルディスパッチキューを取得する 2009年11月8日日曜日
  • 95.
    使用したGCDのメソッド Dispatch::Queue.concurrent(priority = :default) 並列処理用のグローバルディスパッチキューを取得する Dispatch::Queue#apply(amount_size) 並列ループを実行する 2009年11月8日日曜日
  • 96.
    使用したGCDのメソッド Dispatch::Queue.concurrent(priority = :default) 並列処理用のグローバルディスパッチキューを取得する Dispatch::Queue#apply(amount_size) 並列ループを実行する Dispatch::Queue.new(label) シリアル処理用のプライベートディスパッチキューを生成する 2009年11月8日日曜日
  • 97.
    使用したGCDのメソッド Dispatch::Queue.concurrent(priority = :default) 並列処理用のグローバルディスパッチキューを取得する Dispatch::Queue#apply(amount_size) 並列ループを実行する Dispatch::Queue.new(label) シリアル処理用のプライベートディスパッチキューを生成する Dispatch::Queue#dispatch(synchronicity = false) ディスパッチキューにブロックを登録する 2009年11月8日日曜日
  • 98.
    GCD vs. Thread 無駄に複数のスレッドを起動せずOS(中央)が制御 ロック不要 デッドロックが発生しない スレッド直接を使った方が効率がよいアプリが書けるが... 高い技術力やスレッドに関する知識が必要 2009年11月8日日曜日
  • 99.
  • 100.
    まとめ RubyとMac Rubyist≒Macユーザ 2009年11月8日日曜日
  • 101.
    まとめ RubyとMac Rubyist≒Macユーザ RubyによるMacアプリ開発 MacRubyを使おう 2009年11月8日日曜日
  • 102.
    まとめ RubyとMac Rubyist≒Macユーザ RubyによるMacアプリ開発 MacRubyを使おう Mac OS X 10.6 GCDは並列処理を行うライブラリ 2009年11月8日日曜日
  • 103.
    質疑・応答 RHC本サポート:http://www.takao7.net/rhcbk/ kouji@takao7.net、@takaokouji、id:kouji0625 Pokenでハイホー! RHC本のサイン&販売会はこのあとすぐ!! 関西Ruby会議02 ­ 2009年11月7日 ネットワーク応用通信研究所 研究員 高尾 宏治<kouji@netlab.jp> 2009年11月8日日曜日