sábado, 7 de mayo de 2011

Solar System Scope: el sistema solar a tu alcance

Lo maravilloso de aprender algo, es que nadie puede arrebatárnoslo.
-- B. B, King.

Hace casi dos años, escribí un artículo sobre Sideralis, un planetario para móviles gratuito muy práctico. Desde entonces hasta ahora los móviles han cambiado mucho y han aparecido productos software espectaculares para astronomía en todas las plataformas. Por ejemplo, he tenido la ocasión de ver GoSkyWatch funcionando en un iPhone 4 y es realmente impresionante.

Pero lo que hoy traigo aquí es igualmente impresionante, y no hace falta ni tener un iPhone ni siquiera instalarse nada, tan sólo un navegador y curiosidad.
Solar System Scope es un simulador interactivo 3D del sistema solar online realmente espectacular. A diferencia de otros simuladores 2D estáticos (como el de la NASA) o dinámicos (como el de Gunn Interactive), éste permite movernos a través del sistema solar con total libertad de navegación e incluso de representación, ya que nos permite cambiar la escala del sistema (tanto en distancia como en tamaño de los objetos).


No sólo es un buen simulador del sistema solar: es el mejor que he visto. Sus posibilidades de interacción lo hacen tan entretenido, que te puedes pasar un buen rato jugando con múltiples ángulos de observación (desde cada planeta haciendo doble clic) y observando las posiciones y movimientos a través de una representación desproporcionada para que nos quepan todos los planetas en pantalla.

Como elemento didáctico para los niños, es verdaderamente genial, porque se puede jugar con la escala para enseñarles (al poner el sistema en escala real) las enormes distancias del sistema, cómo Urano gira tumbado con sus anillos prácticamente en vertical con respecto al plano orbital, mostrar las fases de la luna y por qué vemos siempre su misma cara, que no sólo Saturno tiene anillos o el extraño amanecer de Venus por el Oeste.




Aunque aún le faltan funcionalidades por terminar (como la localización de estrellas o planetas), puedes comprobar que tiene una interfaz muy sencilla que te hará pasar un rato ameno y entretenido aprendiendo o visualizando aquello que aprendimos hace años. Prúebalo y me cuentas.


Referencias y más información:

domingo, 17 de abril de 2011

PowerDesigner free alternatives... or something close (for PostgreSQL minimum)

Herramientas de modelado de datos gratuitas (para PostgreSQL)


Las herramientas de modelado de datos son muy útiles a la hora de realizar un diseño de datos nuevo o acercarnos a la comprensión y estudio de un modelo existente (en aquellas con características de ingeniería inversa). La capacidad de realizar un diseño de modelo visualizándolo de forma gráfica, a través de los Diagramas E-R, o de obtener un diagrama y documentación de una base de datos existente aumenta enormemente la eficiencia de nuestro trabajo reduciendo drásticamente el tiempo necesario con respecto a una realización manual de dichas tareas de diseño, análisis y estudio.

La mejor y más completa herramienta de modelado que conozco es PowerDesigner©. No es objeto de este artículo describir la enorme cantidad de características que tiene, ni lo perfectamente resuelto que están en ella las tareas de modelado e ingeniería directa e inversa, pero te aseguro que es casi perfecta, contemplando todo el ciclo de modelado (lógico y físico, con multitud de bases de datos) de datos, además de otras tareas de modelado como el de objetos (con generación de código), esquemas xml, etc...

PowerDesigner tiene, empero, un (grave) inconveniente: sólo está disponible para Windows, y en Sybase/SAP no se han preocupado (al contrario que otras compañías, como por ejemplo Spotify) de que pueda ejecutarse con Wine perfectamente.

Vale. Así que tenemos Linux (por ejemplo) y no podemos ejecutar PowerDesigner pero necesitamos una herramienta que nos ayude en nuestro trabajo. ¿Qué alternativas hay?. He buscado en internet "herramientas de modelado de datos", "data modelling tools", "PowerDesigner alternatives"... con resultados decepcionantes: apenas listas de herramientas poco comentadas o algún comentario en foros... Así que me puse manos a la obra a buscar por mi cuenta y compartirlo con la comunidad.

Lo primero que hay que tener en cuenta es que no existe ninguna herramienta gratuita alternativa comparable a PowerDesigner, ni por calidad ni cantidad de características. Pero existen herramientas bastante decentes (para ser gratuitas) que nos pueden servir para la mayor parte de nuestras necesidades. De hecho, hay una lista publicada con una cantidad enorme de herramientas diferentes de modelado que me llevaría muchos días probar. Así que, como en otras ocasiones, fijé una serie de características y condicionantes necesarios para mi, con lo que el número de herramientas candidatas se redujo considerablemente. Mi lista de características y condiciones ha sido la siguiente:
  • Debe estar disponible para Linux, como mínimo.
  • Debe tener características de modelado de datos (no basta con una herramienta de diagramas o que sea sólo para UML)
  • Debe tener características de ingeniería directa e inversa.
  • Debe soportar (para la ingeniería directa e inversa) como mínimo, PostgreSQL. Adicionalmente se valorará otras bases de datos como MySQL, Oracle, SQL Server, DB2, Derby, etc...
  • Debe tener características de documentación: generar diagramas E-R, y documentación de la base de datos.
  • Por supuesto, debe ser gratuita y, preferentemente, libre.
A continuación, os detallo las herramientas analizadas

Open System Architect 4.0.0

Es Open Source. Frecuencia de actualización: desconocida.
De todas las herramientas, analizadas es la que más se parece (dicho esto con todas las cautelas y salvando mucho, mucho las diferencias) a PowerDesigner, y es la que más características y posibilidades incorpora. Por ejemplo, es la única de las analizadas que integra el modelado lógico. Tiene la mejor organización de proyectos y menús y es rápida. Me han gustado muchos aspectos que aparentemente la podrían convertir en la más completa...sin embargo, también es la que más me ha decepcionado en el resultado final. El acceso a las bases de datos es vía ODBC (es la única de las analizadas que no está hecha en Java), lo cual me ha resultado un poco arcaico y engorroso de configurar, aunque al final ese no ha sido el inconveniente, sino la falta de acabados finales que hacían perder la lucidez de las funcionalidades:
  • Diagramas
    • los diagramas generados son feos (si bien este inconveniente es generalizado en todas las herramientas analizadas)
    • faltan opciones de presentación gráficas, de reordenado y de diseño de las tablas y sus relaciones
  • Ingeniería inversa:
    • La importación de tablas no es cómoda y no se sabe muy bien de qué esquemas estás importando. No puedes agregar tablas referenciadas relacionadas (hijas) o que la relacionen (padres) automáticamente.
  • Documentación:
    • No encontré las características de documentación mínimas que buscaba.
En definitiva, debería ser la mejor... pero al final no me ha gustado. Es como si te montas en un Mercedes, que hace ruido, no tiene aire acondicionado y la dirección y el cambio son muy duros. No me ha resultado cómoda y no la voy a usar. Estaré atento a futuras versiones si es que se producen.


SQL Power Architect 1.0.6


Aunque es un producto comercial, la versión community es Open Source y gratuíta.Frecuencia de actualización: alta.

La versión community gratuita es suficiente para un trabajo de modelado básico. Soporta ingeniería directa e  inversa de forma cómoda (se pueden agregar fácilmente las tablas hijas) con bastantes opciones gráficas de presentación. Es rápido, amigable y con él se puede generar una documentación mínima decente. De todos los analizados es el que menos opciones de modelado y documentación tiene, aunque cumple su cometido muy dignamente.


SQuirreL SQL 3.2.1

Open Source. Alta actualización. Esta herramienta es en realidad un cliente SQL multi-bases-de-datos (bastante bueno, la verdad) con capacidades de modelado e ingeniería directa e inversa.

SQuirrel no destaca por sus capacidades gráficas de diagramas E-R. La organización de las tablas en una importación vía ingeniería inversa deja bastante que desear (como se puede observar) aunque salvando el detalle de tener que organizar y posicionar las tablas a mano, tenemos suficientes opciones para añadir tablas referenciadas o elegir la presentación de las tablas. Sin embargo, como he comentado, SQuirrel es un cliente multipropósito y multibase bastante completo, con muchos plugins y potentes editores de datos, SQL, DML y esquemas. Este es probablemente el más completo multi-propósito de todos los analizados.


Druid III (3.11)

Open Source. Frecuencia actualización: Alta

Druid es fundamentalmente una herramienta pensada para crear bases de datos de forma gráfica y documentarlas. Su capacidad de documentación de bases de datos supera a todas las del análisis: es capaz de generar documentación tipo javadoc de una base de datos con los diagramas E-R y sus tablas de forma detallada, como se puede comprobar en la siguiente ilustración.

La interfaz es un poco "extraña" (por llamarla de alguna manera) y muy poco intuitiva (probablemente la peor interfaz de todas). Sin embargo, si quieres documentar una base de datos, ésta es tu heramienta. Permite documentar una base de datos existente vía ingeniería inversa, realizando diagramas temáticos y realizando documentación adicional, de forma muy sencilla, añadiendo tablas relacionadas, y presentando la información que deseemos. En todo caso, a pesar de que le faltan opciones gráficas de zooming y layout y de tener una interfaz difícil, para documentar una base de datos vía ingeniería inversa, es la que más me ha gustado.


Resumen:

  • Todos tienen carencias en la presentación de los diagramas E-R: faltan opciones de "layout" y los diagramas son poco vistosos.
  • Todos son multiplataforma (todos salvo Open Systems Architect están hechos en Java).
  • Todas las herramientas son válidas. Y deberías probarlas todas. Ahora bien, cada una tiene un punto fuerte
    • Documentación: Druid
    • Algo para empezar, sencillo: SQL Power Architect.
    • Cliente completo, todo en uno: SQuirrel
    • OSA no me ha gustado, a pesar de ser la única que incorpora modelado lógico de forma explícita.
Todo esto, como siempre, es cuestión de gustos y de necesidades concretas. Así que, como en otras ocasiones, recomiendo probar y sacar conclusiones... y si las compartes conmigo comentando, te lo agradezco.

¿Conoces alguna otra herramienta que cumpla las condiciones iniciales?


Referencias y más información:

lunes, 21 de marzo de 2011

java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.String

Ver lo que tenemos delante de nuestras narices requiere una lucha constante.
-- George Orwell (1903-1950) Escritor británico.

Un error en tiempo de ejecución como éste: java.lang.ClassCastException: [LFQN_ClassName; cannot be cast to FQN_ClassName, puede dejarte con cara de perplejidad durante algunos minutos. A mi me pasó. Y reconozco cierta vergüenza al admitir que fueron unos cuantos largos minutos en los que no daba crédito. Estaba tan concentrado en que el casting era correcto que no podía entender cómo la JVM me decía que no podía adaptar un tipo de dato a otro exactamente igual... Al cabo de unos minutos me di cuenta que la clave está en el corchete ("["). No se trata del mismo tipo: la máquina virtual me está diciendo que no puede convertir un array de ese tipo a ese mismo tipo (directo).

En efecto, el capítulo 4.3 de la especificación de la máquina virtual referente al fichero class, lo explica bien claro: estamos intentando convertir una instancia de String[] a String. En fin, es de estas veces que tienes la solución delante pero no la estás buscando: estás en otra cosa.... Hay que confiar más en los mensajes de error.

Por cierto que no veo sustituto de ésta url en el dominio oracle.com... así que puede que no esté disponible a partir del 1 de junio. Así es, amigos, uno de los primeros dominios que se registraron y más antiguos, dejará de existir (desaparecerá, en palabras de Oracle).


Referencias y más información:

miércoles, 9 de marzo de 2011

Balteus cumple 10 años (en binario)

(Ilustración: Fran Barquero)
- "¿Le gusta nuestro búho?" -Rachael
- "¿Es artificial?" - Rick Deckard
- "Naturalmente." - Rachael
--Blade Runner.


El pasado domingo 6 de Marzo, este blog cumplió su segundo año de vida. Y he aprovechado la ocasión para hacerle un sutil cambio en el diseño, en la línea del anterior: sobrio y sencillo. Espero que os guste.

Este año me han ocurrido algunas situaciones anecdóticas y relevantes para mi, teniendo en cuenta que soy un escritor de un blog muy especializado y con pocos lectores asiduos. La primera me ocurrió con mi post "La galaxia en un campo de fútbol", en el que comenté el libro de Juan Fernández Macarrón y el propio Juan me dejó un afectuoso comentario (también me pasó en el artículo sobre Logback: también el autor comentó en mi web).  La segunda es que enlazaron mi artículo sobre el control del nivel de aislamiento transaccional con JPA en "The Aquarium", el blog de referencia sobre Java EE y Glassfish. Fue una grata sorpresa, la verdad.

Por otro lado, este año he sido menos prolífico que el primero, y no por falta de temas, sino por falta de tiempo. También he encontrado que los lectores habituales son "silenciosos" y no tienen tiempo y/o ganas de comentar mis artículos (en fin, sois así, ¿qué le vamos a hacer?).

También he contado con un regalo-ilustración realizado especialmente para la ocasión. Gracias, Fran, por la ilustración. Me ha hecho mucha ilusión.

A mis lectores frecuentes: gracias por seguir por ahí... y dejad algún comentario, por favor!. Me gusta saber que hay alguien ahí leyendo.

P.D.: Si veis algo que ha quedado "raro" con el cambio de diseño, por favor, decídmelo.

lunes, 28 de febrero de 2011

Documentación de código con Doxygen y Maven


Voluminous documentation is part of the problem, not part of the solution.
-- Tom DeMarco, software development consultant
Documentation is like sex: when it is good, it is very, very good; and when it is bad, it is better than nothing.
-- Dick Brandon

La documentación de proyectos software siempre ha sido un tema controvertido. Aspectos como la estructura, enfoque, perspectiva, y metodología han generado decenas de tratados y "estándares" (como sinónimo de modelo, patrón o referencia) tan voluminosos como imprácticos e irrealistas. Sin embargo, ya comenté en "La falacia de la Ingeniería del Software" mi poca confianza en la aplicación realista de muchas metodologías y estándares que comparten entre sí la escasez de referencias reales profesionales.

Mi experiencia a la hora de documentar un proyecto para la cesión de  administración y mantenimiento a terceros me ha enseñado que la documentación sólo sirve si:
  • está contínuamente actualizada y sincronizada con lo que documenta (el adverbio continuamente aquí, es clave)
  • la documentación y lo documentado están mutuamente accesibles
  • tiene estructura y formato ágil para la consulta
Por supuesto, creo que los aforismos "cuanta más documentación mejor" o "toda documentación que se haga es poca" son del todo erróneos. El objetivo es la calidad, y creo honestamente que la cantidad participa de forma inversamente proporcional en una ecuación de calidad.

En lo que a documentación de código se refiere, los objetivos anteriores se obtienen con creces con sistemas de generación de documentación automatica:
  • La documentación está junto a lo documentado favoreciendo la contínua actualización
  • Están mutuamente accesibles
  • La estructura es la idónea para facilitar el acceso a la documentación precisa fácilmente ya que suelen generar HTML
En este aspecto, la mejor herramienta que he probado hasta ahora es, sin duda y con diferencia, Doxygen.

Doxygen es un generador de documentación gratuito para  C++, C, Java, Objective-C, Python, IDL, Fortran, VHDL, PHP, C# y D. Su licencia es GPL y sus resultados son comparables (e incluso mejores en algunos aspectos) a documentadores comerciales.

Los desarrolladores de Java, que ya conocen Javadoc, cuya generación está perfectamente integrada con Maven, se preguntarán para qué diablos necesitarían otro documentador. Como se comenta en la segunda cita introductoria de este artículo, Javadoc está bien: es mejor que nada. Pero comparar Doxygen con Javadoc es equivalente a comparar maven con "make".

Las características más destacables, frente a Javadoc, desde mi punto de vista:
  • Genera automáticamente diagramas de clase y colaboración. Opcionalmente, diagramas de dependencia, llamada, etc... 
  • Permite incluir el código fuente resaltado en la propia documentación
  • Formatos: HTML,CHM, PDF, XML, etc..
Doxygen es una utilidad basada en línea de comando, como Javadoc, con más 100 opciones configurables que permiten ajustar la documentación final. Aunque la mayoría de las opciones interesantes ya están configuradas por defecto, Doxygen cuenta con un frontal gŕafico (doxywizard) muy util para gestionar las opciones y los ficheros de configuración. Se instala fácilmente ("sudo apt-get install doxgen-gui", en *ubuntu) existiendo distribuciones en código fuente y binarios para Mac OS y Windows... y, he aquí lo mejor: existe un plugin para maven.

Usando Doxygen con Maven
De la misma forma que podemos automatizar la generación de documentación javadoc en nuestras construcciones con maven, podemos hacerlo con Doxygen. Para ello, tan sólo debemos seguir los siguientes pasos:
  1. Instalar Doxygen y hacerlo disponible en el path (para *ubuntu esto es automático con la instalación)
  2. Añadir el plugin a nuestro pom.xml. A continuación muestro las opciones de configuración que yo suelo usar

    ...
    
        
            
                com.soebes.maven.plugins.dmg
                doxygen-maven-plugin
                1.0.1
            
        
    
    ....
    
        
            
                com.soebes.maven.plugins.dmg
                doxygen-maven-plugin
                1.0.1
                
                    false
                    es.cestel.szarza.balteus
                    1.0
                    spanish
                    true
                    true
                    true
                    true
                    src/main
                    true
                
            
        
    
    ....

Recomiendo probar con las opciones de generación de diagramas. Especialmente los diagramas de colaboración pueden ser muy útiles para ciertos módulos de proyecto.


Referencias y más información:


lunes, 31 de enero de 2011

StatementTimeout / QueryTimeout con PostgreSQL

Si no esperas lo inesperado no lo reconocerás cuando llegue.
- Heráclito de Efeso (540 AC-470 AC) Filósofo griego

Como comentaba en "las 8 falacias de los sistemas distribuídos", en los entornos de producción debemos tener en cuenta que pueden suceder hechos que no se producen en nuestros entornos de desarrollo, integración o preproducción... y ciertamente ocurren. En estos entornos son necesarios procesos y tareas concurrentes inherentes a su propia naturaleza y ambiente de "explotación" (tareas de mantenimiento tanto programados -backups-, como no programados -recuperaciones de datos-, arranque eventual de otras -nuevas- aplicaciones, procesos de datawarehousing, etc).

Uno de estos sucesos típicos suele ser el inexplicable y aleatorio bloqueo de una sesión o de toda una aplicación entera. Tras el correspondiente susto y examen exhaustivo, detectamos la causa en una consulta de base de datos que, eventualmente, tarda demasiado. En algunas ocasiones las causas son muy poco evidentes y muy difíciles de detectar, ya que sólo se producen por la coincidencia de determinados eventos (periódicos o no), e incluso en un determinado orden.

¿Y por qué tarda tanto una consulta que en nuestro entorno de preproducción se lleva apenas unas pocas decenas de milisegundos? Pues típicamente porque ocurre un bloqueo en la base de datos debido a una transacción de larga duración. Si las cosas se complican, puede existir incluso un deadlock (bloqueo mutuo) que deje nuestro sistema completamente bloqueado y produzca un efecto dominó en otras aplicaciones dependientes de la misma base de datos.

Obviamente, la solución pasa por detectar la casuística concreta y evitarla, pero mientras buscamos la causa o la solución, necesitamos mantener nuestro sistema funcionando con normalidad. Para protegernos a este tipo de eventualidades, se debe establecer un valor de timeout en nuestras consultas y transacciones a bases de datos que impida que una consulta se quede indefinidamente esperando el resultado y, por tanto, todas las sesiones de la aplicación que llegan a ese punto. En los entornos JEE, donde se configuran pools de conexiones a bases de datos que permiten un uso eficiente de recursos y conexiones de bases de datos, la ausencia de estos timeouts en esas condiciones pueden suponer el agotamiento de las conexiones del pool, debido a que no se liberan las conexiones y, por tanto, la imposibilidad de que nuevas sesiones de la aplicación puedan funcionar.

Configuración de Statement Timeout en Glassfish
En la mayoría de los servidores de aplicaciones y contenedores web JEE, existe una forma de indicar este parámetro para cada uno de nuestros pools, permitiendo especificar distintos parámetros en función de las características de las aplicaciones o de la duración de las transacciones. En el caso de Glassfish, por ejemplo, es a través del atributo StatementTimeout del pool (que internamente realiza las llamadas a setQueryTimeout() del driver.


Usando PostgreSQL, este atributo sin embargo nos ha dado una desagradable sorpresa:

Caused by: org.postgresql.util.PSQLException: Method org.postgresql.jdbc4.Jdbc4PreparedStatement.setQueryTimeout(int) is not yet implemented.
        at org.postgresql.Driver.notImplemented(Driver.java:753)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.setQueryTimeout(AbstractJdbc2Statement.java:635)
        at com.sun.gjc.spi.base.ConnectionHolder.prepareStatement(ConnectionHolder.java:477)
        at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.prepareStatement(DatabaseAccessor.java:1162)
        at oracle.toplink.essentials.internal.databaseaccess.DatabaseCall.prepareStatement(DatabaseCall.java:612)
        at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:485)

Pues si, aunque parezca increíble, el driver jdbc de Postgresql no implementa aún setQueryTimeout(), al menos hasta la versión disponible en el momento de escribir este artículo (versión Version 9.0-801 de 2010-09-20).

Establecimiento de propiedades de la conexión en el pool de conexiones de Glassfish
La solución es establecer el parámetro de conexión SocketTimeout, que especifica en segundos el tiempo máximo que se espera respuestas del servidor antes de cerrar la conexión. Este parámetro tiene el mismo efecto que el atributo StatementTimeout / QueryTimeout que comentaba anteriormente.


Para nuestros scripts PL/pgSQL, podemos establecer directamente el parámetro statement_timeout al inicio:

SET statement_timeout TO 5000; -- para 5 segundos

 <...resto del PL>

RESET statement_timeout; -- reset

En general, establecer un valor de timeout en operaciones síncronas es una buena práctica para evitar sorpresas desagradables.

Related Posts Plugin for WordPress, Blogger...
cookieassistant.com