Upload
-
View
14.586
Download
5
Embed Size (px)
DESCRIPTION
Rubyを使ったMacのデスクトップアプリケーション開発の概要を説明します。また、Mac OS X 10.6で導入されたGCDの概要とMacRubyからどのように使うのかを説明します。
Citation preview
RubyによるMac OS Xデスクトップアプリケーション開発入門
-- Snow Leopard対応版
関西Ruby会議02 - 2009年11月7日ネットワーク応用通信研究所 研究員
高尾 宏治<[email protected]>
2009年11月8日日曜日
RubyによるMac OS Xデスクトップアプリケーション開発入門
-- Snow Leopard対応版
関西Ruby会議02 - 2009年11月7日ネットワーク応用通信研究所 研究員
高尾 宏治<[email protected]>
2009年11月8日日曜日
RubyによるMac OS Xデスクトップアプリケーション開発入門
-- Snow Leopard対応版
関西Ruby会議02 - 2009年11月7日ネットワーク応用通信研究所 研究員
高尾 宏治<[email protected]>
2009年11月8日日曜日
2002
OS X 10.2Ruby 1.6.7
2007
OS X 10.5Ruby 1.8.6RubyCocoa
Rails
RubyとMac
2005
OS X 10.4Ruby 1.8.2
2009年11月8日日曜日
2002
OS X 10.2Ruby 1.6.7
2007
OS X 10.5Ruby 1.8.6RubyCocoa
Rails
RubyとMac
2009
OS X 10.6Ruby 1.8.7RubyCocoa
Rails
2005
OS X 10.4Ruby 1.8.2
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ユーザ=Rubyisthttp://www.tiobe.com/index.php/paperinfo/tpci/Ruby.html
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日日曜日
公式開発言語:Objective-C
参考画像:CちゃんとSqueakのコラボ、絶妙なバランスhttp://www.limo.fumi2kick.com/forum/glang/glang17.jpg
Macアプリの公式開発言語
C言語にオブジェクト指向機能を追加C言語の上位互換言語
C++とは異なるオブジェクトシステムSmalltalk由来
2009年11月8日日曜日
公式開発言語:Objective-C
参考画像:CちゃんとSqueakのコラボ、絶妙なバランスhttp://www.limo.fumi2kick.com/forum/glang/glang17.jpg
Macアプリの公式開発言語
C言語にオブジェクト指向機能を追加C言語の上位互換言語
C++とは異なるオブジェクトシステムSmalltalk由来
Cocoa:Objective-C用のライブラリ
2009年11月8日日曜日
[self width];self.widthRuby Objective-C
オブジェクトシステムはSmalltalk由来
相性は抜群『RubyとCocoa(Objective-C)は、非常に幸運な組み合わせだったと言えるでしょう』 -- 中川智史:RHC本より
RubyとObjective-C
2009年11月8日日曜日
[self width];self.widthRuby Objective-C
オブジェクトシステムはSmalltalk由来
相性は抜群『RubyとCocoa(Objective-C)は、非常に幸運な組み合わせだったと言えるでしょう』 -- 中川智史:RHC本より
Rubyが理解できていればObjective-Cの理解は早いただし、C言語の知識があることが前提
RubyとObjective-C
2009年11月8日日曜日
[self width];self.widthRuby Objective-C
オブジェクトシステムはSmalltalk由来
相性は抜群『RubyとCocoa(Objective-C)は、非常に幸運な組み合わせだったと言えるでしょう』 -- 中川智史:RHC本より
Rubyが理解できていればObjective-Cの理解は早いただし、C言語の知識があることが前提
RubyとObjective-C
2009年11月8日日曜日
[self width];self.widthRuby Objective-C
オブジェクトシステムはSmalltalk由来
相性は抜群『RubyとCocoa(Objective-C)は、非常に幸運な組み合わせだったと言えるでしょう』 -- 中川智史:RHC本より
Rubyが理解できていればObjective-Cの理解は早いただし、C言語の知識があることが前提
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の特徴
CRuby 1.9ベース、100%互換を目標
http://www.macruby.org/
2009年11月8日日曜日
MacRubyの特徴
CRuby 1.9ベース、100%互換を目標
LLVMで再実装されたVM
http://www.macruby.org/
2009年11月8日日曜日
MacRubyの特徴
CRuby 1.9ベース、100%互換を目標
LLVMで再実装されたVM
Rubyスクリプトをコンパイル可能
http://www.macruby.org/
2009年11月8日日曜日
MacRubyの特徴
CRuby 1.9ベース、100%互換を目標
LLVMで再実装されたVM
Rubyスクリプトをコンパイル可能
Mac OS Xにプリインストールされる(かも?)
メイン開発者のLaurent Sansonetti氏はAppleの社員
http://www.macruby.org/
2009年11月8日日曜日
MacRubyのデモ
class AppController attr_accessor :textField def hello(sender) @textField.stringValue = "Hello,MacRuby!" endend
2009年11月8日日曜日
MacRubyの情報源『RubyによるMac OS Xデスクトップアプリケーション開発入門』通称RHC本ISBN: 978-48399317809月25日発売 3,570円(税込み)
2009年11月8日日曜日
MacRubyの情報源『RubyによるMac OS Xデスクトップアプリケーション開発入門』通称RHC本ISBN: 978-48399317809月25日発売 3,570円(税込み)
MacRuby:世界に1冊
2009年11月8日日曜日
MacRubyの情報源『RubyによるMac OS Xデスクトップアプリケーション開発入門』通称RHC本ISBN: 978-48399317809月25日発売 3,570円(税込み)
MacRuby:世界に1冊
RubyCocoa:日本に1冊
2009年11月8日日曜日
MacRubyの情報源『RubyによるMac OS Xデスクトップアプリケーション開発入門』通称RHC本ISBN: 978-48399317809月25日発売 3,570円(税込み)
MacRuby:世界に1冊
RubyCocoa:日本に1冊
6F展示会場にてサイン会
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のサンプル
# 整数numが素数かどうかを判定する# 戻り値がtrueであれば素数def prime?(num) (2...num).each do |i| return false if num % i == 0 end return trueend
素数の数を求める処理をGCDを使って実装する
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)endputs(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素数?…
処理(ブロック)をディスパッチキューに登録FIFOCPUのコア数などを考慮して自動で並列処理
ワーカースレッド1 ワーカースレッド2
2009年11月8日日曜日
グローバルディスパッチキューグローバルディスパッチキュー
10000000素数?
10000001素数?
10000002素数?
10000299素数?…
処理(ブロック)をディスパッチキューに登録FIFOCPUのコア数などを考慮して自動で並列処理
ワーカースレッド1
10000000素数?
ワーカースレッド2
2009年11月8日日曜日
グローバルディスパッチキューグローバルディスパッチキュー
10000000素数?
10000001素数?
10000002素数?
10000299素数?…
処理(ブロック)をディスパッチキューに登録FIFOCPUのコア数などを考慮して自動で並列処理
ワーカースレッド1
10000000素数?
ワーカースレッド2
10000001素数?
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日日曜日
プライベートディスパッチキュー
ディスパッチキューに登録した順に1つずつ処理プライベートキューは何個でも生成可能ワーカースレッドはグローバルとプライベートで共通
グローバルディスパッチキュー
10000000素数?
10000001素数?
10000002素数?
10000299素数?…
ワーカースレッド1 ワーカースレッド2
10000200素数?
プライベートディスパッチキュー
10000019配列に追加
10000079配列に追加
10000103配列に追加 …
2009年11月8日日曜日
プライベートディスパッチキュー
ディスパッチキューに登録した順に1つずつ処理プライベートキューは何個でも生成可能ワーカースレッドはグローバルとプライベートで共通
グローバルディスパッチキュー
10000000素数?
10000001素数?
10000002素数?
10000299素数?…
ワーカースレッド1 ワーカースレッド2
10000200素数?
プライベートディスパッチキュー
10000019配列に追加
10000079配列に追加
10000103配列に追加 …
10000019配列に追加
2009年11月8日日曜日
プライベートディスパッチキュー
ディスパッチキューに登録した順に1つずつ処理プライベートキューは何個でも生成可能ワーカースレッドはグローバルとプライベートで共通
グローバルディスパッチキュー
10000000素数?
10000001素数?
10000002素数?
10000299素数?…
ワーカースレッド1 ワーカースレッド2
プライベートディスパッチキュー
10000019配列に追加
10000079配列に追加
10000103配列に追加
10000271配列に追加… 素数の
数を出力
2009年11月8日日曜日
プライベートディスパッチキュー
ディスパッチキューに登録した順に1つずつ処理プライベートキューは何個でも生成可能ワーカースレッドはグローバルとプライベートで共通
グローバルディスパッチキュー
10000000素数?
10000001素数?
10000002素数?
10000299素数?…
ワーカースレッド1 ワーカースレッド2
プライベートディスパッチキュー
10000019配列に追加
10000079配列に追加
10000103配列に追加
10000271配列に追加…
10000103配列に追加
素数の数を出力
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のメソッド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日日曜日
質疑・応答
関西Ruby会議02 - 2009年11月7日ネットワーク応用通信研究所 研究員
高尾 宏治<[email protected]>
RHC本サポート:http://www.takao7.net/rhcbk/[email protected]、@takaokouji、id:kouji0625Pokenでハイホー!
RHC本のサイン&販売会はこのあとすぐ!!
2009年11月8日日曜日