Herramientas: BoxCryptor

Si bien esto no está directamente relacionado con el desarrollo y la programación, me pareció una herramienta muy útil, para los que quieran almacenar sus creaciones en la nube, sin tener que dejar cada archivo expuesto a la merced de los términos y condiciones de los servicios más populares.
BoxCryptor es una herramienta bastante simple. Esencialmente se trata de un aplicativo que permite encriptar nuestros archivos, antes de que se escriban en un filesystem. Como encripta cada archivo por separado, es especialmente útil e interesante, para subir, luego, lo generado a servicios como DropBox, Google Drive o Sky Drive.
La forma de uso es bastante simple, luego de instalarlo, tenemos que crear un directorio, en cuyo interior se va a almacenar todo lo que necesitemos de forma encriptada. Si ya tenemos funcionando algún servicio de cloud hosting, lo conveniente es seleccionar un directorio ya sincronizado.
Luego nos preguntará el nombre de un drive (lo probé utilizando la versión Windows), el cual servirá para trabajar con nuestros archivos. Luego de este paso ya lo podemos utilizar.
Una vez que esté en funcionamiento, lo único que hay que hacer, es arrastrar lo que querramos proteger, al drive creado, y automáticamente lo va a ir encriptando en el directorio que seleccionamos previamente, y luego esto será sincronizado de forma automática.
Lo que me pareció interesante, es que podemos volver cualquier archivo a una versión anterior (ej, usando Google Drive o DropBox), y el archivo encriptado se restaurará sin generar problemas de checksum o cosas por el estilo. La versión free tiene el limitante de que solo nos permite tener una carpeta encriptada al mismo tiempo, pero podemos ir eliminando y seleccionando cada carpeta que querramos sin mayores complicaciones, por lo que se puede usar para varios directorios (no al mismo tiempo).
Muy recomendable!

Mapeos más dinámicos: Fluent NHibernate

Como muchos saben, la herramienta de ORM más conocida en el mundo JAVA, Hibernate, tiene su port, bastante actualizado por cierto, en el mundo .NET. Hace poco tuvimos que empezar un proyecto en esta plataforma, y un integrante del equipo, sugirió utilizar Fluent NHibernate. Se trata básicamente de una librería, con un enfoque “fluent” para construir los mappings de las entidades.
Al principio pensé que quizá no era una buena idea utilizar otra manera de hacer mapeos, ya que si teníamos algún problema quizá iba a ser un poco más difícil pedir soporte a otros equipos que tenían más experiencia, pero igualmente decidimos ir para adelante, por lo menos inicialmente, para probar que tan difícil era armarlos.
Por suerte para crear los primeros mapeos pudimos utilizar una herramienta generadora de código, que tenía soporte para crear los mapeos con Fluent. Igualmente fue necesario retocar lo generado, como siempre suele suceder con este tipo de herramientas.
Luego de un tiempo, al final creo que fue una buena idea, y se me ocurrió buscar si había algo parecido en el mundo JAVA, y lamentablemente no pude encontrar nada similar.
La idea básica de este framework es tener una clase con código fuente (en este caso c#) que define el mapeo. Ejemplo:

1:  public class CatMap : ClassMap<Cat>  
2:  {  
3:   public CatMap()  
4:   {  
5:    Id(x => x.Id);  
6:    Map(x => x.Name)  
7:     .Length(16)  
8:     .Not.Nullable();  
9:    Map(x => x.Sex);  
10:    References(x => x.Mate);  
11:    HasMany(x => x.Kittens);  
12:   }  
13:  }  

Lo bueno de este enfoque, comparado con archivos XML, es que muchas cosas se resuelven en tiempo de compilación. La otra ventaja, es que utilizando el Intellisense de la IDE (VisualStudio en este caso), podemos tener rápidamente un vistazo de los diferentes atributos de cada parte del mapeo que estamos construyendo, y contextualizados al campo que estamos mapeando.El startup time, además, es bastante bueno y rápido. 
En fin, esto demuestra que las buenas ideas, traspasan todas las plataformas, y así como .NET se vió beneficiado con el port de uno de los mejores frameworks de persistencia, JAVA podría verse beneficiado con otra forma interesante de construir mapeos si alguien se anima a hacer un port de esta librería en el mundo JAVA :)

El software libre en acción

Hace muchos años, desde que conocí el concepto de software libre, pase por varias etapas. Al principio: me preguntaba constantemente: cómo puede ser rentable y mantenible una idea semejante?, luego de un tiempo, de comenzar a sacudirme de encima todos los preconceptos que un joven freelancer amateur puede tener encima, comencé a darme cuenta de la importancia de las ideas sobre el código, y la importancia que puede tener alguien, por entender realmente el producto o servicio que desarrolla, mantiene y vende. Finalmente pase a entender que gracias al software libre, la relevancia de las ideas y las ganas de llevar a la realidad lo que uno tiene en la cabeza, superan ampliamente al concepto tan antiguo de que el código es algo similar a una cosa física que uno construye y vende.
Pero bueno, volviendo un poco al post, tenía ganas de contarles acerca de tres casos diferentes en magnitudes, pero relacionados entre sí, que a mi entender, demuestran como gracias al software libre, se pueden superar barreras que con software pago y licenciado, no se podían pasar.

CASO 1: DB DESIGNER

Hace unos años, cuando estaba comenzando a desarrollar un sistema, me tocó elegir algún soft, en lo posible gratuito, para poder hacer diseño de modelo de datos, y llegué al DB Designer. Era una herramienta interesante, porque permite trabajar cómodamente con diagramas que podían crecer bastante en tamaño, sincronizar con la base de datos los cambios, generar los scripts de generación de tablas con muchas opciones diferentes, etc. Como el proyecto en cuestión, debía correr contra una base MySQL, pude usar sin problemas la herramienta, ya que estaba específicamente diseñada para trabajar con dicho RDBMS. En realidad esto era un problema, ya que si hubiese necesitado otro Vendor de base de datos, no hubiese podido utilizarla.
Hace poco me surgió una necesidad similar, pero para PostgreSQL, y, habiendo olvidado de esa restricción, opté por descargar DBDesigner para trabajar. Cuando quise hacer una exportación, recordé de que solo funcionaba con MySQL. Fue entonces que visité la página de FabForce, incrédulo de que después de tanto tiempo no hubiesen desarrollado algún plugin, o algo parecido, para poder exportar a otra base … pero nada.
Después de un par de búsquedas, me encontré con DBDesigner Fork. Como su nombre lo indica, se trata de un fork, que agrega soporte para muchas bases de datos, entre ellas PostgreSQL. Luego de descargarla, pude importar el modelo y lograr lo que necesitaba.

CASO 2: TWITTER Y SU VERSIÓN DE MYSQL

Si bien estamos hablando de otra magnitud, es algo, a mi parecer, comparable.
Hace poco me enteré de que Twitter publicó un fork de MySQL con algunas características interesantes, como por ejemplo:
  • Nuevas variables de estatus para el motor INNODB
  • Optimización del acceso a memoria no uniforme (NUMA)
  • Timeout de las querys del lado del servidor
  • Exportación y restauración del pool de conexiones de manera más liviana
  • Optimización para dispositivos SSD

Me pareció una muy buena idea, y una muy buena movida por parte de twitter. Tomar algo que es bueno, adaptarlo para mis necesidades, y retroalimentar a la comunidad con este desarrollo.

CASO 3: JENKINS

Bueno, para los fanas como yo de la integración contínua, esto no es algo desconocido.
El proyecto Hudson, construido prácticamente entero, por uno de mis ídolos, Kohsuke Kawaguchi, comenzó como uno de los desarrollos open-source de SUN, quien luego fue adquirido por Oracle. Luego de la adquisición, Kohsuke deja la compañía, pero continúa trabajando en el proyecto. Oracle intenta influenciar el proyecto, de tal manera que cambia un poco la visión que el creador y mentor tenía sobre el producto, por lo cual él, y la comunidad de desarrolladores de extensiones, deciden hacer un fork del proyecto, cambiándolo de nombre. Pasa a llamarse Jenkins.
Cuando me enteré de esta decisión, no pude evitar pensar, de que prácticamente nadie se tomaría el trabajo de actualizar algo que ya de por sí funcionaba bien, a una versión ya no sponsoreada por el gigante Oracle, con otro nombre, y probablemente con muchos problemas de incompatibilidades.
Estaba muy equivocado, el fork estuvo excelentemente planificado, el swap era extraordinariamente simple, prácticamente no hubo incidencias, y gran parte de la comunidad comenzó a seguir a este branch, se siguieron creando muchísimos plugins más, y los mejores plugins continuaron siendo actualizados bajo este nuevo emprendimiento.
En fin, son tres casos de miles, diferentes entre sí, que me recuerdan que cuando uno desarrolla una pieza de software, lo que hace es materializar la idea del producto que uno tiene en su mente, si a esto le sumamos las ganas y la fuerza de la motivación, el software libre puede ayudar a mantener vivas nuestras creaciones y ayudar a que todos usemos estas herramientas para mejorar lo que hacemos día a día.

STAND for Android: Un buen comienzo

Investigando un poco acerca de si existía algún buen archetype para desarrollar una aplicación en Android, llegué a este proyecto que me pareció interesante. STAND for Android, sirve principalmente para comenzar un buen desarrollo, con todas las herramientas para hacerlo sólido.
Utiliza Maven, para controlar el ciclo de vida del proyecto, versiones, dependencias, etc.
Permite crear proyectos con configuraciones predefinidas de forma óptima, como ser logging, testing, etc.
Opcionalmente, las aplicaciones generadas pueden crearse ya listas, para ser publicadas en el android market.
Para comenzar a utilizarlo, es muy simple para los que están acostumbrados a utilizar el plugin de archetypes de maven, simplemente hay que correr alguno de los comandos indicados en el sitio de stand.
Luego de ejecutar algunos de los archetypes, se generará un proyecto multimódulo, con un apartado especial para los tests de integración.
Obviamente ya viene preconfigurado para usar el plugin de maven para android, y tambien todas las configuraciones necesarias para poder sacarle el provecho a las extensiones de eclipse para trabajar con Android.
Es interesante el apartado de tests de integración, ya que uno de los módulos generados está listo para correr este tipo de tests sobre la nueva aplicación.
Todo lo que vimos hasta ahora es la parte de creación de un proyecto en blanco para poder empezar a trabajar, pero eso no es todo. Ademas existen otros cuatro frameworks interesantes:
  • Rindirect: Es un plugin de maven, que permite facilitar la reutilización de codigo, a traves de varios proyectos diferentes, solucionando los problemas conocidos de dependencias y colisión de paquetes.
  • Androlog: Es una pequeña libreria para tener logging dentro de nuestras aplicaciones Android
  • Marvin: Es una libreria de testing unitario, que permite facilitar la creación de tests complejos, sobre todo relacionados a la ejecución de actividades, etc.
  • Roboject: Es un framework de inyección de dependencias mediante anotaciones para Android.
En fin, un conjunto interesante de herramientas para no tener que reinventar la rueda.

Maven: Dependencia entre wars

Por lo general, en todo proyecto empresarial JAVA, surge al momento de definir la arquitectura del aplicativo, definir el concepto de modulo, subsistema, y por que no, sistema. Al momento de tomar estas definiciones con un aplicativo en particular, surgen muchas maneras de realizar esta división, pero si tenemos en mente el stack de tecnologías JAVA estándares, para la Web, en algún momento, sobre todo dependiendo del tamaño del proyecto, vamos a llegar a la pregunta del millón: conviene separar mi capa de presentación por módulos?
Desde el comienzo, incluido en todo lo que nos ofreció el stack de tecnologías para aplicaciones empresariales de JAVA, nunca hubo un buen soporte para realizar esto, que a simple vista resulta prácticamente básico, poder “partir” mi aplicación en módulos independientes, pero en cierta manera “unidos” entre si, mediante el concepto de aplicación empresarial. Si bien se podían embeber varios paquetes “war” dentro de un único bundle “ear”, eran aplicaciones prácticamente independientes, y, era muy difícil por ejemplo, reutilizar código, ya que un WAR no es una librería (JAR) como tal.
Con la aparición de Maven, el WAR comenzó a ser un módulo más, por lo que surgió naturalmente el concepto de tratarlo como un paquete de código en si. De todas maneras los primeros intentos por lograr la tan ansiada dependencia, no vinieron de los plugins “core” sino de terceros, por ejemplo el goal maven:uberwar de cargo, o el plugin warpath de AppFuse.
Estos plugins si bien lograban su cometido, no eran la forma más natural de poder establecer dependencias entre los módulos WAR y así lograr por ejemplo, la reutilización de código de capa de presentación.
Igualmente ustedes dirán, “pero si queremos reutilizar, porque no metemos el código en librerías JAR?”, el problema viene justamente por lo que decía al principio, hasta hace no tanto, el estándar JEE, no permitía que, por ejemplo, las páginas JSPs u otros recursos WEB vengan embebidas en librerías. Si podríamos reutilizar ese código y tener en un componente principal recursos comunes, y en otros componentes simplemente referenciarlos, se disminuiría un montón el código de varias aplicaciones similares o módulos de una aplicación grande.
Otro problema venía por el lado de las IDEs, si bien podíamos resolverlo quizá, con los plugins que mencioné anteriormente, la IDE por lo general no se “daba cuenta” de esta dependencia, y había que lograr que funcione usando trucos extraños.

La solución

Por suerte se logró solucionar este problema con la última versión del plugin que administra la construcción de archivos war de maven, el maven-war-plugin.
Ahora para poder reutilizar código, podemos usar tranquilamente la dependencia entre wars, que funciona de la siguiente manera.
Supongamos que tenemos un proyecto WAR, denominado “proyecto-comun”, el cual posee clases y recursos comunes a ser reutilizados en otros modulos WAR.Además tenemos un proyecto WAR, denominado “proyecto-nuevo”, el cual necesita reutilizar clases bases y recursos existentes en el proyecto anterior. Para lograr la dependencia, tenemos que agregar las siguientes configuraciones: En el “proyecto-comun”, debemos agregar lo siguiente en el pom.xml:

 <plugin>  
      <groupId>org.apache.maven.plugins</groupId>  
      <artifactId>maven-war-plugin</artifactId>  
      <configuration>  
           <attachClasses>true</attachClasses>  
           <webModule>  
                <groupId>com.miempresa</groupId>  
                <artifactId>proyecto-comun</artifactId>  
                <contextRoot>/proyecto-comun</contextRoot>  
           </webModule>  
      </configuration>  
 </plugin>  

Acá lo importante es el tag “attachClasses”, que le dice a maven que cree un artefacto secundario con las clases del proyecto, las que más adelante nos van a servir para poder compilar el mismo.
Luego en el “proyecto-nuevo”, tenemos que agregar lo siguiente:

 <dependency>  
      <groupId>com.miempresa</groupId>  
      <artifactId>proyecto-comun</artifactId>  
      <version>1.0.0-SNAPSHOT</version>  
      <type>jar</type>  
      <classifier>classes</classifier>  
 </dependency>  
 <dependency>  
      <groupId>com.miempresa</groupId>  
      <artifactId>proyecto-comun</artifactId>  
      <version>1.0.0-SNAPSHOT</version>  
      <type>war</type>  
 </dependency>  

La primer dependencia, indica que las clases se deben compilar teniendo en cuenta el JAR generado automáticamente por el primer proyecto, y la segunda, que luego de compilar, primero copie los recursos del war anterior y luego sobre ese, los recursos del war actual, reutilizando archivos jsps, css, imagenes, xmls, etc.
Lo bueno de esta técnica, es que funciona correctamente con Eclipse (por las dudas usar siempre la última versión), utilizando el plugin m2eclipse, que por el momento es lo mejorcito que existe para trabajar con proyectos maven. La IDE correctamente interpreta la dependencia, y si tenemos los dos proyectos importados, ni siquiera hay que ejecutar el comando “mvn install” sobre el “proyecto-comun” para que tome los cambios, los toma automáticamente.

Que falta

De todas maneras existen algunos puntos sin resolver todavía:

  • No tenemos soporte para “mergear” el archivo web.xml, por lo que el web.xml del “proyecto-comun” va a ser pisado por el del “proyecto-nuevo”
  • Hay que tener cuidado de no crear clases en los mismos paquetes y con los mismos nombres, porque van a ser ignoradas (suponiendo que el application server le de prioridad a las clases del directorio “classes”)

Igualmente es una mejora substancial con lo que había antes, y permite tratar el código de presentación, prácticamente como si se tratase de una librería común, respetando su propio ciclo de vida, relacionado a las versiones, empaquetado, etc.

AppScale: Despegándose de AppEngine

Leyendo un poco acerca de las particularidades de Google AppEngine, llegué a este proyecto que me pareció bastante interesante.
AppScale es un conjunto de herramientas que permiten correr aplicaciones diseñadas para Google AppEngine, pero utilizando otras plataformas de servicio en la nube, como Amazon EC2.
Me pareció interesante el concepto, ya que da mucha tranquilidad a los que están montando servicios y posibles negocios en la nube de google. No tuve la oportunidad de probarlo, pero por la documentación, la idea es que se trata de un aplicativo instalable en un Linux (Ubuntu), que permite agregar aplicaciones listas para ser deployadas en AppEngine.
La distribución trae directorios por cada lenguaje que soporta la plataforma (go, java y python), en los cuales hay varios ejemplos para tomar como base. Igualmente hay que tener en cuenta que no todos los servicios son soportados. Se puede consultar la grilla de compatibilidad para ver el detalle por lenguaje. 
Igualmente lo que me parece más interesante es el soporte del Datastore y del Blobstore, ya que eran características que si uno las utilizaba, no permitía migrar fácilmente a otro tipo de plataforma. También se pueden descargar máquinas virtuales preconfiguradas, listas para ser instaladas en las plataformas de virtualización más conocidas. Incluso tiene una versión pública de imagen lista para ser utilizada en Amazon EC2 o Eucalyptus.
Excelente para perderle el miedo a AppEngine.