Archivos de la categoría ‘Informática’

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 :D 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.

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 :D

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 ut8_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.
h1

UnsupportedOperationException en array construido con Arrays.asList

26 febrero 2010

Si se intenta ejecutar un método add, remove, etc., sobre una lista construida mediante Arrays.asList se obtiene una UnsupportedOperationException. El motivo es que dicho método no crea una lista dinámica real (como sería un ArrayList) sino una vista para el array. Al seguir usando el mismo objeto que teníamos, por tanto, no se puede redimensionar.

La solución a este problema sería emplear un código como el siguiente para construir una lista dinámica real:

List lista = new ArrayList(Arrays.asList(array));

Fuente: Raja’s Weblog

h1

Crear un índice con enlaces en OpenOffice

23 febrero 2010

Aunque un índice normal ya facilita realizar búsquedas en un documento, si queremos acceder a un apartado en concreto es mucho mejor tener enlaces en sus entradas, que se activan con la combinación CTRL+clic. En un principio, el sistema que proporciona OpenOffice resulta más complejo que el de Microsoft Office (y con una interfaz nada intuitiva), pero también brinda más posibilidades de personalización.

Por el tamaño del tocho parece una tarea complicadísima pero es que la explico totalmente al detalle, en realidad son cuatro tonterías :)

Crear el índice

Para añadir un índice al documento, debemos utilizar la opción de menú Insertar » Índices » Índices. Uno de los valores en los que más hay que fijarse es el de Evaluar hasta nivel, porque serán los niveles del árbol de apartados que se nos muestren. Por ejemplo, si seleccionamos tres niveles se mostrarán las entradas 1, 1.1 y 1.1.1, pero no más allá. Según la complejidad del documento, 2-3 niveles suele ser lo más habitual.

Crear los enlaces

Podemos personalizar los enlaces en el cuadro de diálogo de creación del índice o, si lo preferimos, hacerlo después presionando el botón derecho del ratón sobre el índice y seleccionando la opción Editar índice/tabla del menú contextual.

En la pestaña Entradas el apartado que nos interesa es Estructura, donde se muestran cuatro pequeños botones: E#, E, T, #. Cada uno de ellos representa una parte de la línea que corresponde a cada entrada del índice (se puede ver en un cuadro emergente al pasar el ratón sobre ellos):

  • E# es el número de capítulo (1, 1.1, 1.1.1…)
  • E es el título del capítulo
  • T es la tabulación, es decir, los puntos que unen el título del capítulo con su número de página asociado
  • # es el número de página

Y entre cada uno se ve un recuadro en blanco. Podemos añadir un enlace a cualquier subconjunto de cada entrada: solo en el número y título de capítulo, solo en el número de página, en toda la línea, etc. Por comodidad, yo prefiero asociarlo a toda la línea. Para ello:

  1. Se selecciona el primer recuadro en blanco, antes de E#, y presionamos en botón Hiperenlace que se encuentra un poco más abajo. Debería aparecer un nuevo mini-botón antes de E# y, si pasamos el ratón sobre él, un cuadro emergente nos indicará que es el comienzo de un hiperenlace.
  2. Repetimos el proceso con el último recuadro en blanco, después de #. En este caso, la descripción es de final del hiperenlace.

De esta forma, seleccionando cada nivel del índice en la lista a la izquierda podemos aplicar un estilo de enlace distinto para cada uno, aunque sea un poco WTF. Como lo más coherente sería aplicar el mismo a todos, tenemos un fantástico botón Todo a la derecha de la barra de mini-botones. Si lo presionamos y después seleccionamos otro nivel distinto del actual, veremos cómo se han aplicado los cambios a todos ellos.

Fuente: Lista de discusión de OpenOffice en español

h1

Buscar texto en cualquier tipo de archivo en Windows XP

18 febrero 2010

La búsqueda por contenido incluida por defecto en Windows XP (no sé si en 7 es igual) apesta: solo permite buscar texto en archivos .txt, .doc, .xls y demás formatos de Microsoft. Si tienes una carpeta llena de archivos de código fuente puedes darte por muerto, salvo si lo configuras a mano.

Milagrosamente, por una vez la web de soporte de Microsoft sirve para algo :o Proporcionan dos métodos, el primero consistente en instalar una actualización, pero sigue manteniendo una lista de formatos limitada y el formato .po (utilizado en traducciones de gettext) no está reconocido, lo cual me fastidia bastante cuando estoy traduciendo una aplicación en Windows.

La segunda alternativa es configurar el sistema de búsqueda a costa de una penalización en el rendimiento que yo aún no he notado. Supongo que si eliges explorar todo el disco duro en lugar de una carpeta concreta será más agónico. Los pasos para ello son:

  1. Abrir la función de búsqueda, desde Inicio » Buscar o desde el botón Búsqueda en una vista de carpeta.
  2. Seleccionar Cambiar preferencias (la última opción) » Con Index Server (para búsquedas locales más rápidas) » Cambiar la configuración de Index Server (avanzada). No es necesario activar el Servicio de Index Server.
  3. En la barra de herramientas, hacemos clic en Mostrar u ocultar el árbol de la consola y, cuando se muestre el panel izquierdo, en Servicio de Index Server en equipo local (con el botón derecho) » Propiedades.
  4. En la pestaña Generación, marcamos la casilla Indizar archivos con extensiones desconocidas, cerramos el cuadro de diálogo y salimos de la consola. Cerramos la ventana actual del Explorador de Windows (es un poco cortito en temas de refresco :P ) y cuando la volvamos a abrir ya estará activada una búsqueda decente.

Fuente: Web de soporte de Microsoft

Seguir

Get every new post delivered to your Inbox.