98
MacRuby Ruby + ObjC Friday, February 6, 2009

MacRuby - When objective-c and Ruby meet

Embed Size (px)

DESCRIPTION

MACRUBY: WHAT'S THE BIG DEAL?Last year, Apple released MacRuby, an open source Ruby implementationwritten on top of the Objective-C runtime. Writing native MacOSXapplications in Ruby without having to pay the cost of using a bridgeis now a reality. This is an important milestone for Ruby, Apple andthe Ruby community.Matt Aimonetti explains the implementation, show how to builddesktop applications with MacRuby & HotCocoa, and discuss why Rubydevelopers should add this new tool to their utility belt. Matt also talks about the future of MacRuby.

Citation preview

Page 1: MacRuby - When objective-c and Ruby meet

MacRubyRuby + ObjC

Friday, February 6, 2009

Page 2: MacRuby - When objective-c and Ruby meet

COCOAApple's Objective-C based programming environment for

Mac OS X

Friday, February 6, 2009

Page 3: MacRuby - When objective-c and Ruby meet

COCOA

• frameworks

• APIs

• accompanying runtimes

Goal: native Mac applications

Friday, February 6, 2009

Page 4: MacRuby - When objective-c and Ruby meet

OBJECTIVE-C 2.0

• reflective

• object-oriented

• garbage collection

• 32 and 64-bit support

Friday, February 6, 2009

Page 5: MacRuby - When objective-c and Ruby meet

obj.method parameter

RUBY

Friday, February 6, 2009

Page 6: MacRuby - When objective-c and Ruby meet

[obj method:parameter];

OBJECTIVE-C 2.0

Friday, February 6, 2009

Page 7: MacRuby - When objective-c and Ruby meet

friends = []

RUBY

Friday, February 6, 2009

Page 8: MacRuby - When objective-c and Ruby meet

NSMutableArray *friends = [[NSMutableArray alloc] init];

OBJECTIVE-C 2.0

Friday, February 6, 2009

Page 9: MacRuby - When objective-c and Ruby meet

COCOA

Goal => native Mac applications => ObjC

Friday, February 6, 2009

Page 10: MacRuby - When objective-c and Ruby meet

:emo:Friday, February 6, 2009

Page 11: MacRuby - When objective-c and Ruby meet

bridge between the Objective-C runtime and MRI

RUBYCOCOA

Friday, February 6, 2009

Page 12: MacRuby - When objective-c and Ruby meet

No more ObjC code to write :)

RUBYCOCOA

Friday, February 6, 2009

Page 13: MacRuby - When objective-c and Ruby meet

Write cocoa apps in RUBY :)

RUBYCOCOA

Friday, February 6, 2009

Page 14: MacRuby - When objective-c and Ruby meet

potentially prohibitive cost :(

RUBYCOCOA

Friday, February 6, 2009

Page 15: MacRuby - When objective-c and Ruby meet

conversion cost :(

RUBYCOCOA

Friday, February 6, 2009

Page 16: MacRuby - When objective-c and Ruby meet

message forwarding cost :(

RUBYCOCOA

Friday, February 6, 2009

Page 17: MacRuby - When objective-c and Ruby meet

MacRuby

Friday, February 6, 2009

Page 18: MacRuby - When objective-c and Ruby meet

APPLE'S OPEN SOURCE PROJECT

MacRuby

Friday, February 6, 2009

Page 19: MacRuby - When objective-c and Ruby meet

NOT A BRIDGE

MacRuby

Friday, February 6, 2009

Page 20: MacRuby - When objective-c and Ruby meet

BUILT ON TOP OF THEOBJECTIVE-C RUNTIME

MacRuby

Friday, February 6, 2009

Page 21: MacRuby - When objective-c and Ruby meet

all classes => Objective-C all methods => Objective-C all objects => Objective-C

MacRuby

Friday, February 6, 2009

Page 22: MacRuby - When objective-c and Ruby meet

CoreFoundation

MacRuby

Friday, February 6, 2009

Page 23: MacRuby - When objective-c and Ruby meet

native CoreFoundation data types

MacRuby

Friday, February 6, 2009

Page 24: MacRuby - When objective-c and Ruby meet

native threads

MacRuby

Friday, February 6, 2009

Page 25: MacRuby - When objective-c and Ruby meet

Objective-C Garbage Collector

MacRuby

Friday, February 6, 2009

Page 26: MacRuby - When objective-c and Ruby meet

CODE EXAMPLE

Friday, February 6, 2009

Page 27: MacRuby - When objective-c and Ruby meet

$ macirb>> friends = []=> []>> friends.class=> NSMutableArray>> friends << "Juan"=> ["Juan"]>> friends << "Denis"=> ["Juan", "Denis"]

Friday, February 6, 2009

Page 28: MacRuby - When objective-c and Ruby meet

>> friends << {first_name: "Laurent", last_name: "Sansonetti"}=> ["Juan", "Denis", {:first_name=>"Laurent", :last_name=>"Sansonetti"}]>> friends.length=> 3

Friday, February 6, 2009

Page 29: MacRuby - When objective-c and Ruby meet

>> name = "Matt Aimonetti"=> "Matt Aimonetti">> name.uppercaseString=> "MATT AIMONETTI">> name.upcase=> "MATT AIMONETTI"

Friday, February 6, 2009

Page 30: MacRuby - When objective-c and Ruby meet

X-CODE ENVIRONMENT

Friday, February 6, 2009

Page 31: MacRuby - When objective-c and Ruby meet

FREE

http://developer.apple.com/TOOLS/xcode/

Friday, February 6, 2009

Page 32: MacRuby - When objective-c and Ruby meet

WELL DOCUMENTED

http://developer.apple.com/index.html

Friday, February 6, 2009

Page 33: MacRuby - When objective-c and Ruby meet

WELL DONEFriday, February 6, 2009

Page 34: MacRuby - When objective-c and Ruby meet

GREAT TOOLSFriday, February 6, 2009

Page 35: MacRuby - When objective-c and Ruby meet

NEW PROJECTFriday, February 6, 2009

Page 36: MacRuby - When objective-c and Ruby meet

MacRuby.frameworkFriday, February 6, 2009

Page 37: MacRuby - When objective-c and Ruby meet

rb_main.rbFriday, February 6, 2009

Page 38: MacRuby - When objective-c and Ruby meet

# Loading the Cocoa framework. If you need to load more frameworks, you can# do that here too.framework 'Cocoa'

# Loading all the Ruby project files.dir_path = NSBundle.mainBundle.resourcePath.fileSystemRepresentationDir.entries(dir_path).each do |path| if path != File.basename(__FILE__) and path[-3..-1] == '.rb' require(path) endend

# Starting the Cocoa main loop.NSApplicationMain(0, nil)

Friday, February 6, 2009

Page 39: MacRuby - When objective-c and Ruby meet

MainMenu.nibFriday, February 6, 2009

Page 40: MacRuby - When objective-c and Ruby meet

Friday, February 6, 2009

Page 41: MacRuby - When objective-c and Ruby meet

V of MVCFriday, February 6, 2009

Page 42: MacRuby - When objective-c and Ruby meet

PREPARE BINDINGSFriday, February 6, 2009

Page 43: MacRuby - When objective-c and Ruby meet

C of MVCFriday, February 6, 2009

Page 44: MacRuby - When objective-c and Ruby meet

class Controller attr_writer :friendsTableView

def awakeFromNib end

def numberOfRowsInTableView(view) end

def tableView(view, objectValueForTableColumn:column, row:index) end

def tableView(view, setObjectValue:object, forTableColumn:column, row:index) end

def addFriend(sender) end

end

Friday, February 6, 2009

Page 45: MacRuby - When objective-c and Ruby meet

class Controller attr_writer :friendsTableViewend

ivar = outletFriday, February 6, 2009

Page 46: MacRuby - When objective-c and Ruby meet

class Controller

def awakeFromNib end

end

called when instantiated by nibFriday, February 6, 2009

Page 47: MacRuby - When objective-c and Ruby meet

class Controller

def awakeFromNib @friends = [] @friendsTableView.dataSource = self end

end

set the NSTableView data sourceFriday, February 6, 2009

Page 48: MacRuby - When objective-c and Ruby meet

class Controller

def addFriend(sender) end

end

button actionFriday, February 6, 2009

Page 49: MacRuby - When objective-c and Ruby meet

bind the UI with the ControllerFriday, February 6, 2009

Page 50: MacRuby - When objective-c and Ruby meet

NSTableDataSource informal protocol

Friday, February 6, 2009

Page 51: MacRuby - When objective-c and Ruby meet

def numberOfRowsInTableView(view) end

NSTableDataSource protocolFriday, February 6, 2009

Page 52: MacRuby - When objective-c and Ruby meet

def tableView( view, objectValueForTableColumn:column, row:index ) end

NSTableView selectorFriday, February 6, 2009

Page 53: MacRuby - When objective-c and Ruby meet

def tableView(view, setObjectValue:object, forTableColumn:column, row:index) end

NSTableView selectorFriday, February 6, 2009

Page 54: MacRuby - When objective-c and Ruby meet

CompileFriday, February 6, 2009

Page 55: MacRuby - When objective-c and Ruby meet

HOTCOCOAFriday, February 6, 2009

Page 56: MacRuby - When objective-c and Ruby meet

PURE RUBY SEXINESS

Friday, February 6, 2009

Page 57: MacRuby - When objective-c and Ruby meet

NO X-CODE

Friday, February 6, 2009

Page 58: MacRuby - When objective-c and Ruby meet

RUBY DSL FOR COCOA

Friday, February 6, 2009

Page 59: MacRuby - When objective-c and Ruby meet

$ hotcocoa sdruby

Friday, February 6, 2009

Page 60: MacRuby - When objective-c and Ruby meet

$ hotcocoa sdruby

PROJECT SETTINGS

Friday, February 6, 2009

Page 61: MacRuby - When objective-c and Ruby meet

$ hotcocoa sdruby

CORE OF THE APP CODE

Friday, February 6, 2009

Page 62: MacRuby - When objective-c and Ruby meet

$ hotcocoa sdruby

MENU BAR

Friday, February 6, 2009

Page 63: MacRuby - When objective-c and Ruby meet

$ hotcocoa sdruby

RAKE TASKS

Friday, February 6, 2009

Page 64: MacRuby - When objective-c and Ruby meet

$ hotcocoa sdruby

APP RESOURCES

Friday, February 6, 2009

Page 65: MacRuby - When objective-c and Ruby meet

RUBY HELPERS

def start application :name => "Sdruby" do |app| app.delegate = self window(:frame => [100, 100, 500, 500], :title => "SDRuby") do |win| win << label(:text => "Hello from HotCocoa", :layout => {:start => false}) win.will_close { exit } end end end

Friday, February 6, 2009

Page 66: MacRuby - When objective-c and Ruby meet

NSApplication

application :name => "Sdruby" do |app| end

Friday, February 6, 2009

Page 67: MacRuby - When objective-c and Ruby meet

set the delegation

application :name => "Sdruby" do |app| app.delegate = self end

Friday, February 6, 2009

Page 68: MacRuby - When objective-c and Ruby meet

set the delegation

# file/open def on_open(menu) end # file/new def on_new(menu) end # help menu item def on_help(menu) end # window/zoom def on_zoom(menu) end # window/bring_all_to_front def on_bring_all_to_front(menu) end

Friday, February 6, 2009

Page 69: MacRuby - When objective-c and Ruby meet

NSWindow helper

window(:frame => [100, 100, 500, 500], :title => "SDRuby") do |win|end

Friday, February 6, 2009

Page 70: MacRuby - When objective-c and Ruby meet

NSTextField helper

label(:text => "Hello from HotCocoa", :layout => {:start => false})

Friday, February 6, 2009

Page 71: MacRuby - When objective-c and Ruby meet

contentView.addSubview helper

win << label(:text => "Hello from HotCocoa")

Friday, February 6, 2009

Page 72: MacRuby - When objective-c and Ruby meet

window callback

win.will_close { exit }

Friday, February 6, 2009

Page 73: MacRuby - When objective-c and Ruby meet

$ macrake

Friday, February 6, 2009

Page 74: MacRuby - When objective-c and Ruby meet

USE ANY COCOA FRAMEWORK

Friday, February 6, 2009

Page 75: MacRuby - When objective-c and Ruby meet

WEBKIT

Friday, February 6, 2009

Page 76: MacRuby - When objective-c and Ruby meet

framework 'webkit'

Friday, February 6, 2009

Page 77: MacRuby - When objective-c and Ruby meet

win << web_view( :layout => {:expand => [:width, :height]}, :url => "http://sdruby.com")

Friday, February 6, 2009

Page 78: MacRuby - When objective-c and Ruby meet

Friday, February 6, 2009

Page 79: MacRuby - When objective-c and Ruby meet

$ macrake deploy

Raffle.app

Friday, February 6, 2009

Page 80: MacRuby - When objective-c and Ruby meet

AND MUCH MORE

Friday, February 6, 2009

Page 81: MacRuby - When objective-c and Ruby meet

DEMO APPS

Friday, February 6, 2009

Page 82: MacRuby - When objective-c and Ruby meet

SD RUBY RAFFLE APPFriday, February 6, 2009

Page 83: MacRuby - When objective-c and Ruby meet

¿What to do with MacRuby?

Friday, February 6, 2009

Page 84: MacRuby - When objective-c and Ruby meet

WEB APPCLIENT

Friday, February 6, 2009

Page 85: MacRuby - When objective-c and Ruby meet

REUSE RUBY CODE

Friday, February 6, 2009

Page 86: MacRuby - When objective-c and Ruby meet

RETHINK DESKTOP APPS

Friday, February 6, 2009

Page 87: MacRuby - When objective-c and Ruby meet

WEBKIT INTEGRATION

Friday, February 6, 2009

Page 88: MacRuby - When objective-c and Ruby meet

¿MacRuby’s future?

Friday, February 6, 2009

Page 89: MacRuby - When objective-c and Ruby meet

MUCH BETTER PERFORMANCE

Friday, February 6, 2009

Page 90: MacRuby - When objective-c and Ruby meet

NEW VM

Friday, February 6, 2009

Page 91: MacRuby - When objective-c and Ruby meet

SOURCE OBFUSCATION

Friday, February 6, 2009

Page 92: MacRuby - When objective-c and Ruby meet

COMPILED CODE

Friday, February 6, 2009

Page 93: MacRuby - When objective-c and Ruby meet

OPTIMIZATIONS BASED ON THE UNDERLYING OS

Friday, February 6, 2009

Page 94: MacRuby - When objective-c and Ruby meet

SOLID & SUPPORTED WAY TO WRITE COCOA APPS

Friday, February 6, 2009

Page 95: MacRuby - When objective-c and Ruby meet

¿MAINSTREAM WAY TO WRITE COCOA APPS?

Friday, February 6, 2009

Page 96: MacRuby - When objective-c and Ruby meet

¿IPHONE OUTPUT?

Friday, February 6, 2009

Page 98: MacRuby - When objective-c and Ruby meet

Props to Rich Kilmer (hotcocoa)

& Laurent Sansonetti

(MacRuby)

Friday, February 6, 2009