Glumly

Tuesday, September 21. 2010

Si bien no soy para nada amante del alto nivel y sus prácticas, la vez pasada necesitaba representar unas entidades en un paper, creí que era copado hacerlo en un lenguaje universal, y me vi ante la necesidad de hacer mi primer diagrama UML.

Por una cuestión de presentación, necesitaba que el diagrama fuera elegante, y de ser posible en algún formato vectorial, para embeberlo en LaTeX. Con este objetivo, hice una pequeña búsqueda en las aplicaciones que encontré en el repositorio de paquetes de mis distros, y un rato más tarde me convencí de que no había nada que mínimamente me satisfaciera. O herramientas pensadas para generación de código automático, o herramientas de diagramas con nulo aporte estilístico...

Googleando, llegué a yUML y realmente me parecieron bastante copados los gráficos que generaba. Para el volumen de mi problema no necesitaba mucho más que eso. Ahora bien, los gráficos que genera son rasterizados, y por otro lado, tampoco parecía muy práctico estar desarrollando contra una aplicación web. Lamentablemente, yUML es privativo, por lo que tampoco había mucha forma de meter mano como para enmendar una u otra cosa.

Pregunté en el IRC del LUGFI por el tema, y Albertito me recomendó usar Graphviz para armar los diagramas, que si bien tenía un poco de overhead de sintaxis servía. Miré un poco por encima Graphviz y me convenció, así que le di para adelante. Si bien los gráficos que sacaba Graphviz pelado creo que ya eran ampliamente superiores a los que se podían sacar con Dia, googleé un poco y encontré hojas de estilos para maquillar un poco y hacer un poco más vistozos los SVGs de Graphviz, con lo que además de simple, la solución generaba gráficos bonitos.

Luego de delineado el fuente en DOT del primer UML, decidí que iba a ser el último y escribí un generador de DOT orientado a lo que necesitaba, sencillísimo, menos de 10 líneas de código. Ya que estaba, agregué tipos de dependencias que mi proyecto no necesitaba pero completaban los diagramas de clases UML, y terminé cerrando una miniaplicación.

Curiosamente (o no tanto), con un poco de googleo y un par de modestas líneas de código, desarrollé un proceso que si no es con el que está implementado yUML, le pega en el poste. Y dentro del contexto de la falencia de una aplicación sencilla para hacer ese tipo de cosas y de la licencia restrictiva de yUML, un script que hubiera dejado tirado en mi disco hoy lo estoy publicando para beneficio de otros.

Les presento Glumly (grep uml /usr/share/dict/*), una pseudo implementación libre de yUML, que me salió de casualidad.

Acá está el gráfico de ejemplo que colgué en la web (el cual está "inspirado" en el ejemplo más avanzado de la web de yUML):



P.D.: Al respecto de mi problema original, como era obvio esto me sirvió parcialmente... la única aplicación para postprocesar SVGs es el Inkscape y si bien para todos los demás formatos anda joya, los SVGs que genera este script rompen a Cairo, por lo que la exportación a PDF o a EPS anda para atrás. Por fuera de eso, el proceso funciona automagicamente para PNGs y otros formatos raster. Si alguien necesita sacar salida vectorial del Inkscape, comento cómo lo solucioné, pero ya es otro tema. Al respecto de la extensión para que LaTeX procese DOT, también me anduvo para atrás, si bien probablemente podria haber andado dedicándole más tiempo.
P.D.2: Al respecto de referenciar todo lo que menciono, me da paja; si quieren links, la homepage de Glumly tiene todos los que hacen falta.