Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ruby (sometimes) sucks

Ruby (sometimes) sucks

Ruby is a neat and elegant language, we all love Ruby, that's why we are here. Right? But the limits of our language are the limits of our world. Would you really dare to use Ruby everywhere, everytime? Would you?... Here we are, the ones who know when Ruby sucks and what you can use instead, trust us! With no marketing bullshit, we will tell you about cases where Ruby just doesn't fit or can even give you a lot of headaches and sleepless nights. Wanna sleep well?

6ed7c9c01ba124114f965ad3660bc276?s=128

Pablo Astigarraga

October 20, 2012
Tweet

Transcript

  1. WAKE UP KIDS! Saturday, October 20, 12

  2. Ruby sucks Saturday, October 20, 12

  3. Ruby - sometimes - sucks Saturday, October 20, 12

  4. nu7hatch Poteland @ @ @ @ Saturday, October 20, 12

  5. Saturday, October 20, 12

  6. Saturday, October 20, 12

  7. Saturday, October 20, 12

  8. Saturday, October 20, 12

  9. We love Ruby Saturday, October 20, 12

  10. but let’s be honest Saturday, October 20, 12

  11. We are using it everywhere Saturday, October 20, 12

  12. the Right tool for the job We should have fucking

    shotguns for this shit Saturday, October 20, 12
  13. RUBY SUCKS AT CONCURRENCY Saturday, October 20, 12

  14. CONCURRENCY vs. PARALLELISM Saturday, October 20, 12

  15. CONCURRENCY Saturday, October 20, 12

  16. PARALLELISM Saturday, October 20, 12

  17. RUBY SUCKS AT ANY HIGH PERFORMANCE COMPUTING Saturday, October 20,

    12
  18. ... LIKE IMAGE PROCESSING Saturday, October 20, 12

  19. ... CLUSTERING Saturday, October 20, 12

  20. ... AND SOMETIMES EVEN HIGH LOAD WEBSERVICES Saturday, October 20,

    12
  21. ALTERNATIVES? Saturday, October 20, 12

  22. C - extensions Saturday, October 20, 12

  23. FAST... OBVIOUSL Y Saturday, October 20, 12

  24. HARD TO MAINTAIN Saturday, October 20, 12

  25. SOMETIMES SEGV... Saturday, October 20, 12

  26. ...AND STILL NOT PARALLEL AT ALL Saturday, October 20, 12

  27. CONCURRENCY IN RUBY Saturday, October 20, 12

  28. Celluloid Saturday, October 20, 12

  29. THE ACTOR PATTERN Saturday, October 20, 12

  30. class Jackson include Celluloid def initialize(name) @name = name end

    def set_status(status) @status = status end def report "#{@name} is #{@status}" end end Saturday, October 20, 12
  31. >> samuel = Jackson.new "Samuel L Jackson" => #<Celluloid::Actor(Jackson:0x00000100a312d0) @name="Samuel

    L Jackson"> >> samuel.set_status "nervous" => "nervous" >> samuel.report => "Samuel L Jackson is nervous" # This is when motherfuckers get shot. >> samuel.async.set_status "asynchronously nervous" => nil >> samuel.report => "Samuel L Jackson is asynchronously nervous" Saturday, October 20, 12
  32. >> samuel = Jackson.new "Samuel L Jackson" => #<Celluloid::Actor(Jackson:0x00000100a312d0) @name="Samuel

    L Jackson"> >> samuel.set_status "nervous" => "nervous" >> samuel.report => "Samuel L Jackson is nervous" # This is when motherfuckers get shot. >> samuel.async.set_status "asynchronously nervous" => nil >> samuel.report => "Samuel L Jackson is asynchronously nervous" Saturday, October 20, 12
  33. >> samuel = Jackson.new "Samuel L Jackson" => #<Celluloid::Actor(Jackson:0x00000100a312d0) @name="Samuel

    L Jackson"> >> samuel.set_status "nervous" => "nervous" >> samuel.report => "Samuel L Jackson is nervous" # This is when motherfuckers get shot. >> samuel.async.set_status "asynchronously nervous" => nil >> samuel.report => "Samuel L Jackson is asynchronously nervous" Saturday, October 20, 12
  34. >> samuel = Jackson.new "Samuel L Jackson" => #<Celluloid::Actor(Jackson:0x00000100a312d0) @name="Samuel

    L Jackson"> >> samuel.set_status "nervous" => "nervous" >> samuel.report => "Samuel L Jackson is nervous" # This is when motherfuckers get shot. >> samuel.async.set_status "asynchronously nervous" => nil >> samuel.report => "Samuel L Jackson is asynchronously nervous" Saturday, October 20, 12
  35. >> samuel = Jackson.new "Samuel L Jackson" => #<Celluloid::Actor(Jackson:0x00000100a312d0) @name="Samuel

    L Jackson"> >> samuel.set_status "nervous" => "nervous" >> samuel.report => "Samuel L Jackson is nervous" # This is when motherfuckers get shot. >> samuel.async.set_status "asynchronously nervous" => nil >> samuel.report => "Samuel L Jackson is asynchronously nervous" Saturday, October 20, 12
  36. Fire and forget Saturday, October 20, 12

  37. Futures Saturday, October 20, 12

  38. >> future = samuel.future.report => #<Celluloid::Future:0x000001009759b8> >> future.value => "Samuel

    L Jackson is nervous" >> future = Celluloid::Future.new { 2 + 2 } => #<Celluloid::Future:0x000001008425f0> >> future.value => 4 Saturday, October 20, 12
  39. >> future = samuel.future.report => #<Celluloid::Future:0x000001009759b8> >> future.value => "Samuel

    L Jackson is nervous" >> future = Celluloid::Future.new { 2 + 2 } => #<Celluloid::Future:0x000001008425f0> >> future.value => 4 Saturday, October 20, 12
  40. Pools Saturday, October 20, 12

  41. class MyWorker include Celluloid def add_one(number) # roflscale computation goes

    here number + 1 end end pool = MyWorker.pool(size: 9000, args: [:foo, :bar, :baz]) i_am_three = pool.add_one(2) (0..10).to_a.map { |n| pool.future(:add_one, n) } Saturday, October 20, 12
  42. class MyWorker include Celluloid def add_one(number) # roflscale computation goes

    here number + 1 end end pool = MyWorker.pool(size: 9000, args: [:foo, :bar, :baz]) i_am_three = pool.add_one(2) (0..10).to_a.map { |n| pool.future(:add_one, n) } Saturday, October 20, 12
  43. class MyWorker include Celluloid def add_one(number) # roflscale computation goes

    here number + 1 end end pool = MyWorker.pool(size: 9000, args: [:foo, :bar, :baz]) i_am_three = pool.add_one(2) (0..10).to_a.map { |n| pool.future(:add_one, n) } Saturday, October 20, 12
  44. class MyWorker include Celluloid def add_one(number) # roflscale computation goes

    here number + 1 end end pool = MyWorker.pool(size: 9000, args: [:foo, :bar, :baz]) i_am_three = pool.add_one(2) (0..10).to_a.map { |n| pool.future(:add_one, n) } Saturday, October 20, 12
  45. one thing though... Saturday, October 20, 12

  46. MRI @ ? Saturday, October 20, 12

  47. global Lock interpreter Saturday, October 20, 12

  48. ... NO REAL PARALLELISM Saturday, October 20, 12

  49. What to do? Saturday, October 20, 12

  50. rubinius and jruby Saturday, October 20, 12

  51. rubinius Saturday, October 20, 12

  52. rubinius Actual parallel threads Saturday, October 20, 12

  53. rubinius Actual parallel threads built with ruby Saturday, October 20,

    12
  54. rubinius Actual parallel threads built with ruby We all love

    it Saturday, October 20, 12
  55. Rubinius Saturday, October 20, 12

  56. Rubinius compatibility PROBLEMS Saturday, October 20, 12

  57. Rubinius compatibility PROBLEMS not production ready Saturday, October 20, 12

  58. JRUBY Saturday, October 20, 12

  59. JRUBY REAL PARALLELISM Saturday, October 20, 12

  60. JRUBY REAL PARALLELISM access to java libraries! Saturday, October 20,

    12
  61. JRUBY REAL PARALLELISM access to java libraries! Fairl y good

    performance Saturday, October 20, 12
  62. JRUBY Saturday, October 20, 12

  63. JRUBY must Marry java Saturday, October 20, 12

  64. JRUBY must Marry java compatibility PROBLEMS Saturday, October 20, 12

  65. TRUL Y CONCURRENT STUFF... Saturday, October 20, 12

  66. A LITTLE BIT OF HISTORY Saturday, October 20, 12

  67. ADA Saturday, October 20, 12

  68. TASK BASED CONCURRENCY Saturday, October 20, 12

  69. OCCAM Saturday, October 20, 12

  70. Communicating SEQUENTIAL PROGRAMMING Saturday, October 20, 12

  71. CLIK Saturday, October 20, 12

  72. SPAWN and SYNC Saturday, October 20, 12

  73. PLAN9 Saturday, October 20, 12

  74. ALEF Saturday, October 20, 12

  75. LIMBO Saturday, October 20, 12

  76. MESSAGE PASSING Saturday, October 20, 12

  77. THAT’s ENOUGH Saturday, October 20, 12

  78. TIME TO GET SERIOUs Saturday, October 20, 12

  79. ERLANG Saturday, October 20, 12

  80. MESSAGE PASSING CONCURRENCY Saturday, October 20, 12

  81. NOT ONL Y A LANGUAGE Saturday, October 20, 12

  82. AN ECOSYSTEM FOR DISTRIBUTED APPS Saturday, October 20, 12

  83. ONL Y FOR THE PROS Saturday, October 20, 12

  84. TIME TO GO Saturday, October 20, 12

  85. MESSAGE PASSING DONE RIGHT Saturday, October 20, 12

  86. GO IN 5 MINUTES Saturday, October 20, 12

  87. SYNCHRONIZE YOUR WATCHES Saturday, October 20, 12

  88. BASICS Saturday, October 20, 12

  89. package main import "fmt" import uuid "github.com/nu7hatch/gouuid" import ( "fmt"

    uuid "github.com/nu7hatch/gouuid" ) func main() { // *snip* } Saturday, October 20, 12
  90. package main import "fmt" import uuid "github.com/nu7hatch/gouuid" import ( "fmt"

    uuid "github.com/nu7hatch/gouuid" ) func main() { // *snip* } Saturday, October 20, 12
  91. package main import "fmt" import uuid "github.com/nu7hatch/gouuid" import ( "fmt"

    uuid "github.com/nu7hatch/gouuid" ) func main() { // *snip* } Saturday, October 20, 12
  92. package main import "fmt" import uuid "github.com/nu7hatch/gouuid" import ( "fmt"

    uuid "github.com/nu7hatch/gouuid" ) func main() { // *snip* } Saturday, October 20, 12
  93. package main import "fmt" import uuid "github.com/nu7hatch/gouuid" import ( "fmt"

    uuid "github.com/nu7hatch/gouuid" ) func main() { // *snip* } Saturday, October 20, 12
  94. FUNCTIONS Saturday, October 20, 12

  95. func IDoNothingWrong() { } func PrintMotherfucker(something string) { fmt.Println(something +

    " motherfucker!") } func PrintMoreMotherfuckers(one, two string, three int) { fmt.Printf("%s, %s, %d motherfucker!\n", one, two, three) } func PrintAllTheThings(args ...string) { fmt.Println(args...) } Saturday, October 20, 12
  96. func IDoNothingWrong() { } func PrintMotherfucker(something string) { fmt.Println(something +

    " motherfucker!") } func PrintMoreMotherfuckers(one, two string, three int) { fmt.Printf("%s, %s, %d motherfucker!\n", one, two, three) } func PrintAllTheThings(args ...string) { fmt.Println(args...) } Saturday, October 20, 12
  97. func IDoNothingWrong() { } func PrintMotherfucker(something string) { fmt.Println(something +

    " motherfucker!") } func PrintMoreMotherfuckers(one, two string, three int) { fmt.Printf("%s, %s, %d motherfucker!\n", one, two, three) } func PrintAllTheThings(args ...string) { fmt.Println(args...) } Saturday, October 20, 12
  98. func IDoNothingWrong() { } func PrintMotherfucker(something string) { fmt.Println(something +

    " motherfucker!") } func PrintMoreMotherfuckers(one, two string, three int) { fmt.Printf("%s, %s, %d motherfucker!\n", one, two, three) } func PrintAllTheThings(args ...string) { fmt.Println(args...) } Saturday, October 20, 12
  99. CONSTANTS Saturday, October 20, 12

  100. const foo = 1 const ( one = iota two

    three four ) Saturday, October 20, 12
  101. const foo = 1 const ( one = iota two

    three four ) Saturday, October 20, 12
  102. VARIABLES Saturday, October 20, 12

  103. var ( name string age int = 32 ) func

    IDoNothingWrong() { var name string age := 32 // *snip* } Saturday, October 20, 12
  104. var ( name string age int = 32 ) func

    IDoNothingWrong() { var name string age := 32 // *snip* } Saturday, October 20, 12
  105. - Go will never get popular... - Porque? - Languages

    with := never get popular. Saturday, October 20, 12
  106. CONDITIONS Saturday, October 20, 12

  107. if vince.IsOutOfTheToilet() { // kill the bastard! } else {

    // stay cool... } // WROOOONG! if mia.IsOverdosed() vince.ApplyAdrenalineTo(mia) if vince, ok := people["Vince"]; !ok { panic "Vince is dead!" } Saturday, October 20, 12
  108. if vince.IsOutOfTheToilet() { // kill the bastard! } else {

    // stay cool... } // WROOOONG! if mia.IsOverdosed() vince.ApplyAdrenalineTo(mia) if vince, ok := people["Vince"]; !ok { panic "Vince is dead!" } Saturday, October 20, 12
  109. if vince.IsOutOfTheToilet() { // kill the bastard! } else {

    // stay cool... } // WROOOONG! if mia.IsOverdosed() vince.ApplyAdrenalineTo(mia) if vince, ok := people["Vince"]; !ok { panic "Vince is dead!" } Saturday, October 20, 12
  110. SLICES Saturday, October 20, 12

  111. var people []Person people := make([]Person, 5) dumbNumbers := []int{1,2,3,4}

    len(dumbNumbers) // => 4 cap(people) // => 5 motherfuckers := people[1:3] dumbNumbers := append(dumbNumbers, 5) Saturday, October 20, 12
  112. var people []Person people := make([]Person, 5) dumbNumbers := []int{1,2,3,4}

    len(dumbNumbers) // => 4 cap(people) // => 5 motherfuckers := people[1:3] dumbNumbers := append(dumbNumbers, 5) Saturday, October 20, 12
  113. var people []Person people := make([]Person, 5) dumbNumbers := []int{1,2,3,4}

    len(dumbNumbers) // => 4 cap(people) // => 5 motherfuckers := people[1:3] dumbNumbers := append(dumbNumbers, 5) Saturday, October 20, 12
  114. var people []Person people := make([]Person, 5) dumbNumbers := []int{1,2,3,4}

    len(dumbNumbers) // => 4 cap(people) // => 5 motherfuckers := people[1:3] dumbNumbers := append(dumbNumbers, 5) Saturday, October 20, 12
  115. var people []Person people := make([]Person, 5) dumbNumbers := []int{1,2,3,4}

    len(dumbNumbers) // => 4 cap(people) // => 5 motherfuckers := people[1:3] dumbNumbers := append(dumbNumbers, 5) Saturday, October 20, 12
  116. var people []Person people := make([]Person, 5) dumbNumbers := []int{1,2,3,4}

    len(dumbNumbers) // => 4 cap(people) // => 5 motherfuckers := people[1:3] dumbNumbers := append(dumbNumbers, 5) Saturday, October 20, 12
  117. var people []Person people := make([]Person, 5) dumbNumbers := []int{1,2,3,4}

    len(dumbNumbers) // => 4 cap(people) // => 5 motherfuckers := people[1:3] dumbNumbers := append(dumbNumbers, 5) Saturday, October 20, 12
  118. MAPS Saturday, October 20, 12

  119. var people map[string]Person people = make(map[string]Person) people := make(map[string]Person) people

    := map[string]Person{} jules := people["Jules"] delete(people, "Vince") Saturday, October 20, 12
  120. var people map[string]Person people = make(map[string]Person) people := make(map[string]Person) people

    := map[string]Person{} jules := people["Jules"] delete(people, "Vince") Saturday, October 20, 12
  121. var people map[string]Person people = make(map[string]Person) people := make(map[string]Person) people

    := map[string]Person{} jules := people["Jules"] delete(people, "Vince") Saturday, October 20, 12
  122. var people map[string]Person people = make(map[string]Person) people := make(map[string]Person) people

    := map[string]Person{} jules := people["Jules"] delete(people, "Vince") Saturday, October 20, 12
  123. var people map[string]Person people = make(map[string]Person) people := make(map[string]Person) people

    := map[string]Person{} jules := people["Jules"] delete(people, "Vince") Saturday, October 20, 12
  124. var people map[string]Person people = make(map[string]Person) people := make(map[string]Person) people

    := map[string]Person{} jules := people["Jules"] delete(people, "Vince") Saturday, October 20, 12
  125. LOOPS Saturday, October 20, 12

  126. for i := 0; i < 100; i++ { fmt.Println(i)

    } i := 0; for i < 1000 { fmt.Println(i) i++ } for name, motherfucker := range motherfuckers { motherfucker.Kill() fmt.Printf("%s is fucking dead\n", name") } Saturday, October 20, 12
  127. for i := 0; i < 100; i++ { fmt.Println(i)

    } i := 0; for i < 1000 { fmt.Println(i) i++ } for name, motherfucker := range motherfuckers { motherfucker.Kill() fmt.Printf("%s is fucking dead\n", name") } Saturday, October 20, 12
  128. for i := 0; i < 100; i++ { fmt.Println(i)

    } i := 0; for i < 1000 { fmt.Println(i) i++ } for name, motherfucker := range motherfuckers { motherfucker.Kill() fmt.Printf("%s is fucking dead\n", name") } Saturday, October 20, 12
  129. STRUCTURES Saturday, October 20, 12

  130. type Vince struct { Stoned bool } type Stoner struct

    { Stoned bool } type Vince struct { Stoner } var vince Vince var vince = Vince{true} var vince = &Vince{true} func NewVince() *Vince { return &Vince{stoned: true} } Saturday, October 20, 12
  131. type Vince struct { Stoned bool } type Stoner struct

    { Stoned bool } type Vince struct { Stoner } var vince Vince var vince = Vince{true} var vince = &Vince{true} func NewVince() *Vince { return &Vince{stoned: true} } Saturday, October 20, 12
  132. type Vince struct { Stoned bool } type Stoner struct

    { Stoned bool } type Vince struct { Stoner } var vince Vince var vince = Vince{true} var vince = &Vince{true} func NewVince() *Vince { return &Vince{stoned: true} } Saturday, October 20, 12
  133. type Vince struct { Stoned bool } type Stoner struct

    { Stoned bool } type Vince struct { Stoner } var vince Vince var vince = Vince{true} var vince = &Vince{true} func NewVince() *Vince { return &Vince{stoned: true} } Saturday, October 20, 12
  134. type Vince struct { Stoned bool } type Stoner struct

    { Stoned bool } type Vince struct { Stoner } var vince Vince var vince = Vince{true} var vince = &Vince{true} func NewVince() *Vince { return &Vince{stoned: true} } Saturday, October 20, 12
  135. type Vince struct { Stoned bool } type Stoner struct

    { Stoned bool } type Vince struct { Stoner } var vince Vince var vince = Vince{true} var vince = &Vince{true} func NewVince() *Vince { return &Vince{stoned: true} } Saturday, October 20, 12
  136. type Vince struct { Stoned bool } type Stoner struct

    { Stoned bool } type Vince struct { Stoner } var vince Vince var vince = Vince{true} var vince = &Vince{true} func NewVince() *Vince { return &Vince{stoned: true} } Saturday, October 20, 12
  137. METHODS Saturday, October 20, 12

  138. type Vince struct { isStoned bool } func (vince *Vince)

    IsStoned() bool { return vince.isStoned } func (vince *Vince) SmokePot() bool { vince.isStoned = true } type FuckingInt int func (x FuckingInt) Square() int { return int(x) * int(x) } Saturday, October 20, 12
  139. type Vince struct { isStoned bool } func (vince *Vince)

    IsStoned() bool { return vince.isStoned } func (vince *Vince) SmokePot() bool { vince.isStoned = true } type FuckingInt int func (x FuckingInt) Square() int { return int(x) * int(x) } Saturday, October 20, 12
  140. INTERFACES Saturday, October 20, 12

  141. type Jules struct {} func (jules *Jules) IsStoned() bool {

    return false } type Vince struct {} func (vince *Vince) IsStoned() bool { return true } type Stoner interface { IsStoned() bool } func PrintStoner(s Stoner) { fmt.Printf("%x", s) } var x interface{} Saturday, October 20, 12
  142. type Jules struct {} func (jules *Jules) IsStoned() bool {

    return false } type Vince struct {} func (vince *Vince) IsStoned() bool { return true } type Stoner interface { IsStoned() bool } func PrintStoner(s Stoner) { fmt.Printf("%x", s) } var x interface{} Saturday, October 20, 12
  143. type Jules struct {} func (jules *Jules) IsStoned() bool {

    return false } type Vince struct {} func (vince *Vince) IsStoned() bool { return true } type Stoner interface { IsStoned() bool } func PrintStoner(s Stoner) { fmt.Printf("%x", s) } var x interface{} Saturday, October 20, 12
  144. type Jules struct {} func (jules *Jules) IsStoned() bool {

    return false } type Vince struct {} func (vince *Vince) IsStoned() bool { return true } type Stoner interface { IsStoned() bool } func PrintStoner(s Stoner) { fmt.Printf("%x", s) } var x interface{} Saturday, October 20, 12
  145. GOROUTINES AND CHANNELS Saturday, October 20, 12

  146. go func() { for i := 1; i < 100;

    i++ { fmt.Println(i) } }() go SomeMotherfuckingExpensiveLoop() go AnotherMotherfuckingLoop() // app is keep going here... var killed chan bool killed = make(chan bool) go func() { <-killed }() killed <- true <-time.After(10 * time.Second) Saturday, October 20, 12
  147. go func() { for i := 1; i < 100;

    i++ { fmt.Println(i) } }() go SomeMotherfuckingExpensiveLoop() go AnotherMotherfuckingLoop() // app is keep going here... var killed chan bool killed = make(chan bool) go func() { <-killed }() killed <- true <-time.After(10 * time.Second) Saturday, October 20, 12
  148. go func() { for i := 1; i < 100;

    i++ { fmt.Println(i) } }() go SomeMotherfuckingExpensiveLoop() go AnotherMotherfuckingLoop() // app is keep going here... var killed chan bool killed = make(chan bool) go func() { <-killed }() killed <- true <-time.After(10 * time.Second) Saturday, October 20, 12
  149. select { case <-jules.Shoot(): fmt.Println("Jules killed motherfucker") case <-vince.Shoot(): fmt.Println("Vince

    killed motherfucker") } select { // *snip* default: // do something while waiting for the channels. } Saturday, October 20, 12
  150. select { case <-jules.Shoot(): fmt.Println("Jules killed motherfucker") case <-vince.Shoot(): fmt.Println("Vince

    killed motherfucker") } select { // *snip* default: // do something while waiting for the channels. } Saturday, October 20, 12
  151. GOING DEEPER... Saturday, October 20, 12

  152. func main() { for i := 0; i < 10;

    i++ { fmt.Println(i) } } Saturday, October 20, 12
  153. func main() { go func() { for i := 0;

    i < 10; i++ { fmt.Println(i) } }() } Saturday, October 20, 12
  154. func PrintShit() { for i := 0; i < 10;

    i++ { fmt.Println(i) } } func main() { go PrintShit() <-time.After(2 * time.Second) } Saturday, October 20, 12
  155. func PrintShit(done chan bool) { for i := 1; i

    < 10; i++ { fmt.Println(i) } done <- true } func main() { isItThereYet := make(chan bool) go PrintShit(isItThereYet) <-isItThereYet } Saturday, October 20, 12
  156. func PrintShit() <-chan bool { done := make(chan bool) go

    func() { for i := 1; i < 10; i++ { fmt.Println(i) } done <- true }() return done } func main() { <-PrintShit() } Saturday, October 20, 12
  157. SUMARIZING... Saturday, October 20, 12

  158. Limits of your language are limits of your world... Saturday,

    October 20, 12
  159. Limits of your language are limits of your world... Some

    Smart Motherfucker Saturday, October 20, 12
  160. Thank you @ ! Saturday, October 20, 12

  161. Saturday, October 20, 12

  162. Questions Saturday, October 20, 12

  163. I DON’T REMEMBER ASKING YOU A GODDAMN THING!! Saturday, October

    20, 12
  164. Links ‘n stuff this talk: - http://bit.ly/RDGxyC rubinius: - http://rubini.us/

    Celulloid - http://celluloid.io/ ERLANG: - http://erlang/ GO: - http://golang.org/ GO: TOUR - http://tour.golang.org/ Saturday, October 20, 12
  165. nu7hatch Poteland @ @ @ @ Saturday, October 20, 12

  166. WWW.AREYOUFUCKINGCODING.ME WWW.POTELAND.COM Saturday, October 20, 12