Visualización desarrollo de ContentCompass

Hace un par de dias, buscando un repositorio RDF con versionamiento, encontré un proyecto opensource que mostraba un video con la actividad de los desarrolladores en el repositorio GIT. Buscando un poco, encontré que dicha animación fue generada con Gource. A mi gusto, el programa genera excelentes resultados. La animación es un árbol, donde los directorios son ramas y los archivos son hojas.

La wiki de Gource tiene toda la información necesaria para generar el video (o links a los tutoriales respectivos). Los comandos que utilicé son:

 #!/bin/bash
gource --title "ContentCompass" --font-size 14 -1280x720 --highlight-all-users 
 --camera-mode track --hide progress --max-files 0 
 --stop-at-end --seconds-per-day 0.8 --file-idle-time 0 
 --output-ppm-stream cc.ppm
 
ffmpeg -y -b 6000K -r 60 -s hd720 -f image2pipe -vcodec ppm 
-i cc.ppm -i Nurykabe_-_Grand_rassemblement_des_banquiers.flac 
-vcodec libx264 -vpre default cc.mp4

El resultado:

pd: si, hoy fue una tarde productiva :)

ServiceMix 4.2 en Tomcat6

Este fin de semana estuve “destripando” ServiceMix, específicamente la distribución 4.2.0-fuse-02-00 de Fuse. El objetivo era generar un war desplegable en Tomcat6, ya que la versión de Fuse sólo viene como aplicación standalone.

Al final fue no fue tan complicado, porque hay un ejemplo que facilita enormemente la tarea.

Al grano

Para ejecutivos de tiempo escaso, estos son los pasos a seguir.

Supuestos:

  • Linux, distribución Ubuntu Karmic x86_64.
  • Tomcat6 instalado vía apt (relevante, porque determina rutas, permisos y usuario tomcat6).
  • estar conectado a internet (se bajarán componentes en la instalación).

Pasos:

  • Baja el war karaf-smx-1.4.0-fuse-02-00.war
  • Como root, crea el directorio .karaf en el home de tomcat6: mkdir /usr/share/tomcat6/.karaf
  • Cambia el owner de .karaf a tomcat6: chown tomcat6:tomcat6 /usr/share/tomcat6/.karaf
  • Crea un link a etc en el directorio de trabajo de tomcat: ln -sf /var/lib/tomcat6/webapps/karaf-smx/WEB-INF/karaf/etc /var/lib/tomcat6/etc
  • Despliega el war: cp /path/to/karaf-smx-1.4.0-fuse-02-00.war /var/lib/tomcat6/webapps/karaf-smx.war

Ahora deberás esperar un buen rato, porque Karaf empezará a bajar e instalar los bundles de ServiceMix. Puedes ir vigilando lo que pasa en el log:

$ tail -f /var/lib/tomcat6/webapps/karaf-smx/WEB-INF/karaf/data/log/servicemix.log

Para verificar que todo está listo, abre una consola (el password es smx):

$ ssh -p 8101 -l smx localhost

Ejecuta el comando list, para ver los bundles instalados:

smx@root> list
START LEVEL 100
   ID   State         Blueprint      Spring    Level  Name
[   0] [Active     ] [            ] [       ] [    0] OSGi System Bundle (3.5.1.R35x_v20090827)
[   1] [Active     ] [            ] [       ] [    5] OPS4J Pax Url - mvn: (1.1.2)
[   2] [Active     ] [            ] [       ] [    5] OPS4J Pax Url - wrap: (1.1.2)
...
[ 173] [Active     ] [            ] [       ] [   60] Apache ServiceMix Bundles: commons-io-1.3.2 (1.3.2.3)
[ 174] [Active     ] [            ] [       ] [   60] camel-cxf (2.2.0.fuse-02-00)
[ 175] [Active     ] [            ] [       ] [   60] camel-jms (2.2.0.fuse-02-00)
smx@root>

Cuando sean 175 debería esta todo listo para la acción :D .

Continue reading

Jar ejecutable con Maven

Una pregunta común que hacen usuarios nuevos de Maven es cómo crear un jar ejecutable. Generalmente las soluciones propuestas van en la línea de generar un sólo jar gigante –con todas las dependencias dentro– utilizando algo como uberjar, fatjar o el descriptor jar-with-dependencies de maven-assembly-plugin. Esto, en mi opinión, es inconveniente y poco estético, por varias razones:

  • El jar resultante es una sopa de artefactos, ya que se mezclan todas las dependencias directas y transitivas con la aplicación misma.
  • No escala; para proyectos con muchas dependencias, el proceso de formar el “super jar” es lento, por lo que no es una opción viable para utilizar en tiempo de desarrollo (sólo al hacer un release).
  • Pueden haber problemas de licencia. Algunas dependencias pueden exigir que se mantenga la integridad de los binarios que distribuyen, prohibiendo “reempaques”.

Los requerimientos que deseo satisfacer son bastante simples:

  1. Generar un jar con el manifiesto necesario; esto es, que indique la clase con el punto de entrada main y las dependencias.
  2. Poder obtener todos los jars de las dependencias, directas y transitivas, en un directorio de salida aparte (lib, por ejemplo).
  3. Generar un pequeño script bash, que lance el jar con el classpath configurado.
  4. Obtener una distribución de la aplicación, o sea, copiar todo lo anterior en un directorio del sistema (o en target).
  5. Debe ser rápido!, ya que será ejecutado recurrentemente, en tiempo de desarrollo.

En algún momento del pasado lejano llegué a una configuración que satisface los objetivos listados, consistente en una combinación de maven-jar-plugin, maven-dependency-plugin y maven-resources-plugin. Continue reading