Rails Summit Latin America

El día número 256 del año se declaró el día del programador. Esta vez apoyaremos el consumismo haciendolo saber a todo el mundo “SOY PROGRAMADOR Y HOY ES MI DIA!”.

Despues de soportar muchas veces los más duros proyectos, los proyect managers más incompetentes, los clientes más insoportables, nosotros que estamos ahí al pié del cañon para llegar con los milestones y que el mundo virtual se haga realidad, tenemos derecho a un regalito, por eso… HAGAMOSLO SABER! HOY ES NUESTRO DIA!

FELICIDADES A TODOS!

P

Solo para recordarles que hasta el 9 de Septiembre está el descuento en la suscripción al RailsSummit Latin America a realizarse en San Pablo el 15 y 16 de Octubre.

Para los que estén interesados en juntarse para conseguir mejor precio aquí nos estamos organizando para abaratar costos.

Quien consiga mejores ofertas y quiera compartir solo agregarlo en el wiki o en la lista.

Mash it up! Mocking hash

September 1st, 2008

Muchas veces nos encontramos con la necesidad de armar estructuras de datos u objetos pero no queremos caer en open struct pero usar un hash nos queda incómodo.

Mhash es un Hash que actúa como un objeto usando los keys como si fueran métodos para acceder a los valores. Podemos crear de esta manera pseudo objetos de manera muy sencilla. Mhash nos ayuda a hacer mocking de objetos y armar objetos que permite recibir atributos en forma dinámica.


>> require 'mhash'
=> ["Mhash"]
>> articulo = Mhash.new
=> Mhash
>> articulo.autor = "Pedro Visintin" 
=> "Pedro Visintin" 
>> articulo.fecha = Time.now
=> Tue Sep 02 10:08:44 -0300 2008
>> articulo.inspect
=> "<Mhash autor="Pedro Visintin" fecha=Tue Sep 02 10:08:44 -0300 2008>" 

También podemos tomar un hash de base y mhash convertirá todos los hashes en mhashes.


>> hash = {:articulo => {:autor=>{:nombre=>"Pedro Visintin",:email=>"pedro@mail.com"},:titulo=>"Mashit up"}}
=> {:articulo=>{:autor=>{:nombre=>"Pedro Visintin", :email=>"pedro@mail.com"}, :titulo=>"Mashit up"}}
>> post = Mhash.new(hash)
=> <Mhash articulo <Mhash autor <Mhash email"pedro@mail.com" nombre"Pedro Visintin"> titulo"Mashit up">>
>> post.articulo.autor.nombre
=> "Pedro Visintin" 

No solo eso sinó que tambien podemos preguntar si un atributo está asignado:


>> post.fecha?
=> false
>> post.fecha = Time.now
=> Tue Sep 02 10:24:16 -0300 2008
>> post.fecha? 
=> true

Finalmente tenemos el signo ! para crear atributos en jerarquías no inicializadas como por ejemplo:


>> articulo = Mhash.new
=> Mhash
>> articulo.autor!.nombre = "Pedro" 
=> "Pedro" 
>> articulo.autor?
=> true
>> articulo.autor 
=> Mhash nombre"Pedro" 

Mhash es Mash de Michael Bleigh de Intridea, se llama Mhash para evitar conflictos con Mash en Merb, y este artículo está basado en el artículo original. Usé este gem para Open Flash Chart Lazy

La versión renombrada pueden instalarla así


gem sources -a http://gems.github.com
sudo gem install peterpunk-mhash
Los sources:

http://github.com/peterpunk/mhash/tree/master

Rails 2.1 que hay de nuevo del brasilero Carlos Brando traducido al español por nuestro colega Gastón Ramos

Versión HTML

Gracias Gastón y Lucas Florio por tu aporte a la comunidad!

La idea es poder dar soporte a los usuarios del lazy plugin!

open-flash-chart-lazy@googlegroups.com

Open Flash Chart Lazy Plugin

No se si realmente se suscribirá alguien pero hay que abrir la puerta ;-)

Me gustaría saber si alguien está usando el plugin.

Bueno no especialmente para nosotros, sinó en general si pagamos la registración antes del 9 de septiembre hay 100 Reales de descuento.

Ya está disponible la versión internacional del website con soporte para tarjetas de crédito internacionales. Esto permite que cualquier latinoamericáno pueda suscribirse.

Vamos a los números:

Según la cotización del dia el Real cotiza vendedor promedio a 1,81:

Momento de suscripción precio en Reales precio en Pesos Argentinos
Antes del 9 de septiembre $R 300 $AR 543
Despues del 9 de septiembre $R 400 $AR 724
Diferencia $R 100 $AR 181

El evento tendrá traducción real time de inglés a español para todos los speakers en inglés.

La diferencia de la suscripción antes del 9 es interesante para aprovechar, de hecho la voy a aprovechar.

Espero vayamos unos cuantos.

Podemos ayudar a difundir este evento colocando banners en nuestros blogs

Ups el link dice .asp jajajaja

Encontré interesante hablar de este problema y como se soluciona en Rails-ActiveRecord.

El problema es: Un select multiple que tiene un has_many through asociado.

Veamos como nos ayuda activerecord en esto, para verlo utilice la consola de rails y emulé lo que viene del post.

Nuestro modelo principal: Doctor y asociaciones, Certification y Certificate


Doctor
=> Doctorid: integer, user_id: integer, first_name: string, last_name: string, date_of_birth: .....

Con que se asocia?


Doctor.reflections.each do |macro_name,reflection|
?> puts "#{reflection.macro} => :#{macro_name}" 
>> end;1
composed_of => :address
composed_of => :phone
belongs_to => :user
has_many => :degrees
has_many => :certificates
has_many => :certifications
=> 1

Vamos a guardar los certificates asociados, este es el modelo Certificate


 Certificate
=> Certificateid: integer, name: string, created_at: datetime, updated_at: datetime

sus asociaciones:


>> Certificate.reflections.each do |macro_name,reflection|
?> puts "#{reflection.macro} => :#{macro_name}" 
>> end;1
has_many => :certifications

Y éste es el modelo Certifications


Certification 
=> Certificationid: integer, doctor_id: integer, created_at: datetime, updated_at: datetime, certificate_id: integer
Sus asociaciones

>> Certification.reflections.each do |macro_name,reflection|
?> puts "#{reflection.macro} => :#{macro_name}" 
>> end;1
belongs_to => :doctor
belongs_to => :certificate

el ;1 es para que no devuelva la evaluación de reflections.

Para eso crearemos algunos usando el plugin spawner que hizo Michel Martens


>> 100.times do 
?> Certificate.spawn
>> end;1
=> 1
>> Certificate.count
=> 100

Ahora creamos un Doctor


 Doctor.spawn
=> #<Doctor id: 1, user_id: 1, first_name: nil, last_name: nil, date_of_birth: nil, gender: nil, avatar_file_name: nil, 
...
display_name: nil, type: "Doctor">

En nuestra vista deberíamos tener algo así


form_for .... do |f|
...
f.select certificate_ids,Certificate.all().collect{|c| [[c.name],[c.id]]},{},{:multiple=>true}
end

Ahora asociamos certificates usando certificate_ids, para eso nos traemos 4 certificados al azar


 certificates = Certificate.all[0..3]
=> [#<Certificate id: 1, name: "--- \n- aperiam\n- laboriosam\n", created_at: "2008-08-19 22:43:11", updated_at: "2008-08-19 22:43:11">, 
#<Certificate id: 2, name: "--- \n- quidem\n- voluptate\n", created_at: "2008-08-19 22:43:11", updated_at: "2008-08-19 22:43:11">, 
#<Certificate id: 3, name: "--- \n- officia\n- iure\n", created_at: "2008-08-19 22:43:11", updated_at: "2008-08-19 22:43:11">, 
#<Certificate id: 4, name: "--- \n- ipsum\n- eos\n", created_at: "2008-08-19 22:43:11", updated_at: "2008-08-19 22:43:11">]

Obtenemos los ids como si vienen de un form en certificates_ids[]


 new_certificates_for_doctor = certificates.collect {|c| c.id}
=> [1, 2, 3, 4]

Ahora al primer doctor le asignamos estos certificates_ids, para eso vemos que tiene asociado:


d = Doctor.first
=> #<Doctor id: 1, user_id: 1, first_name: nil, last_name: nil, date_of_birth: nil, gender: nil, avatar_file_name: nil, 
...
"2008-08-19 22:45:08", updated_at: "2008-08-19 22:45:08", display_name: nil, type: "Doctor">
>> d.certificate_ids
=> []

Ahora agregamos los ids que habíamos seleccionado:


 d.certificate_ids = new_certificates_for_doctor
=> [1, 2, 3, 4]
>> d.save
=> true

Vemos que pasó …


 Certification.all 
=> [#<Certification id: 1, doctor_id: 1, created_at: "2008-08-20 02:12:51", updated_at: "2008-08-20 02:12:51", certificate_id: 1>, 
#<Certification id: 2, doctor_id: 1, created_at: "2008-08-20 02:12:51", updated_at: "2008-08-20 02:12:51", certificate_id: 2>, 
#<Certification id: 3, doctor_id: 1, created_at: "2008-08-20 02:12:51", updated_at: "2008-08-20 02:12:51", certificate_id: 3>, 
#<Certification id: 4, doctor_id: 1, created_at: "2008-08-20 02:12:51", updated_at: "2008-08-20 02:12:51", certificate_id: 4>]

 d.certificates
=> [#<Certificate id: 1, name: "--- \n- aperiam\n- laboriosam\n", created_at: "2008-08-19 22:43:11", updated_at: "2008-08-19 22:43:11">, 
#<Certificate id: 2, name: "--- \n- quidem\n- voluptate\n", created_at: "2008-08-19 22:43:11", updated_at: "2008-08-19 22:43:11">, 
#<Certificate id: 3, name: "--- \n- officia\n- iure\n", created_at: "2008-08-19 22:43:11", updated_at: "2008-08-19 22:43:11">, 
#<Certificate id: 4, name: "--- \n- ipsum\n- eos\n", created_at: "2008-08-19 22:43:11", updated_at: "2008-08-19 22:43:11">]
>> d.certifications
=> [#<Certification id: 1, doctor_id: 1, created_at: "2008-08-20 02:12:51", updated_at: "2008-08-20 02:12:51", certificate_id: 1>, 
#<Certification id: 2, doctor_id: 1, created_at: "2008-08-20 02:12:51", updated_at: "2008-08-20 02:12:51", certificate_id: 2>, 
#<Certification id: 3, doctor_id: 1, created_at: "2008-08-20 02:12:51", updated_at: "2008-08-20 02:12:51", certificate_id: 3>, 
#<Certification id: 4, doctor_id: 1, created_at: "2008-08-20 02:12:51", updated_at: "2008-08-20 02:12:51", certificate_id: 4>]

Ahora imaginemos que en el post nos eliminan una certificación, para reproducir esto eliminamos un elemento del array


new_certificates_for_doctor.delete(3)
=> 3
>> new_certificates_for_doctor          
=> [1, 2, 4]

Ahora vamos con esos ids que nos mandaron desde el form


 d.certificate_ids
=> [1, 2, 3, 4]
>> d.certificate_ids = new_certificates_for_doctor
=> [1, 2, 4]
>> d.save
=> true
>> d.reload
>> Certification.all
=> [#<Certification id: 1, doctor_id: 1, created_at: "2008-08-20 02:12:51", updated_at: "2008-08-20 02:12:51", certificate_id: 1>, 
#<Certification id: 2, doctor_id: 1, created_at: "2008-08-20 02:12:51", updated_at: "2008-08-20 02:12:51", certificate_id: 2>, 
#<Certification id: 4, doctor_id: 1, created_at: "2008-08-20 02:12:51", updated_at: "2008-08-20 02:12:51", certificate_id: 4>]
 d.certifications
=> [#<Certification id: 1, doctor_id: 1, created_at: "2008-08-20 02:12:51", updated_at: "2008-08-20 02:12:51", certificate_id: 1>, 
#<Certification id: 2, doctor_id: 1, created_at: "2008-08-20 02:12:51", updated_at: "2008-08-20 02:12:51", certificate_id: 2>, 
#<Certification id: 4, doctor_id: 1, created_at: "2008-08-20 02:12:51", updated_at: "2008-08-20 02:12:51", certificate_id: 4>]

ActiveRecord manejó todo por nosotros.

Espero les sirva el ejemplo.

Ayer nos juntamos en Milion con Marcel Molina, el estaba de vacaciones y quería juntarse con algunos geeks y rubystas aquí.

Gracias Emmanuel por las fotos.

Para nosotros fué un gran honor tener a uno de los core-rails developers sentado en nuestra mesa y pudiendo compartir historias ideas y pensamientos.

Marcel nos contó que ahora está desarrollando para iPhone (o sea que fuimos todos engañados ;-) ) Lo curioso al respecto es que para desarrollar para iPhone hay que firmar un NDA por el cual, no se puede postear nada sobre lo que se haga.

Frases o párrafos que rescato de algunas preguntas que le hicimos:

Como ves el futuro de Ruby?

Marcel: Matz dijo Ruby 1.8 es estable, funciona bien y lo pueden usar por mucho tiempo más. Hay versiones de Ruby para todos los gustos, JRuby, MRI, Rubinius, IronRuby, etc. Mientras no salga una versión nueva que se vayan por su propio lado sin respetar los specs de Matz, vamos bien.

Passenger?

Marcel: Ahorra mucho al momento del deploy, y consume menos que el mongrel. Si tenes que empezar algo de cero es el mejor camino. (voy pensando en migrar :-P)

Autenticación?

Acá viene algo interesante en cuanto a concepción de diseño que muchas veces caemos muchos. Marcel: Si vas a construir una casa, lo último que vas a hacer es ponerle la puerta y la cerradura, no empezas por ahí. Autenticación a lo último.

Qué pensas de lo que pasa con los problemas de seguridad con Ruby?

Marcel: Algunos exploits como el último son realmente dificiles de reproducir, entonces no me desespero ni bajo los servicios. De hecho no tuve ningún ataque esos días. Diferente fue el patch de rails en la versión 1.2 donde …. cuando dijimos, apliquen este patch, es importante, no vamos a decir nada, solo háganlo.

Maglev dará el empuje que Ruby necesita para posicionarse como mainstream?

Marcel: Es importante el tema de Maglev pero también hara que muchos rubistas se pasen a smalltalk, Avi Bryant está ocupado en otras cosas ahora (casamiento) pero Maglev continuará y será importante para la comunidad Ruby.

Tu conferencia favorita?

Rubyconf

Marcel no estudió Informática en la Universidad, el estudió letras.

Claro que hablamos mas cosas pero creo haber resumido lo más importante, si hay algo que agregar avisen.

Marcel: Gracias, fué un gustazo!

Este viernes 15 nos vamos a juntar en Milion para charlar de Rails Ruby y quien sabe de qué mas.

Espero que no desaprovechen este meeting ya que contaremos con la presencia de Marcel Molina Jr.

Nos encontramos en Milion

Dirección: Parana Nº 1048 Hora: 18 horas (6pm)

Esto es Paraná entre Santa Fé y MT de Alvear.

P

PizzaConf en Mar del Plata

August 12th, 2008

El Miercoles 13 a las 19 horas nos encontramos los Rubystas y Raileros que anden por Mardel y adelaños.

La idea es conocernos y mostrar algun pedacito de código, proyecto que querramos compartir.

El encuentro es en Piazza, Alem y la costa, gracias Michel por la sugerencia.

Nos vemos ahí

Y el viernes nos encontramos con Marcel Molina en Baires

Agregué la clase para soportar este gráfico y mejoré la doc, le falta, pero vamos mejorando.

Open Flash Chart Lazy

git://github.com/peterpunk/open_flash_chart_lazy.git

Sugiero ver la aplicación de ejemplo en Sinatra (el Foca me mostro como se usa)

Hablando con Luis Lavena me comentó de este sitio (que seguramente ya muchos lo conocen), para los que nó, aqui va:

http://rails-doc.org/

Lo interesante es que nos dice de un metodo desde que versión hasta que versión está disponible.

Un ejemplo para ver es por ejemplo Autocomplete que ya no está mas.

Si queremos que la documentación sea mejor, que esperamos para registrarnos? No nos hagamos los Indúes (esto va en chiste por la carta a DHH del hindú)

Saludos

P

En la Pizzaconf Uruguay, presentaron Sinatra y lo encontré ideal para armar una aplicación de ejemplo para Open Flash Chart Lazy. Ya lo puse en marcha y estoy trabajando en armar los tutoriales para el plugin. Pueden ver algo acá (no esta listo, falta bastante)

Sample App Open Flash Chart Lazy

Sources de la sample app en Sinatra

Saluti

P

Primero que nada quiero contarles que la Universidad Pacífico de Santiago de Chile, incorporó en su carrera de Comunicación Multimedia la enseñanza de Ruby y Rails para la parte de desarrollo web.

El viernes 18 de julio del 2008 presentaré una charla introductoria de Ruby on Rails con motivo de las clases que daré en la Universidad del Pacífico de Ruby y Rails en septiembre de este año.

La charla es abierta al público en general y será gratuita.

Dirección: Universidad del Pacífico sede Providencia Av. Ricardo Lyon 227, Providencia Viernes 18 a las 10 de la mañana.

Los espero…

Tuve que incluír un gráfico de barras, asi que ahora está incluído, también revisé la doc (primitiva) y faltaba especificar la ruta dentro de un hash.

Algunas mejoras:

  • Corrección de la documentación (actualizado en el anuncio original).
  • Bar chart fue incorporado.
  • Atributos generales del gráfico pueden ser especificados ahora.

Próximos pasos:

  • Más ejemplos
  • Más de un gráfico inline (en lo posible sin tocar open_flash_chart_2)

Seguiremos mejorándolo.

Si alguien lo usó y tiene alguna idea o sugerencia, bienvenido!

P