Mostrando las entradas con la etiqueta tijuanarb. Mostrar todas las entradas
Mostrando las entradas con la etiqueta tijuanarb. Mostrar todas las entradas

jueves, noviembre 18, 2010

Wash, DRY and fold

DRY es una de las recomendaciones mas mencionadas en el desarrollo de software, DRY es el acronimo de "Don't Repeat Yourself" o "No te repitas" en español.

DRY lo que promueve es la no duplicidad de código fuente en nuestro software, ya que la duplicidad acarrea una serie de problemas de mantenimiento, inconsistencia en la funcionalidad, falta de claridad, etc.

Es por eso que en nuestros desarrollos debemos de buscar patrones de código que se repiten una y otra vez para tratar de extraerlos, abstraerlos y reutilizarlos.

El origen de este post es precisamente, que en un desarrollo en Ruby On Rails que estoy haciendo, encontre estos patrones repetitivos en mis controladores. La mayoría de ellos trabajan haciendo CRUD de manera muy tradicional, por lo tanto las acciones de: Index, Show, Edit, New, Create, Update y Destroy tienen código muy similar a excepción de las referencias al modelo sobre el cual actúan.

Buscando una solución para eliminar esto, me encontré con el proyecto de José Valim (@josevalim) Inherited Resources, el cual trata precisamente sobre como mantenerse DRY.
Algo importante es que Inherited Resources no cambia nuestra forma de trabajar al nombrar variables con nombres genéricos para que puedan ser usadas en nuestros controladores, el se encarga de nombrar las variables de acuerdo a la convención de Rails por lo tanto su uso es bastante transparente.

El post no se trata sobre Inherited Resources, por lo que aqui les dejo ligas a material de referencia para quien guste conocer mas:

¿Bueno entonces de que se trata el post? Es sobre DRY, pero mi implementación de DRY para un problema particular.

En el proyecto que estoy trabajando, tuve la necesidad de que la aplicación de Rails consumiera datos de un API de otra aplicación, la aplicación, de hecho son varias aplicaciones, que contiene lo datos no tiene API, por lo que con una aplicación de Sinatra, le cree un API Rest para que pueda ser consumida con la aplicación Rails - la aplicación de Rails y las aplicaciones sin API están en diferentes servidores/redes -. Esta API Rest puede ser consumida desde Rails a través del uso de ActiveResources, que aparentan ser modelos normales de Rails, pero que en realidad hacen llamados remotos a través de http para obtener sus datos.

En mi problema, tengo un controlador con diversas acciones, donde cada acción hace una llamada Rest a diferentes modelos y muestra los datos obtenidos, hay llamadas que traen una colección de objetos y otras que solamente traen un objeto en particular.

El patron que comencé a ver en las diversas llamadas para traer colecciones de datos fue:


así como la variación siguiente, también para traer colecciones de objetos:


La diferencia entre ellos es que en ocasiones se pasa el ID y en otras no, fuera de eso son muy similares.

Por otro lado, al traer un solo elemento el patrón era el siguiente:


Donde se pasa el ID en otro orden como parametro y la llamada ya no es al metodo all, es a find.

Este código se repetia una y otra ves en mi controlador donde solo cambiaba el nombre del Modelo, así como las variables @modelos y @modelo que es a donde se asignan los datos una vez que se obtienen.

Mi intención aquí es hacer que esto funcione DRY, y con la ayuda de un poco de metaprogramacion es fácil el lograrlo.

La idea es que pudiese hacer algo como:

fetch_resources! :modelo

o

fetch_resource! :modelo

Para obtener mis datos a través de Rest para el modelo adecuado y que se cargara la variable correspondiente con los datos correctos.



Así es como llegue al código que se muestra arriba. El método en singular trae un solo modelo a través de Rest y el metodo en plural trae una colección de modelos, opcionalmente ambos pueden aceptar un filtro en forma de Hash, y el modelo se indica a través de un símbolo.

El metodo fetch! es el que hace toda la magia, primero crea un Hash con el filtro default para todas las llamadas Rest, luego evalúa si a traves de fetch_resource! o fetch_resources! le estamos pasando filtros adicionales, si es así, los integra al Hash de filtro default.

En este punto es donde esta lo mas interesante, usamos en simbolo que se almacena en la variable resource para obtener la referencia a la clase del modelo sobre el cual nos interesa hacer la consulta, por ejemplo si nuestro símbolo es :cliente, asume que tenemos un modelo Cliente y sobre el queremos enviar nuestra solicitud Rest.

Acto seguido identificamos si tenemos un ID a traves del Hash params en el controlador, si es así, identificamos si debemos de llamar al metodo find o all y colocamos los parámetros de la forma correcta, mediante send hacemos el llamado de forma dinamica y el resultado lo guardamos en la variable values.

Finalmente fetch! asume que si tenemos una colección y nuestro símbolo es :cliente, esperamos tener una variable @clientes con los datos, en cambio si tenemos un solo modelo como respuesta y nuestro símbolo sigue siendo :cliente, asume que esperamos una variable @cliente con el dato.

De esta forma en nuestras vistas podemos hacer uso de @clientes o @cliente según corresponda.

Si bien no hubo un ahorro significativo en lineas de código, si hubo la eliminación de lineas de código repetidas y susceptibles a errores o cambios, las cuales fueron reemplazadas por otras instrucciones mas simples que manejan el mismo escenario para cualquiera de mis modelos.


miércoles, noviembre 17, 2010

Tercera reunión de Tijuana.rb

Tentativamente el miércoles 1 de Diciembre sera la tercera reunión de Tijuana.rb, una vez mas será en la oficinas de Ingenia Creative, ubicadas en:

Blvd. de las Americas
5636 Interior D.
Lomas de Agua Caliente
Tijuana, Baja California 22040 México

Para ver el mapa de lugar, lo pueden consultar aquí.

La reunion sera de 7pm a 9pm, aun no hay temas ni presentadores definidos, así que si te interesa participar no dudes en comentarlo, cualquier tema de Ruby/Rails/Sinatra, principiante o avanzado es bueno.

Te puedes apuntar aquí en los comentarios del post o en el google group de Tijuana.rb

Actualización!
Ya hay presentaciones para esta reunión
@obelich hablara de su experiencia con Rails desde el punto de vista de un PHPero.
@stanmx nos platicara como usar el polimorfismo en Rails para ser mas DRY.

Nos vemos en la reunión.


domingo, noviembre 07, 2010

Segunda Reunion de Tijuana.rb

Este proximo miércoles 10 de Noviembre sera la segunda reunión de Tijuana.rb, edición llamada "mas vale tarde que nunca", en esta ocasión será en la oficinas de Ingenia Creative, ubicadas en:

Blvd. de las Americas
5636 Interior D.
Lomas de Agua Caliente
Tijuana, Baja California 22040 Mexico

Para ver el mapa de lugar, lo pueden consultar aquí.

La reunion sera de 7pm a 9pm, los temas a presentar se actualizaran en las próximas horas.
Temas para hoy en la reunion:
- Antonio Antillon: "Boy meets Rails"
La experiencia personal de un programador novato, durante la creación de una app en Rails para solucionar el registro de asistentes a la Expo Industrial BajaMak.

- Fernando Castellanos: "Google Maps V3 con Rails3"
Como usar los mapas de Google API V3 de manera facil y sencilla con Rails3.


sábado, octubre 09, 2010

Plática, vistiendo un sitio con CSS

Actualización: Aqui esta el video grabado de esta platica.

Sesión CSS from Gabriel Flores on Vimeo.


Como en otras ocasiones todo inicio con un "tweet" ¿y que tal si?, en esta ocasión el que tal si fue para tener una plática sobre el uso de HTML y CSS en el desarrollo web, desde la experiencia de un desarrollador/diseñador @stanmx.

@stanmx planea llevar un proyecto base en HTML y en base a técnicas y experiencias personales mostrar como "vestir" este sitio web.

La plática se llevará a cabo el día 14 de Octubre 2010 de 6pm a 8pm en Grupo Expotarlia:
Calle Ricardo Castro No. 355,
Fracc. Nueva Tijuana

La entrada es gratis y algo importante es que este evento esta organizado por:


martes, octubre 05, 2010

Como iniciarse en Ruby/Rails

En varias ocasiones me han hecho esta pregunta y generalmente no tengo una respuesta sencilla, ya que no creo que exista una receta para lograr esto.

Creo que lo primero es obviamente tener interes por Ruby y/o Rails, un buen lugar para comenzar con Ruby es el sitio de Ruby Lang. Un libro muy bueno es Programming Ruby. Realmente no conozco muchos recursos en español sobre Ruby en particular. Otro libro interesante es Learn to Program donde enseña como programar desde el punto de vista de Ruby.

Una buena recomendación, antes de moverse a programar en Rails es aprender a programar con Sinatrarb, ya que que Sinatrarb a diferencia de Rails, no agrega tanta "magia" y hay que conocer mejor el lenguaje para hacer una aplicación con este DSL.

Sobre Rails igualmente no conozco mucho contenido en español sin embargo puedo recomendar seguir y estar pendiente de las siguientes comunidades y eventos:

Una buena opción también es buscar si seguir a los tweeteros sobre temas de Ruby/Rails es español.

En cuestión de libros el único que puedo recomendar es Agile Web Development with Rails, aunque hay muchos otros.

De los recursos de podcasts y video, gratuitos y de paga puedo recomendar:

  • Peepcode $$, tiene por ahí varios vídeos básicos para aprender Rails
  • Tekpub $$, hay 2 series de videos una sobre Rails y otra sobre Sinatra y Rack
  • Rails3 de Gregg Pollack, videos con lo nuevo sobre Rails3
  • Railscasts, los videos por excelencia sobre Rails
  • SDRuby, videos de las sesiones de la comunidad de Ruby en San Diego CA
  • Ruby5, el mejor podcast sobre Ruby
  • Confreaks, videos de diversas conferencias de Ruby y Rails

Por ultimo y porque aun hay tiempo, bueno no mucho, Magma Rails es la primera - creo - conferencia de Rails en México y al parecer van a tener varias sesiones interesantes.

Como dije al principio no hay una receta especifica, pero si hay muchos recursos en Internet sobre Ruby y Rails, aunque la mayoría en ingles.

NOTA: En los comentarios me han pasado algunas referencias en español para comenzar en Rails.
Antonio me hace referencia RailsTutorial, el cual es un buen libro en linea
Obelich recomienda "El maldito libro de los descarrilados" ademas de recomendar la comunidad GuateOnRails de Guatemala y su curso de Rails. Tambien recomienda ASCII Casts en Español y un tutorial de Ruby.

Por otro lado desde algunas semanas me ha estado rondando la inquietud de hacer un taller de Ruby y Rails de unas 3 o 4 sesiones donde podamos aprender y construir aplicaciones, pero de momento no se que tanto interés habría aquí en la ciudad.


martes, septiembre 28, 2010

Heroku y MongoHQ con Mongoid en Rails3

He tenido la necesidad de mostrarle en linea a un cliente un prototipo de una aplicación Rails3 que usa MongoDB como base de datos, para mi la opción por excelencia para estos prototipos es usar Heroku, un hosting de aplicaciones en la nube para Rails muy fácil de usar.

Lo interesante de Heroku es que tiene cuentas gratuitas - aunque con ciertas limitaciones -, que son perfectas para mi propósito. (En la primera reunión de @tijuanarb, @bitfon platico sobre Heroku).

Pero Heroku no tiene soporte directo para bases de datos MongoDB, aunque si ofrece un addon para integrarse con MongoHQ, servicio también en la nube para este tipo de base de datos, y al igual que Heroku, también tiene cuentas gratuitas, excelente también para prototipos. (También en la primera reunión de @tijuanarb, @fcastellanos hablo sobre MongoDB)

Hasta aqui todo bien, mi detalle vino al revisar la documentación de Heroku de como configurar la conexión a MongoHQ, ya que se requiere de una variable ambiente MONGOHQ_URL donde se coloca una URL que MongoHQ proporciona para cada base de datos, la forma de agregar esta variable en nuestra aplicación de Heroku es la siguiente:

$ heroku config:add MONGOHQ_URL="mongodb://mi-url-de-la-db-que-me-dio-mongohq"

Nota: a comentario de @fcastellanos, a la url de MongoHQ ha que agregarle el usuario y clave que tiene acceso a la base de datos, ejemplo:

$ heroku config:add MONGOHQ_URL="mongodb://[usuario]:[password]@[url_mongohq]"

Mi detalle viene a partir de que la documentación de Heroku no indica ningún paso adicional para configurar MongoID, la libreria de Ruby que mi aplicación usa para comunicarse con una base de datos MongoDB, sin embargo si hay pasos adicionales para otras librerías similares.

Así que asumí que todo estaba bien, me conecto a la aplicación y me indica un error, al revisar el log veo que no encuentra la base de datos, por lo tanto al parecer MongoID no estaba haciendo uso de la variable de ambiente MONGOHQ_URL.

Revisando el archivo config/mongoid.yml donde se configura la base de datos veo que espera obtener los valores de varias variables de ambiente:

host:

port:

username:

password:

database:

Así que lo que procedí a hacer es cargar esas variables al momento de iniciar mi aplicación para esto modifique el archivo config/applicacion.rb y justo a partir de la segunda linea y antes de los "require" agregue el siguiente código:

# MongoHQ Setup

require 'uri'

if ENV["MONGOHQ_URL"]

mongo_uri = URI.parse(ENV["MONGOHQ_URL"])

ENV["MONGOID_HOST"] = mongo_uri.host

ENV["MONGOID_PORT"] = mongo_uri.port.to_s

ENV["MONGOID_USERNAME"] = mongo_uri.user

ENV["MONGOID_PASSWORD"] = mongo_uri.password

ENV["MONGOID_DATABASE"] = mongo_uri.path.gsub("/", "")

end

Después de esto, volví a lanzar mi aplicación y ahí estaba finalmente funcionando, por fin Heroku y MongoHQ estaban trabajando juntos.


jueves, septiembre 23, 2010

Reunion del grupo tijuana.rb

El dia de ayer miércoles, se llevo a cabo la 1ra reunion de grupo de usuario de ruby/rails tijuana.rb, en la cual Sergio Lopez (@bitfon) habló sobre Heroku y el flujo de trabajo para publicar aplicaciones en ruby en la nube y Fernando Castellanos (@fcastellanos) sobre mongodb y como usarla en Rails.

El lugar fue la parte exterior del Starbucks Lucerna en zona rio, y tengo que admitirlo llego mucha mas gente de la esperada, en un punto éramos alrededor de 15 o poco mas, y aunque las condiciones del lugar no fueron las optimas - no nos alcanzo el espacio donde estábamos -, creo que estuvo bastante bien para la primera reunión. Así que para la siguiente reunión vamos a tratar de tener un lugar adecuado.

Ambas platicas interesantes y con muchas preguntas por parte de los asistentes.

En la reunion tambien nos acompañaron Jed Sundwall (@jedsundwall), Edward O'Connor (@hober) y Patrick Crowley (@mokolabs) del grupo de @SDRuby y SANDPYT - San Diego Phyton -. Y aunque solo uno de ellos hablaba español participaron de manera activa; y trajeron algunos regalos para rifar con los asistentes.

De lo interesante de que ellos nos acompañaran, es que tuve la oportunidad de platicar con Patrick, y salió la posibilidad de realizar eventos en conjunto, ya sea aqui en Tijuana o San Diego, lo cual es de lo mas interesante. De entrada ya veremos la posibilidad de realizar un "carpool" para asistir a la próxima reunión de @SDRuby.

Gracias a los que asistieron y esperamos verlos el siguiente mes, con mejores condiciones de espacio y gracias a @bitfon y @fcastellanos por su participación.








lunes, septiembre 13, 2010

Primera Reunion de tijuana.rb

Ven y asiste a la primera reunion del grupo de usuario Ruby/Rails de Tijuana, tijuana.rb, este proximo miércoles 22 de Septiembre en el Starbucks Lucerna de la Zona Río, a partir de las 7pm.

En esta primera reunión, Sergio Lopez (@bitfon) nos platicará sobre @heroku, un hosting para Ruby/Rails con cuentas gratuitas. Estamos a la espera de la confirmación de una plática más. Fernando Castellanos(@fcastellanos) ya se apuntó con una platica sobre como usar MongoDB con Rails.

Para los que me han preguntado sobre como iniciar con Ruby, le dejo esta liga a un post "larguísimo" que escribí con ejemplos y aunque es sobre IronRuby funciona igual con Ruby. Si alguien lo quiere ver en video aquí esta la sesión grabada en ALT.NET Hispano.

Para estar al pendiente de lo que sucede con tijuana.rb únete al Google Group o sigue a @tijuanarb en twitter.