SlideShare a Scribd company logo
1 of 150
Download to read offline
The Dark Side of Ruby
@gautamrege!
@joshsoftware
What’s the talk about?
What’s the talk about?
• Ruby is AWESOME but …
What’s the talk about?
• Ruby is AWESOME but …
• Nothing scary
What’s the talk about?
• Ruby is AWESOME but …
• Nothing scary really
What’s the talk about?
• Ruby is AWESOME but …
• Nothing scary
• Weirdness and Gotcha’s
really
What’s the talk about?
• Ruby is AWESOME but …
• Nothing scary
• Weirdness and Gotcha’s
Ah-ha! Moments
really
Slides are Tagged
Slides are Tagged
Beginner
Slides are Tagged
Expert
(In)Famous Infinityhttp://www.flickr.com/photos/emdot/482622478/sizes/l/
(In)Famous Infinity
(In)Famous Infinity
(In)Famous Infinity
$ irb> 1/0
(In)Famous Infinity
$ irb> 1/0
=> ZeroDivisionError: divided by 0
(In)Famous Infinity
$ irb> 1/0
$ irb> 1.0/0
=> ZeroDivisionError: divided by 0
(In)Famous Infinity
$ irb> 1/0
$ irb> 1.0/0
=> ZeroDivisionError: divided by 0
=> Infinity
(In)Famous Infinity
$ irb> 1/0
$ irb> 1.0/0
$ irb> Infinity
=> ZeroDivisionError: divided by 0
=> Infinity
(In)Famous Infinity
$ irb> 1/0
$ irb> 1.0/0
$ irb> Infinity
=> ZeroDivisionError: divided by 0
=> Infinity
=> NameError: uninitialized constant
Infinity
(In)Famous Infinity
(In)Famous Infinity
(In)Famous Infinity
#if !defined(INFINITY) || !defined(NAN)!
union bytesequence4_or_float {!
unsigned char bytesequence[4];!
float float_value;!
};!
#endif!
!
RUBY_EXTERN const union
bytesequence4_or_float rb_infinity;
(In)Famous Infinity
#if !defined(INFINITY) || !defined(NAN)!
union bytesequence4_or_float {!
unsigned char bytesequence[4];!
float float_value;!
};!
#endif!
!
RUBY_EXTERN const union
bytesequence4_or_float rb_infinity;
include/ruby/missing.h
Base Jumping
http://www.flickr.com/photos/shahdi/8035647153/sizes/l/
Base Conversions
Base Conversions
Base Conversions
$ irb> 12345.to_s(8)
Base Conversions
$ irb> 12345.to_s(8)
=> "30071" # => Octal
Base Conversions
$ irb> 12345.to_s(8)
$ irb> 12345.to_s(36)
=> "30071" # => Octal
Base Conversions
$ irb> 12345.to_s(8)
$ irb> 12345.to_s(36)
=> "30071" # => Octal
=> "9ix" # That is an actual number
Base Conversions
$ irb> 12345.to_s(8)
$ irb> 12345.to_s(36)
$ irb> 1234.to_s(64)
=> "30071" # => Octal
=> "9ix" # That is an actual number
Base Conversions
$ irb> 12345.to_s(8)
$ irb> 12345.to_s(36)
$ irb> 1234.to_s(64)
=> "30071" # => Octal
=> "9ix" # That is an actual number
=> ArgumentError: invalid radix 64
Hashes and Arrays
Hashes and Arrays
Hashes and Arrays
a=[1,2,3,4,5,6]!
h=Hash[*a]
Hashes and Arrays
a=[1,2,3,4,5,6]!
h=Hash[*a]
=> {1=>2, 3=>4, 5=>6}
Hashes and Arrays
a=[1,2,3,4,5,6]!
h=Hash[*a]
=> {1=>2, 3=>4, 5=>6}
[1,2,3] * 3
Hashes and Arrays
a=[1,2,3,4,5,6]!
h=Hash[*a]
=> {1=>2, 3=>4, 5=>6}
[1,2,3] * 3
=> [1,2,3,1,2,3,1,2,3]
Hashes and Arrays
a=[1,2,3,4,5,6]!
h=Hash[*a]
=> {1=>2, 3=>4, 5=>6}
[1,2,3] * 3
=> [1,2,3,1,2,3,1,2,3]
[1,2,3] * "%"
Hashes and Arrays
a=[1,2,3,4,5,6]!
h=Hash[*a]
=> {1=>2, 3=>4, 5=>6}
[1,2,3] * 3
=> [1,2,3,1,2,3,1,2,3]
[1,2,3] * "%"
=> "1%2%3"
Calling out to Stabby
Calling out to Stabby
blk = ->(f, *m, sl, l) do
puts sl
end
Calling out to Stabby
blk = ->(f, *m, sl, l) do
puts sl
end
blk.call(1, 2, 3, 4, 5, 6)
Calling out to Stabby
blk = ->(f, *m, sl, l) do
puts sl
end
blk.call(1, 2, 3, 4, 5, 6)
=> 5
blk.(1, 2, 3, 4, 5, 6)
Calling out to Stabby
blk = ->(f, *m, sl, l) do
puts sl
end
blk.call(1, 2, 3, 4, 5, 6)
=> 5
blk.(1, 2, 3, 4, 5, 6)
Calling out to Stabby
blk = ->(f, *m, sl, l) do
puts sl
end
blk.call(1, 2, 3, 4, 5, 6)
=> 5
blk.(1, 2, 3, 4, 5, 6)
=> 5
syntax sugar for call
blk[1,2,3,4,5,6]
Calling out to Stabby
blk = ->(f, *m, sl, l) do
puts sl
end
blk.call(1, 2, 3, 4, 5, 6)
=> 5
Syntax
Syntax
def foo(a=1, b=1,opts={})
end
Syntax
def foo(a: 1, b: 2)
end
Syntax
def foo(a: 1, b: 2)
end
keyword arguments
Syntax
def foo(a: 1, b:, c: 2)
end
def foo(a: 1, b: 2)
end
keyword arguments
Syntax
def foo(a: 1, b:, c: 2)
end
def foo(a: 1, b: 2)
end
keyword arguments
Syntax
def foo(a: 1, b:, c: 2)
end
foo(a: 2)
=> ArgumentError: missing keyword: b
Mandatory keyword
arguments
def foo(a: 1, b: 2)
end
keyword arguments
Syntax
Syntax
def foo(a, b)
p a, b
end
Syntax
def foo(a, b)
p a, b
end
foo (1, 2)
Syntax
def foo(a, b)
p a, b
end
foo (1, 2)
syntax error, unexpected
',', expecting ')'
Syntax
def foo(a, b)
p a, b
end
foo (1, 2)
foo(1, 2)
Syntax
def foo(a, b)
p a, b
end
foo (1, 2)
foo(1, 2)
Syntax
def foo(a, b)
p a, b
end
foo (1, 2)
foo(1, 2) syntax error, unexpected
',', expecting ')'
Syntax
Syntax
irb> a[1]
What is the
data type of a ?
Syntax
irb> a[1]
a = [ 10, 11, 12] # Array
Syntax
irb> a[1]
a = [ 10, 11, 12] # Array
a = { 1 => "one" } # Hash
Syntax
irb> a[1]
a = [ 10, 11, 12] # Array
a = { 1 => "one" } # Hash
a = Proc.new { |e| p e }
Case Complexity
The Case Statement
def multiple_of(factor)!
Proc.new {|p| p.modulo(factor).zero?}!
end!
!
number = 9!
case number!
when multiple_of(3)!
puts "Multiple of 3"!
when multiple_of(7)!
puts "Multiple of 7"!
end
The Case Statement
def multiple_of(factor)!
Proc.new {|p| p.modulo(factor).zero?}!
end!
!
number = 9!
case number!
when multiple_of(3)!
puts "Multiple of 3"!
when multiple_of(7)!
puts "Multiple of 7"!
end
Behind every case is a ===
number = 9!
case number !
when multiple_of(3)
Proc.new {|p| p.modulo(3).zero?} === 9
Behind every case is a ===
number = 9!
case number !
when multiple_of(3)
Proc.new {|p| p.modulo(3).zero?} === 9
Behind every case is a ===
number = 9!
case number !
when multiple_of(3)
Proc.new {|p| p.modulo(3).zero?} === 9
Proc#=== is an alias to Proc#call.
Behind every case is a ===
number = 9!
case number !
when multiple_of(3)
Proc.new {|p| p.modulo(3).zero?} === 9
Proc.new { |p| !
p.modulo(3).zero?!
}.call(9)
Proc#=== is an alias to Proc#call.
Override the === method
to customise case
evaluation.
==, ===, eql?, equal?
http://www.flickr.com/photos/gak/2418146934/sizes/o/
==, ===, eql?, equal?
==, ===, eql?, equal?
irb> 1 == 1.0
==, ===, eql?, equal?
irb> 1 == 1.0
=> true # generic equality
==, ===, eql?, equal?
irb> 1 == 1.0
=> true # generic equality
irb> 1 === 1.0
==, ===, eql?, equal?
irb> 1 == 1.0
=> true # generic equality
irb> 1 === 1.0
=> true # case equality
==, ===, eql?, equal?
irb> 1 == 1.0
=> true # generic equality
irb> 1 === 1.0
=> true # case equality
irb> 1.eql? 1.0
==, ===, eql?, equal?
=> false # alias of == except Numeric
irb> 1 == 1.0
=> true # generic equality
irb> 1 === 1.0
=> true # case equality
irb> 1.eql? 1.0
==, ===, eql?, equal?
=> false # alias of == except Numeric
irb> 1 == 1.0
=> true # generic equality
irb> 1 === 1.0
=> true # case equality
irb> 1.eql? 1.0
irb> 1.equal? 1.0
==, ===, eql?, equal?
=> false # alias of == except Numeric
irb> 1 == 1.0
=> true # generic equality
irb> 1 === 1.0
=> true # case equality
irb> 1.eql? 1.0
irb> 1.equal? 1.0
=> false # object identity
==, ===, eql?, equal?
=> false # alias of == except Numeric
irb> 1 == 1.0
=> true # generic equality
irb> 1 === 1.0
=> true # case equality
irb> 1.eql? 1.0
irb> 1.equal? 1.0
=> false # object identity
irb> 'a'.equal? 'a'
==, ===, eql?, equal?
=> false # alias of == except Numeric
=> false # gotcha?
irb> 1 == 1.0
=> true # generic equality
irb> 1 === 1.0
=> true # case equality
irb> 1.eql? 1.0
irb> 1.equal? 1.0
=> false # object identity
irb> 'a'.equal? 'a'
==, ===, eql?, equal?
=> false # alias of == except Numeric
=> false # gotcha?
irb> 1 == 1.0
=> true # generic equality
irb> 1 === 1.0
=> true # case equality
irb> 1.eql? 1.0
irb> 1.equal? 1.0
=> false # object identity
irb> 'a'.equal? 'a'
irb> 1.equal? 1
==, ===, eql?, equal?
=> false # alias of == except Numeric
=> false # gotcha?
irb> 1 == 1.0
=> true # generic equality
irb> 1 === 1.0
=> true # case equality
irb> 1.eql? 1.0
irb> 1.equal? 1.0
=> false # object identity
irb> 'a'.equal? 'a'
=> true # gotcha?
irb> 1.equal? 1
Object Ids & Fixnum
Object Ids & Fixnum
Fixnum * 2 + 1
irb> 23 * 2 + 1
=> 47
irb > 23.object_id
=> 47
Object Ids & Fixnum
Fixnum * 2 + 1
irb> 23 * 2 + 1
=> 47
irb > 23.object_id
=> 47
irb> (2**62 - 1).class
=> Fixnum
irb> (2**62).class
=> Bignum
http://www.flickr.com/photos/miscdebris/6748016253/sizes/o/
3 Pulls for the Jackpot
jackpot = lambda { |x, y, z|
(x == y) == (x == z)
}
# 3 pulls
pull = jackpot.curry[rand(5)]
2.times { pull = pull.curry[rand(5)] }
!
p pull ? "Jackpot" : "Sucker!"
3 Pulls for the Jackpot
jackpot = lambda { |x, y, z|
(x == y) == (x == z)
}
# 3 pulls
pull = jackpot.curry[rand(5)]
2.times { pull = pull.curry[rand(5)] }
!
p pull ? "Jackpot" : "Sucker!"
3 Pulls for the Jackpot
jackpot = lambda { |x, y, z|
(x == y) == (x == z)
}
# 3 pulls
pull = jackpot.curry[rand(5)]
2.times { pull = pull.curry[rand(5)] }
!
p pull ? "Jackpot" : "Sucker!"
The curry recipe
• Return lambda till all parameters are passed.
• Evaluate the block if all parameters are passed.
pull = jackpot.curry[rand(5)]
=> #<Proc:0x007f9eec0990b0 (lambda)>
2.times { pull = pull.curry[rand(5)] }
=> true # or false
The curry recipe
• Return lambda till all parameters are passed.
• Evaluate the block if all parameters are passed.
pull = jackpot.curry[rand(5)]
=> #<Proc:0x007f9eec0990b0 (lambda)>
2.times { pull = pull.curry[rand(5)] }
=> true # or false
So! So you think you can tell…
Heaven from Hell
- Pink Floyd
So! So you think you can tell…
Protected from Private
Private methods
class Soldier
private
def ryan
puts "Saving private ryan"
end
end
class Movie < Soldier
def name
ryan
end
end
Private methods
class Soldier
private
def ryan
puts "Saving private ryan"
end
end
class Movie < Soldier
def name
ryan
end
end
Private methods
class Soldier
private
def ryan
puts "Saving private ryan"
end
end
class Movie < Soldier
def name
ryan
end
end
Private Methods are
inherited!
class Base!
include Mongoid::Document!
end
The elusive include
class Base!
include Mongoid::Document!
end
The elusive include
Private method!
Instance method !
Defined the class Module
class Base!
include Mongoid::Document!
end
The elusive include
Protected methods
Protected methods
Protected methods
• Work with objects not classes.
Protected methods
• Work with objects not classes.
• Invoke a protected method on
another object in the same lineage
Protected methods
• Work with objects not classes.
• Invoke a protected method on
another object in the same lineage
What the …
class Autobot
def initialize(nick); @nick = nick; end
!
protected
attr_accessor :nick
end
!
prime = Autobot.new("Optimus Prime")
p prime.nick
class Autobot
def initialize(nick); @nick = nick; end
!
protected
attr_accessor :nick
end
!
prime = Autobot.new("Optimus Prime")
p prime.nick
class Autobot
def initialize(nick); @nick = nick; end
!
protected
attr_accessor :nick
end
!
prime = Autobot.new("Optimus Prime")
p prime.nick
protected method `nick' called for
#<Autobot:0x007f92ba082330 @nick="Optimus
Prime"> (NoMethodError)
class Autobot
def fights(target)
p "I am #{self.nick}"
p "Kicking #{target.nick}'s ass"
end
protected
attr_accessor :nick
end
!
optimus = Autobot.new("Optimus Prime")
megatron = Autobot.new('Megatron')
!
optimus.fights megatron
class Autobot
def fights(target)
p "I am #{self.nick}"
p "Kicking #{target.nick}'s ass"
end
protected
attr_accessor :nick
end
!
optimus = Autobot.new("Optimus Prime")
megatron = Autobot.new('Megatron')
!
optimus.fights megatron
class Autobot
def fights(target)
p "I am #{self.nick}"
p "Kicking #{target.nick}'s ass"
end
protected
attr_accessor :nick
end
!
optimus = Autobot.new("Optimus Prime")
megatron = Autobot.new('Megatron')
!
optimus.fights megatron
"I am Optimus Prime"
"Kicking Megatron's ass"
class Autobot
def fights(target)
p "I am #{self.nick}"
p "Kicking #{target.nick}'s ass"
end
protected
attr_accessor :nick
end
!
optimus = Autobot.new("Optimus Prime")
megatron = Autobot.new('Megatron')
!
optimus.fights megatron
"I am Optimus Prime"
"Kicking Megatron's ass"
Keywords in Ruby?
Keywords - hmm…
class Serious
def true
false
end
def false
true
end
end
die = Serious.new
p "seriously!" if die.false
Keywords - hmm…
class Serious
def true
false
end
def false
true
end
end
die = Serious.new
p "seriously!" if die.false
Keywords - hmm…
class Serious
def true
false
end
def false
true
end
end
die = Serious.new
p "seriously!" if die.false
stack too deep?
superlative
class Search!
def search!
p "Default Search algorithm"!
end!
end!
class KeywordSearch < Search !
def search(keyword:)!
super!
end!
end!
KeywordSearch.new.search(keyword: "Ruby")
superlative
class Search!
def search!
p "Default Search algorithm"!
end!
end!
class KeywordSearch < Search !
def search(keyword:)!
super!
end!
end!
KeywordSearch.new.search(keyword: "Ruby")
superlative
class Search!
def search!
p "Default Search algorithm"!
end!
end!
class KeywordSearch < Search !
def search(keyword:)!
super!
end!
end!
KeywordSearch.new.search(keyword: "Ruby")
superlative
class Search!
def search!
p "Default Search algorithm"!
end!
end!
class KeywordSearch < Search !
def search(keyword:)!
super!
end!
end!
KeywordSearch.new.search(keyword: "Ruby")
`search`: wrong number
of arguments (1 for 0)
superlative
class Search!
def search!
p "Default Search algorithm"!
end!
end!
class KeywordSearch < Search !
def search(keyword:)!
super()!
end!
end!
KeywordSearch.new.search(keyword: "Ruby")
superlative
class Search!
def search!
p "Default Search algorithm"!
end!
end!
class KeywordSearch < Search !
def search(keyword:)!
super()!
end!
end!
KeywordSearch.new.search(keyword: "Ruby")
superlative
class Search!
def search!
p "Default Search algorithm"!
end!
end!
class KeywordSearch < Search !
def search(keyword:)!
super()!
end!
end!
KeywordSearch.new.search(keyword: "Ruby")
superlative
class Search!
def search!
p "Default Search algorithm"!
end!
end!
class KeywordSearch < Search !
def search(keyword:)!
super()!
end!
end!
KeywordSearch.new.search(keyword: "Ruby")
And we thought parenthesis for
method invocation didn’t matter
Module mixins are funny
module Superman!
def fly; p "Superman: It's a bird"; end!
end!
!
module Batman!
def fly; p "Batman: Fly? Me?"; end!
end!
!
module Ironman!
def fly; p "Iroman: That's flying!"; end!
end
Module mixins are funny
module Superman!
def fly; p "Superman: It's a bird"; end!
end!
!
module Batman!
def fly; p "Batman: Fly? Me?"; end!
end!
!
module Ironman!
def fly; p "Iroman: That's flying!"; end!
end
Module mixins are funny
class Tinyman!
include Superman!
include Batman!
include Ironman!
end!
!
Tinyman.new.fly
"Iroman: That's how you fly!"
Module mixins are funny
class Tinyman!
include Superman!
include Batman!
include Ironman!
end!
!
Tinyman.new.fly
"Iroman: That's how you fly!"
Module Inheritance?
module Superman!
def fly; p "Superman: It's a bird"; end!
end!
!
module Batman!
def fly; p "Batman: Fly? Me?"; end!
end!
!
module Ironman!
def fly; super; p "Iroman: That's flying!"; end!
end
Module Inheritance?
module Superman!
def fly; p "Superman: It's a bird"; end!
end!
!
module Batman!
def fly; p "Batman: Fly? Me?"; end!
end!
!
module Ironman!
def fly; super; p "Iroman: That's flying!"; end!
end
Module Inheritance?
module Superman!
def fly; p "Superman: It's a bird"; end!
end!
!
module Batman!
def fly; p "Batman: Fly? Me?"; end!
end!
!
module Ironman!
def fly; super; p "Iroman: That's flying!"; end!
end
"Batman: Fly? Me?”!
"Iroman: That's flying!"
Dynamic Inheritance!
class Tinyman!
include Superman!
include Batman!
include Ironman!
end
Dynamic Inheritance!
class Tinyman!
include Superman!
include Batman!
include Ironman!
end
class Tinyman!
include Superman!
include Ironman!
include Batman!
end
Dynamic Inheritance!
class Tinyman!
include Superman!
include Batman!
include Ironman!
end
class Tinyman!
include Superman!
include Ironman!
include Batman!
end
Dynamic Inheritance!
class Tinyman!
include Superman!
include Batman!
include Ironman!
end
Cherry pick from Modules
module Megatron!
def power!
p "Megatron's super strength"!
end!
!
def evil!
p 'Evil genius'!
end!
end
Cherry pick from Modules
module Megatron!
def power!
p "Megatron's super strength"!
end!
!
def evil!
p 'Evil genius'!
end!
end
class Hanuman!
include Megatron!
end
Hanuman.new.power!
# => "Megatron's super strength"!
Hanuman.new.evil !
# => "Evil genius" # Oh no!
Cherry pick from Modules
class Hanuman!
include Megatron!
end
Hanuman.new.power!
# => "Megatron's super strength"!
Hanuman.new.evil !
# => "Evil genius" # Oh no!
Cherry pick from Modules
Cherry pick from Modules
class Hanuman!
def power!
Megatron.instance_method(:power).!
bind(self).call!
end!
end
Cherry pick from Modules
class Hanuman!
def power!
Megatron.instance_method(:power).!
bind(self).call!
end!
end
Cherry pick from Modules
class Hanuman!
def power!
Megatron.instance_method(:power).!
bind(self).call!
end!
end
Hanuman.new.power
# => "Megatron's super strength"
Hanuman.new.evil
# => undefined method `evil’...>
That’s all Folks!
@gautamrege
@joshsoftware
That’s all Folks!
@gautamrege
@joshsoftware
since 2007

More Related Content

What's hot

Ruby Language - A quick tour
Ruby Language - A quick tourRuby Language - A quick tour
Ruby Language - A quick touraztack
 
{tidytext}と{RMeCab}によるモダンな日本語テキスト分析
{tidytext}と{RMeCab}によるモダンな日本語テキスト分析{tidytext}と{RMeCab}によるモダンな日本語テキスト分析
{tidytext}と{RMeCab}によるモダンな日本語テキスト分析Takashi Kitano
 
eCommerce 2009 short version
eCommerce 2009 short versioneCommerce 2009 short version
eCommerce 2009 short versionGemius.CZ
 
Pre-Bootcamp introduction to Elixir
Pre-Bootcamp introduction to ElixirPre-Bootcamp introduction to Elixir
Pre-Bootcamp introduction to ElixirPaweł Dawczak
 
Modelling game economy with Neo4j
Modelling game economy with Neo4jModelling game economy with Neo4j
Modelling game economy with Neo4jYan Cui
 
Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기
Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기
Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기Suyeol Jeon
 

What's hot (8)

Python 1
Python 1Python 1
Python 1
 
Ruby Language - A quick tour
Ruby Language - A quick tourRuby Language - A quick tour
Ruby Language - A quick tour
 
{tidytext}と{RMeCab}によるモダンな日本語テキスト分析
{tidytext}と{RMeCab}によるモダンな日本語テキスト分析{tidytext}と{RMeCab}によるモダンな日本語テキスト分析
{tidytext}と{RMeCab}によるモダンな日本語テキスト分析
 
eCommerce 2009 short version
eCommerce 2009 short versioneCommerce 2009 short version
eCommerce 2009 short version
 
7li7w devcon5
7li7w devcon57li7w devcon5
7li7w devcon5
 
Pre-Bootcamp introduction to Elixir
Pre-Bootcamp introduction to ElixirPre-Bootcamp introduction to Elixir
Pre-Bootcamp introduction to Elixir
 
Modelling game economy with Neo4j
Modelling game economy with Neo4jModelling game economy with Neo4j
Modelling game economy with Neo4j
 
Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기
Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기
Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기
 

Similar to RedDot Ruby Conf 2014 - Dark side of ruby

ScotRuby - Dark side of ruby
ScotRuby - Dark side of rubyScotRuby - Dark side of ruby
ScotRuby - Dark side of rubyGautam Rege
 
Slides chapter3part1 ruby-forjavaprogrammers
Slides chapter3part1 ruby-forjavaprogrammersSlides chapter3part1 ruby-forjavaprogrammers
Slides chapter3part1 ruby-forjavaprogrammersGiovanni924
 
Perl 6 in Context
Perl 6 in ContextPerl 6 in Context
Perl 6 in Contextlichtkind
 
Python WATs: Uncovering Odd Behavior
Python WATs: Uncovering Odd BehaviorPython WATs: Uncovering Odd Behavior
Python WATs: Uncovering Odd BehaviorAmy Hanlon
 
Refactor like a boss
Refactor like a bossRefactor like a boss
Refactor like a bossgsterndale
 
Learning Perl 6 (NPW 2007)
Learning Perl 6 (NPW 2007)Learning Perl 6 (NPW 2007)
Learning Perl 6 (NPW 2007)brian d foy
 
Invertible-syntax 入門
Invertible-syntax 入門Invertible-syntax 入門
Invertible-syntax 入門Hiromi Ishii
 
GCRC 2014 - The Dark Side of Ruby
GCRC 2014 - The Dark Side of RubyGCRC 2014 - The Dark Side of Ruby
GCRC 2014 - The Dark Side of RubyGautam Rege
 
Learning Perl 6
Learning Perl 6 Learning Perl 6
Learning Perl 6 brian d foy
 
NUS iOS Swift Talk
NUS iOS Swift TalkNUS iOS Swift Talk
NUS iOS Swift TalkGabriel Lim
 
Ruby 入門 第一次就上手
Ruby 入門 第一次就上手Ruby 入門 第一次就上手
Ruby 入門 第一次就上手Wen-Tien Chang
 
Python for High School Programmers
Python for High School ProgrammersPython for High School Programmers
Python for High School ProgrammersSiva Arunachalam
 
Programming Paradigms Which One Is The Best?
Programming Paradigms Which One Is The Best?Programming Paradigms Which One Is The Best?
Programming Paradigms Which One Is The Best?Netguru
 
Adventures in Optimization
Adventures in OptimizationAdventures in Optimization
Adventures in OptimizationDavid Golden
 
Saigon Ruby Meetup 06/10/2015 - 5 Random Ruby Tips
Saigon Ruby Meetup 06/10/2015 - 5 Random Ruby TipsSaigon Ruby Meetup 06/10/2015 - 5 Random Ruby Tips
Saigon Ruby Meetup 06/10/2015 - 5 Random Ruby TipsFutureworkz
 
eJADA web development the Ruby way
eJADA web development the Ruby wayeJADA web development the Ruby way
eJADA web development the Ruby wayMustafah Elbanna
 

Similar to RedDot Ruby Conf 2014 - Dark side of ruby (20)

ScotRuby - Dark side of ruby
ScotRuby - Dark side of rubyScotRuby - Dark side of ruby
ScotRuby - Dark side of ruby
 
Slides chapter3part1 ruby-forjavaprogrammers
Slides chapter3part1 ruby-forjavaprogrammersSlides chapter3part1 ruby-forjavaprogrammers
Slides chapter3part1 ruby-forjavaprogrammers
 
Perl 6 in Context
Perl 6 in ContextPerl 6 in Context
Perl 6 in Context
 
Python WATs: Uncovering Odd Behavior
Python WATs: Uncovering Odd BehaviorPython WATs: Uncovering Odd Behavior
Python WATs: Uncovering Odd Behavior
 
Refactor like a boss
Refactor like a bossRefactor like a boss
Refactor like a boss
 
CoffeeScript
CoffeeScriptCoffeeScript
CoffeeScript
 
Learning Perl 6 (NPW 2007)
Learning Perl 6 (NPW 2007)Learning Perl 6 (NPW 2007)
Learning Perl 6 (NPW 2007)
 
Invertible-syntax 入門
Invertible-syntax 入門Invertible-syntax 入門
Invertible-syntax 入門
 
GCRC 2014 - The Dark Side of Ruby
GCRC 2014 - The Dark Side of RubyGCRC 2014 - The Dark Side of Ruby
GCRC 2014 - The Dark Side of Ruby
 
Learning Perl 6
Learning Perl 6 Learning Perl 6
Learning Perl 6
 
NUS iOS Swift Talk
NUS iOS Swift TalkNUS iOS Swift Talk
NUS iOS Swift Talk
 
Ruby 入門 第一次就上手
Ruby 入門 第一次就上手Ruby 入門 第一次就上手
Ruby 入門 第一次就上手
 
Groupes
GroupesGroupes
Groupes
 
Python for High School Programmers
Python for High School ProgrammersPython for High School Programmers
Python for High School Programmers
 
Programming Paradigms Which One Is The Best?
Programming Paradigms Which One Is The Best?Programming Paradigms Which One Is The Best?
Programming Paradigms Which One Is The Best?
 
Adventures in Optimization
Adventures in OptimizationAdventures in Optimization
Adventures in Optimization
 
An introduction to Ruby
An introduction to RubyAn introduction to Ruby
An introduction to Ruby
 
4.1 PHP Arrays
4.1 PHP Arrays4.1 PHP Arrays
4.1 PHP Arrays
 
Saigon Ruby Meetup 06/10/2015 - 5 Random Ruby Tips
Saigon Ruby Meetup 06/10/2015 - 5 Random Ruby TipsSaigon Ruby Meetup 06/10/2015 - 5 Random Ruby Tips
Saigon Ruby Meetup 06/10/2015 - 5 Random Ruby Tips
 
eJADA web development the Ruby way
eJADA web development the Ruby wayeJADA web development the Ruby way
eJADA web development the Ruby way
 

More from Gautam Rege

RubyConf India 2019 - Confessions of a rubypreneur
RubyConf India 2019 - Confessions of a rubypreneurRubyConf India 2019 - Confessions of a rubypreneur
RubyConf India 2019 - Confessions of a rubypreneurGautam Rege
 
GoFFIng around with Ruby #RubyConfPH
GoFFIng around with Ruby #RubyConfPHGoFFIng around with Ruby #RubyConfPH
GoFFIng around with Ruby #RubyConfPHGautam Rege
 
Agile india 2017 - Rewarding OpenSource with $$$
Agile india 2017 - Rewarding OpenSource with $$$Agile india 2017 - Rewarding OpenSource with $$$
Agile india 2017 - Rewarding OpenSource with $$$Gautam Rege
 
WIDS - Gamifying Open Source
WIDS - Gamifying Open SourceWIDS - Gamifying Open Source
WIDS - Gamifying Open SourceGautam Rege
 
Gamifying Open Source
Gamifying Open SourceGamifying Open Source
Gamifying Open SourceGautam Rege
 
Affordable Smart Housing - The new revolution
Affordable Smart Housing - The new revolutionAffordable Smart Housing - The new revolution
Affordable Smart Housing - The new revolutionGautam Rege
 
WebSummit 2015 - Gopher it
WebSummit 2015 - Gopher itWebSummit 2015 - Gopher it
WebSummit 2015 - Gopher itGautam Rege
 
Dont test your code
Dont test your codeDont test your code
Dont test your codeGautam Rege
 
Art of speaking at tech conferences
Art of speaking at tech conferencesArt of speaking at tech conferences
Art of speaking at tech conferencesGautam Rege
 
RubyConf Portugal 2014 - Why ruby must go!
RubyConf Portugal 2014 - Why ruby must go!RubyConf Portugal 2014 - Why ruby must go!
RubyConf Portugal 2014 - Why ruby must go!Gautam Rege
 
Ruby and rails - Advanced Training (Cybage)
Ruby and rails - Advanced Training (Cybage)Ruby and rails - Advanced Training (Cybage)
Ruby and rails - Advanced Training (Cybage)Gautam Rege
 
Rails Vs CakePHP
Rails Vs CakePHPRails Vs CakePHP
Rails Vs CakePHPGautam Rege
 

More from Gautam Rege (13)

RubyConf India 2019 - Confessions of a rubypreneur
RubyConf India 2019 - Confessions of a rubypreneurRubyConf India 2019 - Confessions of a rubypreneur
RubyConf India 2019 - Confessions of a rubypreneur
 
GoFFIng around with Ruby #RubyConfPH
GoFFIng around with Ruby #RubyConfPHGoFFIng around with Ruby #RubyConfPH
GoFFIng around with Ruby #RubyConfPH
 
Agile india 2017 - Rewarding OpenSource with $$$
Agile india 2017 - Rewarding OpenSource with $$$Agile india 2017 - Rewarding OpenSource with $$$
Agile india 2017 - Rewarding OpenSource with $$$
 
WIDS - Gamifying Open Source
WIDS - Gamifying Open SourceWIDS - Gamifying Open Source
WIDS - Gamifying Open Source
 
Gamifying Open Source
Gamifying Open SourceGamifying Open Source
Gamifying Open Source
 
Affordable Smart Housing - The new revolution
Affordable Smart Housing - The new revolutionAffordable Smart Housing - The new revolution
Affordable Smart Housing - The new revolution
 
WebSummit 2015 - Gopher it
WebSummit 2015 - Gopher itWebSummit 2015 - Gopher it
WebSummit 2015 - Gopher it
 
Dont test your code
Dont test your codeDont test your code
Dont test your code
 
Art of speaking at tech conferences
Art of speaking at tech conferencesArt of speaking at tech conferences
Art of speaking at tech conferences
 
RubyConf Portugal 2014 - Why ruby must go!
RubyConf Portugal 2014 - Why ruby must go!RubyConf Portugal 2014 - Why ruby must go!
RubyConf Portugal 2014 - Why ruby must go!
 
Ruby and rails - Advanced Training (Cybage)
Ruby and rails - Advanced Training (Cybage)Ruby and rails - Advanced Training (Cybage)
Ruby and rails - Advanced Training (Cybage)
 
Rails Vs CakePHP
Rails Vs CakePHPRails Vs CakePHP
Rails Vs CakePHP
 
Ruby On Rails
Ruby On RailsRuby On Rails
Ruby On Rails
 

Recently uploaded

Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...OnePlan Solutions
 
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full RecordingOpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full RecordingShane Coughlan
 
VictoriaMetrics Anomaly Detection Updates: Q1 2024
VictoriaMetrics Anomaly Detection Updates: Q1 2024VictoriaMetrics Anomaly Detection Updates: Q1 2024
VictoriaMetrics Anomaly Detection Updates: Q1 2024VictoriaMetrics
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfMarharyta Nedzelska
 
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptxThe Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptxRTS corp
 
UI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptxUI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptxAndreas Kunz
 
Best Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh ITBest Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh ITmanoharjgpsolutions
 
Large Language Models for Test Case Evolution and Repair
Large Language Models for Test Case Evolution and RepairLarge Language Models for Test Case Evolution and Repair
Large Language Models for Test Case Evolution and RepairLionel Briand
 
Sending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdfSending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdf31events.com
 
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Cizo Technology Services
 
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...OnePlan Solutions
 
Keeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldKeeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldRoberto Pérez Alcolea
 
Effectively Troubleshoot 9 Types of OutOfMemoryError
Effectively Troubleshoot 9 Types of OutOfMemoryErrorEffectively Troubleshoot 9 Types of OutOfMemoryError
Effectively Troubleshoot 9 Types of OutOfMemoryErrorTier1 app
 
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfExploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfkalichargn70th171
 
VK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web DevelopmentVK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web Developmentvyaparkranti
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtimeandrehoraa
 
Not a Kubernetes fan? The state of PaaS in 2024
Not a Kubernetes fan? The state of PaaS in 2024Not a Kubernetes fan? The state of PaaS in 2024
Not a Kubernetes fan? The state of PaaS in 2024Anthony Dahanne
 
Strategies for using alternative queries to mitigate zero results
Strategies for using alternative queries to mitigate zero resultsStrategies for using alternative queries to mitigate zero results
Strategies for using alternative queries to mitigate zero resultsJean Silva
 
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...confluent
 
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdf
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdfEnhancing Supply Chain Visibility with Cargo Cloud Solutions.pdf
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdfRTS corp
 

Recently uploaded (20)

Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
 
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full RecordingOpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
 
VictoriaMetrics Anomaly Detection Updates: Q1 2024
VictoriaMetrics Anomaly Detection Updates: Q1 2024VictoriaMetrics Anomaly Detection Updates: Q1 2024
VictoriaMetrics Anomaly Detection Updates: Q1 2024
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdf
 
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptxThe Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
 
UI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptxUI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptx
 
Best Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh ITBest Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh IT
 
Large Language Models for Test Case Evolution and Repair
Large Language Models for Test Case Evolution and RepairLarge Language Models for Test Case Evolution and Repair
Large Language Models for Test Case Evolution and Repair
 
Sending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdfSending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdf
 
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
 
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
 
Keeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldKeeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository world
 
Effectively Troubleshoot 9 Types of OutOfMemoryError
Effectively Troubleshoot 9 Types of OutOfMemoryErrorEffectively Troubleshoot 9 Types of OutOfMemoryError
Effectively Troubleshoot 9 Types of OutOfMemoryError
 
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfExploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
 
VK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web DevelopmentVK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web Development
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtime
 
Not a Kubernetes fan? The state of PaaS in 2024
Not a Kubernetes fan? The state of PaaS in 2024Not a Kubernetes fan? The state of PaaS in 2024
Not a Kubernetes fan? The state of PaaS in 2024
 
Strategies for using alternative queries to mitigate zero results
Strategies for using alternative queries to mitigate zero resultsStrategies for using alternative queries to mitigate zero results
Strategies for using alternative queries to mitigate zero results
 
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
 
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdf
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdfEnhancing Supply Chain Visibility with Cargo Cloud Solutions.pdf
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdf
 

RedDot Ruby Conf 2014 - Dark side of ruby