Slide 1

Slide 1 text

mmm.. mruby Aloha RubyConf 2012 - Matt Aimonetti @merbist Tuesday, October 9, 12

Slide 2

Slide 2 text

revisit ruby Tuesday, October 9, 12

Slide 3

Slide 3 text

Nico disclaimer Tuesday, October 9, 12

Slide 4

Slide 4 text

Nico Tuesday, October 9, 12

Slide 5

Slide 5 text

Tuesday, October 9, 12

Slide 6

Slide 6 text

Tuesday, October 9, 12

Slide 7

Slide 7 text

“now” hiring Tuesday, October 9, 12

Slide 8

Slide 8 text

1. walk around 2. ask the audience questions 3. don't read your content 4. change your tone of voice frequently 5. have a mai-tai before you start? 6. enjoy yourself Tuesday, October 9, 12

Slide 9

Slide 9 text

ruby Tuesday, October 9, 12

Slide 10

Slide 10 text

JRuby C Ruby REE rubinus MacRuby IronRuby Maglev Tuesday, October 9, 12

Slide 11

Slide 11 text

Tuesday, October 9, 12

Slide 12

Slide 12 text

mruby Tuesday, October 9, 12

Slide 13

Slide 13 text

why? Tuesday, October 9, 12

Slide 14

Slide 14 text

modular Tuesday, October 9, 12

Slide 15

Slide 15 text

float instead of double max func args disable regexp disable sprintf disable math disable time disable stdio memory management Tuesday, October 9, 12

Slide 16

Slide 16 text

anything that isn’t cross platform isn’t available Tuesday, October 9, 12

Slide 17

Slide 17 text

embedded Tuesday, October 9, 12

Slide 18

Slide 18 text

Lego Mindstorms NXT 64kb RAM Tuesday, October 9, 12

Slide 19

Slide 19 text

mruby != ruby 2.0 Tuesday, October 9, 12

Slide 20

Slide 20 text

Tuesday, October 9, 12

Slide 21

Slide 21 text

matz’ embeddable minimal implementation of the ruby language mmmmm mruby Tuesday, October 9, 12

Slide 22

Slide 22 text

minimalistic ruby Tuesday, October 9, 12

Slide 23

Slide 23 text

Tuesday, October 9, 12

Slide 24

Slide 24 text

mruby preliminary release Tuesday, October 9, 12

Slide 25

Slide 25 text

Regional Innovation Creation R&D Program Tuesday, October 9, 12

Slide 26

Slide 26 text

execution Tuesday, October 9, 12

Slide 27

Slide 27 text

• $ mruby hello_world.rb execution Tuesday, October 9, 12

Slide 28

Slide 28 text

• $ mruby hello_world.rb • REPL / mirb execution Tuesday, October 9, 12

Slide 29

Slide 29 text

• $ mruby hello_world.rb • REPL / mirb • $ mruby -e “p ‘Hello World!’ ” execution Tuesday, October 9, 12

Slide 30

Slide 30 text

• $ mruby hello_world.rb • REPL / mirb • $ mruby -e “p ‘Hello World!’ ” • bytecode (intermediate representation) execution Tuesday, October 9, 12

Slide 31

Slide 31 text

• $ mruby hello_world.rb • REPL / mirb • $ mruby -e “p ‘Hello World!’ ” • bytecode (intermediate representation) • convert to C code (readable or binary) execution Tuesday, October 9, 12

Slide 32

Slide 32 text

2012 #include   #include   /*  Include  the  needed  mruby  headers  */ #include   #include   int  main(void) {    mrb_state  *mrb  =  mrb_open();    char  code[]  =  "p  'hello  world!'";    printf("Executing  Ruby  code  from  C!\n");    mrb_load_string(mrb,  code);    return  0; } Tuesday, October 9, 12

Slide 33

Slide 33 text

2012 $  gcc  -­‐Iinclude  hello.c  lib/libmruby.a  -­‐lm  -­‐o   hello.out $  ./hello.out Executing  Ruby  code  from  C! "hello  world!" Tuesday, October 9, 12

Slide 34

Slide 34 text

Use case(s)? Tuesday, October 9, 12

Slide 35

Slide 35 text

anywhere Lua is used Tuesday, October 9, 12

Slide 36

Slide 36 text

Tuesday, October 9, 12

Slide 37

Slide 37 text

Lua combines simple procedural syntax with powerful data description constructs based on associative arrays and extensible semantics. Tuesday, October 9, 12

Slide 38

Slide 38 text

Ruby is a dynamic programming language with a focus on simplicity and productivity. It has an elegant syntax that is natural to read and easy to write. Tuesday, October 9, 12

Slide 39

Slide 39 text

2009 survey - scripting languages used by game developers Tuesday, October 9, 12

Slide 40

Slide 40 text

small footprint portable very easily embedded Tuesday, October 9, 12

Slide 41

Slide 41 text

“Lua mruby is dynamically typed, runs by interpreting bytecode for a register-based virtual machine, and has automatic memory management with incremental garbage collection, making it ideal for configuration, scripting, and rapid prototyping.” Tuesday, October 9, 12

Slide 42

Slide 42 text

mobiruby Tuesday, October 9, 12

Slide 43

Slide 43 text

http://mobiruby.org/ Tuesday, October 9, 12

Slide 44

Slide 44 text

ruby for node.js https://github.com/mattn/mruby-uv Tuesday, October 9, 12

Slide 45

Slide 45 text

mix JS & Ruby using Node.js Tuesday, October 9, 12

Slide 46

Slide 46 text

mod_mruby https://github.com/matsumoto-r/mod_mruby Tuesday, October 9, 12

Slide 47

Slide 47 text

backends  =  [        "http://192.168.0.101:8888/",        "http://192.168.0.102:8888/",        "http://192.168.0.103:8888/",        "http://192.168.0.104:8888/", ] #  write  balancing  algorithm  here. r  =  Apache::Request.new() r.handler    =  "proxy-­‐server" r.proxyreq  =  Apache::PROXYREQ_REVERSE r.filename  =  "proxy:"  +                          backends[rand(backends.length)]  +  r.uri Apache::return(Apache::OK) Tuesday, October 9, 12

Slide 48

Slide 48 text

Tuesday, October 9, 12

Slide 49

Slide 49 text

Gotchas Tuesday, October 9, 12

Slide 50

Slide 50 text

no fork no threads Tuesday, October 9, 12

Slide 51

Slide 51 text

no “require” Tuesday, October 9, 12

Slide 52

Slide 52 text

not officially released Tuesday, October 9, 12

Slide 53

Slide 53 text

very little documentation Tuesday, October 9, 12

Slide 54

Slide 54 text

no std lib Tuesday, October 9, 12

Slide 55

Slide 55 text

https:// github.com/ iij/mruby mruby extension for unix Tuesday, October 9, 12

Slide 56

Slide 56 text

• Digest::MD5/RIPEMD160/SHA1/SHA256/SHA384/SHA512 • Digest::HMAC: #reset • ENV: ::[] :: []= ::clear ::delete ::inspect ::keys ::size ::store ::to_a ::to_hash ::to_s ::values • Errno::EXXX • File: ::open ::umask ::unlink ::delete ::rename ::exist? ::exists? ::dirname #path • IO: ::open ::sysopen ::popen #close #closed? #each #each_byte #each_line #read #sync #sync= #write #to_io • Regexp: ::compile ::last_match #match • TCPSocket: ::new ::open • UNIXSocket: #addr ::new ::open #peeraddr • Syslog: ::open ::close ::log ::opened? ::ident ::options ::facility • SystemCallError • Kernel: #exit #sleep #system • (and more, including features that should land in mruby master) Tuesday, October 9, 12

Slide 57

Slide 57 text

so how fast is it? Tuesday, October 9, 12

Slide 58

Slide 58 text

Benchmark time!!! Tuesday, October 9, 12

Slide 59

Slide 59 text

ruby is a hacking language Tuesday, October 9, 12

Slide 60

Slide 60 text

use ruby everywhere! Tuesday, October 9, 12

Slide 61

Slide 61 text

Tuesday, October 9, 12

Slide 62

Slide 62 text

Tuesday, October 9, 12

Slide 63

Slide 63 text

Tuesday, October 9, 12

Slide 64

Slide 64 text

Tuesday, October 9, 12

Slide 65

Slide 65 text

Tuesday, October 9, 12

Slide 66

Slide 66 text

Tuesday, October 9, 12

Slide 67

Slide 67 text

ruby everywhere! not just for the web Tuesday, October 9, 12

Slide 68

Slide 68 text

Questions? Tuesday, October 9, 12

Slide 69

Slide 69 text

revisit ruby (talk part deux) Tuesday, October 9, 12

Slide 70

Slide 70 text

functional AND object oriented Tuesday, October 9, 12

Slide 71

Slide 71 text

functional! Tuesday, October 9, 12

Slide 72

Slide 72 text

functional freedom programming Tuesday, October 9, 12

Slide 73

Slide 73 text

no side effects Tuesday, October 9, 12

Slide 74

Slide 74 text

higher order functions Tuesday, October 9, 12

Slide 75

Slide 75 text

composability Tuesday, October 9, 12

Slide 76

Slide 76 text

(1..17).select(&:odd?). map(&:to_f). map do |x| (x / rand(99)).rationalize end # => [(1/61), (3/68), (5/22), (7/45), (9/68), (11/23), (1/6), (15/46), (17/13)] Tuesday, October 9, 12

Slide 77

Slide 77 text

Enumerator:: Lazy Tuesday, October 9, 12

Slide 78

Slide 78 text

currying Tuesday, October 9, 12

Slide 79

Slide 79 text

sum = -> func,a,b do result = 0 a.upto(b){|n| result += func.(n) } result end # currying curried_sum = sum.curry # partial functions sum_ints = curried_sum[-> x {x}] sum_of_squares = curried_sum[-> x {x**2}] sum_of_powers_of_2 = curried_sum[-> x {2**x}] # results sum_ints[1,5] #=> 15 sum_of_squares.call(1,5) #=> 55 sum_of_powers_of_2.(1,5) #=> 62 Tuesday, October 9, 12

Slide 80

Slide 80 text

TCO Tuesday, October 9, 12

Slide 81

Slide 81 text

RubyVM::InstructionSequence.\ compile_option[:tailcall_optimization] Tuesday, October 9, 12

Slide 82

Slide 82 text

vm_opts.h #define OPT_TAILCALL_OPTIMIZATION 1 Tuesday, October 9, 12

Slide 83

Slide 83 text

def fact(n, r=1) if n < 2 r else fact(n-1, n*r) end end fact(30_000) # => SystemStackError: stack level too deep Tuesday, October 9, 12

Slide 84

Slide 84 text

option = { tailcall_optimization: true, trace_instruction: false, } iseq = RubyVM::InstructionSequence.new(<<-EOF, "fact.rb", '/', nil, option).eval class Tailcall def fact(n, r=1) if n < 2 r else fact(n-1, n*r) end end end EOF Tailcall.new.fact(30_000) Tuesday, October 9, 12

Slide 85

Slide 85 text

pattern matching Tuesday, October 9, 12

Slide 86

Slide 86 text

me = ["Matt",42, "San Diego"] awesome_places = ["San Diego", "Hawaii"] case me when -> list {seq.first == "matt" } puts "Hey #{list.first} from #{list.last}" when -> list {awesome_places.include?(seq.last)} puts "Yay #{list.first}, you live in \ an awesome place" else puts ":(" end Tuesday, October 9, 12

Slide 87

Slide 87 text

immutability Tuesday, October 9, 12

Slide 88

Slide 88 text

not a requirement to be FP Tuesday, October 9, 12

Slide 89

Slide 89 text

modules don’t have to be mixins Tuesday, October 9, 12

Slide 90

Slide 90 text

module RubyConf module_function def generate_oauth_token(id, scope, expiration) "#{id}#{scope}#{expiration}" end def valid_headers?(headers) true end def set_sso_cookies!(response) response.set_cookie 'sso', {value: '123', domain: TLD} response end end Tuesday, October 9, 12

Slide 91

Slide 91 text

Ruby not really optimized for FP (yet) Tuesday, October 9, 12

Slide 92

Slide 92 text

ruby everywhere! Tuesday, October 9, 12

Slide 93

Slide 93 text

“ruby” developers Tuesday, October 9, 12

Slide 94

Slide 94 text

product builders Tuesday, October 9, 12

Slide 95

Slide 95 text

you’re also hackers! Tuesday, October 9, 12

Slide 96

Slide 96 text

have fun! Tuesday, October 9, 12

Slide 97

Slide 97 text

play with ruby everywhere! Tuesday, October 9, 12

Slide 98

Slide 98 text

matt aimonetti @ m e r b i s t Tuesday, October 9, 12