MacRuby & HotCocoa
Upcoming SlideShare
Loading in...5

MacRuby & HotCocoa






Total Views
Views on SlideShare
Embed Views



4 Embeds 48 42 3 2 1



Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
Post Comment
Edit your comment

    MacRuby & HotCocoa MacRuby & HotCocoa Presentation Transcript

    • MacRuby & HotCocoa Tasty Apps for OS X Thilo Utke 2009
    • Overview About - Web developer - macruby - - Upstream - Alex - Web developer - WebApplications - doningtext - forex-metal - In business for a while - bootstrap - Paper-C - fast - rails - ruby - reliable - testing - rspec - cucumber - ruby - reliable - macs - ruby - rails - text mate - fast - plugins - gems - tools - interesting techs - iphone - mac - tools - Objective-C - features like ruby - smalltalk - more code - Hello World Example - not so fast - unlike ruby - dropped it - heard about macruby 0.3 relase - on top of Obj-C - get curious - less code - on Mac - with Cocoa - major API - Desktop Applications - More like ruby - liked it - Its from Apple! - from - RubyWrapper for NSObject 2001 - Integration with ProjectBuilder (IB 2002) - 2006 Laurent Sansonetti - 10.5 shipped with OS X - 2008 MacRuby shall replace RubyCocoa - RubyCocoa is a scripting Bridge - Syntactic Sugar - Syntax Mismatch - 2 Object Graphs - Green Threads vs. native Threads - Ruby 1.8 and ObjectiveC - Standard Libs Broken - Slow!!! - Mismatch like String != NSString => more Code - Picture - Ruby first Class Citizen - MacRuby - Ruby 1.9 - Native Threads - Matches better with Obj Syntax - Faster - Tighter Integration with Obj-C - Share Base classes - Share Infrastructure - GC - MacRuby 0.5 - the best Ruby for Mac - In Development - NO GLI - Share IO - On top of LLVM - Doing optimizations - Calls Obj-C - class/methods/obj all Obj C - show Methods - No more libffi but uses a new C-dispatcher - Picture! - Show Mixing MacRuby with ObjC - Compiles Code JIT - soon AOT - other Platforms - iPhone? - IB integration! - Framework - main_rm - Outlet - Action - Delegates - Like ActiveRecord Callbacks - but fixed names - you tell who handle it - first responder - Delegate for Application - Show Random Number Gen with IB - Code Obj-C/MacRuby- All the things I’d like to talk about.
    • Outline Intro Objective-C Encounter Apple - Ruby RubyCocoa MacRuby 0.5 MacRuby <-> Obj-C Interface Builder Integration Back to Code with HotCocoa Impact
    • I’m a WebDeveloper.
    • UPSTREAM My Company
    • Alexander Lang, also Founder and Owner of Upstream
    • Wrote CouchPotato. Talks about Ruby Libs for CouchDB
    • We did Community, Productivity, Finance and Educational Websites. Our own product is
    • Rails enabled us to build WebApps really fast.
    • Text I love Ruby!
    • To be fast and deliver reliable applications, we build software with test first.
    • New libraries, gems and technics keep WebDevelopment interesting.
    • Boring!!!! Still I get bored easily, so I play with new technologies.
    • Thats why I have an iPhone.
    • That’s why Alex has an iPhone.
    • That’s why we play with couchDB.
    • That’s why I thought Obj-C might be interesting.
    • SmallTalk Ruby Obj-C Ruby and Obj-C have a common ancestry.
    • Ruby Obj-C Reflective Dynamic Garbage Collection Object Oriented Characteristics they have in common.
    • Ruby Obj-C Closures FFI, C-Ext C-SuperSet methodname(1,2) method: 1 name:2 Interpreter Compiler Things that differ.
    • Grabbed this book to start with Obj-C.
    • First Objective-C App @interface Foo : NSObject { IBOutlet NSTextField *textField; } - (IBAction)gerneate:(id)sender; - (IBAction)seed:(id)sender; @end @impelemtation Foo - (IBAction)generate:(id)sender { int generated = (random() % 100) +1; [textField setIntValue:generated]; } - (IBAction)seed:(id)sender { srandom(time(NULL)); [textField setStringValue:@quot;Generator seededquot;]; } My first Obj-C code with header files, types, many braces and semicolons.
    • o_0 Felt like back in C programming class. Thrown Obj-C away. Yes, Ruby spoiled me.
    • MacRuby 0.3 Heard about MacRuby with the 0.3 release.
    • First Objective-C App class Foo attr_writer :text_field def seed(sender) @text_field.StringValue = quot;Generator doesn't need to be seeded ;)quot; end def generate(sender) @text_field.StringValue = (rand(100) + 1) end end Same Obj-C Tutorial App with MacRuby.
    • 0_0/ Header files, types, braces, and semicolons are gone. Much less code. Yeah!
    • It is from Apple!
    • Apple wants Ruby to be a first class citizen on OS X Where that comes from.
    • 2001 Ruby extension for NSObject and NSClassFromString function by Hisakuni Fujimoto
    • 2002 RubyCocoa Project Ruby 1.6.7 on OS X 10.2
    • 2005 Ruby 1.8.2 on OS X 10.4 For a long time nothing happened.
    • 2006 Laurent Sansonetti from Apple joined RubyCocoa Things started to move.
    • 2007 Ruby 1.8.6, Rails, RubyGems and RubyCocoa on OSX 10.5 Big move
    • RubyCocoa Frameworks App Std Lib Obj-C Ruby Code GC GC IO GCC Bridge MRI 1.8 Obj-C Runtime RubyCocoa Architecture
    • RubyCocoa Use Objects from Obj-C in Ruby and vice versa Syntax matching [Class initWith:(type) p1 other:(type) p2] Frameworks Class.initWith_other(p1, p2) Extending/Inheriting/Overwriting App Std Lib Obj-C Access to C-Structs Ruby Code GC GC IO GCC Bridge MRI 1.8 Obj-C Runtime
    • RubyCocoa Messaging between Obj-C and Ruby is slow! Frameworks App Std Lib Obj-C Ruby Code GC GC IO GCC Bridge MRI 1.8 Obj-C Runtime
    • RubyCocoa Two Object Spaces quot;Hiquot; != @quot;Hiquot; Green Threads vs. Native Threads Frameworks App Std Lib Obj-C Ruby Code GC GC IO GCC Bridge MRI 1.8 Obj-C Runtime RubyCocoa can run only on the MainThread. Ruby needs patching to allow to work with the Obj-C runtime.
    • RubyCocoa Duplicated infrastructure Frameworks App Std Lib Obj-C Ruby Code GC GC IO GCC Bridge MRI 1.8 Obj-C Runtime
    • RubyCocoa Duplicated libraries Ruby’s causing hang ups Frameworks App Std Lib Obj-C Ruby Code GC GC IO GCC Bridge MRI 1.8 Obj-C Runtime
    • Thanks to RubyCocoa for some cool apps, like GitNub.
    • 2008 MacRuby shall replace RubyCocoa in the future The appearance of MacRuby
    • 2009 MacRuby gets popular Ruby 1.8.7, Rails 2.3, RubyGems and RubyCocoa on OSX 10.6 Community starts to grow. Gets buzz, because it for example faster than YARV. Appears more in screencasts/conferences. Apple Stayes true to ruby
    • MacRuby 0.5 App Std Lib Frameworks Ruby Code Obj-C LLVM JIT/AOT GC IO GCC Obj-C Runtime MacRuby architecture
    • MacRuby 0.5 Object => NSObject RubySpecific extensions App Std Lib Frameworks Ruby Code Obj-C LLVM Same Primitives JIT/AOT GC IO GCC Obj-C Runtime
    • ./miniruby -e 'p, true)' [:quot;sortUsingFunction:context:quot;, :quot;exchangeObjectAtIndex:withObjectA tIndex:quot;, :removeAllObjects, :quot;getObjects:range:quot;, :quot;containsObject :inRange:quot;, :removeObjectsInRange, :removeObjectAtIndex, :removeLas tObject, :quot;replaceObjectAtIndex:withObject:quot;, :quot;insertObject:atInde x:quot;, :addObject, :quot;countByEnumeratingWithState:objects:count:quot;, :ob jectAtIndex, :count, :mutableCopyWithZone, :copyWithZone, :classFor Coder, :finalize, :hash, :isEqual, :sortUsingDescriptors, :filterUs ingPredicate, :initWithContentsOfURL, :initWithContentsOfFile, :sor tUsingSelector, :quot;removeObjectsFromIndices:numIndices:quot;, :removeObj ectsAtIndexes, :quot;replaceObjectsAtIndexes:withObjects:quot;, :quot;insertObj ects:atIndexes:quot;, :quot;sortUsingFunction:context:range:quot;, :quot;initWithOb jects:count:quot;, :initWithCapacity, :removeObjectsInArray, :quot;removeOb jectIdenticalTo:inRange:quot;, :removeObjectIdenticalTo, :quot;removeObject :inRange:quot;, :removeObject, :quot;removeObject:range:identical:quot;, :setAr ray, :quot;setObject:atIndex:quot;, :addObjectsFromArray, :quot;replaceObjectsI With the extra second argument set on true, you can see the Obj-C methods.
    • MacRuby 0.5 Generate Obj-C calls for Ruby code Intermediate Representation (IR) App Std Lib Optimization Frameworks Ruby Code JIT compiler to execute code GCC LLVM ~ 3 x faster than YARV JIT/AOT GC IO LLVM AOT compiler very soon Obj-C Runtime LLVM = Low Level Virtual Machine
    • MacRuby 0.5 Generate Obj-C calls for Ruby code Intermediate Representation (IR) App Std Lib Optimization Frameworks Ruby Code JIT compiler to execute code GCC LLVM ~ 3 x faster than YARV JIT/AOT GC IO LLVM AOT compiler very soon Obj-C Runtime AOT Compiler might allow to build for the iPhone. The garbage collection is still an open question.
    • VM_DUMP_IR=1 ./miniruby -e 'p quot;Hello RailsWayCon!quot;' quot;Hello RailsWayCon!quot; IR dump ---------------------------------------------- ; ModuleID = 'Roxor' define i64 @0(i64 %self, i8* %sel) { MainBlock: %0 = tail call i64 (i8*, i64, i8*, i8*, i8, i32, ...)* @rb_vm_dispatch(i8* inttoptr (i64 4309091648 to i8*), i64 %self, i8* inttoptr (i64 4308940784 to i8*), i8* null, i8 0, i32 1, i64 34360384192) ; <i64> [#uses=1] ret i64 %0 } declare i64 @rb_vm_dispatch(i8*, i64, i8*, i8*, i8, i32, ...) ------------------------------------------------------ How the IR in LLVM looks?
    • MacRuby 0.5 One runtime App One Lib Std object space Frameworks Shared infrastructure Ruby Code Multithreaded Obj-C LLVM JIT/AOT GC IO GCC Obj-C Runtime No GIL is needed.
    • MacRuby 0.5 MacRuby is not fully functional yet. Not installable around 85% RubySpecs passes. You can play with miniruby.
    • MacRuby 0.4 “Stable” version
    • Using Frameworks #import <Cocoa/Cocoa.h> framework 'Cocoa'     Require a framework
    • Calling Obj-C Methods [dog makeNoise:@”wuff” level:6]; dog.makeNoise “wuff”, level:6 dog.makeNoise “wuff”, :level => 6    
    • Defining Methods for Obj-C - (id) makeNoise:(NSString)noise level:(NSInteger)level; def makeNoise(noise, level:level)  
    • Using Structs NSPoint(0,1),1)  
    • Pointer NSError* error; //MacRuby 0.4 error = Pointer.new_with_type('@') //MacRuby 0.5 error =   Pointers are often used as a means for output parameters, mostly for error handling.
    • alloc & init [[NSMutableArray alloc] init] Array.alloc.init == Array.alloc.initWithArray([1])== Array.arrayWithArray([1])
    • Use Ruby from Objective-C //Possible id dog = [NSClassFromString(@quot;Dogquot;) new]; [dog bark] //Safer id dog = [[MacRuby sharedRuntime] evaluateString:@quot;Dog.newquot;]; [dog performRubySelector: @selector(bark:)]; Ruby Parameters are always objects, careful when passing primitives!
    • XCode MacRuby is supported in XCode.
    • Interface Builder Also support by Interface Builder
    • Read this book to learn more about Interface Builder and XCode.
    • Interface Builder Wire the GUI to your code.
    • OUTLETS References to GUI elements
    • attr_writer :stalutation attr_accessor :user_input
    • ACTIONS Methods, which are supposed to be called on UI events.
    • def showSalutation(sender) @stalutation.stringValue = quot;Hi RailsWayCon!quot; end
    • Delegates Specific to Ruby Cocoa and other frameworks.
    • def applicationDidFinishLoading(message) // do somehting here end I am your delegate Answer my Emails! Alternative explanation: ActiveRecord callbacks with fixed names defined in another object.
    • With InterfaceBuilder you get very much, very fast, with very little code but rather static. Good for small Apps, prototypes, App parts.
    • More control, understanding, flexibility.
    • Hello World MacRuby framework 'Cocoa'     app = NSApplication.sharedApplication   window = NSWindow.alloc.initWithContentRect([0,0,200,60],   styleMask:NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask ,   backing:NSBackingStoreBuffered,   defer:false)   window.title = 'Hello World'   label = NSTextField.alloc.initWithFrame(NSZeroRect) window.contentView.addSubview(label) label.stringValue = quot;Hello RailsWayCon!quot; label.setEditable(false) label.setSelectable(false) label.setBezeled(false) label.setDrawsBackground(false) label.sizeToFit label.frameOrigin = NSMakePoint((window.contentView.frameSize.width / 2) - (label.frameSize.width / 2)),   (window.contentView.frameSize.height / 3)) window.display window.orderFrontRegardless No InterfaceBuilder -> lots of code
    • by: HotCocoa. Not only a tasty drink but a smart Lib shipped with MacRuby.
    • HotCocoa Ruby Wrapper for major frameworks AppKit WebKit QtKit CoreGraphics CoreImage
    • HotCocoa Constructors with smart defaults Constants mapped to Symbols Custom methods Easy delegation Constructors- Building the instances of the mapped classes using the correct class-specific APIs Smart Defaults - Default constructor parameters to minimize the needed parameters Constant Mapping - Use of Ruby symbols to minimize the text and incr. readability Custom Methods- Ruby-friendly API for commonly used methods Delegate Methods - Ruby-friendly methods for delegating instances
    • Hello World HotCocoa require 'hotcocoa' include HotCocoa   application do   window = window(title: 'Hello World', frame: [0,0,200,60])   label = label(text:'Hello RailsWayCon!', layout: {align::center})   window << label end Same App done with MacRuby.
    • 0_0/
    • Constructors with Smart Defaults NSWindow.alloc.initWithContentRect([0,0,200,60], styleMask:NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask ,  backing:NSBackingStoreBuffered,    defer:false) window(title: 'Hello World', frame: [0,0,200,60])  
    • Constant Mappings button.setBezelStyle(NSRoundedBezelStyle) button.bezel = :rounded  
    • Custom Methods window.contentView.addSubview(label) window << label  
    • Delegate = self button.action = 'sayHello' def sayHello p 'Hello!' end botton.on_action {p 'Hello!'}  
    • HotCoco Documentation Soon see /hotcocoa/mappings HotConsole at gitHub to play arround
    • Lot of work to do to understand all available OS X frameworks.
    • So What? The implications of MacRuby
    • Movement ?
    • Better Tool Support != Apple | XCode | InterfaceBuilder HotCocoa, Rucola (App. Gen.) HotConsole
    • Mature Testing Libraries TestUnit (working) Mocha (working) Rspec Shoulda Cucumber (GUI manipulation?)
    • More applications for MAC!
    • Thanks Start: Help: MacRuby-devel on MacOSForge Twitter: @MacRuby Thilo Utke 2009 for RailsWayCon Upstream-Agile GmbH (