Archive for the ‘Informática’ Category

h1

Chat de vídeo de Google Talk en OpenSUSE

28 septiembre 2010

Aunque Google ya proporciona un paquete RPM, supuestamente para dar soporte de manera sencilla a la videoconferencia en OpenSUSE, la realidad es que al final no es todo tan simple. El proceso inicial es el típico: la primera vez que intentemos iniciar el chat de voz/vídeo nos proporcionará un enlace desde el que descargar el paquete RPM. Sin embargo, cuando intentemos instalarlo avisará de que falta una dependencia libcrypto.so.10, que se encuentra dentro del paquete openssl.

Tras descargar este último (incluyendo también la versión de 32 bits si nuestro operativo es de 64), en lugar de instalar directamente el complemento de vídeo hay que crear dos enlaces simbólicos, porque a saber qué criterio de nombrado habrán utilizado en Google y por eso no encuentra la biblioteca que procede. Las órdenes son:

sudo ln -s /lib/libcrypto.so.1.0.0 /lib/libcrypto.so.10
sudo ln -s /lib/libssl.so.1.0.0 /lib/libssl.so.10

Ahora sí, podemos proceder a instalar el RPM, ignorando el error de dependencias que se muestre. Tras reiniciar el navegador ya deberíamos poder configurar los parámetros de la cámara 😀 Aviso de que a mí tampoco me funcionó a la primera, tuve que instalarlo primero en Chrome y después volver a probar desde Firefox. Tras este segundo intento ya funcionó sin problemas en ambos.

Anuncios
h1

Pasar un método como parámetro a un composite component de JSF

27 agosto 2010

En una aplicación para el trabajo (aún no he conseguido escapar de las garras de JSF 😦 ) necesitaba que, cuando un usuario fuese a salir de una página de edición, se le notificase mediante un cuadro de diálogo que perdería los cambios sin guardar. Como había bastantes salidas posibles (botones, elementos de menú…) decidí crear el diálogo en un composite component. Por si a alguien le interesa, para el diálogo en sí utilicé la biblioteca PrimeFaces 2.1, basada en jQuery UI.

Evidentemente, cada salida tenía un destino diferente: en el caso de los elementos de menú cada uno dirigía a una parte distinta de la aplicación. Por ello, necesitaba pasar como parámetro del componente la acción a ejecutar.
Sin embargo, esto no es que esté precisamente documentado de manera muy espléndida en ninguna parte, pero encontré la solución gracias a un tutorial en IBM DeveloperWorks.

Debemos definir nuestro componente al menos con el contenido del siguiente cuadro, donde he simplificado mi situación (en lugar de un diálogo de confirmación solo hay un botón) para que se vea de forma más obvia la solución 🙂

<cc:interface>
  <cc:attribute name="actionMethod" 
                required="true"
                method-signature="java.lang.String action()" />
</cc:interface>
<cc:implementation>
  <h:commandButton value="¡Púlsame!"
                action="#{cc.attrs.actionMethod}" />
</cc:implementation>

En la interfaz se debe definir un atributo que evalúe a un método; lo he llamado “actionMethod”. Importante: En el atributo method-signature se debe proporcionar la declaración de tipos completa, como en java.lang.String.

Con esto ya podemos invocar el componente desde cualquier página con:

<lib:componente actionMethod="#{controlador.accion}" />
h1

Acceder como manager al Tomcat distribuido con Netbeans

25 marzo 2010

Entre las opciones de instalación de Netbeans se encuentra el servidor Tomcat, para el que configura un usuario administrador automáticamente (se puede ver junto a otros datos en Services » Servers » Apache Tomcat).

Si queremos añadir otro usuario un poco más fácil de recordar, ver las aplicaciones desplegadas, etc., debemos dirigirnos a nuestra carpeta persona » .netbeans en lugar de a la raíz de instalación global de Tomcat. Ningún cambio que hagamos en dicha raíz se reflejará si accedemos mediante la configuración por defecto de Netbeans.

Si queremos trabajar directamente sobre la instalación general de Tomcat, debemos añadir una nueva configuración de servidor en Services » Servers, y poner como carpeta base de Catalina la de dicha instalación.

h1

Incluir JAR propio en un repositorio Maven local

24 marzo 2010

Una de las principales ventajas de Maven es que gestiona las dependencias de los proyectos descargándolas a un repositorio local la primera vez que se necesiten. Sin embargo, posiblemente tengamos que incluir algunas a mano porque no estén disponibles en los repositorios “oficiales”, como me ocurrió con Qt Jambi (editado: hoy he descubierto que hay un repositorio independiente en Sourceforge para la versión Community). Después de dar vueltas buscando una solución, resultó estar en las FAQ de Maven 🙂

Para incluir un artefacto debemos ejecutar una orden donde indicar cuál es el archivo a subir, su groupId, artifactId, versión, tipo de empaquetado y si debe generar el POM (no veo ningún motivo para no hacerlo), utilizando una orden como la siguiente. Nota: Si tenemos el ejecutable de Maven en el PATH podemos colocarnos en la carpeta donde se encuentre el artefacto para no tener que escribir toda su ruta.

mvn install:install-file -Dfile=qtjambi-4.5.0_01.jar -DgroupId=qtjambi -DartifactId=qtjambi -Dversion=4.5.0_01 -Dpackaging=jar -DgeneratePom=true

En este caso concreto el groupId y el artifactId coinciden porque me pareció más coherente, ya que se trata del JAR principal para cualquier aplicación que utilice Qt Jambi. Si también fuésemos a incluir las distribuciones para Windows, Mac y Linux podríamos hacerlo dentro del mismo groupId pero con distinto artifactId, como en las siguientes órdenes:

mvn install:install-file -Dfile=qtjambi-win32-msvc2005-4.5.0_01.jar -DgroupId=qtjambi -DartifactId=qtjambi-win -Dversion=4.5.0_01 -Dpackaging=jar -DgeneratePom=true
mvn install:install-file -Dfile=qtjambi-macosx-gcc-4.5.0_01.jar -DgroupId=qtjambi -DartifactId=qtjambi-mac -Dversion=4.5.0_01 -Dpackaging=jar -DgeneratePom=true
mvn install:install-file -Dfile=qtjambi-linux32-gcc-4.5.0_01.jar -DgroupId=qtjambi -DartifactId=qtjambi-linux -Dversion=4.5.0_01 -Dpackaging=jar -DgeneratePom=true
Y con esto tenemos cuatro nuevos JAR en nuestro repositorio local, listos para ser utilizados desde cualquier proyecto Maven 😀

h1

Illegal mix of collations en procedimiento almacenado de MySQL

23 marzo 2010

En el trabajo he tenido que modificar el modelo de una base de datos MySQL para un proyecto ya casi terminado (benditos lusers que no saben cómo hacen lo que hacen), por lo que creé un par de procedimientos almacenados. En mi equipo funcionaban perfectamente, pero al probarlo en otro no hacía más que mostrar el error:

ERROR 1267 (HY000): Illegal mix of collations (utf8_spanish_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='

El único punto del procedimiento donde podía ocurrir era en un where donde se comparaban dos longtext:

select id into errorid from errortecnico
where mensaje = errormensaje

Buscando y buscando encontré la inspiración en el blog de Pablo Viquez, un desarrollador de Costa Rica, con la única diferencia de que su problema ocurría con la codificación latin1.

La solución es convertir la parte del where que causa problemas a la collation (dentro de una codificación, la ordenación de caracteres) que nosotros usamos mediante la sentencia convert, que en mi caso quedaría tal que así:

select id into errorid from errortecnico where mensaje
= CONVERT(errormensaje using utf8) collate utf8_spanish_ci

Con esto, MySQL convertirá automáticamente el dato que interpretaba como utf8_general_ci a utf8_spanish_ci.

h1

Limitaciones de la API Criteria de Hibernate

19 marzo 2010

En el trabajo estoy utilizando la API Criteria para desarrollar un generador de informes, porque permite componer consultas dinámicamente sin tener que concatenar asquerosamente un montón de cadenas de texto. Por desgracia, aún tiene varias limitaciones que no están presentes si utilizamos HQL y que la deslucen un poco.

Lo peor de todo es que descubrirlas puede llevar bastante tiempo, así que por si Google indexa este post de manera que salga en alguna de las primeras entradas, al menos le habrá ahorrado tiempo a alguien xD Las limitaciones que he descubierto hasta ahora son:

  • Cruzar varias veces con la misma tabla (aunque a cada join se le asigne un alias distinto).
  • Restricciones/proyecciones con atributos multivaluados, representados mediante una CollectionOfElements. Para la versión 3.5.0 parece posible que al menos la primera parte del problema se solucione gracias a un parche.