103
Ruby による Mac OS X デスクトップアプリケーション開発入門 -- Snow Leopard 対応版 関西Ruby会議02 - 2009年11月7日 ネットワーク応用通信研究所 研究員 高尾 宏治< [email protected] > 2009118日日曜日

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

  • 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日日曜日

RubyとMac

2009年11月8日日曜日

RubyとMac

2009年11月8日日曜日

2002

OS X 10.2Ruby 1.6.7

RubyとMac

2009年11月8日日曜日

2002

OS X 10.2Ruby 1.6.7

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

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ユーザ

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アプリ開発

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

参考画像: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

RubyとObjective-C

2009年11月8日日曜日

[self width];self.widthRuby Objective-C

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

Rubyと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

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の特徴

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の情報源

2009年11月8日日曜日

MacRubyの情報源

2009年11月8日日曜日

MacRubyの情報源

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アプリの配布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のサンプル

# 整数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のメソッド

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.6GCDは並列処理を行うライブラリ

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日日曜日