Slideshow transcript
Slide 1: Ruby Mola (y por qué) Sergio Gil Conferencia Rails noviembre de 2006 1
Slide 2: Ruby
Slide 3: Ruby
Slide 4: Ruby • Simple
Slide 5: Ruby • Simple • Completo
Slide 6: Ruby • Simple • Orientado a objetos • Completo
Slide 7: Ruby • Simple • Orientado a objetos • Completo • Dinamico ´
Slide 8: Ruby • Simple • Orientado a objetos • Completo • Dinamico ´ Ruby y Ruby on Rails
Slide 9: Ruby • Simple • Orientado a objetos • Completo • Dinamico ´ Ruby y Ruby on Rails • Rails aprovecha al maximo la potencia y el ´ dinamismo de Ruby
Slide 10: Ruby • Simple • Orientado a objetos • Completo • Dinamico ´ Ruby y Ruby on Rails • Rails aprovecha al maximo la potencia y el ´ dinamismo de Ruby • DHH opina que no hubiera podido crear Rails con otro lenguaje.
Slide 11: Ruby • Simple • Orientado a objetos • Completo • Dinamico ´ Ruby y Ruby on Rails • Rails aprovecha al maximo la potencia y el ´ dinamismo de Ruby • DHH opina que no hubiera podido crear Rails con otro lenguaje. • Y sin embargo, esta infrautilizado ´
Slide 12: Ruby • Simple • Orientado a objetos • Completo • Dinamico ´ Ruby y Ruby on Rails • Rails aprovecha al maximo la potencia y el ´ dinamismo de Ruby • DHH opina que no hubiera podido crear Rails con otro lenguaje. • Y sin embargo, esta infrautilizado ´
Slide 13: 1 Un lenguaje muy dulce
Slide 14: 1 Un lenguaje muy dulce 2 ‘De serie’
Slide 15: 1 Un lenguaje muy dulce 2 ‘De serie’ ´ 3 Orientacion a objetos
Slide 16: 1 Un lenguaje muy dulce 2 ‘De serie’ ´ 3 Orientacion a objetos ´ 4 Un lenguaje dinamico
Slide 17: Un lenguaje muy dulce 1 Un lenguaje muy dulce 2 ‘De serie’ ´ 3 Orientacion a objetos ´ 4 Un lenguaje dinamico
Slide 18: Un lenguaje muy dulce “Quien no ha probado lo amargo, no sabe lo que es dulce” ´ PROVERBIO ALEM A N
Slide 19: Un lenguaje muy dulce • Los idiomas influyen (¿determinan?) la manera de pensar de las personas
Slide 20: Un lenguaje muy dulce • Los idiomas influyen (¿determinan?) la manera de pensar de las personas • Los lenguajes, la de los programadores
Slide 21: Un lenguaje muy dulce • Los idiomas influyen (¿determinan?) la manera de pensar de las personas • Los lenguajes, la de los programadores Ruby
Slide 22: Un lenguaje muy dulce • Los idiomas influyen (¿determinan?) la manera de pensar de las personas • Los lenguajes, la de los programadores Ruby • Cercano a nuestra forma de pensar
Slide 23: Un lenguaje muy dulce • Los idiomas influyen (¿determinan?) la manera de pensar de las personas • Los lenguajes, la de los programadores Ruby • Cercano a nuestra forma de pensar • Lo cual da una experiencia mejor
Slide 24: Un lenguaje muy dulce • Los idiomas influyen (¿determinan?) la manera de pensar de las personas • Los lenguajes, la de los programadores Ruby • Cercano a nuestra forma de pensar • Lo cual da una experiencia mejor • ¡Es divertido!
Slide 25: Un lenguaje muy dulce • Los idiomas influyen (¿determinan?) la manera de pensar de las personas • Los lenguajes, la de los programadores Ruby • Cercano a nuestra forma de pensar • Lo cual da una experiencia mejor • ¡Es divertido! • Te hace sentir inteligente
Slide 26: Un lenguaje muy dulce • Los idiomas influyen (¿determinan?) la manera de pensar de las personas • Los lenguajes, la de los programadores Ruby • Cercano a nuestra forma de pensar • Lo cual da una experiencia mejor • ¡Es divertido! • Te hace sentir inteligente • ‘Ruby stays out of your way’
Slide 27: Un lenguaje muy dulce Algunos ejemplos
Slide 28: Un lenguaje muy dulce ´ Las estructuras devuelven el valor de la ultima expresion ´ evaluada: @user = if params[:id] User.find(params[:id]) else User.new end
Slide 29: Un lenguaje muy dulce ´ Las estructuras devuelven el valor de la ultima expresion ´ evaluada: @user = if params[:id] User.find(params[:id]) else User.new end
Slide 30: Un lenguaje muy dulce ´ Las estructuras devuelven el valor de la ultima expresion ´ evaluada: @user = if params[:id] User.find(params[:id]) else User.new end
Slide 31: Un lenguaje muy dulce ´ Las estructuras devuelven el valor de la ultima expresion ´ evaluada: @user = if params[:id] User.find(params[:id]) else User.new end ´ Menos codigo 1
Slide 32: Un lenguaje muy dulce ´ Las estructuras devuelven el valor de la ultima expresion ´ evaluada: @user = if params[:id] User.find(params[:id]) else User.new end ´ Menos codigo 1 Menos errores 2
Slide 33: Un lenguaje muy dulce ´ Las estructuras devuelven el valor de la ultima expresion ´ evaluada: @user = if params[:id] User.find(params[:id]) else User.new end ´ Menos codigo 1 Menos errores 2 ´ ¡Mas bonito! 3
Slide 34: Un lenguaje muy dulce ´ Las asignaciones tambien devuelven el valor asignado: @post = Post.find(params[:id]) if @post @post.destroy end
Slide 35: Un lenguaje muy dulce ´ Las asignaciones tambien devuelven el valor asignado: @post = Post.find(params[:id]) if @post @post.destroy end Mejor: if @post = Post.find(params[:id]) @post.destroy end
Slide 36: Un lenguaje muy dulce ´ Las asignaciones tambien devuelven el valor asignado: @post = Post.find(params[:id]) if @post @post.destroy end Mejor: if @post = Post.find(params[:id]) @post.destroy end
Slide 37: Un lenguaje muy dulce ´ Las asignaciones tambien devuelven el valor asignado: @post = Post.find(params[:id]) if @post @post.destroy end Mejor: if @post = Post.find(params[:id]) @post.destroy end • Y ademas nos repetimos menos ´
Slide 38: Un lenguaje muy dulce Asignaciones condicionales
Slide 39: Un lenguaje muy dulce Asignaciones condicionales @title = "T´tulo gen´rico" unless defined?(@title) ı e
Slide 40: Un lenguaje muy dulce Asignaciones condicionales @title = "T´tulo gen´rico" unless defined?(@title) ı e @title ||= "T´tulo gen´rico" ı e
Slide 41: Un lenguaje muy dulce Asignaciones condicionales @title = "T´tulo gen´rico" unless defined?(@title) ı e @title ||= "T´tulo gen´rico" ı e @heading = if defined?(@subsection) @subsection.title else @section.title end
Slide 42: Un lenguaje muy dulce Asignaciones condicionales @title = "T´tulo gen´rico" unless defined?(@title) ı e @title ||= "T´tulo gen´rico" ı e @heading = if defined?(@subsection) @subsection.title else @section.title end @heading = ( @subsection || @section ).title
Slide 43: Un lenguaje muy dulce Asignaciones condicionales @title = "T´tulo gen´rico" unless defined?(@title) ı e @title ||= "T´tulo gen´rico" ı e @heading = if defined?(@subsection) @subsection.title else @section.title end @heading = ( @subsection || @section ).title
Slide 44: ‘De serie’ 1 Un lenguaje muy dulce 2 ‘De serie’ ´ 3 Orientacion a objetos ´ 4 Un lenguaje dinamico
Slide 45: ‘De serie’ “Cualquier tecnolog´a ı distinguible de la magia es insuficientemente avanzada” ´ CLE ON I
Slide 46: ‘De serie’ • La clase Array1 es una de las joyas de las clases inclu´das ı 1 ´ Sin olvidar el modulo Enumerable
Slide 47: ‘De serie’ • La clase Array1 es una de las joyas de las clases inclu´das ı • Le daremos un repaso para ejemplificar: 1 ´ Sin olvidar el modulo Enumerable
Slide 48: ‘De serie’ • La clase Array1 es una de las joyas de las clases inclu´das ı • Le daremos un repaso para ejemplificar: • La potencia de las clases inclu´das ı 1 ´ Sin olvidar el modulo Enumerable
Slide 49: ‘De serie’ • La clase Array1 es una de las joyas de las clases inclu´das ı • Le daremos un repaso para ejemplificar: • La potencia de las clases inclu´das ı • La potencia y el uso de los bloques 1 ´ Sin olvidar el modulo Enumerable
Slide 50: ‘De serie’ • La clase Array1 es una de las joyas de las clases inclu´das ı • Le daremos un repaso para ejemplificar: • La potencia de las clases inclu´das ı • La potencia y el uso de los bloques • El ‘estilo Ruby’ 1 ´ Sin olvidar el modulo Enumerable
Slide 51: ‘De serie’ @arr = [ 1, 2, 3, 4, 5 ]
Slide 52: ‘De serie’ @arr = [ 1, 2, 3, 4, 5 ] Iterando: @arr.each do |item| puts item end
Slide 53: ‘De serie’ @arr = [ 1, 2, 3, 4, 5 ] Iterando: @arr.each do |item| puts item end
Slide 54: ‘De serie’ @arr = [ 1, 2, 3, 4, 5 ] Iterando: @arr.each do |item| puts item end
Slide 55: ‘De serie’ @arr = [ 1, 2, 3, 4, 5 ] Iterando: Que es el for de toda la vida: @arr.each do |item| for item in @arr puts item puts item end end
Slide 56: ‘De serie’ @arr = [ 1, 2, 3, 4, 5 ] Iterando: Que es el for de toda la vida: @arr.each do |item| for item in @arr puts item puts item end end
Slide 57: ‘De serie’ @arr = [ 1, 2, 3, 4, 5 ] Iterando: Que es el for de toda la vida: @arr.each do |item| for item in @arr puts item puts item end end
Slide 58: ‘De serie’ Lo bueno empieza ahora:
Slide 59: ‘De serie’ Lo bueno empieza ahora: Utilidades varias • .uniq [ 1, 1, 2, 3, 3 ].uniq >> [ 1, 2, 3 ]
Slide 60: ‘De serie’ Lo bueno empieza ahora: Utilidades varias • .uniq • .flatten [ [ 1, 1 ], 2, [ 3, 3 ] ].flatten >> [ 1, 1, 2, 3, 3 ]
Slide 61: ‘De serie’ Lo bueno empieza ahora: Utilidades varias • .uniq • .flatten [ 1, nil, 2, nil, 3 ].compact • .compact >> [ 1, 2, 3 ]
Slide 62: ‘De serie’ Lo bueno empieza ahora: Utilidades varias • .uniq • .flatten [ 1, 1, 2, 3, 3 ].reverse • .compact >> [ 3, 3, 2, 1, 1 ] • .reverse
Slide 63: ‘De serie’ Lo bueno empieza ahora: Utilidades varias • .uniq • .flatten [ 1, 3, 2, 1, 3 ].sort • .compact >> [ 1, 1, 2, 3, 3 ] • .reverse • .sort
Slide 64: ‘De serie’ Lo bueno empieza ahora: Utilidades varias • .uniq • .flatten • .compact • .reverse • .sort Busqueda ´ [ 1, 2, 3 ].find {|n| n % 3 == 0 } >> 3 • .find [ 1, 2, 3 ].find {|n| n % 5 == 0 } >> nil
Slide 65: ‘De serie’ Lo bueno empieza ahora: Utilidades varias • .uniq • .flatten • .compact • .reverse • .sort Busqueda ´ [ 1, 3, 5, 6 ].find all {|n| n % 3 == 0 } >> [ 3, 6 ] • .find [ 1, 2, 3 ].find all {|n| n % 5 == 0 } • .find all >> []
Slide 66: ‘De serie’ Lo bueno empieza ahora: Utilidades varias • .uniq • .flatten • .compact • .reverse • .sort Busqueda ´ [ 1, 3, 5, 6 ].reject {|n| n % 3 == 0 } >> [ 1, 5] • .find [ 1, 2, 3 ].reject {|n| n % 5 == 0 } • .find all >> [ 1, 2, 3 ]
Slide 67: ‘De serie’ Operaciones • ‘Suma’: + [ 1, 2 ] + [ 3, 4 ] >> [ 1, 2, 3, 4 ]
Slide 68: ‘De serie’ Operaciones • ‘Suma’: + • ‘Resta’: - [ 1, 2, 3, 4 ] - [ 2, 3 ] >> [ 1, 4 ]
Slide 69: ‘De serie’ Operaciones • ‘Suma’: + • ‘Resta’: - [ 1, 2 ] * 3 • ‘Repeticion’: * ´ >> [ 1, 2, 1, 2, 1, 2 ]
Slide 70: ‘De serie’ Operaciones • ‘Suma’: + • ‘Resta’: - [ 0, 1, 2, 3, 4 ] & [ 0, 3, 6 ] • ‘Repeticion’: * ´ >> [ 0, 3 ] • Interseccion (∩): & ´
Slide 71: ‘De serie’ Operaciones • ‘Suma’: + • ‘Resta’: - [ 1, 2, 3] | [ 3, 4, 5 ] • ‘Repeticion’: * ´ >> [ 1, 2, 3, 4, 5 ] • Interseccion (∩): & ´ • Union (∪): | ´
Slide 72: ‘De serie’ ´ Nunca mas esto: @precios = ... @ivas = [] @precios.each do |precio| @ivas << precio * 0.16 end
Slide 73: ‘De serie’ ´ Nunca mas esto: @precios = ... @ivas = [] @precios.each do |precio| @ivas << precio * 0.16 end ¿No es mejor esto? @ivas = @precios.map {|precio| precio * 0.16 }
Slide 74: ‘De serie’ Por si hace falta otro ejemplo: @precios = ... @total = 0 @precios.each do |precio| @total += precio end
Slide 75: ‘De serie’ Por si hace falta otro ejemplo: @precios = ... @total = 0 @precios.each do |precio| @total += precio end ´ ¿No es mas bonito as´? ı @total = @precios.inject {|t, precio| t + precio }
Slide 76: ‘De serie’ ¿Y en Rails? Algunos ejemplos chulos:
Slide 77: ‘De serie’ ¿Y en Rails? Algunos ejemplos chulos: @comments = @posts.map { |p| p.comments }.flatten.sort
Slide 78: ‘De serie’ ¿Y en Rails? Algunos ejemplos chulos: @comments = @posts.map { |p| p.comments }.flatten.sort
Slide 79: ‘De serie’ ¿Y en Rails? Algunos ejemplos chulos: @comments = @posts.map { |p| p.comments }.flatten.sort
Slide 80: ‘De serie’ ¿Y en Rails? Algunos ejemplos chulos: @comments = @posts.map { |p| p.comments }.flatten.sort @last comments = Comment.find(:all, :order => ’date DESC’, :limit => 10) @last commented posts = @last comments.map { |c| c.post }.uniq
Slide 81: ‘De serie’ ¿Y en Rails? Algunos ejemplos chulos: @comments = @posts.map { |p| p.comments }.flatten.sort @last comments = Comment.find(:all, :order => ’date DESC’, :limit => 10) @last commented posts = @last comments.map { |c| c.post }.uniq
Slide 82: ‘De serie’ ¿Y en Rails? Algunos ejemplos chulos: @comments = @posts.map { |p| p.comments }.flatten.sort @last comments = Comment.find(:all, :order => ’date DESC’, :limit => 10) @last commented posts = @last comments.map { |c| c.post }.uniq <p>Comentado por: <%= @post.comments.sort[0..4].map { |c| link to(c.user.name, c.permalink) }.join(’, ’) %></p>
Slide 83: ‘De serie’ ¿Y en Rails? Algunos ejemplos chulos: @comments = @posts.map { |p| p.comments }.flatten.sort @last comments = Comment.find(:all, :order => ’date DESC’, :limit => 10) @last commented posts = @last comments.map { |c| c.post }.uniq <p>Comentado por: <%= @post.comments.sort[0..4].map { |c| link to(c.user.name, c.permalink) }.join(’, ’) %></p>
Slide 84: ‘De serie’ ¿Y en Rails? Algunos ejemplos chulos: @comments = @posts.map { |p| p.comments }.flatten.sort @last comments = Comment.find(:all, :order => ’date DESC’, :limit => 10) @last commented posts = @last comments.map { |c| c.post }.uniq <p>Comentado por: <%= @post.comments.sort[0..4].map { |c| link to(c.user.name, c.permalink) }.join(’, ’) %></p>
Slide 85: ‘De serie’ ¿Y en Rails? Algunos ejemplos chulos: @comments = @posts.map { |p| p.comments }.flatten.sort @last comments = Comment.find(:all, :order => ’date DESC’, :limit => 10) @last commented posts = @last comments.map { |c| c.post }.uniq <p>Comentado por: <%= @post.comments.sort[0..4].map { |c| link to(c.user.name, c.permalink) }.join(’, ’) %></p>
Slide 86: ‘De serie’ Merece la pena conocer bien las clases inclu´das ı ´ Algunas clases y modulos que no perder de vista
Slide 87: ‘De serie’ Merece la pena conocer bien las clases inclu´das ı ´ Algunas clases y modulos que no perder de vista • Array
Slide 88: ‘De serie’ Merece la pena conocer bien las clases inclu´das ı ´ Algunas clases y modulos que no perder de vista • Array • Enumerable
Slide 89: ‘De serie’ Merece la pena conocer bien las clases inclu´das ı ´ Algunas clases y modulos que no perder de vista • Array • Enumerable • Hash
Slide 90: ‘De serie’ Merece la pena conocer bien las clases inclu´das ı ´ Algunas clases y modulos que no perder de vista • Array • Enumerable • Hash • Numeric
Slide 91: ‘De serie’ Merece la pena conocer bien las clases inclu´das ı ´ Algunas clases y modulos que no perder de vista • Array • Range • Enumerable • Hash • Numeric
Slide 92: ‘De serie’ Merece la pena conocer bien las clases inclu´das ı ´ Algunas clases y modulos que no perder de vista • Array • Range • Enumerable • Regexp • Hash • Numeric
Slide 93: ‘De serie’ Merece la pena conocer bien las clases inclu´das ı ´ Algunas clases y modulos que no perder de vista • Array • Range • Enumerable • Regexp • Hash • String • Numeric
Slide 94: ‘De serie’ Merece la pena conocer bien las clases inclu´das ı ´ Algunas clases y modulos que no perder de vista • Array • Range • Enumerable • Regexp • Hash • String • Numeric • Time
Slide 95: ´ Orientacion a objetos 1 Un lenguaje muy dulce 2 ‘De serie’ ´ 3 Orientacion a objetos ´ 4 Un lenguaje dinamico
Slide 96: ´ Orientacion a objetos “Los prisioneros de la ´ caverna solo ven las sombras de los objetos.” ´ PLAT ON
Slide 97: ´ Orientacion a objetos En Ruby: • Todo es un objeto
Slide 98: ´ Orientacion a objetos En Ruby: • Todo es un objeto • Todo
Slide 99: ´ Orientacion a objetos En Ruby: • Todo es un objeto • Todo • De verdad, todo
Slide 100: ´ Orientacion a objetos En serio, todo: • No hay ‘tipos primitivos’ 2 ´ Lo cual permite tecnicas avanzadas que no veremos hoy =;-)
Slide 101: ´ Orientacion a objetos En serio, todo: • No hay ‘tipos primitivos’ • Los numeros son objetos Fixnum (o Float, o...) ´ 2 ´ Lo cual permite tecnicas avanzadas que no veremos hoy =;-)
Slide 102: ´ Orientacion a objetos En serio, todo: • No hay ‘tipos primitivos’ • Los numeros son objetos Fixnum (o Float, o...) ´ • Las cadenas son objetos String 2 ´ Lo cual permite tecnicas avanzadas que no veremos hoy =;-)
Slide 103: ´ Orientacion a objetos En serio, todo: • No hay ‘tipos primitivos’ • Los numeros son objetos Fixnum (o Float, o...) ´ • Las cadenas son objetos String • Incluso las clases son objetos Class2 2 ´ Lo cual permite tecnicas avanzadas que no veremos hoy =;-)
Slide 104: ´ Orientacion a objetos De toda la vida: def sanitize title(title) sanitized title = ... return sanitized title end ... post.title = params[:title] post.sanitized title = sanitize title(post.title)
Slide 105: ´ Orientacion a objetos ´ ´ Mas bonito y mas DRY : class Post < ActiveRecord::Base def sanitized title ... end end ... post.title = params[:title] post.sanitized title
Slide 106: ´ Orientacion a objetos Mejor aun: ´ class String def sanitize ... end end ... post.title = params[:title] post.title.sanitize
Slide 107: ´ Un lenguaje dinamico 1 Un lenguaje muy dulce 2 ‘De serie’ ´ 3 Orientacion a objetos ´ 4 Un lenguaje dinamico
Slide 108: ´ Un lenguaje dinamico “Un hombre no puede ˜ banarse dos veces en el mismo r´o; ni el r´o ni el ı ı hombre son los mismos, puesto que todo fluye.” ´ HER A CLITO
Slide 109: ´ Un lenguaje dinamico En Ruby: • No hay diferencia entre ‘tiempo de compilacion’ y ‘tiempo ´ ´ de ejecucion’
Slide 110: ´ Un lenguaje dinamico En Ruby: • No hay diferencia entre ‘tiempo de compilacion’ y ‘tiempo ´ ´ de ejecucion’ • Se pueden crear y modificar clases, redefinir o anadir ˜ ´ metodos, en cualquier momento
Slide 111: ´ Un lenguaje dinamico En Ruby: • No hay diferencia entre ‘tiempo de compilacion’ y ‘tiempo ´ ´ de ejecucion’ • Se pueden crear y modificar clases, redefinir o anadir ˜ ´ metodos, en cualquier momento • Hasta los tipos basicos, como Class u Object ´
Slide 112: ´ Un lenguaje dinamico ´ ¿Como creen si no que Rails... • ...anade metodos a clases ActiveRecord tras leer la base ˜ ´ de datos? (como name o incluso find by name())
Slide 113: ´ Un lenguaje dinamico ´ ¿Como creen si no que Rails... • ...anade metodos a clases ActiveRecord tras leer la base ˜ ´ de datos? (como name o incluso find by name()) • ...anade unos metodos tras ejecutar otros? ˜ ´ ˜ ´ (has many :posts anade el metodo posts, etc...)
Slide 114: ´ Un lenguaje dinamico ´ ¿Como creen si no que Rails... • ...anade metodos a clases ActiveRecord tras leer la base ˜ ´ de datos? (como name o incluso find by name()) • ...anade unos metodos tras ejecutar otros? ˜ ´ ˜ ´ (has many :posts anade el metodo posts, etc...) • ...modifica nuestros metodos para que ejecuten los filtros? ´ (before filter y after filter)
Slide 115: ´ Un lenguaje dinamico ´ Nosotros tambien podemos redefinir
Slide 116: ´ Un lenguaje dinamico ´ Nosotros tambien podemos redefinir class Fixnum def +(other) self - other end end
Slide 117: ´ Un lenguaje dinamico ´ Nosotros tambien podemos redefinir class Fixnum def +(other) self - other end end >> 5 + 4
Slide 118: ´ Un lenguaje dinamico ´ Nosotros tambien podemos redefinir class Fixnum def +(other) self - other end end >> 5 + 4 => 1
Slide 119: ´ Un lenguaje dinamico ´ Un ejemplo mas cabal
Slide 120: ´ Un lenguaje dinamico ´ Un ejemplo mas cabal class Post < ActiveRecord::Base end
Slide 121: ´ Un lenguaje dinamico ´ Un ejemplo mas cabal class Post < ActiveRecord::Base def title=(title) write attribute(’title’, title) end end
Slide 122: ´ Un lenguaje dinamico ´ Un ejemplo mas cabal class Post < ActiveRecord::Base def title=(title) write attribute(’title’, title) if self.new? write attribute(’sanitized title’, title.sanitize) end end end
Slide 123: Preguntas ¿ ... ?
Slide 124: Moraleja: Aprendan Ruby Merece la pena ¡Y gracias por venir!
Slide 125: Salamanca 17 Madrid – 28020 España tel. +34 91 567 0605 www.thecocktail.com 2
Slide 126: Referencias • “Programming Ruby”, Dave Thomas • “The Pragmatic Programmer”, Adrew Hunt & Dave Thomas • http://www.ruby-lang.org/ • http://www.rubyonrails.org/ • http://www.cs.byu.edu/colloquia/2006Fall/presentations/Matz slides/ • http://es.wikipedia.org/wiki/Plat%C3%B3n • http://es.wikipedia.org/wiki/Her%C3%A1clito Fotograf´as: ı • http://flickr.com/photos/rtv/290062998/in/pool-sweetcandy/ • http://microwave.gotovim.ru/ • http://www.xtec.es/lvallmaj/passeig/plato2.htm • http://www.flickr.com/photos/mtnpix/294515665/






Add a comment on Slide 1
If you have a SlideShare account, login to comment; else you can comment as a guest- Favorites & Groups
Showing 1-50 of 3 (more)