Slide 1

Slide 1 text

MACRUBY A p p l e ’ s R u b y M a t t A i m o n e t t i - R u b y C o n f X - N o v 2 0 1 0 Friday, November 12, 2010

Slide 2

Slide 2 text

ABOUT ME Friday, November 12, 2010

Slide 3

Slide 3 text

Friday, November 12, 2010

Slide 4

Slide 4 text

Hacker Friday, November 12, 2010

Slide 5

Slide 5 text

MacRuby Friday, November 12, 2010

Slide 6

Slide 6 text

http://macruby.labs.oreilly.com/ Friday, November 12, 2010

Slide 7

Slide 7 text

MACRUBY A p p l e ’ s R u b y Friday, November 12, 2010

Slide 8

Slide 8 text

MacRuby YARV Parser GC Runtime Stdlib Builtin classes Ruby 1.9 Friday, November 12, 2010

Slide 9

Slide 9 text

MacRuby LLVM/Roxor Parser Stdlib AOT JIT Obj-C Runtime libobjc libauto Builtin Classes CoreFoundation MacRuby Friday, November 12, 2010

Slide 10

Slide 10 text

MacRuby LLVM/Roxor Parser Stdlib AOT JIT Obj-C Runtime libobjc libauto Builtin Classes CoreFoundation YARV Parser GC Runtime Stdlib Builtin classes Ruby 1.9 Friday, November 12, 2010

Slide 11

Slide 11 text

MacRuby LLVM Friday, November 12, 2010

Slide 12

Slide 12 text

JIT Compilation MacRuby Friday, November 12, 2010

Slide 13

Slide 13 text

JIT Compilation MacRuby Ruby AST LLVM IR Machine Code CPU Transforms the AST into LLVM intermediate representation ... optimizes it ... compiles it to machine code ... and executes it! Very good performance for algorithmic operations Friday, November 12, 2010

Slide 14

Slide 14 text

AOT Compilation MacRuby Friday, November 12, 2010

Slide 15

Slide 15 text

AOT Compilation MacRuby Ruby AST LLVM IR Machine Code Mach-O Object File CLI tool or Xcode ... applies more optimizations ... and saves the machine code to disk ... faster bootstrap time Can be used to obfuscate the source code Friday, November 12, 2010

Slide 16

Slide 16 text

NO GIL No Global Interpreter Lock Friday, November 12, 2010

Slide 17

Slide 17 text

GC Thread Thread VM VM VM Core Friday, November 12, 2010

Slide 18

Slide 18 text

MULTI-THREADED GENERATIONAL GC Friday, November 12, 2010

Slide 19

Slide 19 text

NATIVE ACCESS TO COCOA Friday, November 12, 2010

Slide 20

Slide 20 text

WHEN . TO USE MACRUBY? NOT Friday, November 12, 2010

Slide 21

Slide 21 text

YOU DON’T HAVE A MAC Friday, November 12, 2010

Slide 22

Slide 22 text

LINUX HOSTING Friday, November 12, 2010

Slide 23

Slide 23 text

YOU DON’T WANT TO LEARN Friday, November 12, 2010

Slide 24

Slide 24 text

WHAT’S NEW? Friday, November 12, 2010

Slide 25

Slide 25 text

COCOA DEV IS STABLE Friday, November 12, 2010

Slide 26

Slide 26 text

DNA Sequencing by Hampton Catlin Friday, November 12, 2010

Slide 27

Slide 27 text

AOT COMPILATION Friday, November 12, 2010

Slide 28

Slide 28 text

MacRuby: De nitive Guide Hello World Example Friday, November 12, 2010

Slide 29

Slide 29 text

framework 'AppKit' class AppDelegate def applicationDidFinishLaunching(notification) voice_type = "com.apple.speech.synthesis.voice.GoodNews" @voice = NSSpeechSynthesizer.alloc.initWithVoice(voice_type) end def windowWillClose(notification) puts "Bye!" exit end def say_hello(sender) @voice.startSpeakingString("Hello World!") puts "Hello World!" end end app = NSApplication.sharedApplication app.delegate = AppDelegate.new window = NSWindow.alloc.initWithContentRect([200, 300, 300, 100], styleMask:NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask, backing:NSBackingStoreBuffered, defer:false) window.title = 'MacRuby: The Definitive Guide' window.level = 3 window.delegate = app.delegate button = NSButton.alloc.initWithFrame([80, 10, 120, 80]) button.bezelStyle = 4 button.title = 'Hello World!' button.target = app.delegate button.action = 'say_hello:' window.contentView.addSubview(button) window.display window.orderFrontRegardless app.run hello_world.rb Friday, November 12, 2010

Slide 30

Slide 30 text

$ macrubyc hello_world.rb -o demo $ file demo demo: Mach-O 64-bit executable x86_64 $ ./demo Compile to machine code Friday, November 12, 2010

Slide 31

Slide 31 text

w00t!! Friday, November 12, 2010

Slide 32

Slide 32 text

Create compiled/ dynamic libraries $ macrubyc file1.rb file2.rb -o shared.dylib --dylib $ macrubyc other_project_source.rb shared.dylib -o example $ ./example Friday, November 12, 2010

Slide 33

Slide 33 text

DEBUGGER Friday, November 12, 2010

Slide 34

Slide 34 text

characters = %w{Adama Apollo Baltar Roslin StarBuck Six} def cylon?(character) false # buggy detector end characters.each do |character| if cylon?(character) puts "#{character} is a Cylon!" else puts "#{character} is not a cylon." end end Friday, November 12, 2010

Slide 35

Slide 35 text

$ macruby cylon_detector.rb Adama is not a cylon. Apollo is not a cylon. Baltar is not a cylon. Roslin is not a cylon. StarBuck is not a cylon. Six is not a cylon. Buggy code :( Friday, November 12, 2010

Slide 36

Slide 36 text

$ macrubyd cylon_detector.rb Starting program. 1! characters = %w{Adama Apollo Baltar Roslin StarBuck Six} cylon_detector.rb:1> Debug the detector live Friday, November 12, 2010

Slide 37

Slide 37 text

cylon_detector.rb:1> b cylon_detector.rb:8 if character == 'Six' Added breakpoint 1. Added a breakpoint on a speci c le/line based on a condition Friday, November 12, 2010

Slide 38

Slide 38 text

cylon_detector.rb:1> c Adama is not a cylon. Apollo is not a cylon. Baltar is not a cylon. Roslin is not a cylon. StarBuck is not a cylon. 8! if cylon?(character) cylon_detector.rb:8> Breaks on condition Friday, November 12, 2010

Slide 39

Slide 39 text

cylon_detector.rb:8> p character => "Six" cylon_detector.rb:8> p cylon?(character) => false Bug con rmed :( Friday, November 12, 2010

Slide 40

Slide 40 text

cylon_detector.rb:8> p def cylon?(character) character == 'Six' end ZOMG live bug xing! Friday, November 12, 2010

Slide 41

Slide 41 text

cylon_detector.rb:8> c Six is a Cylon! Program exited. w00t!! Friday, November 12, 2010

Slide 42

Slide 42 text

GCD API https://github.com/MacRuby/MacRuby/tree/trunk/lib/dispatch/ Friday, November 12, 2010

Slide 43

Slide 43 text

https://github.com/MacRuby/MacRuby/tree/trunk/lib/dispatch/ Threads can be complicated to program :( Friday, November 12, 2010

Slide 44

Slide 44 text

Global Interpreter Lock VM Friday, November 12, 2010

Slide 45

Slide 45 text

Slow :( Friday, November 12, 2010

Slide 46

Slide 46 text

Full concurrency via multiple processes :( Friday, November 12, 2010

Slide 47

Slide 47 text

Safe data :) Friday, November 12, 2010

Slide 48

Slide 48 text

https://github.com/MacRuby/MacRuby/tree/trunk/lib/dispatch/ MacRuby doesn’t have a global VM lock Friday, November 12, 2010

Slide 49

Slide 49 text

https://github.com/MacRuby/MacRuby/tree/trunk/lib/dispatch/ MacRuby VM Core VM VM Friday, November 12, 2010

Slide 50

Slide 50 text

Good but not good enough, threads are still a pain in the butt! Friday, November 12, 2010

Slide 51

Slide 51 text

https://github.com/MacRuby/MacRuby/tree/trunk/lib/dispatch/ libdispatch Friday, November 12, 2010

Slide 52

Slide 52 text

Let GCD gure out how many threads to use! https://github.com/MacRuby/MacRuby/tree/trunk/lib/dispatch/ require 'dispatch' job = Dispatch::Job.new { slow_operation } job.value # => “wait for the result” Friday, November 12, 2010

Slide 53

Slide 53 text

Asynchronous API https://github.com/MacRuby/MacRuby/tree/trunk/lib/dispatch/ require 'dispatch' job = Dispatch::Job.new { slow_operation } job.value do |v| "asynchronous dispatch when done!" end Friday, November 12, 2010

Slide 54

Slide 54 text

Elegant wrapper API https://github.com/MacRuby/MacRuby/tree/trunk/lib/dispatch/ require 'dispatch' job = Dispatch::Job.new job.add { slow_operation(a) } job.add { slow_operation(b) } job.add { slow_operation(c) } job.join job.values # =>[result_a, result_b, result_c] Friday, November 12, 2010

Slide 55

Slide 55 text

Dispatch Enumerable Parallel Iterations https://github.com/MacRuby/MacRuby/tree/trunk/lib/dispatch/ require 'dispatch' geeks.p_each do |user| print find_pair(user) end Friday, November 12, 2010

Slide 56

Slide 56 text

https://github.com/MacRuby/MacRuby/tree/trunk/lib/dispatch/ Remember: MacRuby doesn’t have a global VM lock! Friday, November 12, 2010

Slide 57

Slide 57 text

https://github.com/MacRuby/MacRuby/tree/trunk/lib/dispatch/ Serial queues: lock free synchronization Friday, November 12, 2010

Slide 58

Slide 58 text

https://github.com/MacRuby/MacRuby/tree/trunk/lib/dispatch/ require 'dispatch' job = Dispatch::Job.new @scores = job.synchronize Hash.new [user1, user2, user3].each do |user| job.add \ { @scores[user.name] = calculate(user) } end job.join @scores[user1.name] # => 1042 @scores[user2.name] # => 673 @scores[user3.name] # => 845 Friday, November 12, 2010

Slide 59

Slide 59 text

https://github.com/MacRuby/MacRuby/tree/trunk/lib/dispatch/ require 'dispatch' job = Dispatch::Job.new @scores = job.synchronize Hash.new [user1, user2, user3].each do |user| job.add \ { @scores[user.name] = calculate(user) } end job.join @scores[user1.name] # => 1042 @scores[user2.name] # => 673 @scores[user3.name] # => 845 safe proxy object Friday, November 12, 2010

Slide 60

Slide 60 text

CONTROLTOWER http://github.com/MacRuby/ControlTower Friday, November 12, 2010

Slide 61

Slide 61 text

http://github.com/MacRuby/ControlTower Web server for Rack apps Friday, November 12, 2010

Slide 62

Slide 62 text

NEW DISPATCHER Friday, November 12, 2010

Slide 63

Slide 63 text

ONIGURUMA TO ICU Friday, November 12, 2010

Slide 64

Slide 64 text

MORE SOLID FOUNDATIONS Friday, November 12, 2010

Slide 65

Slide 65 text

SUPPORT FOR C BLOCKS Friday, November 12, 2010

Slide 66

Slide 66 text

SANDBOX Friday, November 12, 2010

Slide 67

Slide 67 text

$ macirb --simple-prompt >> require 'open-uri' => true >> begin >> Sandbox.no_internet.apply! >> open('http://www.macruby.org') >> rescue SystemCallError => exception >> puts exception >> end Operation not permitted - connect(2) => nil Friday, November 12, 2010

Slide 68

Slide 68 text

•Sandbox.pure_computation •Sandbox.no_internet •Sandbox.no_network •Sandbox.temporary_writes •Sandbox.no_writes 5 default pro les Friday, November 12, 2010

Slide 69

Slide 69 text

APP STORE Friday, November 12, 2010

Slide 70

Slide 70 text

Great exposure! Friday, November 12, 2010

Slide 71

Slide 71 text

Better user experience Friday, November 12, 2010

Slide 72

Slide 72 text

Reinvent desktop apps Friday, November 12, 2010

Slide 73

Slide 73 text

/Developer/Examples/Ruby/MacRuby/ What can you do with MacRuby?! Friday, November 12, 2010

Slide 74

Slide 74 text

Speech Recognizer Friday, November 12, 2010

Slide 75

Slide 75 text

Friday, November 12, 2010

Slide 76

Slide 76 text

CoreLocation Friday, November 12, 2010

Slide 77

Slide 77 text

Friday, November 12, 2010

Slide 78

Slide 78 text

Friday, November 12, 2010

Slide 79

Slide 79 text

Address Book.app Friday, November 12, 2010

Slide 80

Slide 80 text

Friday, November 12, 2010

Slide 81

Slide 81 text

String Tokenizer Friday, November 12, 2010

Slide 82

Slide 82 text

framework 'Foundation' class String def language CFStringTokenizerCopyBestStringLanguage(self, CFRangeMake(0, self.size)) end end Call a C function directly Friday, November 12, 2010

Slide 83

Slide 83 text

framework 'Foundation' class String def language CFStringTokenizerCopyBestStringLanguage(self, CFRangeMake(0, self.size)) end end ["Bonne année!", "Happy new year!", "¡Feliz año nuevo!", "Felice anno nuovo!", "ةﺪﻴﻌﺳ دﺎﻴﻋأ", "໌͚·͓ͯ͠ΊͰͱ͏͍͟͝·͢ɻ"].each do |msg| puts "#{msg} (#{msg.language})" end Friday, November 12, 2010

Slide 84

Slide 84 text

Bonne année! (fr) Happy new year! (en) ¡Feliz año nuevo! (es) Felice anno nuovo! (it) (ar) ةﺪﻴﻌﺳ دﺎﻴﻋأ ໌͚·͓ͯ͠ΊͰͱ͏͍͟͝·͢ɻ (ja) Friday, November 12, 2010

Slide 85

Slide 85 text

Bluetooth Hardware WebKit JS Bridge Friday, November 12, 2010

Slide 86

Slide 86 text

Friday, November 12, 2010

Slide 87

Slide 87 text

http://macruby.org download & dble click No conflict with your Rubies Friday, November 12, 2010

Slide 88

Slide 88 text

@merbist http://merbist.com http://macruby.labs.oreilly.com http://github.com/mattetti Friday, November 12, 2010