CELTAB
Centro Latino-Americano
de Tecnologias Abertas
1
Ruby?!
2
3
4
● O que é o ruby?
● Onde e como nasceu?
● Para que serve?
5
Comparando ruby
com outras LPs
6
Versões de ruby
7
Ruby Version Manager
RVM é uma ferramenta de linha de comando
que permite instalar, gerenciar e trabalhar com
múltiplas versões de ruby e diversos conjuntos
de gems.
rvm.io
8
“Ruby está projetado para fazer os
programadores felizes.”
Yukihiro “Matz” Matsumoto - Criador do Ruby
9
Ruby
● Interpretada
● Totalmente Orientada a Objetos
● Dinâmica e fortemente Tipada
● Gramática complexa, mas expressiva
● Inspirada em Smalltalk, Lisp, Perl,
Ada, python...
10
➔ Programação OO
➔ Programação imperativa
➔ Programação Funcional
➔ Metaprogramação
➔ ...
O que podemos fazer?
11
➔ Gambiarras!
➔ Softwares
➔ Ferramentas
➔ Scripts
O que podemos construir?
12
Em ruby, tudo é objeto...
...sem exceções!
13
“[...] a não ser as variáveis...
… elas fazem referências a eles.”
14
Core Classes
➔ String
➔ Números
➔ Array
➔ Hash
➔ Symbol
➔ Boolean
➔ nil
➔ Range
➔ Regex
➔ Procs, blocks e lambdas
15
Types
value = 123 # => Fixnum
value = “1234” # => String
number = 1234
string = “I’m a string”
# Podemos somar ?
puts number + string
# => TypeError: String can't be coerced into Fixnum
16
Duck Typing
“Se anda como um pato e faz barulho como um pato,
então de deve ser um pato. E o interpretador ficará feliz
em fazer com que o objeto seja tratado como um pato. Na
prática, isso significa que em vez de fazer verificações de
tipo de um objeto, você deve se preocupar se este objeto
é capaz de executar o método que você precisa.”
- Nando Vieira
17
Duck Typing
class Marmot
def initialize(message)
@message = message
end
def quack
puts “Quack: #{@message}”
end
end
class Duck
def initialize
@name = “John Doe”
end
def quack
puts “Quack, my name is #{@name}”
end
end
duck_1 = Marmot.new “Marmots”
duck_2 = Duck.new
duck_1.quack # => “Quack: Marmots”
duck_2.quack # => “Quack, my name is John Doe”
18
Strings
message = “Galera!”
message_1 = ‘Hey’
message_1 + “, e” + “ ai ” + message
#=> “Hey, e ai Galera!”
ruby-doc.org/core-2.2.0/String.html19
Strings: Interpolação
message = “Galera!”
message_1 = ‘Hey’
“#{message_1}, e ai #{message}”
#=> “Hey, e ai Galera!”
“Agora somando #{3 + 5}”
#=> “Agora somando 8”
20
Números
21
Números
puts 1234 #=> 1234 - Base decimal, padrão
puts 0d1234 #=> 1234 - Base decimal, padrão
puts 1_234 #=> 1234 - Underscores são ignorados
puts -1234 #=> -1234 - Negativo
puts 0x4d2 #=> 1234 - Hexadecimal
puts 02322 #=> 1234 - Octal
puts 0b10011010010 #=> 1234 -Binário
puts 1.234 #=> 1.234
puts -1.234 #=> -1.234
puts 1_234.0 #=> 1234.0
puts 12e2 #=> 1200.0
puts 12.3e2 #=> 1230.0
puts 12.3E2 #=> 1230.0
22
Arrays
items = [ 1, "String", 1.0, [ 2, 3], nil ]
# => [ 1, “String”, 1.0, [ 2, 3], nil ]
puts [ "a", "a", "c" ] <=> [ "a", "b", "c" ] #=> -1
puts [ 1, 2, 3, 4, 5, 6 ] <=> [ 1, 2 ] #=> +1
items = Array.new
# => [ ]
items = Array.new([ 1, 2, 3 ])
# => [ 1, 2, 3 ]
words = %w[aa bb cc dd ee ff]
# => [ “aa”, “bb”, “cc”, “dd”, “ee”, “ff” ]
puts words[1]
# => “bb”
23
Hash
hash = { name: "John", last_name: "Doe", "zombie" => false, 'age' => '1e1'}
hash.each { |hash, value|
puts " ~> #{hash}(#{hash.class}) #{value}(#{value.class})"
}
# ~> name(Symbol) John(String)
# ~> last_name(Symbol) Doe(String)
# ~> zombie(String) false(FalseClass)
# ~> age(String) 1e1(String)
hash[:new_value] = { b: "something", 'another_value' => "something else" }
puts hash.inspect
# {:name=>"John", :last_name=>"Doe", "zombie"=>false, "age"=>"1e1", :
new_value=>{:b=>"something", "another_value"=>"something else"}}
24
Symbols
sym = :name
zombie = :"zombie"
to_sym = "john".to_sym
example = 'example'.intern
[sym, zombie, to_sym, example].each { |s|
puts "#{s}(#{s.class})"
}
# name(Symbol)
# zombie(Symbol)
# john(Symbol)
# example(Symbol)
25
Módulos
26
Classes
module Zombie
class Zombie
def initialize
@name = "John Doe"
@brains_eaten = 0
end
def tweet
"I want brains!"
end
def eat(n = 1)
@brains_eaten += n
end
def rooting
"Yeap"
end
def status
{ :status => "I just ate some delicious brains",
:zombie => @name }
end
end
end 27
Herança
Obs: ‘Não existe herança múltipla em ruby’
class Walker < Zombie
def walk
# do something
end
end
28
Mixins
module SuperHero
def super_powers
# Do something
end
end
module Fly
def fly
#Do something
end
end
class Goku
include SuperHero
include Fly
def saiyan
@@force *= :infinite
end
end
class Hulk
include SuperHero
def say_something_smart
"Hulk smash!"
end
end
29
Erros?
filename = 'testfile'
begin
# .. process
f = File.open('testfile')
rescue Exception => e
# .. handle error
filename = 'testfile.rb'
retry
ensure
f.close if f
end
30
➔ Condicionais (if, else, elseif, unless)
➔ Seletor Múltiplo (Case)
➔ Estruturas de repetição(for...in, while..
until, loop)
➔ Iteradores (Enumerator, Iterator)
➔ Closures
➔ Procs, blocks e Lambdas
➔ Variáveis (@@Classe, @instância)
➔ Constantes
➔ Monkey Patching e Refinements
31
32
33
SimpleDateFormat dtForm = new SimpleDateFormat("yyyy-MM-dd");
connection = GlobalConnector.getConnection();
StringBuffer sql = new StringBuffer("INSERT INTO conta (Numero,
Agencia, DataAdesao, DataEncerramento, ValorCorrenteTotalEmConta,
Cliente_id, TipoConta_id)");
sql.append(" VALUES(" + account.getAccountNumber() + ",'");
sql.append(account.getBankBranch() + "','");
sql.append(dtForm.format(account.getStartAccountDate()) + "','");
sql.append(dtForm.format(account.getClosingAccountDate()) + "','");
sql.append(account.getSaldoCorrente().toString() + "','");
sql.append(account.getClient().getIdClient() + "',");
sql.append(account.getTipo().getId() + ");");
connection.execute(sql);
connection.close();
34
@PersistenceContext(unitName = UNIT_NAME)
private EntityManager em;
private Class<T> entityClass;
public GenericDao(Class<T> entityClass) {
this.entityClass = entityClass;
}
public T save(T entity)
throws EntityExistsException, IllegalArgumentException, TransactionRequiredException
public void delete(Long id)
throws IllegalArgumentException, TransactionRequiredException
public T update(T entity)
throws IllegalArgumentException, TransactionRequiredException
public List<T> findAll()
throws IllegalStateException, QueryTimeoutException, TransactionRequiredException,
PessimisticLockException, LockTimeoutException, PersistenceException
35
@items = Item.all
@item = Item.find(params[:id])
@item = Item.new(item_params)
@item.save
@item.update_attributes(item_params)
@item.destroy
def item_params
params.require(:item).permit(:name, :quantity, :
useful_for, :category_id)
end
36
➔ PaaS
➔ Agilidade
➔ tempo x $$
➔ Cultura github
➔ Ecossistema
Rails para Startups
37
38
hotframeworks.com
39
Como continuar?
40
Try ruby!
tryruby.org
41
Como continuar?
codeschool.com/paths/ruby
42
github.com/markets/awesome-ruby
lista de 100+ ferramentas ruby para tudo!
43
github.com/bbatsov/ruby-style-guide
44
guides.rubyonrails.org/
45
46
47
kenner.hp@gmail.com
github.com/gnomex
@KennerKliemann
slideshare/kennerkliemann
br.linkedin.com/in/kennerkliemann
48
49

Começando com ruby

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
    ● O queé o ruby? ● Onde e como nasceu? ● Para que serve? 5
  • 6.
  • 7.
  • 8.
    Ruby Version Manager RVMé uma ferramenta de linha de comando que permite instalar, gerenciar e trabalhar com múltiplas versões de ruby e diversos conjuntos de gems. rvm.io 8
  • 9.
    “Ruby está projetadopara fazer os programadores felizes.” Yukihiro “Matz” Matsumoto - Criador do Ruby 9
  • 10.
    Ruby ● Interpretada ● TotalmenteOrientada a Objetos ● Dinâmica e fortemente Tipada ● Gramática complexa, mas expressiva ● Inspirada em Smalltalk, Lisp, Perl, Ada, python... 10
  • 11.
    ➔ Programação OO ➔Programação imperativa ➔ Programação Funcional ➔ Metaprogramação ➔ ... O que podemos fazer? 11
  • 12.
    ➔ Gambiarras! ➔ Softwares ➔Ferramentas ➔ Scripts O que podemos construir? 12
  • 13.
    Em ruby, tudoé objeto... ...sem exceções! 13
  • 14.
    “[...] a nãoser as variáveis... … elas fazem referências a eles.” 14
  • 15.
    Core Classes ➔ String ➔Números ➔ Array ➔ Hash ➔ Symbol ➔ Boolean ➔ nil ➔ Range ➔ Regex ➔ Procs, blocks e lambdas 15
  • 16.
    Types value = 123# => Fixnum value = “1234” # => String number = 1234 string = “I’m a string” # Podemos somar ? puts number + string # => TypeError: String can't be coerced into Fixnum 16
  • 17.
    Duck Typing “Se andacomo um pato e faz barulho como um pato, então de deve ser um pato. E o interpretador ficará feliz em fazer com que o objeto seja tratado como um pato. Na prática, isso significa que em vez de fazer verificações de tipo de um objeto, você deve se preocupar se este objeto é capaz de executar o método que você precisa.” - Nando Vieira 17
  • 18.
    Duck Typing class Marmot definitialize(message) @message = message end def quack puts “Quack: #{@message}” end end class Duck def initialize @name = “John Doe” end def quack puts “Quack, my name is #{@name}” end end duck_1 = Marmot.new “Marmots” duck_2 = Duck.new duck_1.quack # => “Quack: Marmots” duck_2.quack # => “Quack, my name is John Doe” 18
  • 19.
    Strings message = “Galera!” message_1= ‘Hey’ message_1 + “, e” + “ ai ” + message #=> “Hey, e ai Galera!” ruby-doc.org/core-2.2.0/String.html19
  • 20.
    Strings: Interpolação message =“Galera!” message_1 = ‘Hey’ “#{message_1}, e ai #{message}” #=> “Hey, e ai Galera!” “Agora somando #{3 + 5}” #=> “Agora somando 8” 20
  • 21.
  • 22.
    Números puts 1234 #=>1234 - Base decimal, padrão puts 0d1234 #=> 1234 - Base decimal, padrão puts 1_234 #=> 1234 - Underscores são ignorados puts -1234 #=> -1234 - Negativo puts 0x4d2 #=> 1234 - Hexadecimal puts 02322 #=> 1234 - Octal puts 0b10011010010 #=> 1234 -Binário puts 1.234 #=> 1.234 puts -1.234 #=> -1.234 puts 1_234.0 #=> 1234.0 puts 12e2 #=> 1200.0 puts 12.3e2 #=> 1230.0 puts 12.3E2 #=> 1230.0 22
  • 23.
    Arrays items = [1, "String", 1.0, [ 2, 3], nil ] # => [ 1, “String”, 1.0, [ 2, 3], nil ] puts [ "a", "a", "c" ] <=> [ "a", "b", "c" ] #=> -1 puts [ 1, 2, 3, 4, 5, 6 ] <=> [ 1, 2 ] #=> +1 items = Array.new # => [ ] items = Array.new([ 1, 2, 3 ]) # => [ 1, 2, 3 ] words = %w[aa bb cc dd ee ff] # => [ “aa”, “bb”, “cc”, “dd”, “ee”, “ff” ] puts words[1] # => “bb” 23
  • 24.
    Hash hash = {name: "John", last_name: "Doe", "zombie" => false, 'age' => '1e1'} hash.each { |hash, value| puts " ~> #{hash}(#{hash.class}) #{value}(#{value.class})" } # ~> name(Symbol) John(String) # ~> last_name(Symbol) Doe(String) # ~> zombie(String) false(FalseClass) # ~> age(String) 1e1(String) hash[:new_value] = { b: "something", 'another_value' => "something else" } puts hash.inspect # {:name=>"John", :last_name=>"Doe", "zombie"=>false, "age"=>"1e1", : new_value=>{:b=>"something", "another_value"=>"something else"}} 24
  • 25.
    Symbols sym = :name zombie= :"zombie" to_sym = "john".to_sym example = 'example'.intern [sym, zombie, to_sym, example].each { |s| puts "#{s}(#{s.class})" } # name(Symbol) # zombie(Symbol) # john(Symbol) # example(Symbol) 25
  • 26.
  • 27.
    Classes module Zombie class Zombie definitialize @name = "John Doe" @brains_eaten = 0 end def tweet "I want brains!" end def eat(n = 1) @brains_eaten += n end def rooting "Yeap" end def status { :status => "I just ate some delicious brains", :zombie => @name } end end end 27
  • 28.
    Herança Obs: ‘Não existeherança múltipla em ruby’ class Walker < Zombie def walk # do something end end 28
  • 29.
    Mixins module SuperHero def super_powers #Do something end end module Fly def fly #Do something end end class Goku include SuperHero include Fly def saiyan @@force *= :infinite end end class Hulk include SuperHero def say_something_smart "Hulk smash!" end end 29
  • 30.
    Erros? filename = 'testfile' begin #.. process f = File.open('testfile') rescue Exception => e # .. handle error filename = 'testfile.rb' retry ensure f.close if f end 30
  • 31.
    ➔ Condicionais (if,else, elseif, unless) ➔ Seletor Múltiplo (Case) ➔ Estruturas de repetição(for...in, while.. until, loop) ➔ Iteradores (Enumerator, Iterator) ➔ Closures ➔ Procs, blocks e Lambdas ➔ Variáveis (@@Classe, @instância) ➔ Constantes ➔ Monkey Patching e Refinements 31
  • 32.
  • 33.
  • 34.
    SimpleDateFormat dtForm =new SimpleDateFormat("yyyy-MM-dd"); connection = GlobalConnector.getConnection(); StringBuffer sql = new StringBuffer("INSERT INTO conta (Numero, Agencia, DataAdesao, DataEncerramento, ValorCorrenteTotalEmConta, Cliente_id, TipoConta_id)"); sql.append(" VALUES(" + account.getAccountNumber() + ",'"); sql.append(account.getBankBranch() + "','"); sql.append(dtForm.format(account.getStartAccountDate()) + "','"); sql.append(dtForm.format(account.getClosingAccountDate()) + "','"); sql.append(account.getSaldoCorrente().toString() + "','"); sql.append(account.getClient().getIdClient() + "',"); sql.append(account.getTipo().getId() + ");"); connection.execute(sql); connection.close(); 34
  • 35.
    @PersistenceContext(unitName = UNIT_NAME) privateEntityManager em; private Class<T> entityClass; public GenericDao(Class<T> entityClass) { this.entityClass = entityClass; } public T save(T entity) throws EntityExistsException, IllegalArgumentException, TransactionRequiredException public void delete(Long id) throws IllegalArgumentException, TransactionRequiredException public T update(T entity) throws IllegalArgumentException, TransactionRequiredException public List<T> findAll() throws IllegalStateException, QueryTimeoutException, TransactionRequiredException, PessimisticLockException, LockTimeoutException, PersistenceException 35
  • 36.
    @items = Item.all @item= Item.find(params[:id]) @item = Item.new(item_params) @item.save @item.update_attributes(item_params) @item.destroy def item_params params.require(:item).permit(:name, :quantity, : useful_for, :category_id) end 36
  • 37.
    ➔ PaaS ➔ Agilidade ➔tempo x $$ ➔ Cultura github ➔ Ecossistema Rails para Startups 37
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
    github.com/markets/awesome-ruby lista de 100+ferramentas ruby para tudo! 43
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.