Mostrando las entradas con la etiqueta Ruby. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Ruby. 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.


jueves, noviembre 04, 2010

Ruby on Rails este mes de Noviembre

Al parecer un mes mas activo en cuanto a mis actividades en Ruby y Rails este mes de Noviembre.

Primeramente Alt.NET Hispano me ha invitado este sábado 6 de Noviembre a dar una VAN sobre Rails, la dirección para conectarse aparecera ese mismo dia en el sitio o traves de la cuenta de twitter @altnethispano, la VAN sera a las 18:00 UTC/GMT.

El domingo 7 participare en el evento "Latam en Rails" de Rails.mx, con la platica "Uso de Steakrb para BDD", la platica en es linea y sera a las 5:30pm hora del centro de Mexico.

Finalmente el proximo sábado 13 de noviembre estaré en el evento "Software Freedom Day 2010" del grupo de usuarios linux de Tijuana, este evento sera en el Museo del Trompo y estaré a las 10:00am hora del pacifico platicando sobre Rails.


sábado, octubre 16, 2010

Ayuda fuera de linea para Rails 3.0 en OSX

Existe en linea una buena cantidad de recursos de ayuda para trabajar en Rails, uno de los primeros sitios a consultar es RailsGuide, otro sitio en linea importante es el que contiene la documentación del API de Rails o el sitio Rails API; finalmente la fuente de ayuda mas importante es el mismo código fuente de Rails.

Todas estas opciones son muy buenas para resolver dudas sobre el API, el detalle viene cuando por algún motivo no estamos en linea. Si al momento de instalar nuestra gemas instalamos también la ayuda en formato rdoc, entonces podemos consultar el API desde la linea de comando con ri.

Por ejemplo si buscamos ayuda sobre content_for, en la linea de comando podemos ejecutar:

$ ri content_for

Después de un momento ri nos indica que hay mas de un resultado, entonces elijo el que están dentro del namespace de Ruby que nos interesa y volvemos a ejecutar ri:

$ri ActionView::Helpers::CaptureHelper#content_for

En este caso el resultado que nos muestra ri es la ayuda sobre ese especifico método de Rails. Esta opción funciona en todas las plataformas donde podamos instalar Rails, pero si estamos en OSX, pues tenemos una opción gráfica para la ayuda en linea.

Esta opción consiste en usar la aplicación de diccionario de OSX, donde instalamos el diccionario con la ayuda de Rails, este lo podemos descargar de el vinculo publicado en este post, y para instalarlo solamente copiamos el diccionario a la carpeta ~/Library/Dictionaries.

Abrimos la aplicación de diccionario y ya podemos consultar el API de Rails fuera de linea.

Inclusive mejor aun, desde nuestro editor - en mi caso MacVIM, me posiciono sobre la instrucción de la que quiero consultar el API y presiono las teclas Command + Ctrl + D y me aparece una "burbuja" con la ayuda proveniente del API.


Ya sea en linea o fuera de linea, hay opciones muy convenientes para siempre poder consultar el API de Rails.


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.








miércoles, septiembre 22, 2010

Calcular fechas laborables con Ruby

Hoy me encontré con este post llamado "Calculate Business Days using LINQ" donde explican como usar C# y LINQ para de un rango de fechas obtener solo las fechas que son laborables, es decir excluir las fechas que caigan en sábado y domingo.

El código se muestra a continuación donde se haca primero una llamada al método GetAllDates y se le pasa una fecha inicial y otra final, después con Where de LINQ se evalúa cada fecha un método que regresa falso o verdadero si la fecha cae en fin de semana o no, obteniendo al fina un arreglo con las fechas laborables.


Después de revisarlo, me pregunte, que tan complicado es hacer lo mismo en Ruby. Después de unos minutos me di cuenta que es ridículamente simple hacer lo mismo que LINQ y C# en solo 1 linea de código.

A mi metodo wroking_days se le pasa una fecha inicial y una fecha final y como resultado tenemos una arreglo de fechas excluyendo las que caen en fin de semana.




lunes, septiembre 20, 2010

La complejidad de Ruby On Rails

A raíz de mi post anterior y algunos comentarios expresados en él acerca de la complejidad para tener una aplicación de Ruby On Rails funcionando con MongoDB, he decidido escribir este post, el cual lo voy a tratar desde la vista de un ex(o casi)-desarrollador de .NET y aunque quizás algunos de mis comentarios parezcan un ataque a un .NET, no es esa mi intención, así que por favor tomenlos relajados. Ni tampoco es mi intención decir cual es mejor o cual es peor, ese es un ejercicio que cada quien forma personal debe de realizar

Comencé a desarrollar en .NET desde las versiones beta del mismo, ya hace mas de 10 años, e inclusive desarrolle para Web desde antes, ya sea con código escrito en C a modo de cgi-bin o Perl, al igual me toco desarrollar para Web en Visual Basic 4 - 6. En esos tiempos era realmente algo complejo hacer paginas dinámicas y era muy sencillo tomar decisiones incorrectas y hacer que el desarrollo se complicara enormemente.

Con la llegada de .NET Microsoft proponía otro paradigma un tanto diferente de como desarrollar a Web, proponía hacerlo tal y como se escribían aplicaciones de escritorio, solo haciendo "drag and drop", "right click", configurar aqui y alla y listo, tener aplicaciones sin - o casi sin - escribir una linea de código, digo cuantas veces no hemos visto a empleados de Microsoft haciendo este tipo de demos en eventos de la empresa.

Desde mi punto de vista - si desde mi punto de vista y experiencia - esto funcionada super bien para aplicaciones muy simples y predecibles, mi problema siempre venia cuando se quería hacer "algo mas" con la aplicación, la complejidad de desarrollo iba en aumento y en ocasiones se convertía en algo nada trivial. Durante ese tiempo también me toco hacer desarrollo con Java, varios frameworks para Web y Tomcat, y la experiencia no fue mejor.

Llego un punto en el cual casi casi decidí dejar de escribir aplicaciones para Web y únicamente escribir aplicaciones para escritorio, pero los clientes seguían solicitando aplicaciones Web, así que busque alternativas en .NET - PHP realmente nunca me gusto ni me gusta, quizás no tengo argumentos técnicos para decir porque, simplemente no me gusta -.

La alternativa que encontre fue MonoRail, comencé a ver los ejemplos y a entender sus dependencias, MonoRail es un framework para ASP.NET que trabaja con los patrones de MVC y ActiveRecord, inspirado por Action Pack. Al investigar que es Action Pack, descubrí Ruby On Rails, pero en ese momento le encontre un problema, tenia que aprender otro lenguaje de programación y tenia algunas semanas para entregar una aplicación Web para un cliente.

Así que me decidi por MonoRail, pero había algunos "detalles", tenia muchas dependencias, no tenia "Wizards" ni componentes o controles como se les llama en ASP.NET WebForms, en lo personal no lo vi como problema ya que en lo personal es raro que use los "Wizards" o que utilice controles de 3ros, así que para mi no había perdida ahí, aunque si me ha tocado conocer y dar cursos a desarrolladores de .NET que si no tiene un "Wizard" o no pueden poner su "Grid" súper "fancy" no son capaces de desarrollar una aplicación.

Por otro lado, si bien la configuración de un ambiente de trabajo con MonoRail requeria de un poco de trabajo y entendimiento por arriba de "Drag and Drop" y "Right click", no me pareció gran cosa y mas cuando es algo que solo haces una sola vez. MonoRail me permitió entregar varias aplicaciones de manera muy rápida, quede impresionado y eso me llevo a investigar sobre Ruby On Rails. Por cierto hace algunos días anunciaron, parte de "Roadmap" de MonoRail.

El motivo por el cual MonoRail me permitió entregar aplicaciones muy rápido fue porque no tuve que tomar decisiones, MonoRail lo hizo por mi, por ejemplo no tuve que decidir como organizar mi aplicación, no tuve que decidir como conectarme a la base de datos, todo lo decidió MonoRail, así solo tuve que enfocarme en la funcionalidad que era importante para mis clientes y ya. MonoRail al igual que Ruby on Rails es opinioted software.

Al llegar a Ruby on Rails, obviamente la primera barrera fue el lenguaje Ruby, pero es muy facil acostumbrarse a el, aunque todavia escribo código a la C#, pero creo que voy mejorando.

Para la gente acostumbrada a los IDEs hay una gran variedad de opciones a elegir, en lo personal no soy fan de las IDEs, prefiero ambientes mas ligeros y que me hagan usar la consola de comandos, por lo tanto en Windows se puede seguir esta guia y en Linux estas dos guias, puede parecer complicado, pero es algo que solo se tiene que hacer una vez, si se usa un IDE en cuestión de minutos se tiene un ambiente complete y configurado.

Es muy sencillo crear una nueva aplicación con Ruby On Rails (RoR) haciendo uso de las decisiones que el framework hace por nosotros, por ejemplo:

$ rails new mi_super_app

$ cd mi_super_app

$ rails generate scaffold client name:string, address:string

$ rails server

Dirigimos nuestro navegador a http://localhost:3000/clients y listo ya podemos comenzar a dar de alta y modificar clientes, simple, fácil y rápido.

Si bien esto funcionara tal y como esta en un gran numero de casos, la gente en RoR pensamos en la regla 80/20, hay momentos en que se tiene que hacer algo un poco diferente para configurar nuestra aplicación, donde podemos cambiar las decisiones que RoR hace por nosotros y adaptarlas al 100% de nuestras necesidades, como las modificaciones propuestas en mi post para usar MongoDB en lugar de una base de datos relacional.

Si bien la intención de mi post es servir como una guia o receta, paso a paso de como hacerlo, también podemos hacerlo sencillo con el uso de Templates - así como existen también templates en Visual Studio para crear aplicaciones con ciertas características y defaults -, en e siguiente video de Railscasts se explica el concepto. De hecho existe ya un template para pre-configurar una aplicación de RoR para usar MongoDB y Rspec, con el cual se puede omitir mi post y solo ejecutar:

$ rails new mi_super_app -JOT -m ~/path_a/mongodb_template/templater.rb

Ya viendolo así, ¿ya no se ve que sean muchos pasos no?

Sobre el tema de las dependencias, al igual que en cualquier otro framework o lenguaje podemos tener dependencias a librerías de terceros o podemos elegir no hacerlo. En el caso de Ruby y sus diferentes frameworks, hay librerías para casi todo lo que nos podamos imaginar, RubyGems es un buen lugar para descubrirlas y Bundler nos permite manejar esas dependencias de forma sencilla y a nivel aplicaciones, es decir podemos tener la misma dependencia pero hacia diferentes versiones de la librería sin conflictos, no hay "DLL Hell".

Para determinar como elegir que dependencias tener en nuestra aplicación, va en relación directa de nuestras necesidades, pero creo que puedo sumarizar algunos criterios:

  • Librerías que fueron extraídas del framework de RoR
  • Librerías mantenidas por miembros del equipo de desarrollo de RoR
  • Librerías que son tan viejas como el mismo framework de RoR y que evolucionan paralelamente
  • Librerías mantenidas por empresas de desarrollo en RoR
  • Librerías populares y que tengan pruebas

Con respecto al soporte de los librerías disponibles en Ruby, este varia, pero el común denominador es que son OSS y el código de casi todas esta disponible en Github. En experiencia personal no he tenido problemas con esto, ya que a través de los grupos, IRC, reportando bugs o correo directo he tenido solución cuando se me ha presentado algún problema, inclusive, he enviado parches que han sido aceptados y generalmente la corrección a mi problema puede llevar algunas horas en lugar de tener que esperar días si fuese un bug en una librería comercial.

De las librerías que he utilizado realmente no me ha tocado alguna que pierda el soporte, cuando el desarrollador principal se retira generalmente sale alguien a continuar trabajando en ella, lo que si me ha tocado experimentar es el reemplazo de librerías por otras mejores, por ejemplo, cuando entre a RoR restful_authentication era "la librería" para el manejo y autentificacion de usuarios, posteriormente authlogic la reemplazo y actualmente devise es la librería popular, no es que las otras tengan algo malo o funcionen mejor o peor, es solo la manera en como evolucionan las cosas.

Creo que personalmente lo que encontre en RoR es que no me tengo que pelear contra el framework para poder entregarle aplicaciones a mis clientes, todo lo contrario, me puedo olvidar un poco del framework y dedicarme a implementar la funcionalidad que le da valor a mi trabajo.

Y afortunadamente puedo decir que aquí en Tijuana no he sido el único que ha encontrado este valor, ya que desde que comencé a platicar sobre RoR varios amigos implementaron soluciones para sus empresas y clientes de estas que están en linea y en tiempo record, y traen todavía mas proyectos nuevos que están siendo desarrollados en RoR, de mi parte igualmente tengo un par de proyectos en RoR que pronto verán "la luz", proyectos para mis clientes. Al mismo tiempo se de empresas que están tomando cursos y evaluando RoR para el desarrollo de nuevas versiones de sus productos, todo esto solo en Tijuana.

Creo que después de esta explicación algunos estarán de acuerdo conmigo y otros no, a final de cuentas debemos de ser apasionados con el lenguaje/framework que elijamos para trabajar, porque para bien o para mal a estos le vamos a dedicar nuestro tiempo laboral; pero el ser apasionados también implica el ser críticos de lo que usamos y si es posible conocer y probar otras herramientas, aunque si trabajamos para una empresa "casada" con una compañía/tecnología va a ser un poco difícil cambiar su visión, ya que generalmente se usan x tecnología por cuestión política o de mercadotecnia o gusto personal de la persona que toma las decisiones.


sábado, septiembre 18, 2010

Aplicación de Rails 3 con MongoDB

En los últimos días he tenido que iniciar un par de proyectos en Ruby On Rails, donde la base de datos que se ha requerido es una base de datos no relacional, en este caso MongoDB.

La idea de este post es documentar la configuración de una nueva aplicación en Rails 3 para usar con MongoDB, donde vamos a desactivar ActiveRecord e instalar las siguientes herramientas:

  • Generadores Rails para Mongo
  • Rspec para pruebas
  • Factory Girl para fixtures
  • Haml como plantilla de vistas y jQuery.

Como paso inicial es necesario crear una nueva aplicación de Rails 3 - Se asume que ya se tiene instalado Rails 3 y MongoDB -, pero vamos a pasar las opciones -O para que no se creen archivos de ActiveRecord, -J para que no se instale la librería de javascript Prototype y -T para que no cree el fólder para Test::Unit

$ rails new mi_app -O -J -T

Después de creada la aplicación, seria buena idea inicializar un repositorio de Git.

Una vez creada nuestra aplicación hay que realizarle algunas adiciones nuestro archivo Gemfile para agregar las dependencias de nuestra aplicación:

  • mongoid y bson_ext => Mongoid es la librería que usaremos para conectarnos a la base de datos de MongoDB y bson_ext es una extensión en C para acelerar la serializacion de BSON
  • haml => Lenguaje de plantilla alternativa para vistas en Rails, desde mi punto de vista menos verbal y mas "developer friendly" que html y erb.

Dentro de un grupo llamado :development agregamos las siguientes gemas:

  • rails3-generators => varios generadores para Rails 3, lo que nos permite ejecutar rails generate
  • haml-rails => generadores de haml para Rails 3
  • jquery-rails => generadores de jquery para Rails 3

En el grupo :test agregamos:

  • rspec => framework para pruebas en Ruby
  • rspec-rails => utilerias para pruebas en RSpec para Rails
  • factory_girl_rails => utileria para la creación de modelos para pruebas
  • remarkable_mongoid => librería para pruebas de modelos de mongoid con RSpec

El archivo Gemfile debe de quedar como se muestra a continuación.



Para instalar las gemas solo ejecutamos

$ bundle install

Para conocer mas de las gemas instaladas aquí les dejo los vínculos a sus referencias

Una vez instaladas las gemas hay que realizar algunas configuraciones, lo primero es configurar mongoid para trabajar con Rails y desactivar ActiveRecord, para eso ejecutamos el comando:

$ rails generate mongoid:config

Este comando va crear el archivo config/mongoid.yml donde vamos a configurar el acceso a la base de datos de MongoDB, también va a modificar el archivo config/application.rb y va a eliminar la dependencia de ActiveRecord, la parte superior de config/application.rb deberá quedar algo similar a:

# require "active_record/railtie"

require "action_controller/railtie"

require "action_mailer/railtie"

require "active_resource/railtie"

#require "rails/test_unit/railtie"

Ya que estamos en el archivo config/application.rb vamos indicandole a Rails que en nuestra aplicación deseamos usar haml, rspec y factory_girl por omisión, para esto dentro de la declaración de la clase Application < Rails::Application, pero al final agregamos el siguiente código



A partir de este punto instalamos el soporte para jQuery y Rspec en nuestra aplicación de la siguiente forma:

$ rails generate jquery:install #--ui para activar jQuery UI

$ rails generate rspec:install

Como ultimo paso vamos configurar RSpec para que trabaje con factory_girl y remarkable, ademas de eliminar el soporte a ActiveRecord y hacer que RSpec elimine las colecciones creadas en MongoDB por nuestras pruebas antes de la ejecución de cada prueba, esto es necesario para asegurarnos que al correr cada prueba la base de datos este "limpia" y así no crear conflictos y/o dependencias en las pruebas.

Al inicio del archivo spec/spec_helper.rb hay que requerir:

require 'factory_girl'

require 'remarkable/mongoid'

Un poco mas abajo indicamos que cargue los archivos Factory de factory_girl

Dir[Rails.root.join("spec/factories/**/*.rb")].each {|f| require f}

Después eliminamos el soporte a ActiveRecord comentando las siguientes lineas:

config.fixture_path = "#{::Rails.root}/spec/fixtures"

config.use_transactional_fixtures = false

Y finalmente dentro y al final del bloque de configuración de RSpec indicamos que antes de cada prueba elimine las colecciones de MongoDB

config.before :each do

Mongoid.master.collections.select {|c| c.name !~ /system/ }.each(&:drop)

end

El archivo spec/spec_helper.rb deberá quedar muy parecido a



Una vez en este punto ya podemos proceder a crear nuestra súper aplicación usando MongoDB como base de datos, si ejecutamos el generador para model, o controller o scaffold, Rails 3 generara modelos para MongoDB o vistas en haml y creara los archivos necesarios en spec para realizar pruebas con RSpec.


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.


miércoles, septiembre 01, 2010

Localización de fechas en Rails

Al estar trabajando en un sitio/aplicación para un cliente bajo el CMS RefineryCMS, cambie el idioma de CMS a español, pero las fecha seguían apareciendo en formato en Inglés, ej: September 01, en lugar de 01 de Septiembre.

Aun y cuando ya tenia instalado el archivo es-MX.yml en el directorio locale y Rails estaba localizando otros textos pero no las fechas. En el archivo yml encontramos la siguiente estructura:

date:

order: [:day, :month, :year]

abbr_day_names: [Dom, Lun, Mar, Mie, Jue, Vie, Sab]

abbr_month_names: [~, Ene, Feb, Mar, Abr, May, Jun, Jul, Ago, Sep, Oct, Nov, Dic]

day_names: [Domingo, Lunes, Martes, Miércoles, Jueves, Viernes, Sábado]

month_names: [~, Enero, Febrero, Marzo, Abril, Mayo, Junio, Julio, Agosto, Septiembre, Octubre, Noviembre, Diciembre]

formats:

short: "%d de %b"

default: "%d/%m/%Y"

long: "%A, %d de %B de %Y"

formal: "%d de %B"

time:

formats:

short: "%d de %b a las %H:%M hrs"

default: "%a, %d de %b de %Y a las %H:%M:%S %Z"

long: "%A, %d de %B de %Y a las %I:%M %p"

am: "am"

pm: "pm"

En donde en Date:Formats:Formal encontramos "%d de %B, con lo que esperaria formatos de fecha 01 de Septiembre.

Resulta que con:

t (:formal, :scope => [:date, :formats])

podemos leer el formato "%d de %B del archivo de localización, pero ahora el problema es ¿como le indicamos a la fecha que formato usar?, bueno para eso usamos I18n, donde pasamos la fecha a formatear y el formato de acuerdo al idioma de la aplicación:

I18n::localize(date, :format => t (:formal, :scope => [:date, :formats]))

Ahora el único problema es que este código es bastante largo para colocarlo dentro de una vista, por lo que podemos mandarlo a un método helper de la siguiente forma:

def localize_short_date(date)

I18n::localize(date, :format => t (:formal, :scope => [:date, :formats]))

end

Con esto en nuestra vista solo llamamos:

<%= localize_short_date Date.now %>

Y nos aseguramos que la fecha es desplegada en el formato definido y localizada al idioma de la aplicación Rails.


lunes, agosto 23, 2010

Presentaciones de Ruby on Rails

Este próximo sábado 28 de Agosto estaré participando en el evento en línea "Desarrollando en Ruby On Rails", durante todo el sábado habrán una serie de charlas que cubren diversos aspectos del desarrollo de Ruby On Rails.

En mi caso estaré participando con la plática "Vistas en Rails" en la cual platicaré sobre facilidades que nos proporcionar Ruby On Rails al desarrollar nuestras UI.

Para ver las platicas solo es necesario ingresar el sábado a tv.rails.mx, recuerden que el horario de las platicas es del centro de México (CDT -05).

Ademas, los chicos del Grupo de Usuarios Linux de Tijuana están organizando el "Día Mundial del Software Libre" para este 18 de Septiembre, donde tambien ya me invitaron a dar la plática de "Desarrollo Web a la Rails" - un no tengo el horario -.

Así que si les interesa Ruby On Rails, no lo piensen y acompañenme en ambos o alguno de los eventos. Adicionalmente y de manera no-oficial, los invito a la Comunidad Tijuana.rb, comunidad sobre Ruby y Ruby On Rails de Tijuana, aunque aun no tenemos sitio web, ni reuniones, ya hay actividad en el grupo de la comunidad en Google Groups, asi como en la cuenta de twitter @tijuanarb


lunes, mayo 24, 2010

RailsConf 2010

Gracias a EngineYard que me regalo un pase a RailsConf 2010, estaré en Baltimore de 7 al 10 de Junio en el evento de eventos de Rails.

Inicialmente no lo tenia planeado, ya que hoy - 24 de mayo - recibí la invitación, me entero que la disponibilidad de hotel esta medio "presionada", es por eso que a través de este post, hago un llamado/invitación a personas que piensen asistir al RailsConf y que les gustaría compartir los gastos de hotel, se comuniquen conmigo para ponernos de acuerdo.

Me encuentran en twitter como mario_chavez y a través de mi correo de google mario.chavez


martes, mayo 11, 2010

Plática "Desarrollo Web con Ruby On Rails" en el CITEDI

Me invitaron del CITEDI IPN en la ciudad de Tijuana a participar en los Seminarios Académicos, los cuales son sesiones gratuitas y abiertas al público.

Mi plática se llama "Desarrollo Web con Ruby On Rails" y se llevará a cabo el próximo 14 de Mayo a las 12pm.

Ahí los espero a quienes tengan la oportunidad de darse la vuelta.



jueves, marzo 18, 2010

VIdeo de IronRuby en ALT.NET Hispano

Hace ya algunas semanas previas había publicado el código fuente de Ruby que utilice en los webcasts en los cuales participe a finales de enero, hace unos días me avisaron de ALT.NET Hispano que ya estaba listo y disponible el video que se grabo sobre mi sesión.

Como muchos de ustedes ya están enterados, el próximo sábado 20 de Marzo se llevara acabo un curso de Ruby on Rails aquí en Tijuana - para información de como asistir ver este post -, si bien el video habla sobre IronRuby, los conceptos ahí expresados aplican para Ruby a excepción la interoperabilidad con .NET, por lo tanto es muy recomendable para quienes tengan la intención de asistir al curso.

Por otro lado la comunidad de ALT.NET Hispano es una comunidad de desarrolladores de habla español que cada semana presentan lo se conoce como "desconferencias" -VAN -, donde se abordan temas principalmente de como mejorar nuestras técnicas y conocimientos de desarrollo en .NET.

Para participar con la comunidad de ALT.NET Hispano, podemos estar al pendiente de las próximas VANs o ver los vídeos de las VANs pasadas, o bien unirse al grupo de discusión.


miércoles, marzo 03, 2010

Curso de Ruby on Rails en Tijuana

[Actualización, 10 de Marzo] El curso si se va a llevar a cabo el día 20 de Marzo en el Cesun Universidad, Campus Morelos, de 9am a 6pm en Av. Cucapah *Sur # 20100* Fracc. El Lago.

Los interesados en asistir por favor pongan su comentario en el post de @stanmx sobre el curso, ya que a esas personas Stan les hará llegar la información de pago del curso, recuerden que ese dinero es para la compra de comida y bebidas para el curso, por lo tanto es importante que quienes deseen ir paguen cuanto antes para comprar las cosas con anticipación, cualquier duda sobre el pago Stan les puede ayudar.

Adicionalmente la gente de TekPub fue amable de regalarnos una subscripción a la serie de video de Ruby On Rails, la cual cuenta con 10 videos de 1 hora aproximadamente, cubriendo diferentes aspectos de RoR.
La subscripción se le regalara, en una mecánica por definir, a alguno de los asistentes de curso.

[Actualización, 8 Marzo] Es muy probable que el curso se lleve a cabo el día 20 de Marzo en el Cesun Universidad, Campus Morelos. En cuanto este confirmado se les hará saber.

Después de un par de meses de que @stanmx me estuviese dando lata comentara sobre su interés de un curso de Ruby On Rails, decidimos hacer el ejercicio de ver si había interés entre los desarrolladores de la ciudad, y el ejercicio fue bueno, actualmente hay alrededor de 12 personas que levantaron la mano.

Entrando en detalles del curso, actualmente estamos viendo quien nos puede facilitar un espacio para al menos unas 15 personas, de preferencia que tenga acceso a Internet y que podamos hacer uso de un proyector, obviamente también buscamos un lugar donde nos puedan abrir un sábado y estar ahí entre 10 y 12 horas.

El curso no es gratuito, pero tampoco es lucrativo, se pide una cooperación de $250.00 pesos, lo que incluye el curso y bebidas/alimentos/botanas durante la realización del mismo.

Pre-requisitos para el curso
Contestando a preguntas directas que me han realizado, sobre que se necesita a para poder atender el curso, aquí les dejo la siguiente información.

  • Llevar su propia computadora, de preferencia laptop
  • Conocer por lo menos lo básico de algún lenguaje de programación
  • Preinstalar Ruby on Rails - esto para evitar perder tiempo con las instalaciones y entrar de lleno al curso desde el primer minuto -
  • Sentirse cómodo utilizando la consola de comandos :)

Observaciones
Ruby On Rails puede hacer uso de diversos motores de base de datos, pero por cuestiones de simplicidad vamos a hacer uso del motor de SQLite, aunque si se va a explicar como, por ejemplo, cambiar la configuración para conectarse a un MySQL.

La version de Ruby on Rails sobre la que se va a trabajar es la 2.3.5, aunque la version 3.0 Beta 1 esta disponible, vamos a irnos por la ruta de la version estable.

Si desean instalar algún administrador gráfico para SQLite y tienen instalado Firefox, pueden instalarle el addon SQLite Manager.

¿Como instalar Ruby On Rails en mi equipo?
Dependiendo del OS de nuestra laptop es como vamos a realizar la instalación, por la lista de amigos que levantaron la mano al curso puedo darme cuenta que vamos a tener OSX, Linux y Windows, así que aquí va las guías para cada OS.

RoR en Windows
Hace algunos meses escribí un post que detalla la instalación de RoR en Windows, utilizando cygwin y un editor llamado e-TextEditor. El e-TextEditor no es gratuito tiene un costo como de 40 USD y cuenta con versión de evaluación.

Otra opción de instalación es utilizar algún IDE de RoR, las posibles IDEs las menciono mas abajo en el post ya que estas son comunes sin importar el SO.

RoR en Linux
Esta guía en español y para Ubuntu es muy fácil y directa, pero fácilmente se puede adaptar para cualquier distro de Linux.

Si se sigue esta guía, es recomendable configurar gEdit para RoR, lo cual nos da un buen IDE para trabajar en Linux.

Otra opción de instalación es utilizar algún IDE de RoR, las posibles IDEs las menciono mas abajo en el post ya que estas son comunes sin importar el SO.

RoR en OSX
En OSX es necesario insertar el disco de instalación de OSX e instalar las herramientas de desarrollo.

Como IDE es posible usar TextMate, aunque no es gratuito, cuentan con versión de evaluación.

Otra opción de instalación es utilizar algún IDE de RoR, las posibles IDEs las menciono mas abajo en el post ya que estas son comunes sin importar el SO.

IDEs para RoR
Para quienes se sientan mas a gusto con un IDE completo hay 3 posibles opciones de las cuales solamente una no es gratuita, pero cuenta con versión de evaluación.

Para lo que tengan duda sobre si instalar una IDE o no, en el curso no nos vamos a enfocar a ningún IDE en particular, todos los comandos los vamos a ejecutar desde la consola, la IDE nos va a servir únicamente como un editor de texto.

El curso
El temario tentativo para el curso es el siguiente:

  1. Introducción al lenguaje Ruby
  2. Introducción a Ruby On Rails
  3. Conocer una aplicación de Rails, a través de los bloques ActiveRecord, ActionController y ActionView
  4. El Patron MVC en Rails
  5. Básico del patron ActiveRecord - CRUD -
  6. Básico de controladores: acciones, filtros, parámetros, sesiones y mensajes flash
  7. Básico de vistas: plantillas ERB, layouts, parciales y helpers
  8. Mas de ActiveRecord: Validaciones, asociaciones, agregaciones y find_by_*
  9. Rutas en Rails
  10. Pruebas con RSpec
  11. Depuración, logging y uso de la consola
  12. AJAX en rails

Fecha y lugar

De momento de desconoce, espero que se pueda confirmar en los próximos días, la fecha depende en gran medida de la disponibilidad del espacio que nos faciliten, así que estén pendientes a este blog y a

twitter

.


domingo, febrero 07, 2010

Ironruby webcasts

Hace un par de semanas tuve la oportunidad de presentar dos webcast/VAN, uno para el Club de .NET de la Universitat Oberta de Catalunya y para AltNet Hispano.

Si bien ambos los puede llevar a cabo no sin algunos contratiempos, ya que en esas fechas tuvimos una tormenta en la ciudad y hubo cortes de energía, pero finalmente puede participar.

Este post tiene como finalidad el realizar una recapitulación de ambas presentaciones ya que si bien las dos fueron en relación a IronRuby el enfoque fue un poco diferente.

¿Que es IronRuby?
Bueno esta pregunta se tiene que responder primero comentado que es Ruby.

Ruby es un lenguaje dinámico bajo el paradigma de Orientado a Objetos, con sintaxis inspirada en Python, Perl y SmallTalk. Lenguaje que vio la luz publica en 1995 bajo la mano de Yukihiro "Matz" Matsumoto.

Ruby es un lenguaje moderno que cuenta con características que son estándar en lenguajes modernos, como: manejo de excepciones, iteradores y clausuras, sobre carga de operadores, recolección de basura, portable, carga dinámica de librerías, introspeccion-reflexion-metaprogramacion entre otras-; ademas de que la sintaxis esta diseñada pensando en la productividad y diversión del desarrollador y sobre todo que sea lo mas natural al lenguaje humano.

Algo importante a notar es que Ruby es un lenguaje distribuido y licenciado bajo una licencia de Software Libre.

Ahora si vamos a al origen de la pregunta, ¿Que es IronRuby?, pues IronRuby es la implementación del lenguaje Ruby como un lenguaje dinámico para .NET, llevada a cabo por Microsoft.

IronRuby ofrece un interprete de Ruby compatible con la version 1.8.6, el cual permite ejecutar aplicaciones de Ruby de manera transparente o casi transparente, ademas de permitir a los programas que se ejecutan bajo IronRuby el poder interactuar con las librerías de .NET, e inclusive incluir dentro de una aplicación de .NET funcionalidad de "scripting" con el lenguaje Ruby.

IronRuby como se menciono es desarrollado por Microsoft y esta disponible bajo una licencia de Software Libre. Aunque aun no ha alcanzado si versión 1.0 - al momento de este post están en su RC 1 -, es lo suficientemente maduro para ser utilizado para el desarrollo de aplicaciones.

¿Porque usar IronRuby?
Es una pregunta un tanto difícil de contestar sobre todo porque depende de la perspectiva y visión de cada desarrollador, por lo tanto voy a contestarla desde mi visión.

Ruby cuenta con una gran variedad de herramientas maduras para realizar pruebas de código bajo los enfoques TDD y BDD ademas de herramientas para realizar Mocking de objetos, si bien en .NET también las hay, existen algunos proyectos que intentan replicar algunas de estas en C#, pero entonces ¿para que replicarlas si las podemos usar con un poco de IronRuby?

En Ruby esta Rake, una herramienta para hacer scripts para "construir" aplicaciones o archivos de "Build", bastante poderosa y flexible, tanto así que proyectos populares de Software Libre en .NET usan esta librería para ejecutar pruebas, compilar y empaquetar estos proyectos, tal es el caso que inclusive hay una librería llamada Albacore, la cual es una compilación de tareas Rake para .NET.

Ruby es un lenguaje que favorece la creación de DSLs - Domain Specific Languages -, por ejemplo en Ruby on Rails encontramos la implementación de DLSs en diferentes puntos del Framework. Otro ejemplo muy bueno es Sinatra, un DSL para la creación de aplicaciones Web.

En la lista de IronRuby, también mencionan que es mucho mas fácil y rápido realizar aplicaciones con Ruby en comparación con su contraparte en C#, tan es así, que se han creado un par de "wrappers" para la creación de aplicaciones ASP.NET MVC totalmente en Ruby, también es posible crear aplicaciones en Silverlight con un Framework al estilo Ruby On Rails llamado IronNails.

Gracias a IronRuby es posible reutilizar la gran cantidad de librerías de Ruby, Frameworks y aplicaciones en ambientes .NET y viceversa.

Por último, otro punto a favor es la posibilidad de darle a nuestras aplicaciones .NET la posibilidad de extenderlas mediante "scripting" en el lenguaje Ruby.

Quizás puedan estar de acuerdo conmigo o no, o inclusive a la mejor me faltan mas escenario que hacen que IronRuby sea "deseable" en .NET; lo que si creo que vale la pena es darle la oportunidad y crear nuestro propio criterio. Esta discusión en la lista de IronRuby abre un abanico un poco mas amplio de posibilidades.

¿Que necesito para iniciar en IronRuby?
Lo primero que hay que hacer es descargar IronRuby de la página de http://ironruby.net, su instalación es tan sencillo como descomprimir IronRuby en nuestro disco duro y agregar esta carpeta en nuestro path.

No voy a publicar como trabajar con IronRuby ya que eso se mostró en los Webcast/VAN, en el momento que alguno de esos videos estén disponibles, pondré los enlaces en este post.

Una pregunta recurrente que me han hecho y no solo para IronRuby, sino también para Ruby es ¿Que IDE uso para *Ruby?, bueno en el mundo *Ruby es muy común el uso de editores como Emacs y VIM o editores de texto como TextMate en OSX, en Windows también es posible usar editores sencillos como Notepad2, eTextEditor o un IDE mas en forma como RubyMine de JetBrains.

Siendo RubyMine una de las IDEs disponibles enfocada al desarrollo de aplicaciones en Ruby - Debo aclarar que gracias a AltNetHispano y JetBrains me obsequiaron una licencia hace unos días, pero aun antes de esto ya había yo mencionado/recomendado RubyMine -, inclusiveRubyMine tiene soporte para IronRuby.

Hay una solicitud en Microsoft Connect para que Visual Studio 2010 incluya soporte a desarrollar aplicaciones IronRuby desde el mismo IDE.

Show me the code! Show me the code!
Después de esta larguísima introducción, ahora si ha llegado el momento de mostrar el código de ejemplo utilizado en las dos presentaciones, casi todo este código se ejecuto desde el interprete de IronRuby ir.exe

Para poder ejecutar algunos de los ejemplos es necesario instalar primeramente algunas gemas de Ruby. Una Gema es una librería que extendiende la funcionalidad base de Ruby.

Para encontrar Gemas para casi todo lo que nos podamos imaginar hay que visitar GemCutter.

El siguiente comando instalara gemas para Sinatrarb, Rails, Rspec, Cucumber, Rake y el driver de SQLServer para Ruby. Es importante actualizar nuestro path en Windows para incluir el directorio donde esta el código binario de IronRuby y el código de las gemas; asumiendo que instalamos IronRuby en C:\IronRuby ejecutamos:

set PATH=%PATH%;C:\IronRuby\bin;C:\IronRuby\lib\IronRuby\gems\1.8\bin

Para instalar las gemas ejecutamos:

igem install sinatra rake rails rspec cucumber ironruby-sqlserver --no-rdoc --no-ri

- Variables
Al ser un lenguaje dinámico, en Ruby podemos la declaración de variables se hace sin tipo.

- Métodos
La llamada a métodos puede realizarse con paréntesis o sin paréntesis para pasar parámetros.

- Clases
Al redefinir una clase no es necesario declararla por completo, solo declarando lo nuevo o lo que se modifica es suficiente. La reflexión y el manejo dinámico de las clases es muy poderoso.

- Ruby es amor, "Sintactic Sugar"
El lenguaje de Ruby en ocasiones se "siente" tan natural

- Expresiones regulares
Ruby es tan poderoso para el manejo de expresiones regulares como Perl

- Reflexion
Metaprogramacion, reflexion en Ruby es algo tan natural

- Sinatra
La siguiente aplicación de ejemplo de Sinatrarb muestra el uso de el DSL para aplicaciones Web, es importante que antes de ejecutar el ejemplo, instalemos el siguiente parche al código fuente de Sinatra para que funcione correctamente con IronRuby:


Para ejecutar la aplicación solamente iniciamos con el siguiente comando:

ir SinatraSample.rb

Y apuntamos nuestro navegador a:

http://localhost:4567 http://localhost:4567/acercade http://localhost:4567 /Mario

Para conocer mas de Sinatra pueden ver este screencast en español.

- Ruby on Rails
Ruby on Rails es el framework mas famoso en Ruby para el desarrollo de aplicaciones Web. Con IronRuby podemos crear aplicaciones bajo este Framework. Para este ejemplo se requiere de tener una base de datos en SQL Server llamada ironruby_on_rails_dev.

Hay que seguir las instrucciones en el código que se muestra, ya que es necesario realizar algunos cambios a ciertos archivos de nuestra aplicación Rails para que pueda funcionar, una vez que ejecutemos el server de Rails podemos apuntar nuestro navegador a: http://localhost:3000/posts

Nuestra aplicación de debe de mostrar en el navegador.

- Usando IronRuby para probar nuestras aplicaciones .NET
Partiendo de la idea que tenemos la siguiente clase en C# que deseamos probar, inicialmente con Rspec, definimos únicamente es esqueleto de la misma, para compilarla, desde la linea de comandos ejecutamos:

csc /target:library /out:Bowling.dll *.cs

Ahora definimos su funcionamiento con Rspec

Para ejecutar nuestras pruebas podemos ejecutar alguno de los siguientes comandos:

spec --format specdoc spec --format html > spec_bowling.html

Después de ejecutar el comando podemos ver que pruebas pasan y cuales fallan

Si implementamos nuestra clase y la compilamos de la siguiente forma y ejecutamos nuestras pruebas, ahora nuestra especificación debe pasar

csc /target:library /out:Bowling.dll *.cs spec --format specdoc

Otra herramienta para probar nuestras aplicaciones es Cucumber, para poder traerlo a nuestro escenario, hay que crear un folder llamado features y crear el siguiente documento

Dentro de feature hay que crear otro folder llamado step_definitions y dentro creamos el siguiente archivo

Ahora si podemos ejecutar alguno de los dos siguientes comandos para ejecutar nuestra prueba con Cucumber

cucumber features/bowling.feature cucumber features/bowling.feature --format html --out features.html

- Extender clases de C# desde IronRuby
La reflexion y la metaprogramacion de Ruby la podemos llevar también a las clases de C#, por ejemplo con la clase compilada de Bowling.cs, si cargamos el interprete de Ruby podemos extenderla de la siguiente forma:

- Incluyendo Ruby para darle capacidad de scripting a nuestras aplicaciones en .NET
Con IronRuby podemos hacer que nuestras aplicaciones en .NET "hablen" Ruby

Para compilar el siguiente ejemplo ejecutamos:

csc Program.cs /r:IronRuby.dll /r:Microsoft.Scripting.dll /r:Microsoft.Scripting.Core.dll

La librerías requeridas están incluidas en la instalación de IronRuby.

Conclusion Ruby es un lenguaje con muchos pequeños detalles que hacen que sea agradable programar en el, el soporte y actividad de la comunidad Ruby es mas que excelente, el contar con un Framework para el desarrollo de aplicaciones que otros lenguajes/comunidades han buscado replicar, son puntos adicionales para investigar y experimentar con Ruby.

El plus que trae IronRuby es el poder unir los dos mundos, el dinámico y estático con .NET, de una forma que no causa "fricción" el pasar de .NET a Ruby y viceversa.

Me han preguntado por ejemplos de grandes aplicaciones que se hallan desarrollado en .NET, hasta ahorita no hay una que conozca, pero estoy seguro que una vez que IronRuby alcance la versión 1.0, no tardaremos en ver aplicaciones que hagan extenso uso de Ruby.

Recursos A continuación les presento los siguientes blogs/sitios con referencia sobre Ruby e IronRuby.

domingo, enero 17, 2010

Webcasts sobre IronRuby en Enero

Esta semana voy a llevar a cabo un para de Webcasts sobre IronRuby, el cual es la implementación de Microsoft del popular lenguaje Ruby; y que presenta una de las propuestas de Microsoft sobre los lenguajes dinámicos en .NET

El primer Webcast se va a llevar a cabo el día 21 de Enero a la 19:00 hora de Madrid/París, 10:00 hora de Tijuana PST, para elClub .NET de la Universitat Oberta de Catalunya, para registrarse y atender el evento hay que dirigirse al sitio de MSEvents.

El segundo Webcast se va a llevar a cabo para la Comunidad ALT.NET Hispano el sábado 23 de Enero a las 10:00 hora de Tijuana PST, para atender el Webcast solo es necesario conectarse a esta dirección el dia y hora indicado.