Introducción
a Ruby

Ruby Argentina Asociación Civil
25 de Septiembre de 2012

¿Quiénes somos?

Ruby Argentina
Asociación Civil

Preguntas al público

ルビ (Ruby)

Agenda

Características de Ruby

Ruby is designed for programmer happiness
matz

Elige tu propia aventura


Multiplataforma


Múltiples implementaciones

Interpretado



Simbología!

Dinámico

value = 42
puts value # => 42
value = "Hola UNLaM!"
puts value # => Hola UNLaM!

puts "hola".capitalize # => "Hola"
        

En Ruby todo es un objeto

>> "fnoCybuR".reverse
=> "RubyConf"

a = ""
4.times { |i| a+= i.to_s  }
# => 0123

4.8.round
# => 5

nil.nil?
# => true
nil.class
# => NilClass

Clases

class Person
  attr_accessor :name
end
inkel = Person.new
inkel.name = "Leandro"
puts inkel.name # => "Leandro"

Módulos

module Say
  def self.say
    "I'm a module!"
  end
end
Say.new # => NoMethodError
puts Say.say # => "I'm a module!"

Herencia

class Animal
  attr_accessor :kind
end
class Human < Animal
  def initialize
    @kind = "Human"
  end
end

extend/include

module Extend
  def de_clase
    "class method"
  end
end
module Include
  def de_instancia
    "instance method"
  end
end
class EI
  extend Extend
  include Include
end

extend/include 2

EI.de_clase
# => class method
EI.new.de_instancia
# => instance method

Es una buena manera de extender funcionalidades en las clases.

En cierto sentido, similar a las interfaces de Java o a los templates de C++.

Arrays

nums  = [1, 2, 3, 4, 5]
names = [ "ceneon", "inkel" ]
meses = %w{ enero febrero marzo abril mayo ... }
        

Hashes

meses = { :enero => 31, :febrero => 28 }
meses[:enero] # => 31
counter = Hash.new { |h, k| h[k] = 0 }
counter[:a] # => 0
counter[:b] += 1 # => 1
        

Pasaje de parámetros por nombre

Curso.find(:conditions => {:dia => Date.today }, :order => "id asc" )

Splats

def splats(*args)
  p [ args.length, args ]
end

splats "ceneon"
# => [1, ["ceneon"]]
splats "ceneon", "inkel"
# => [2, ["ceneon", "inkel"]]

Open source + Monkey Patching

Código fuente de Ruby: https://github.com/ruby/ruby

class String
  def greet
    "Hola #{self}!"
  end
end

>> "UNLaM".greet
=> "Hola UNLaM!"
        

Introspección

class Person
  attr_accessor :name, :age
end

Person.instance_methods
# => "[:instance_eval, :pretty_inspect, :enum_for, :public_methods..."

Person.instance_methods.grep(/^to_/).sort.reverse
# => "[:to_yaml_properties, :to_yaml, :to_s, :to_enum]"

Person.instance_methods false
# => [:name, :name=, :age, :age=]
        

Es muy expresivo

10.times do
  puts "u "
end

puts "Hoy es la charla!" if Time.now.tuesday?

Person.delete_all!

(1..5).each do |i|
  puts "El cuadrado de #{i} es #{i * i}"
end

1_000_000.times do
  # Algo que se hará muchas veces
end

Closure

user = "Foo Bar"
10.times do
  puts user
end

# Donde *user* es una variable que fue creada
# fuera del bloque y el bloque puede acceder a ella
        
vec = []
(0..7).each do |n|
  vec <<  n
end

# vec => [0, 1, 2, 3, 4, 5, 6, 7]
          

Lambda

reverse_string_order = lambda {  |x, y|  y.to_s <=> x.to_s }
[1, 20, 3].sort &reverse_string_order
# => [20, 3, 1]

square = lambda { |n| n * n }
[1, 2, 3, 4, 5].map &square
# => [1, 4, 9, 16, 25]
        

Instalar Ruby

Ruby.install!

Ruby.installed?

conf$ ruby -v
=> ruby 1.9.....
        

Interactive Ruby

conf$ irb
"hola mundo".split
=> ["hola", "mundo"]
        

Probar Ruby online

http://tryruby.org

TryRuby.org

Editores / IDEs

Ruby Ecosystem

Ruby Version Management

Rake: Ruby Make

# Rakefile
task :default => [:test]

desc "Run unit tests"
task :test do
  ruby "test/unittest.rb"
end

# Bash
rake test
        

RubyGems: Distribución de paquetes


Librerías, o "gemas" de todo tipo

Sistema de repositorios símil Debian/Ubuntu

# Bash
gem install 'twitter'
        

RubyGems: Ejemplo @Twitter

# irb
> require 'twitter'
=> true

> Twitter.user_timeline("inkel").first.text
=> "cerrando detalles de la charla de #Ruby para la UNLaM"
        

Algunos Gems muy Usados

Git


SCM (Como SVN, CVS pero mejor!)

Proyectos en Git: Linux, Debian, Eclipse




GitHub


Social Coding (Open Source Fun!)

Proyectos en GitHub: jQuery, Symfony, DJAngo, Linux Kernel






"git y GitHub, primeros pasos" por Ruby Argentina, el 21/8

Desktop Frameworks

Web Frameworks

Objetivo principal: Más productividad

Ruby on Rails

http://rubyonrails.org/

Algunos features

Ejemplos de empresas que usan Rails

Sinatra


http://www.sinatrarb.com/

Sinatra


Minimalista. Simple.

require 'sinatra'

get '/hi' do
  "Hello World!"
end
        

Otros Frameworks

Ejemplo - Rails


Paso 1: Crear la aplicación

$ rails new app1
        

Paso 2: Configurar base de datos

/config/database.yml
/Gemfile # => 'mysql2'
        

Ejemplo - Rails


Paso 3: Crear un "Scaffold" (andamios)

$ rails generate scaffold alumno nombre:string dni:integer email:string
        

Paso 4: Actualizar base de datos

$ rake db:migrate
        

(Ver resultado en la BD)

Ejemplo - Rails


Paso 5: Iniciar el servidor

$ rails server
        

http://localhost:3000/alumnos

(Ver model, controller y views)

Ejemplo - Rails


Validaciones del modelo

/app/models/alumno.rb
# validates_presence_of :nombre
# validates_numericality_of :dni
        

Localizar mensajes

/config/environment.rb
/config/locales/es.yml
rails server
        

Ejemplo - Rails


Layouts

/app/views/layouts/application.html.erb
        

Form Helpers

/app/views/alumnos/_form.html.erb
        

Ejemplo - Rails


Bonus: Poner una foto a los alumnos

/Gemfile # => gem 'paperclip'
$ bundle install

$ rails g migration agregarFotoDeAlumnos
add_column :alumnos, :foto_file_name,    :string
add_column :alumnos, :foto_content_type, :string
add_column :alumnos, :foto_file_size,    :integer
add_column :alumnos, :foto_updated_at,   :datetime

$ rake db:migrate

/app/models/alumno.rb
has_attached_file :foto, :styles => { :medium => "300x300>", :thumb => "128x128>" }
validates_attachment_content_type :foto, :content_type=>['image/jpeg', 'image/png', 'image/gif']
        

Ejemplo - Rails


Bonus: Poner una foto a los alumnos

/app/views/alumnos/_form.html.erb
form_for .... , :html => { :multipart => true }
f.file_field :foto

/app/views/alumnos/index.html.erb
image_tag alumno.foto.url(:thumb)
        

Recursos

Eventos locales

Meetups mensuales (ruby.com.ar)

Otras charlas de Ruby Argentina

Rails Girls Buenos Aires

15 y 16 de Junio

railsgirls.com/buenosaires

RubyConf Argentina 2012 - Parte del "Tour Ruby Sur"

RubyConf Argentina 2012

http://rubyconfargentina.org

17, 19 y 20 de Octubre
Paseo La Plaza

@rubyconfar



http://rubyconfargentina.org

25% de descuento con código: RUBYUNLAM

Ruby Argentina Asociación Civil

¿Preguntas?

Slides: ceneon.github.com/ruby-talk

Gracias por venir

ruby.com.ar - @rubyargentina

rubyconfargentina.org - @rubyconfar - rubyconfar@gmail.com

Slides: ceneon.github.com/ruby-talk