«Patrón singleton» revisited

Estoy leyendo un delicioso libro, «Effective Java», de Joshua Bloch, sobre buenas prácticas Java para programadores Java (el segundo capítulo, por ejemplo, empieza explicando cómo usar métodos de factoría estáticos y sus ventajas sobre los constructores típicos, para que os hagáis una idea…). El libro es una joya, de los que merece la pena leer junto a un buen café, tomando notas en los laterales, porque está cargadito de apuntes que reutilizarás en el futuro, seguro, al menos si programas en Java (sí, ya sé, «Java is evil», etc.. etc…. ) Enumera distintos ítems, (vamos a llamarles recetas), en las que indica cómo se hace tal cosa en Java y cómo se debería de hacer. En muchas ocasiones, las recetas están directamente relacionadas con patrones de diseño, soluciones a problemas comunes. En otras, con anti-patrones : soluciones que NO se deberían de adoptar ante problemas comunes.

Sólo un comentario más de presentación, extraído del prefacio, en palabras de James Gosling, el padre de Java: «I sure wish I had had this book ten years ago. Some might think that I don’t need any Java books, but I need this one.»

Bien, una vez hechas las introducciones, pasamos a la chicha. Uno de los puntos sobre el que ya hablamos en otro post de DiarioLinux trata sobre el patrón singleton. El caso es que Bloch recomienda seguir una plantilla para aplicar el patrón singleton diferente a la que recomienda el libro de Liskov (Program Development in Java). La recomendación (de Bloch) es la siguiente:


// Singleton with public final field
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public void leaveTheBuilding() { ... }
}
// como todo el mundo sabe "There's only one Elvis" :-)

Yo mismo recomendaba la plantilla de Liskov frente a la de Bloch… pero visto lo visto, y sabiendo que la recomendación de Liskov podría tener condiciones de carrera… ya no hay duda. Sin embargo, el propio Bloch indica que «un consumidor de ese código con suficientes privilegios podría invocar al constructor privado usando las capacidades de introspección de Java, con el método AccessibleObject.setAccessible», así que para evitar ese problema (hay que ser rebuscado de narices), recomienda esta otra forma:


// Singleton with static factory
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public static Elvis getInstance() { return INSTANCE; }
public void leaveTheBuilding() { ... }
}

que se parece muchísimo a la recomendación de Liskov, pero sin el problema de las condiciones de carrera.

Finalmente, llega la guinda. Bloch dice que todo lo anterior está muy bien y tal, pero que teniendo disponible Java 1.5 desde hace ya unos cuantos añitos, que nos podríamos simplificar todos un poco la vida mediante el uso de tipos enumerados (disponibles en Java desde la versión 1.5, o 5.0 para aquellos lectores más comercial-friendly):


// Enum singleton - the preferred approach
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() { ... }
}

«While this approach has yet to be widely adopted, a single-element enum type is the best way to implement a singleton.» Amén 🙂

PD: buscando documentación sobre esto, me he encontrado casualmente con la receta que comento en un artículo de InformIT.

Gestikk: mouse-gestures para GNOME

La primera noticia al respecto de los «mouse gestures» que tuve fue con el navegador Opera. La idea es que con un moviemiento de ratón (por ejemplo, dibujando un cuadrado con el ratón), se ejecuta cierta aplicación predefinida. Con otro movimiento (por ejemplo, una V) se ejecuta otra. En el caso del navegador, el movimiento de un cuadrado podría ser: ir a HOME. El movimiento de una V podría ser, agregar a los marcadores la página actual. La idea era muy interesante (y estamos hablando del año 2001). Tanto que hubo una extensión para Mozilla (actualmente para Mozilla Firefox) que hacía presisamente eso. Lo que no sabía es que para GNOME también se ha desarrollado un applet que utiliza esta técnica. Se llama Gestikk, y funciona bastante bien (aunque no se puede decir tanto de la web, que está medio en alemán medio en inglés 😉 Al instalar la extensión, veremos un nuevo applet en la barra superior:

En la zona de preferencias podremos definir (en pestaña Gestures) nuevos gestos. Por ejemplo, un dibujo de una línea de izquierda a derecha y abajo, me abrirá Gedit:

Podemos indicar que cuando «dibujemos» las rayas, se vean en pantalla (On Screen Display)

También podemos hacer que la aplicación nos notifique de lo que ha «entendido» o «reconocido» en nuestro dibujo, mediante un mensaje o notificación en pantalla (o como popup de alerta):

Lo que he echado en falta es que la aplicación no venga ya con algunos gestos predefinidos, así como que la instalación ha sido un poco engorrosa, pero por lo demás, tiene buena pinta. Lo dejaré unos días instalado, y decidiré mantenerlo o no en función del uso que le dé.

Archivo histórico de versiones de Flash Player

¿Necesitas hacer pruebas de compatibilidad con versiones viejas de Flash Player en Linux? ¿Quieres asegurarte de la versión del player de Flash a partir del cual tu aplicación funcioará sin problemas? ¿Quieres ver cómo se degrada tu aplicación en versiones viejas? Aquí tienes un enorme zip con todas las versiones de Flash Player a partir de la v9.0
En el link anterior, sustituyendo el 9 por el 8, tendremos todas las versiones de Flash Player de la v8.0 hasta la v9.0. Ídem para la 7, 6, 5, 4, 3 y 2 .

Red Hat Network se convierte en software open source

Bajo el nombre de Proyecto Spacewalk, Red Hat acaba de anunciar hoy, durante el Red Hat Summit en Boston la publicación del código fuente de Red Hat Network bajo licencia GPL v2. Spacewalk/RHN es una solución para la gestión de múltiples sistemas Linux que permite:

  • Inventariado de sistemas (información hardware y software)
  • Instalación y actualización de software en todas las máquinas de tu red (de forma remota!)
  • Agrupar y distribuir paquetes software personalizados en grupos de gestión
  • Posibilidad de uso de distintas plantillas kickstart para tus sistemas (Provisioning)
  • Gestión y despliegue de ficheros de configuración (a todos los ordenadores que quieras de la red que gestiones !)
  • Monitorización de sistemas
  • Provisioning de máquinas virtuales
  • Inicio/Parada/Configuración de sistemas corriendo en máquinas virtuales

{seesmic_video:{«url_thumbnail»:{«value»:»http://t.seesmic.com/thumbnail/Qn7MEEkhqI_th1.jpg»}»title»:{«value»:»Spacewalk / Red Hat Network / GPL «}»videoUri»:{«value»:»http://www.seesmic.com/video/jg7TCoirA1″}}}

Visual Paradigm, Linux y Compiz

No sólo ocurre con Visual Paradigm sino con muchas aplicaciones Java con interfaz gráfico SWING. Siempre que usemos Linux con Compiz (efectos gráficos) activado. El problema es que al lanzar la aplicación (en el ejemplo, al lanzar Visual Paradigm), la ventana sale «en blanco» :

Hay dos soluciones a este problema:

1) La obvia, desactivar Compiz momentáneamente (desde consola $ metacity –replace podría valer)

2) El problema concreto es que AWT no soporta (en todos los sentidos 😉 el gestor de ventanas Compiz
Así que hay que decirle a AWT que use otro. ¿Cómo? Así:

export AWT_TOOLKIT=MToolkit

Lo que hace que AWT use Motif como gestor de ventanas.

La solución está documentada en la web de Visual Paradigm (No, VP no es libre . Sí, VP está hecho en Java. Sí, lo sé, pero es una aplicación extraordinaria)