28 julio 2005

jace

En el foro de linux de la web del programador, "El Mogur" comenta la existencia de JACE, una librería de C++ standard que hace mucho más fácil el uso de JNI.

Nos la podemos bajar de http://sourceforge.net/projects/jace/ y tenemos documentación sobre ello en http://reyelts.dyndns.org:8080/jace/release/docs/guide/guide0.html

Bueno, otra cosa más pendiente de que le eche un ojo en algún momento.

27 julio 2005

Wanadoo

Parece que sí estoy dado de baja de wanadoo. Aparte de que me lo han confirmado telefónicamente, este mes me ha llegado una factura parcial de ellos, correspondiente al 1 de Junio al día que ellos dicen que me han dado de baja, 19 de Junio.

No sé si he tenido suerte o que la nueva normativa parece que se la tienen que tomar algo más en serio.

QT

Me han mandado un correo preguntando sobre un tutorial de socket para QT. Desgraciadamente no he podido contestar, no conozco ninguno.

Sin embargo me he puesto a mirar qué es eso de QT. Parece que es un entorno de desarrollo de C++ que permite ejecutar los programas en plataformas distintas. Es decir, podemos hacer nuestro programa con QT en windows y luego ejecutarlo en linux. Supongo que habrá que tener instalado QT en ambas plataformas, o como mínimo su versión de runtime, si es que la tiene.

El entorno de desarrollo es de pago, pero creo que merece la pena echarle un ojo. Es una nueva tarea que me apunto como pendiente....

14 julio 2005

Una tontería de C en linux

Viendo una pregunta en un foro, recordé un pequeño problema que tuve en su momento con C en Solaris (unix de Sun) y que nos trajo de cabeza a mí y a unos compañeros mios bastante tiempo.

El problema es que los decimales desaparecian al echar cuentas. Un programa tan tonto como este

main()
{
double a=5.4;
double b=0.1;
cout << a-b << endl;
}

daba de resultado 5, en vez de 5.3. Los decimales desaparecían. El problema era la variable de entorno LANG. Estaba definida por defecto a es (de español)

LANG=es;
export LANG;

Esto hacía que el compilador se liara. Consideraba que el punto decimal debía ser la , en vez de el . y de alguna forma, ignoraba los decimales.

Simplemente cambiándola por

LANG=c
export LANG;

y volviendo a recompilar el programa... ¡Todo arreglado!

log4j

He empezado a utilizar log4j.

Es una librería que permite escribir textos en pantalla, de forma similar a System.out.println(), desde un programa java. Sin embargo, va más allá. Luego, sin andar tocando por todo el código donde hemos escrito un texto, podemos hacer que determinados textos no salgan en pantalla, o que salgan por otro sitio (escribirse en una base de datos, salir en una ventana, etc).

Por ejemplo, si hacemos un algoritmo matemático en java y queremos ver resultados parciales en pantalla, podemos sacarlos usando esta librería e indicando que son de "depuración". Cuando alguna cuenta no nos cuadre, podemos sacar el texto indicando que es un "error". Podemos a la vez sacar mensajes parciales para el pintado de un gráfico, también como "depuración". Luego, al ejecutar y sin tocar código, podemos hacer que solo se vean los de "depuración", o sólo los de "error" o sólo los del algoritmo matemático, sean de "error" o de "depuración", pero no los del gráfico.

El filtrado puede ser más fino incluso. Podemos querer ver sólo los mensajes de "error" que escribe una determinada clase.

Para el uso de esta librería, además de bajarnos el jar correspondiente y añadirlo en nuestro classpath, debemos, en el main(), inicializar el "logger" con algo como esto:

PropertyConfigurator.configure ("fichero_configuracion");

Luego, en el código, para escribir mensajes, en vez de System.out.println(), escribimos cosas como esta:

Logger.getLogger(MiClase.class).debug("Esto es un mensaje de depuracion");
Logger.getLogger(OtraClase.class).error("Esto es un mensaje de errror");

El fichero de configuración que pasamos al principio es un fichero de propiedades de los de java y en él es dónde se indican qué mensajes se quieren ver: de qué clases, si los de depuración, los de error, los warning, etc.

En fin, igual de cómodo pero mucho más versátil que el System.out.println().

08 julio 2005

consulta de sql

Un pequeño truco tonto que he aprendido.
A veces tenemos dos consultas a bases de datos sobre tablas distintas, pero que nos dan bastantes campos comunes. Sin embargo, en una de las consultas aparecen, por ejemplo, un par de campos distintos que en la otra.
Supongamos que queremos una tabla de deportistas. Los datos de ellos son comunes, pero la mejor marca es distinta en función del deporte que hagan: para corredores, la mejor marca va en segundos, en minutos, etc. Para los saltadores de longitud y altura, va en metros y para los gimnastas son puntos. Imaginemos que los select que hay que hacer son de este estilo

select nombre, deporte, mejor_tiempo... para los deportistas
select nombre,deporte,mejor_distancia... para los saltadores
select nombre,deporte,mejor_puntuacion para los gimnastas

Imaginemos también que queremos meter todo esto en la misma tabla y que nos interesaría que los ResultSet que devuelve java tuvieran las mismas columnas, para tratarlos igual.

El truco consiste en que podemos poner null en los campos seleccionados en la consulta, de forma que nos devolverá null en esas columnas. De esta forma, con estas consultas

select nombre, deporte, mejor_tiempo,null,null ...
select nombre,deporte,null,mejor_distancia,null ...
select nombre,deporte,null,null,mejor_puntuacion ...


Nos devolverán el mismo tipo de ResultSet, pero con los "huecos" ya preparados cuando un determinado campo no tiene sentido. Los tres ResulSet podemos tratarlos con el mismo código y añadirlos fácilmente a la misma tabla.

Por supuesto, este "truco" tiene sentido si mejor_tiempo, mejor_distancia y mejor_puntuacion pertenecen a tablas de base de datos distintas que estén ligada a la tabla de deportistas. Si todo fueran campos de la misma tabla, los huecos ya estarían en la tabla y lo arreglaríamos fácilmente con una única consulta

select nombre,deporte,mejor_tiempo, mejor_distancia, mejor_puntuacion ...