Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
MacRuby & HotCocoa
Tasty Apps for OS X




                      Thilo Utke 2009
Overview
     About - Web developer - macruby - - Upstream - Alex - Web developer - WebApplications - doningtext
     - fo...
Outline
 Intro

 Objective-C Encounter

 Apple - Ruby

 RubyCocoa

 MacRuby 0.5

 MacRuby <-> Obj-C

 Interface Builder In...
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
doingText.com
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!!!!




                                                             www.flickr.com/photos/ipom


Still I get bored ...
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
                                Dynam...
Ruby             Obj-C

           Closures

           FFI, C-Ext        C-SuperSet

           methodname(1,2)   method:...
Grabbed this book to start with Obj-C.
First Objective-C App
   @interface Foo : NSObject
   {
     IBOutlet NSTextField *textField;
   }

   - (IBAction)gerneat...
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 =...
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 co...
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         ...
RubyCocoa
  Use Objects from Obj-C in Ruby and vice versa
  Syntax matching
    [Class initWith:(type) p1 other:(type) p2]...
RubyCocoa
  Messaging between Obj-C and Ruby is slow!


                                             Frameworks


  App   ...
RubyCocoa
       Two Object Spaces
          quot;Hiquot; != @quot;Hiquot;
       Green Threads vs. Native Threads Framewo...
RubyCocoa
  Duplicated infrastructure


                                             Frameworks


  App         Std Lib   ...
RubyCocoa
  Duplicated libraries
   Ruby’s causing hang ups
                                             Frameworks


  Ap...
Thanks to RubyCocoa for some cool apps, like GitNub.
2008



                             MacRuby
                shall replace RubyCocoa
                            in the fu...
2009

                    MacRuby gets popular


        Ruby 1.8.7, Rails 2.3, RubyGems
                            and R...
MacRuby 0.5

            App         Std Lib
                                             Frameworks
                 Ruby...
MacRuby 0.5
         Object => NSObject
         RubySpecific extensions
  App        Std Lib
                             ...
./miniruby -e 'p Array.new.methods(true, true)'

   [:quot;sortUsingFunction:context:quot;, :quot;exchangeObjectAtIndex:wi...
MacRuby 0.5
                             Generate Obj-C calls for Ruby code
                             Intermediate Repr...
MacRuby 0.5
                               Generate Obj-C calls for Ruby code
                               Intermediate ...
VM_DUMP_IR=1 ./miniruby -e 'p quot;Hello RailsWayCon!quot;'

   quot;Hello RailsWayCon!quot;
   IR dump ------------------...
MacRuby 0.5
                           One runtime
            App            One Lib
                           Std objec...
MacRuby 0.5




MacRuby is not fully functional yet.
Not installable around 85% RubySpecs passes.
You can play with miniru...
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 =>...
Defining Methods for Obj-C
- (id) makeNoise:(NSString)noise
level:(NSInteger)level;

def makeNoise(noise, level:level)
 
Using Structs
    NSPoint(0,1)

NSpoint.new(0,1)
 
Pointer
       NSError* error;

   //MacRuby 0.4
   error = Pointer.new_with_type('@')

   //MacRuby 0.5
   error = Pointe...
alloc & init

[[NSMutableArray alloc] init]

Array.alloc.init == Array.new

Array.alloc.initWithArray([1])==
Array.arrayWi...
Use Ruby from Objective-C
   //Possible
   id dog = [NSClassFromString(@quot;Dogquot;) new];
   [dog bark]


   //Safer
  ...
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




                                           ...
With InterfaceBuilder you get very much, very fast, with very little code but rather static.
Good for small Apps, prototyp...
More control, understanding, flexibility.
Hello World MacRuby
   framework 'Cocoa'
    
    
   app = NSApplication.sharedApplication
    
   window = NSWindow.allo...
by: http://www.flickr.com/photos/myphotourl
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...
Hello World HotCocoa
  require 'hotcocoa'
  include HotCocoa
   
  application do
    window = window(title: 'Hello World'...
0_0/
Constructors with Smart Defaults
NSWindow.alloc.initWithContentRect([0,0,200,60],
   styleMask:NSTitledWindowMask |
   NSC...
Constant Mappings
button.setBezelStyle(NSRoundedBezelStyle)

button.bezel = :rounded
 
Custom Methods
window.contentView.addSubview(label)


window << label
 
Delegate
button.target = 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: macruby.org


Help: MacRuby-devel on MacOSForge
Twitter: @MacRuby


Thilo Utke 2009 for RailsWayCon
Upstrea...
MacRuby & HotCocoa
MacRuby & HotCocoa
MacRuby & HotCocoa
Upcoming SlideShare
Loading in …5
×

MacRuby & HotCocoa

8,795 views

Published on

Published in: Technology
  • Be the first to comment

MacRuby & HotCocoa

  1. MacRuby & HotCocoa Tasty Apps for OS X Thilo Utke 2009
  2. 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.
  3. Outline Intro Objective-C Encounter Apple - Ruby RubyCocoa MacRuby 0.5 MacRuby <-> Obj-C Interface Builder Integration Back to Code with HotCocoa Impact
  4. I’m a WebDeveloper.
  5. UPSTREAM My Company
  6. Alexander Lang, also Founder and Owner of Upstream
  7. Wrote CouchPotato. Talks about Ruby Libs for CouchDB
  8. We did Community, Productivity, Finance and Educational Websites. Our own product is doingText.com
  9. Rails enabled us to build WebApps really fast.
  10. Text I love Ruby!
  11. To be fast and deliver reliable applications, we build software with test first.
  12. New libraries, gems and technics keep WebDevelopment interesting.
  13. Boring!!!! www.flickr.com/photos/ipom Still I get bored easily, so I play with new technologies.
  14. Thats why I have an iPhone.
  15. That’s why Alex has an iPhone.
  16. That’s why we play with couchDB.
  17. That’s why I thought Obj-C might be interesting.
  18. SmallTalk Ruby Obj-C Ruby and Obj-C have a common ancestry.
  19. Ruby Obj-C Reflective Dynamic Garbage Collection Object Oriented Characteristics they have in common.
  20. Ruby Obj-C Closures FFI, C-Ext C-SuperSet methodname(1,2) method: 1 name:2 Interpreter Compiler Things that differ.
  21. Grabbed this book to start with Obj-C.
  22. 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.
  23. o_0 Felt like back in C programming class. Thrown Obj-C away. Yes, Ruby spoiled me.
  24. MacRuby 0.3 Heard about MacRuby with the 0.3 release.
  25. 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.
  26. 0_0/ Header files, types, braces, and semicolons are gone. Much less code. Yeah!
  27. It is from Apple!
  28. Apple wants Ruby to be a first class citizen on OS X Where that comes from.
  29. 2001 Ruby extension for NSObject and NSClassFromString function by Hisakuni Fujimoto
  30. 2002 RubyCocoa Project Ruby 1.6.7 on OS X 10.2
  31. 2005 Ruby 1.8.2 on OS X 10.4 For a long time nothing happened.
  32. 2006 Laurent Sansonetti from Apple joined RubyCocoa Things started to move.
  33. 2007 Ruby 1.8.6, Rails, RubyGems and RubyCocoa on OSX 10.5 Big move
  34. RubyCocoa Frameworks App Std Lib Obj-C Ruby Code GC GC IO GCC Bridge MRI 1.8 Obj-C Runtime RubyCocoa Architecture
  35. 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
  36. 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
  37. 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.
  38. RubyCocoa Duplicated infrastructure Frameworks App Std Lib Obj-C Ruby Code GC GC IO GCC Bridge MRI 1.8 Obj-C Runtime
  39. 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
  40. Thanks to RubyCocoa for some cool apps, like GitNub.
  41. 2008 MacRuby shall replace RubyCocoa in the future The appearance of MacRuby
  42. 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
  43. MacRuby 0.5 App Std Lib Frameworks Ruby Code Obj-C LLVM JIT/AOT GC IO GCC Obj-C Runtime MacRuby architecture
  44. 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
  45. ./miniruby -e 'p Array.new.methods(true, 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.
  46. 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
  47. 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.
  48. 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?
  49. 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.
  50. MacRuby 0.5 MacRuby is not fully functional yet. Not installable around 85% RubySpecs passes. You can play with miniruby.
  51. MacRuby 0.4 “Stable” version
  52. Using Frameworks #import <Cocoa/Cocoa.h> framework 'Cocoa'     Require a framework
  53. Calling Obj-C Methods [dog makeNoise:@”wuff” level:6]; dog.makeNoise “wuff”, level:6 dog.makeNoise “wuff”, :level => 6    
  54. Defining Methods for Obj-C - (id) makeNoise:(NSString)noise level:(NSInteger)level; def makeNoise(noise, level:level)  
  55. Using Structs NSPoint(0,1) NSpoint.new(0,1)  
  56. Pointer NSError* error; //MacRuby 0.4 error = Pointer.new_with_type('@') //MacRuby 0.5 error = Pointer.new(:object)   Pointers are often used as a means for output parameters, mostly for error handling.
  57. alloc & init [[NSMutableArray alloc] init] Array.alloc.init == Array.new Array.alloc.initWithArray([1])== Array.arrayWithArray([1])
  58. 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!
  59. XCode MacRuby is supported in XCode.
  60. Interface Builder Also support by Interface Builder
  61. Read this book to learn more about Interface Builder and XCode.
  62. Interface Builder Wire the GUI to your code.
  63. OUTLETS References to GUI elements
  64. attr_writer :stalutation attr_accessor :user_input
  65. ACTIONS Methods, which are supposed to be called on UI events.
  66. def showSalutation(sender) @stalutation.stringValue = quot;Hi RailsWayCon!quot; end
  67. Delegates Specific to Ruby Cocoa and other frameworks.
  68. 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.
  69. With InterfaceBuilder you get very much, very fast, with very little code but rather static. Good for small Apps, prototypes, App parts.
  70. More control, understanding, flexibility.
  71. 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   app.run No InterfaceBuilder -> lots of code
  72. by: http://www.flickr.com/photos/myphotourl HotCocoa. Not only a tasty drink but a smart Lib shipped with MacRuby.
  73. HotCocoa Ruby Wrapper for major frameworks AppKit WebKit QtKit CoreGraphics CoreImage
  74. 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
  75. 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.
  76. 0_0/
  77. 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])  
  78. Constant Mappings button.setBezelStyle(NSRoundedBezelStyle) button.bezel = :rounded  
  79. Custom Methods window.contentView.addSubview(label) window << label  
  80. Delegate button.target = self button.action = 'sayHello' def sayHello p 'Hello!' end botton.on_action {p 'Hello!'}  
  81. HotCoco Documentation Soon see /hotcocoa/mappings HotConsole at gitHub to play arround
  82. Lot of work to do to understand all available OS X frameworks.
  83. So What? The implications of MacRuby
  84. Movement ?
  85. Better Tool Support != Apple | XCode | InterfaceBuilder HotCocoa, Rucola (App. Gen.) HotConsole
  86. Mature Testing Libraries TestUnit (working) Mocha (working) Rspec Shoulda Cucumber (GUI manipulation?)
  87. More applications for MAC!
  88. Thanks Start: macruby.org Help: MacRuby-devel on MacOSForge Twitter: @MacRuby Thilo Utke 2009 for RailsWayCon Upstream-Agile GmbH (upstream-berlin.com)

×