Azure Monitor & Application Insight to monitor Infrastructure & Application
Ruby para-programadores-php
1. Ruby
para programadores PHP
Monday, April 25, 2011
2. PHP
História
• Criada por Rasmus Lerdorf em 1994.
• Objetivo: Fazer um contador para a página pessoal de Rasmus.
• Originalmente era apenas uma biblioteca Perl.
• PHP3 escrito por Andi Gutmans e Zeev Suraski (Zend) em 1997/98
Monday, April 25, 2011
3. Ruby
História
• Criada por Yukihiro Matsumoto (Matz) em 1993.
• Objetivo: Criar uma linguagem poderosa que tenha uma “versão simplificada”
de programação funcional com ótima OO.
• Matz: “I wanted a scripting language that was more powerful than Perl, and
more object-oriented than Python. That's why I decided to design my own
language”
• Matz: “I hope to see Ruby help every programmer in the world to be
productive, and to enjoy programming, and to be happy. That is the primary
purpose of Ruby language.”
Monday, April 25, 2011
6. PHP
Paradigma
• Procedural com suporte a OO.
$a = array(1,2,3);
array_shift($a);
=> 1
array_pop($a);
=> 3
array_push($a, 4);
=> [2,4]
Monday, April 25, 2011
7. Ruby
Paradigma
• Procedural, totalmente OO com classes (Smalltalk-like), um tanto funcional
com o conceito de blocos. Not Haskell thought.
a = [1,2,3]
a.shift
=> 1
a.pop
=> 3
a.push(4)
=> [2,4]
Monday, April 25, 2011
8. PHP
Tipagem
• Dinâmica e fraca.
10 + “10”;
=> 20
Monday, April 25, 2011
9. Ruby
Tipagem
• Dinâmica e forte. (Aberta a mudanças.)
10 + “10”
=> TypeError: String can't be coerced into Fixnum
class Fixnum
alias :old_sum :+
def + s
old_sum s.to_i
end
end
10 + “10”
=> 20
Monday, April 25, 2011
12. Ruby
Fluxo
• if, unless ...
if i == j
...
end
unless cond
...
end
puts “Maior” if age >= 18
puts “Menor” unless user.adult?
Monday, April 25, 2011
13. Ruby
Fluxo
• ...case...
# default usage
case hour
when 1: ...
when 2: ...
end
# with ranges!
case hour
when 0..7, 19..23: puts “Good nite”
when 8..12: puts “Good mornin’”
end
Monday, April 25, 2011
14. Ruby
Fluxo
• ...case...
# with regexes
case date
when /d{2}-d{2}-d{4}/: ...
when /d{2}/d{2}/d{4}/: ...
end
# crie seu próprio case
class MyClass
def ===
...
end
end
Monday, April 25, 2011
15. PHP
Iteradores
• while, for, foreach;
while($i < 10){ ... }
for($i = 0; $i < length($clients); $i++){ ... }
foreach($clients as $client){ ... }
Monday, April 25, 2011
16. Ruby
Iteradores
• for in, each, map, select, inject... enumeradores;
5.times{ ... }
[5,7,4].each{ ... }
[1,2,3].map{|i| i + 1 }
=> [2,3,4]
[16,19,22].select{|i| i >= 18 }
=> [19,22]
[5,7,8].inject{|s,i| s + i }
=> 20
Monday, April 25, 2011
17. Ruby
Iteradores / Blocos
• crie seu próprio iterador:
def hi_five
yield 1; yield 2; yield 3; yield 4; yield 5
end
hi_five{|i| ... }
Monday, April 25, 2011
18. Ruby
Blocos
• power to the people.
File.open(“file”, “w”){|f| f.write(“Wow”) }
File.each_line(“file”){|l| ... }
Dir.glob(“*.png”){ ... }
“Ruby para programadores PHP”.gsub(/PHP/){|m| ... }
get “/” { ... } # sinatra
p{ span “Ruby is ”; strong “cool” } # markaby
Monday, April 25, 2011
19. PHP
OO
• Herança comum, classes abstratas, interfaces. Como Java.
Monday, April 25, 2011
20. Ruby
OO
• Classes e módulos.
module Walker
def walk
...
end
end
# módulo como “herança múltipla” ou “mixin”
class Johny
include Walker
end
Monday, April 25, 2011
21. Ruby
OO
• Classes e módulos.
# módulo como “namescope”
module Foo
class Bar
...
end
end
variable = Foo::Bar.new
Monday, April 25, 2011
22. PHP
OO Dinâmico
• __call: Chama métodos não existentes.
• __get: Chama “atributos” não existentes.
• __set: Chama ao tentar setar atributos não existentes;
$obj->metodo();
$obj->atributo;
$obj->atributo = “valor”;
Monday, April 25, 2011
23. Ruby
OO Dinâmico
• method_missing: Tudo em Ruby são chamadas de métodos.
obj.metodo # chama o método “metodo”
obj.atributo # chama o método “atributo”
obj.atributo = “valor” # chama o método “atributo=”
class Foo
def method_missing m, *args
...
end
end
Monday, April 25, 2011
24. Ruby
OO Dinâmico
• inherited...
# inherited
class Foo
def self.inherited(subklass)
...
end
end
class Bar < Foo
end
Monday, April 25, 2011
25. Ruby
OO Dinâmico
• included...
# included
module Foo
def included(klass)
...
end
end
class Bar
include Foo
end
Monday, April 25, 2011
26. Ruby
OO Dinâmico
• class_eval, class_exec....
class Foo; end
Foo.class_eval(“def bar() ... end”)
Foo.class_exec{ def bar() ... end }
Foo.bar # works
Foo.baz # works
Monday, April 25, 2011
27. Ruby
OO Dinâmico
• instance_eval, instance_exec, define_method....
class Foo
define_method(:bar) { ... }
instance_exec{ def baz(); ... end }
instance_eval(“def qux(); ... end”)
end
Foo.new.bar # works
Foo.new.baz # works
Foo.new.qux # works
Monday, April 25, 2011
28. Ruby
OO Dinâmico
• attr_(reader|accessor|writer)
class Foo
attr_accessor :bar
end
# same as...
class Foo
def bar() @bar end
def bar= val
@bar = val
end
end
Monday, April 25, 2011
29. Ruby
OO Dinâmico
• nesting, alias, autoload, class_variable_(set|get|defined?), const_(get|set|
defined?|missing), constanst, instance_(method|methods), method_(added|
defined?|removed|undefined), remove_(class_variable|const|method),
undef_method, and so much more...
Monday, April 25, 2011
30. PHP
Comunidade
• PECL, PEAR. ... PHP Classes?
Monday, April 25, 2011
31. Ruby
Comunidade
• RubyGems
gem install bundler # install gem
bundler gem my_gem # create my own gem
cd my_gem
rake release # that’s all folks
#also
bundler install # install all dependencies for a project
Monday, April 25, 2011
32. Ruby
Comunidade
• GitHub
Monday, April 25, 2011