Slide 1

Slide 1 text

Powered by Rabbit 1.0.4 Ruby 2.0 Chief Architect, Ruby @ Heroku @yukihiro_matz Yukihiro "Matz" Matsumoto

Slide 2

Slide 2 text

Powered by Rabbit 1.0.4   Ruby1.8 will die soon 1/143

Slide 3

Slide 3 text

Powered by Rabbit 1.0.4   Move to Ruby2.0 now 2/143

Slide 4

Slide 4 text

Powered by Rabbit 1.0.4   1.8.7 3/143

Slide 5

Slide 5 text

Powered by Rabbit 1.0.4   Rails tragedy 4/143

Slide 6

Slide 6 text

Powered by Rabbit 1.0.4   1.9.0 5/143

Slide 7

Slide 7 text

Powered by Rabbit 1.0.4   Compatibility tragedy 6/143

Slide 8

Slide 8 text

Powered by Rabbit 1.0.4   Ruby2.0 7/143

Slide 9

Slide 9 text

Powered by Rabbit 1.0.4   The happiest release ever 8/143

Slide 10

Slide 10 text

Powered by Rabbit 1.0.4   Faster 9/143

Slide 11

Slide 11 text

Powered by Rabbit 1.0.4   Better 10/143

Slide 12

Slide 12 text

Powered by Rabbit 1.0.4   `100% Compatible' 11/143

Slide 13

Slide 13 text

Powered by Rabbit 1.0.4   February 24 1993 12/143

Slide 14

Slide 14 text

Powered by Rabbit 1.0.4   I started developing Ruby 13/143

Slide 15

Slide 15 text

Powered by Rabbit 1.0.4   The date I named it 14/143

Slide 16

Slide 16 text

Powered by Rabbit 1.0.4   December 21 1995 15/143

Slide 17

Slide 17 text

Powered by Rabbit 1.0.4   I released it to public (0.95) 16/143

Slide 18

Slide 18 text

Powered by Rabbit 1.0.4   Dec 1996 1.0 Aug 1997 1.1 Dec 1998 1.2 Aug 1999 1.4 Sep 2000 1.6 17/143

Slide 19

Slide 19 text

Powered by Rabbit 1.0.4   Aug 2003 1.8 Dec 2007 1.9.0 Aug 2010 1.9.2 Oct 2011 1.9.3 18/143

Slide 20

Slide 20 text

Powered by Rabbit 1.0.4   by courtesy of @a_matsuda 19/143

Slide 21

Slide 21 text

Powered by Rabbit 1.0.4   by courtesy of @a_matsuda 20/143

Slide 22

Slide 22 text

Powered by Rabbit 1.0.4   We released Ruby2.0 21/143

Slide 23

Slide 23 text

Powered by Rabbit 1.0.4   Finally 22/143

Slide 24

Slide 24 text

Powered by Rabbit 1.0.4   On Faburary 24th 2013 23/143

Slide 25

Slide 25 text

Powered by Rabbit 1.0.4   Ruby's 20th birthday 24/143

Slide 26

Slide 26 text

Powered by Rabbit 1.0.4   RubyConf2001 25/143

Slide 27

Slide 27 text

Powered by Rabbit 1.0.4 RubyConf2001 I mentioned Ruby2 26/143

Slide 28

Slide 28 text

Powered by Rabbit 1.0.4 RubyConf2001 new VM new GC native thread embeddable API 27/143

Slide 29

Slide 29 text

Powered by Rabbit 1.0.4 RubyConf2001 I also mentioned psychological barrier 28/143

Slide 30

Slide 30 text

Powered by Rabbit 1.0.4 Version Numbers limited resource 29/143

Slide 31

Slide 31 text

Powered by Rabbit 1.0.4 Psychological Barrier 20 years anniversary 30/143

Slide 32

Slide 32 text

Powered by Rabbit 1.0.4 Psychological Barrier Anniversary Driven Development 31/143

Slide 33

Slide 33 text

Powered by Rabbit 1.0.4 Psychological Barrier ADD 32/143

Slide 34

Slide 34 text

Powered by Rabbit 1.0.4 RubyConf2001 new VM new GC native thread embeddable API 33/143

Slide 35

Slide 35 text

Powered by Rabbit 1.0.4 new VM for performance 34/143

Slide 36

Slide 36 text

Powered by Rabbit 1.0.4 new VM Implemented by Ruby1.9 (YARV) 35/143

Slide 37

Slide 37 text

Powered by Rabbit 1.0.4 new GC GC performance 36/143

Slide 38

Slide 38 text

Powered by Rabbit 1.0.4 new GC Generatoinal GC 37/143

Slide 39

Slide 39 text

Powered by Rabbit 1.0.4 new GC Gave up 38/143

Slide 40

Slide 40 text

Powered by Rabbit 1.0.4 new GC Ruby1.9 improved GC 39/143

Slide 41

Slide 41 text

Powered by Rabbit 1.0.4 new GC Lazy Sweeping 40/143

Slide 42

Slide 42 text

Powered by Rabbit 1.0.4 new GC Bitmap marking (2.0) 41/143

Slide 43

Slide 43 text

Powered by Rabbit 1.0.4 native thread green thread til 1.8 42/143

Slide 44

Slide 44 text

Powered by Rabbit 1.0.4 native thread stack copying 43/143

Slide 45

Slide 45 text

Powered by Rabbit 1.0.4 native thread linking threading library problem 44/143

Slide 46

Slide 46 text

Powered by Rabbit 1.0.4 native thread Ruby1.9 uses native thread 45/143

Slide 47

Slide 47 text

Powered by Rabbit 1.0.4 native thread with GIL 46/143

Slide 48

Slide 48 text

Powered by Rabbit 1.0.4 native thread Giant Interpreter Lock 47/143

Slide 49

Slide 49 text

Powered by Rabbit 1.0.4 native thread thread safe core 48/143

Slide 50

Slide 50 text

Powered by Rabbit 1.0.4 native thread fine grained lock problem 49/143

Slide 51

Slide 51 text

Powered by Rabbit 1.0.4 native thread Compromise 50/143

Slide 52

Slide 52 text

Powered by Rabbit 1.0.4 embeddable API Gave up 51/143

Slide 53

Slide 53 text

Powered by Rabbit 1.0.4 embeddable API Compatibility matters 52/143

Slide 54

Slide 54 text

Powered by Rabbit 1.0.4   Ruby2 in 2001 53/143

Slide 55

Slide 55 text

Powered by Rabbit 1.0.4   Done in Ruby1.9 54/143

Slide 56

Slide 56 text

Powered by Rabbit 1.0.4   The origin of Ruby2.0 today 55/143

Slide 57

Slide 57 text

Powered by Rabbit 1.0.4   RubyConf2003 56/143

Slide 58

Slide 58 text

Powered by Rabbit 1.0.4 RubyConf2003 New Hash literals Keyword arguments Method combination Selector namespace 57/143

Slide 59

Slide 59 text

Powered by Rabbit 1.0.4 New Hash literals {:foo => 1, :bar => 2} as {foo: 1, bar: 2} 58/143

Slide 60

Slide 60 text

Powered by Rabbit 1.0.4 New Hash literals Done in 1.9 59/143

Slide 61

Slide 61 text

Powered by Rabbit 1.0.4 Method combination Allowing method decoration 60/143

Slide 62

Slide 62 text

Powered by Rabbit 1.0.4 Selector namespace Monkey patching with scope 61/143

Slide 63

Slide 63 text

Powered by Rabbit 1.0.4   New features in Ruby2.0 62/143

Slide 64

Slide 64 text

Powered by Rabbit 1.0.4 New features in 2.0 Keyword arguments Module#prepend Enumerable#lazy Refinements 63/143

Slide 65

Slide 65 text

Powered by Rabbit 1.0.4 New features in 2.0 symbol array literals to_h conversion method UTF-8 by default Dtrace / TracePoint 64/143

Slide 66

Slide 66 text

Powered by Rabbit 1.0.4   Keyword Arguments 65/143

Slide 67

Slide 67 text

Powered by Rabbit 1.0.4 Keyword Arguments Named optinal arguments No specific order Descriptive Easy-to-remember 66/143

Slide 68

Slide 68 text

Powered by Rabbit 1.0.4 Keyword Arguments log("Hello!", level: "INFO") Possoble in Ruby1.9 67/143

Slide 69

Slide 69 text

Powered by Rabbit 1.0.4 Keyword Arguments in 1.9 def log(msg, opt = {}) level = opt[:level] || "ERROR" time = opt[:time] || Time.now puts "#{ time.ctime } [#{ level }] #{ msg }" end 68/143

Slide 70

Slide 70 text

Powered by Rabbit 1.0.4 Keyword Arguments in 1.9 What if you want to combin with arbitrary number of arguments descriptive exceptions pass nil as a valid value 69/143

Slide 71

Slide 71 text

Powered by Rabbit 1.0.4 Keyword Arguments in 1.9 def log(*msgs) opt = msgs.last.is_a?(Hash) ? msgs.pop : {} level = opt.key?(:level) ? opt.delete(:level) : "ERROR" time = opt.key?(:time) ? opt.delete(:time) : Time.now raise "unknown keyword: #{ opt.keys.first }" if !opt.empty? msgs.each {|msg| puts "#{ time.ctime } [#{ level }] #{ msg }" } end 70/143

Slide 72

Slide 72 text

Powered by Rabbit 1.0.4 Keyword Arguments in 2.0 def log(msg, level: "ERROR", time: Time.now) puts "#{ time.ctime } [#{ level }] #{ msg }" end 71/143

Slide 73

Slide 73 text

Powered by Rabbit 1.0.4 Keyword Arguments in 2.0 Simpler More descriptive API Easy to read Easy to write 72/143

Slide 74

Slide 74 text

Powered by Rabbit 1.0.4 Keyword Arguments in 2.0 log("Hello!", **opt) You can pass existing hash as keyword arguments 73/143

Slide 75

Slide 75 text

Powered by Rabbit 1.0.4 Keyword Arguments in 2.0 def log(msg, level: "ERROR", time: Time.now, **kw) puts "#{ time.ctime } [#{ level }] #{ msg }" end You can get keyword arguments as a hash Unkown keywords do not raise error 74/143

Slide 76

Slide 76 text

Powered by Rabbit 1.0.4 Keyword Arguments in 2.0 Summary Easy API More descriptive Rails prefer keyword arguments 75/143

Slide 77

Slide 77 text

Powered by Rabbit 1.0.4   Module#prepend 76/143

Slide 78

Slide 78 text

Powered by Rabbit 1.0.4 Module#prepend Method combination Decrating existing methods 77/143

Slide 79

Slide 79 text

Powered by Rabbit 1.0.4 alias method chain Decorate existing methods using aliases AcriveSupport 78/143

Slide 80

Slide 80 text

Powered by Rabbit 1.0.4 alias method chain class A def foo; puts "foo"; end end class A # reopen def foo_with_bar foo_without_bar puts "bar" end alias_method_chain :foo, :bar end A.new.foo 79/143

Slide 81

Slide 81 text

Powered by Rabbit 1.0.4 alias method chain def alias_method_chain(target, feature) alias_method "#{target}_without_#{feature}", target alias_method target, "#{target}_with_#{feature}" end 80/143

Slide 82

Slide 82 text

Powered by Rabbit 1.0.4 alias method chain problems many public methods spilled out accidental feature name conflict adding same feature set to classes 81/143

Slide 83

Slide 83 text

Powered by Rabbit 1.0.4 Method combination from CLOS(CommonLisp Object System) to extend existing methods confugurable via MOP 82/143

Slide 84

Slide 84 text

Powered by Rabbit 1.0.4 Method combination Standard combination in CLOS before hook after hook around hook 83/143

Slide 85

Slide 85 text

Powered by Rabbit 1.0.4 Method combination Confugurable via MOP and-combination or-combination whatever-combination 84/143

Slide 86

Slide 86 text

Powered by Rabbit 1.0.4 Method combination in CLOS Too complex for Ruby 85/143

Slide 87

Slide 87 text

Powered by Rabbit 1.0.4 Module#prepend Simplified Method Comnbination 86/143

Slide 88

Slide 88 text

Powered by Rabbit 1.0.4 Module#prepend Methods added by #include comes after exisiting methods #prepend put them before to wrap methods 87/143

Slide 89

Slide 89 text

Powered by Rabbit 1.0.4 Module#prepend class Foo def foo; p :foo; end end module Prepend def foo p :before super p :after end end class Foo prepend Prepend end Foo.new.foo 88/143

Slide 90

Slide 90 text

Powered by Rabbit 1.0.4 Module#prepend Summary Extending exising methods No method name conflict Package features in a module 89/143

Slide 91

Slide 91 text

Powered by Rabbit 1.0.4   Refinements 90/143

Slide 92

Slide 92 text

Powered by Rabbit 1.0.4 Refinements Scoped Monkey Patching 91/143

Slide 93

Slide 93 text

Powered by Rabbit 1.0.4 Monkey Patching Open class Reopen existing class/module Adding methods Replacing methods 92/143

Slide 94

Slide 94 text

Powered by Rabbit 1.0.4 Adding methods ActiveSupport 93/143

Slide 95

Slide 95 text

Powered by Rabbit 1.0.4 Adding methods 20.years.ago # => Sun Feb 28 17:32:42 94/143

Slide 96

Slide 96 text

Powered by Rabbit 1.0.4 Replacing methods mathn 95/143

Slide 97

Slide 97 text

Powered by Rabbit 1.0.4 Replacing methods 1 / 2 #=> 0 96/143

Slide 98

Slide 98 text

Powered by Rabbit 1.0.4 Replacing methods require 'mathn' 1 / 2 #=> 1/2 (Rational) 97/143

Slide 99

Slide 99 text

Powered by Rabbit 1.0.4   Open class is so strong 98/143

Slide 100

Slide 100 text

Powered by Rabbit 1.0.4   Any Problem? 99/143

Slide 101

Slide 101 text

Powered by Rabbit 1.0.4 Problems Name conflict Behavior conflict 100/143

Slide 102

Slide 102 text

Powered by Rabbit 1.0.4   Global modification is bad 101/143

Slide 103

Slide 103 text

Powered by Rabbit 1.0.4 Scoped enhancement Refinement 102/143

Slide 104

Slide 104 text

Powered by Rabbit 1.0.4 Refinements module R refine String do def foo ... end end end "".foo # => error! using R "".foo 103/143

Slide 105

Slide 105 text

Powered by Rabbit 1.0.4 Other Languages Selector namespace (Smallscript) Classbox (Smalltalk/Java) Extended Method (C#) 104/143

Slide 106

Slide 106 text

Powered by Rabbit 1.0.4 Selector namespace No one knows Smallscript Smallscript still alive? Very complex 105/143

Slide 107

Slide 107 text

Powered by Rabbit 1.0.4 Classbox Scoped class modification Local rebinding Dynamic scope 106/143

Slide 108

Slide 108 text

Powered by Rabbit 1.0.4 Extended Methods Can only add methods No replacing 107/143

Slide 109

Slide 109 text

Powered by Rabbit 1.0.4   Enumerable#lazy 108/143

Slide 110

Slide 110 text

Powered by Rabbit 1.0.4 Enumerable#lazy for Lazy evaluation 109/143

Slide 111

Slide 111 text

Powered by Rabbit 1.0.4 Enumerable#lazy Inspired by functional programming 110/143

Slide 112

Slide 112 text

Powered by Rabbit 1.0.4 Enumerable#lazy Functional programming wannabe 111/143

Slide 113

Slide 113 text

Powered by Rabbit 1.0.4 Functional programming wannabe Immutable data Pattern matching Lazy evaluation Function composition 112/143

Slide 114

Slide 114 text

Powered by Rabbit 1.0.4 Function composition sort of method chains in Ruby 113/143

Slide 115

Slide 115 text

Powered by Rabbit 1.0.4 Method chains (1..Float::INFINITY).map {|i| i.to_s }.select{|s| /3/ === s }.first(5) This doesn't work 114/143

Slide 116

Slide 116 text

Powered by Rabbit 1.0.4 Method chains If we had lazy evaluation.. 115/143

Slide 117

Slide 117 text

Powered by Rabbit 1.0.4 Lazy evaluation What if we had lazy version of enumerating methods 116/143

Slide 118

Slide 118 text

Powered by Rabbit 1.0.4 Lazy evaluation map_lz, select_lz 117/143

Slide 119

Slide 119 text

Powered by Rabbit 1.0.4 Method chains (1..Float::INFINITY).map_lz {|i| i.to_s }.select_lz{|s| /3/ === s }.first(5) 118/143

Slide 120

Slide 120 text

Powered by Rabbit 1.0.4 Lazy evaluation Lazy people need lazy evaluation 119/143

Slide 121

Slide 121 text

Powered by Rabbit 1.0.4 Lazy evaluation to lazy to add _lz all the time 120/143

Slide 122

Slide 122 text

Powered by Rabbit 1.0.4 Enumerable#lazy (1..Float::INFINITY).lazy.map {|i| i.to_s }.select{|s| /3/ === s }.first(5) 121/143

Slide 123

Slide 123 text

Powered by Rabbit 1.0.4 Enumerable#lazy Looks better 122/143

Slide 124

Slide 124 text

Powered by Rabbit 1.0.4   Symbol array literals 123/143

Slide 125

Slide 125 text

Powered by Rabbit 1.0.4 Symbol array literals %i(foo bar baz) 124/143

Slide 126

Slide 126 text

Powered by Rabbit 1.0.4   to_h conversion method 125/143

Slide 127

Slide 127 text

Powered by Rabbit 1.0.4 to_h conversion method Hash, ENV, Struct to have to_h 126/143

Slide 128

Slide 128 text

Powered by Rabbit 1.0.4 to_i and to_int to_i for explicit conversion to_int for implicit conversion 127/143

Slide 129

Slide 129 text

Powered by Rabbit 1.0.4 conversion methods to_i and to_int to_s and to_str to_h and to_hash 128/143

Slide 130

Slide 130 text

Powered by Rabbit 1.0.4   UTF-8 by default 129/143

Slide 131

Slide 131 text

Powered by Rabbit 1.0.4 UTF-8 by default No magic comment needed 130/143

Slide 132

Slide 132 text

Powered by Rabbit 1.0.4 UTF-8 by default Unicode everywhere now 131/143

Slide 133

Slide 133 text

Powered by Rabbit 1.0.4 Dtrace/TracePoint Better debug/profile support 132/143

Slide 134

Slide 134 text

Powered by Rabbit 1.0.4 Performance VM GC require 133/143

Slide 135

Slide 135 text

Powered by Rabbit 1.0.4   Ruby 2.0 134/143

Slide 136

Slide 136 text

Powered by Rabbit 1.0.4   Now works on Heroku 135/143

Slide 137

Slide 137 text

Powered by Rabbit 1.0.4   136/143

Slide 138

Slide 138 text

Powered by Rabbit 1.0.4 Ruby2.0 working under the platform 137/143

Slide 139

Slide 139 text

Powered by Rabbit 1.0.4 Ruby2.0 and beyond I have no idea (yet) 138/143

Slide 140

Slide 140 text

Powered by Rabbit 1.0.4 Ruby2.1 We made a 2.1 branch 139/143

Slide 141

Slide 141 text

Powered by Rabbit 1.0.4 Ruby2.1 Coming next Christmas (hopefull) 140/143

Slide 142

Slide 142 text

Powered by Rabbit 1.0.4 Ruby2.1 less strict Unicode validation even better perfomance 141/143

Slide 143

Slide 143 text

Powered by Rabbit 1.0.4   Thank you 142/143

Slide 144

Slide 144 text

Powered by Rabbit 1.0.4   Any Questions? 143/143