martes, 31 de mayo de 2011

Java FX 2 - Error de instalación del plugin para Net Beans 7.0

El pasado 24 de mayo salió la versión beta del nuevo Java FX 2. Tras mucho tiempo esperando este último intento de convertir Java FX en una tecnología con repercusión, andaba ansioso por empezar a cacharrear, y plantearme algún proyectito para ver qué nos podía ofrecer.

Pero nada más empezar, ya me estaba dando cabezazos. Resulta que tenemos disponible un plugin para la versión 7.0 de Net Beans. Me lo descargo, lo instalo, reinicio el IDE como me piden, y... casquiporre.

Warning - could not install some modules

Y una larga retahíla de librerías o similares.

Como en las instrucciones de instalación no se especifica nada sobre errores, y en principio las había seeguido tal cuál, incluyendo la instalación previa del runtime, empecé a probar siguiendo mi instinto. Reinstalación de Net Beans, rebajada del plugin, reinicio del pc, tonterías varias... nada de nada.

Hasta que en el foro de Oracle encontré la solución gracias a la ayuda de 862201. La historia es que antes de instalar el plugin en sí, hay que instalar todas las actualizaciones disponibles. Esto lo hacemos accediendo a Tools - Plugins, y seleccionando todos los elementos de la pestaña Updates.

Ahora sí, ¡a juguetear!

martes, 24 de mayo de 2011

Review - Teclado Thinity Wireless de Trust

Uno de los periféricos más importantes que adquirí con mi nuevo HTPC, es el teclado Thinity Wireless de Trust. Con este post hago mi estreno en la tarea de analizar y ofrecer mis impresiones de los aparatejos que tengo la suerte de probar. Lo que viene conociéndose en la jerga de la red como hacer una review.

En general el Thinity cumple con los requisitos deseados para este tipo de periféricos. En mi opinión, su punto fuerte es sin duda el apartado estético. Presenta un diseño elegante y moderno, y por su tamaño no destacará más de lo necesario si lo tienes en un lugar visible de tu salón. Los acabados son buenos, y suficientemente resistentes para el trote al que normalmete estará sometido. En cuanto a funciones, presenta todas las teclas habituales, más algunas adicionales como las que permiten manejar directamente el sonido, que son imprescindibles para un teclado orientado al uso con un centro multimedia. Además tenemos también un touchpad, por lo que no necesitamos un ratón adicional. Un importante punto a favor es la utilización de batería. La carga se realiza simplemente colocándolo sobre la base, resultando muy cómoda.



Pero como en esta vida no hay nada perfecto, hay bastantes pegas que ponerle.

Lo primero es tener muy presente de qué estamos hablando. Se trata de un teclado para tu ordenador de salón, así que no esperes poder trabajar eficientemente con él. Tendrás lo justo para poder escribir direcciones Web, nombres de carpetas, y algún que otro correo, pero el tamaño y posición de las teclas no permite hacer alardes mecanográficos. Exactamente lo mismo pasa con el touchpad, con el agravante de que en general al ratón se le da más uso. Personalmente, acabé optando por comprar un ratón inalámbrico. Si simplemente vas a navegar o ver unas fotos, el Thinity puede bastar. Pero a partir de ahí se me hacía demasiado limitado.

Respecto al funcionamiento, en general es correcto, pero en algunas ocasiones me he encontrado con problemas por pulsaciones no detectadas (o detectadas demasiadas veces). Por las pruebas que he hecho, me da la impresión de que los fallos tienen que ver con la posición del teclado (no con su distancia al receptor, que nunca supera los 3 - 4 metros). En cualquier caso resulta frustrante, y le hace perder muchos puntos.

Por último queda hablar del precio. A mí me costó 72,65 €, incluído el iva. Carísimo. Pero no deja de ser un caprichito, y así es como está el mercado de este tipo de periféricos. De hecho, no es de los más caros que podemos encontrar. 

Resumiendo, que es prescindible y mejorable, pero queda muy bonito.

Definición gráfica de ininteligible



lunes, 23 de mayo de 2011

Problemas de memoria

Aunque también podría, no me refiero en este caso a mi escasa capacidad para almacenar recuerdos, sino a la gestión de memoria al trabajar con JPA.

En estos días estoy liado con el desarrollo de un proceso de migración que obtiene información de una base de datos Oracle, la procesa, y la escribe en ficheros de texto. El procesamiento principal se reducía a ir obteniendo todos los registros de una tabla, y tratarlos uno a uno. El volumen de datos estaba en torno a los 200.000 registros.

En sí, el código necesario para este trabajo no tiene mayor complejidad, puesto que no hay más que a ir sacando la información de la base de datos, y manejarla. El problema que se nos va a presentar tiene que ver con los límites de memoria de nuestro pc. Tal como funciona JPA, cada uno de los registros de la base de datos se convertirá en una instancia de la entidad con la que estemos trabajando que, lógicamente, se alojará en memoria. Y lo normal, con estos volúmenes de información, es que no tengamos capacidad para almacenarlos todos.

Al tratarse de un procesamiento iterativo, en el que cada objeto lo utilizamos independientemente del resto, y una vez que terminamos con él no lo necesitamos más, podemos pensar que no hay problema en que en cada momento haya un único objeto en memoria, que sea justamente el que estemos usando. El problema es que JPA no tiene conocimiento de esta situación, y cada uno de los objetos que se van cargando se quedan ahí a perpetuidad. Lógicamente en poco tiempo te encontrarás el temido mensaje:

java.lang.OutOfMemory - Java heap space

Java se ha quedado sin memoria. La solución directa no puede ser otra, por tanto, que aumentarla. Si no cabes en tu casa, búscate una más grande (o mayor, que diría mi hermana). Esto se puede hacer simplemente incluyendo el parámetro -xmx al lanzar tu aplicación. En jDeveloper, por ejemplo, esta opción la puedes incluir en la sección Java Application de las propiedades de tu proyecto.

Esta opción está muy bien, pero tiene pegas. Una importante es que si al final consigues solucionar el problema, estarás en cualquier caso utilizando mucha más memoria de la que realmente necesitas, malgastándola. Una todavía más determinante es que realmente la limitación sigue estando ahí: ¿qué haces si no tienes suficiente ni asignándole a Java toda la memoria de tu equipo? (Aparte de la opción de pasar por caja y ampliar la memoria, que sería una opción un tanto drástica).

Vamos, que mi opinión es que esta no es una buena solución para nuestro problema concreto. El aumento de memoria se debería hacer sólo si realmente necesitas tener toda esa información cargada. Si no, mejor buscar alternativas.

Y nuestra alternativa en este caso es clara. Sabemos que no necesitamos más que un objeto en memoria en cada iteración, así que digámosle a JPA que no los acumule tontamente.

Conforme vamos cargando entidades, estas pasan a ser gestionadas por JPA, componiendo lo que se conoce como Contexto de persistencia. Y mientras una entidad sea gestionada, seguirá estando ahí y no liberará memoria. Por eso existe la posibilidad de decirle a JPA que deje de gestionar entidades, utilizando el método clear. Al invocarlo, todas las entidades del contexto de persistencia dejarán de ser manejadas, y el recolector de basura de Java podrá por fin hacerse cargo de ellas. También existe la posibilidad de aplicar este tratamiento a una única instancia mediante el método detach.

Eso sí, tampoco hay necesidad de invocar al método clear cada vez que terminemos con una entidad. Lo ideal sería hacer el procesamiento por lotes, y liberar cada vez que se termine con uno.

Bajo rendimiento de consulta Oracle con upper

Hace poco estaba trabajando, y tenía una consulta sobre mi base de datos Oracle, que obtenía una sería de datos haciendo un filtrado por un campo de tipo varchar2. La consulta parecía funcionar bien, y tenía un rendimiento perfectamente aceptable. Algo como:

select * from tabla where campo=:parametro

Pero al poco tiempo me di cuenta de que para que la consulta funcionase correctamente en todos los casos, necesitaba que no se distinguiese entre mayúsculas y minúsculas al hacer la comparación. Por tanto, añadí una llamada a upper para el campo (el parámetro siempre llega en mayúsculas).

select * from tabla where upper(campo)=:parametro

De esta forma la consulta funcionaba como yo necesitaba. El problema es que, para mi sorpresa, el rendimiento cayó en picado.

En principio busqué la explicación en la llamada a upper en sí, pero lógicamente este tratamiento no es tan pesado como para producir tanto retraso. El problema está en que el buen tiempo de respuesta de la consulta original se producía gracias a la existencia de un índice sobre la columna campo. Al pasar a hacer la comparación por upper(campo), Oracle no puede utilizar el índice, y el tiempo de respuesta crece exponencialmente.

Ante esta situación, una solución es crear un índice directamente sobre la expresión upper(campo), en lugar (o además) de directamente sobre campo.

create index campo_index on tabla (upper(campo))

Eso sí, hay que tener en cuenta que para que el índice sea utilizado en este caso, es necesario modificar ligeramente la consulta, y asegurarse de que no se obtienen valores nulos.

martes, 17 de mayo de 2011

HTPC

Desde que me convertí en uno más del grupo de mileuristas hipotecados de España, tenía en mente la idea de adquirir un Media Center para mi nueva vivienda. De esta forma podría escuchar música, ver películas, navegar por Internet, y un puñado de cosas más, desde mi sofá con un único aparatito.

Así que llevaba ya bastante tiempo dándole vueltas para decidir qué comprarme. Lo primero que tuve en mente fue el Dell Zino, que en mi opinión es el mejor estéticamente, pero que se quedaba atrás si teníamos en cuenta prestaciones y precio. Así que tras ver algunas otras alternativas premontadas, me animé a pedir presupuesto para un equipo por componentes, y acabé eligiendo esta opción. Cuando tenga tiempo intentaré hacer un pequeño review con la solución que he adquirido, y el resultado que me ha dado. Pero de momento valga esta entrada para agradecer su ayuda a dos Webs. En primer lugar, todohtpc.com, una página en la que puedes encontrar noticias relacionadas con el mundo de los HTPC, y que sobre todo tiene un foro con bastante vida (sin llegar a estar saturado), con mucha información interesante, y gente con una magnífica predisposición a ayudar. Y en segundo lugar, changlonet.es. Esa es la Web de la tienda en la que me he comprado el ordenador, y la recomiendo por el excelente trato que me han prestado. A través de su página ofrecen un servicio que te permite indicar tus necesidades, y ellos utilizarán esa información para proponerte distintas configuraciones que te puedan venir bien. Todo con buen trato, velocidad de respuesta, y muy buena presentación final. De lo que no puedo hablar mucho es del precio, ya que no me paré demasiado a comparar, pero por lo que ví están dentro de mercado.