Ruby on Rails y Grails, cara a cara

Ya comenté que, al empezar a trabajar con Linking Paths, empezaría a utilizar Ruby on Rails y que pretendía hacer un cara a cara entre Ruby on Rails y Grails. Como podría ser un post muy largo y tampoco quiero ir dejándome cosas, la intención es hacerlo en una serie de posts tal y como vaya teniendo las ideas claras, espero tener tiempo y ganas para ir completándola :). El objetivo no es decir cuál es mejor, sino simplemente que se vean las características de cada uno. En este post se van a tratar características generales y algunos parecidos razonables entre los frameworks.

A primera vista:

Como mucha gente sabrá los dos son frameworks web full-stack que siguen el patrón MVC, siguen el principio DRY(Don't repeat yourself) y CoC(Convention over configuration). Lo primero que hay que decir es que Grails se basó en las ideas de RoR, incluso a Grails en un principio se le llamó Groovy on Rails pero los creadores de RoR pidieron que se le cambiara el nombre.

RoR está enteramente construido con Ruby. Mientras que Grails lo está con la combinación Java+Groovy usando frameworks y librerías muy conocidas por debajo(destacan Spring, Hibernate y Sitemesh).

Para empezar hay que destacar que, ambos frameworks, nos traen de serie un servidor/contenedor web y un servidor de bases de datos embebidos: RoR trae WEBrick y SQLite mientras que Grails Jetty y HSQLDB. De esta forma podemos trabajar en desarrollo sin preocuparnos de tener acceso o tener que instalar nada más.

Para la automatización de tareas repetitivas con RoR se usa Rake y con Grails Gant(basado en Apache Ant).

Como librería javascript, por defecto, las dos traen Prototype.

Manos a la obra:

Donde más parecido he encontrado ha sido en la capa más web. Con los dos se usan layouts para la decoración base de la página, para las vistas Grails usa GSP y RoR ERB, mientras que lo que en un sitio se llaman Taglibs en otro son Helpers. Existen diferencias de sintaxis y de cómo se hacen las cosas, pero las capacidades son muy parecidas.

Para el acceso a datos, en los dos se utiliza el patrón ActiveRecord a través de ORM's, RoR utiliza uno del mismo nombre que el patrón y Grails GORM(basado en Hibernate y vitaminado con el dinamismo de Groovy). De inicio puede dar la impresión de que son casi equivalentes, pero este tema creo que tiene miga para tratarlo en otro capítulo.

Herramientas/IDE's:

En este apartado, gana RoR sin discusión con el plugin de NetBeans o RadRails que tienen un soporte realmente bueno. Mientras que para Grails Jet Groovy de IDEA es el único con un soporte decente, el plugin de Eclipse todavía está lejos de ser bueno, y el de NetBeans está en desarrollo.

Aparte de esto, hay muchos editores que soportan sintaxis ruby, mientras que soporte a groovy todavía es muy difícil encontrar

Algunas conclusiones:

A nivel de madurez, se le nota mucho más maduro a RoR. Empiezan a verse bastantes aplicaciones en producción, tiene más documentación, más plugins y una comunidad mayor. Aunque hay algo donde creo que destaca Grails, es en cómo está organizada la documentación de referencia, tanto para empezar de cero como para buscar algo en concreto.

Para un programador acostumbrado a Java, la curva de aprendizaje de Grails es más baja, puedes empezar a trabajar de una forma más javera e ir introduciendo/aprendiendo la forma más ¿grooviera?, además de poder utilizar cualquier librería java.

Reunión de Junio del ZaragozaJUG

El pasado mes de Marzo organizamos ZaragozaJUG, algo parecido a un Java User Group. Digo parecido porque no se habla exclusivamente de Java, lo que ayuda a enriquecer el grupo, pero todos trabajamos/hemos trabajado/tenemos interés en la plataforma Java.

Desde entonces, empezamos a organizar reuniones mensuales(para quien lo conozca, tipo cócktail cadius), aunque al ser todavía poquita gente no tenemos impuesto un día concreto al mes y tratamos que le vaya bien a la mayoría. Simplemente nos juntamos unos cuantos alrededor de unas cañas y charlamos sobre lo que surja, o sobre intereses e inquietudes de alguno de los asistentes, además de ser una buena forma de conocer gente interesante.

La reunión será el lunes 16 a partir de las 20:00, en principio en el Universal en Fernando el Católico, al lado de la plaza San Francisco.

Grails Morph Plugin

Ayer hablaba de los pasos para desarrollar una micro-aplicación con Grails y cómo desplegarla en Morph, había un paso molesto teniendo que generar y modificar el web.xml para añadir un recurso, que había que quitar para ejecutar la aplicación en entornos diferentes al de producción en Morph.

Ya pensaba en un plugin para esto mientras escribía el post anterior, pero por el comentario de dahernan me lancé a crearlo, lo que sólo me llevó unos minutos. Es un pequeño plugin que modifica el web.xml dinámicamente, o mejor dicho, que participa en su generación.

El plugin se llama Morph Plugin, está disponible el para descargarlo y en el SVN está disponible el código. Aunque se vean muchos archivos, la chicha está en MorphGrailsPlugin.groovy:


def doWithWebDescriptor = { xml ->
def env = System.getProperty("grails.env")
if(env=="production"){
def resourceRef = xml.'resource-ref'
resourceRef+{
'description'("Morphlabs Datasource")
'res-ref-name'("jdbc/morph-ds")
'res-type'("javax.sql.DataSource")
'res-auth'("Container")
}
}
}

Para instalarlo sólo hay que descargarlo y ejecutar dentro del directorio de la aplicación este comando:
grails install-plugin elpathquesea/grails-morph-0.1.zip

El ejemplo de la TODO list ya está desplegado de esta manera, y ya no es necesario ejecutar el comando grails install-templates para modifcar el web.xml ni tenemos ningún problema para seguir trabajando en local.

Si alguien está interesado en la creación de plugins para Grails, existe una guía para desarrolladores.

Desplegando una aplicación Grails en Morph

Morph es un servicio de hosting, que utiliza por detrás los servicios de Amazon, hasta no hace mucho sólo tenía soporte para Rails pero han añadido soporte a Java (vía Jetty), que todavía está en beta.

Morph tiene un plan gratuito para desarrolladores, y he probado a subir una micro-aplicación desarrollada con Grails. Como lo interesante es ver lo sencillo que es desplegar una aplicación, he creado una TODO list muy básica, sin gestión de usuarios y utilizando el scaffolding dinámico, que también podría servir para iniciarse en éste framework.

Primero deberemos registrarnos, y tras esto descargar el morph_deploy.jar y el morph_deploy.properties que usaremos para desplegar nuestra aplicación cuando la tengamos terminada.

Creamos la aplicación y, dentro del directorio de la aplicación que se ha creado, una clase del dominio:

grails create-app todo
grails create-domain-class task

En la clase Task.groovy le añadimos algún atributo:

class Task {
String task
}

Creamos un controller vacío:

grails create-controller task

Y para el andamiaje, añadimos al controller:

def scaffold = true

Para verlo en local (http://localhost:8080/todo/):

grails run-app

Podríamos dejar la configuración a la base de datos con hsqldb y no tener que hacer ninguna modificación al estar embebida, pero para usar PostgreSQL, deberemos descargarnos el driver, añadirlo al directorio /lib de nuestra aplicación y hacer las siguientes modificaciones en el DataSource.groovy, en el entorno de producción:

driverClassName = "org.postgresql.Driver"
url = "jdbc:postgresql://XXX.XXX.XXX.XXX/db_XXX"
username = "XXX"
password = "XXX"

Inicio Actualización 09/06/2008: Utilizando el plugin para Morph, ya no es necesario este paso.

Debemos añadir el recurso del DataSource en el web.xml, que se genera con grails install-templates:

<resource-ref>
<description>Morphlabs Datasource</description>
<res-ref-name>jdbc/morph-ds</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

Este recurso, lo tendremos que comentar para probarlo en local, ya que nos dará errores al ejecutar la aplicación.

Fin Actualización

Ya sólo nos quedaría empaquetarlo en un .war:
grails war
Y desplegarlo:
java -jar morph_deploy.jar --config morph_deploy.properties pathdelwar/todo-0.1.war
Que posteriormente, pedirá nuestro usuario/password con los que nos hemos dado de alta en morph y nos desplegará la aplicación.

Tras esto, sólo nos queda esperar unos minutos a que haga se efectúe el despliegue, y ya tenemos la aplicación corriendo. El ejemplo está disponible en http://danilat.morphexchange.com/, como se puede ver, me ha costado más escribir el post que la aplicación+despliegue :P.

Los despliegues se pueden hacer también con Ant y Maven, esto y alguna cosita más se puede encontrar en el Java Cookbook de Morph.

Lo que no tengo demasiado claro son las limitaciones que tendrá el servicio, a parte de poder usar sólo PostgreSQL, estando todavía en beta y si habrá muchas diferencias de los planes de pago con el plan gratuito.

Trabajando con Linking Paths

Cuando hablé de mi independencia, ya comenté que había algo más pero que otros tenían que ser quienes lo anunciaran y ya lo hizo Aitor, estuve unos días en Madrid para acelerar mi puesta a punto y empezar a trabajar con Linking Paths durante unos meses, en lo que han bautizado como Linking Internship 2008.

linking paths

En estos días con Alberto, he empezado a aprender Ruby on Rails(tarde o temprano seguro que habrá una comparativa cara a cara con Grails :P) y a ver Tog.

Pero sobre todo he comprobado lo que sospechaba, que es una empresa que se sale de lo habitual, con una especie de caos controlado, con personas muy interesantes e ideas muy interesantes.