MacRuby & HotCocoa

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    5 Favorites

    MacRuby & HotCocoa - Presentation Transcript

    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:@\"Generator seeded\"]; } 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 = \"Generator doesn't need to be seeded ;)\" 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 \"Hi\" != @\"Hi\" 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)' [:\"sortUsingFunction:context:\", :\"exchangeObjectAtIndex:withObjectA tIndex:\", :removeAllObjects, :\"getObjects:range:\", :\"containsObject :inRange:\", :removeObjectsInRange, :removeObjectAtIndex, :removeLas tObject, :\"replaceObjectAtIndex:withObject:\", :\"insertObject:atInde x:\", :addObject, :\"countByEnumeratingWithState:objects:count:\", :ob jectAtIndex, :count, :mutableCopyWithZone, :copyWithZone, :classFor Coder, :finalize, :hash, :isEqual, :sortUsingDescriptors, :filterUs ingPredicate, :initWithContentsOfURL, :initWithContentsOfFile, :sor tUsingSelector, :\"removeObjectsFromIndices:numIndices:\", :removeObj ectsAtIndexes, :\"replaceObjectsAtIndexes:withObjects:\", :\"insertObj ects:atIndexes:\", :\"sortUsingFunction:context:range:\", :\"initWithOb jects:count:\", :initWithCapacity, :removeObjectsInArray, :\"removeOb jectIdenticalTo:inRange:\", :removeObjectIdenticalTo, :\"removeObject :inRange:\", :removeObject, :\"removeObject:range:identical:\", :setAr ray, :\"setObject:atIndex:\", :addObjectsFromArray, :\"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 \"Hello RailsWayCon!\"' \"Hello RailsWayCon!\" 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(@\"Dog\") new]; [dog bark] //Safer id dog = [[MacRuby sharedRuntime] evaluateString:@\"Dog.new\"]; [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 = \"Hi RailsWayCon!\" 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 = \"Hello RailsWayCon!\" 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)

    + freaklikemefreaklikeme, 5 months ago

    custom

    2610 views, 5 favs, 1 embeds more stats

    More info about this document

    © All Rights Reserved

    Go to text version

    • Total Views 2610
      • 2608 on SlideShare
      • 2 from embeds
    • Comments 0
    • Favorites 5
    • Downloads 50
    Most viewed embeds
    • 2 views on http://www.fachak.com

    more

    All embeds
    • 2 views on http://www.fachak.com

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as inappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel
    File a copyright complaint
    Having problems? Go to our helpdesk?

    Categories