30 de septiembre de 2009

Nombrando Threads en Java

Suponiendo que tenemos definida una claseX que implementa Runnable

Al crear Threads de esta manera :

for(int i=0;i<3;i++)
{ 
    ClaseX objetoX=new ClaseX();
    Thread th = new Thread (objetoX);
    th.start();
}
Tomarán nombres automáticos numerados
Thread-0
Thread-1
Thread-2
Así nombrados no indican de qué clase de implementación de threads se trata, ni ayudan para identificarlos en debugging. Otra opción es ponerles el nombre de la clase:
for(int i=0;i<3;i++)
{

    ClaseX objetoX=new ClaseX();
    Thread th = new Thread (objetoX, getClass().getSimpleName());
    th.start();
}
Con la desventaja de que todos tendrían el mismo nombre:
ClaseX
ClaseX
ClaseX
Usando ambas cosas a la vez
for(int i=0;i<3;i++)
{

    ClaseX objetoX=new ClaseX();
    Thread th = new Thread (objetoX);
    th.setName(getClass().getSimpleName() + " " + th.getName());
    th.start();
}
Ahora sí.
ClaseX Thread-0
ClaseX Thread-1
ClaseX Thread-2
Otra manera posible es nombrarlos con la clase más la fecha y hora de creación, en lugar usar un nombre numerado, etc... Usar un buen nombre de thread además de ser útil en debugging, puede servir para saber a qué Clase pertenece el método que está invocando a una implementación de una interfaz, sin necesidad de utilizar argumentos.

25 de septiembre de 2009

Acelerar los navegadores de internet

Una forma de mejorar la rapidez de los navegadores
(Disminuir la cantidad de procesamiento, y ya que exageramos,
reducir el consumo mundial de energía)

Hacer que el parser de tags HTML sea Case Sensitive

Claro, debido a que el estándar no es Case Sensitive, el resultado sería
que muchas páginas no funcionen, es algo sabido que HTML
no es un formato que tenga como prioridad la rapidez, hasta es (casi) human readable!,
pero me pregunto, no será mejor que los Admins parseen y modifiquen
una sola vez en cada página de sus servidores con una aplicación tagsToUpperCase()
o tagsToLowerCase(), en lugar de hacer eso cada vez que se abre una página,
una y otra y otra vez, en todo el mundo. No parece tener mucho sentido.

El estándar XML que es posterior es Case Sensitive. Lo cual me parece muy bien.

Hora en Debian Linux

Tenía un problema con el horario de un server
UTC vs Local Time

En la consola de linux con el comando

date

devolvía la hora correcta.

y desde Java, leía un horario incorrecto, con un source de este estilo:

..
Date fecha = new Date();
System.out.println(DateFormat.getDateTimeInstance().format(fecha));
..

Sucede que estaba viendo la hora UTC..

Estaba mal especificada la zona horaria,

Intenté cambiarla con el siguiente comando en linux

tzselect

pero obtuve este error

/usr/bin/tzselect: line 23: /usr/share/zoneinfo/iso3166.tab: No such file or directory
/usr/bin/tzselect: time zone files are not set up correctly


Instalé el paquete tzdata

apt-get install tzdata


y volví a probar con


tzselect

(
tambien puede ser
dpkg-reconfigure tzdata)


Ahí si me apareció una lista de paises, y pude setear correctamente la zona horaria!
y desde Java reportaba bien la hora.

Dejo entonces este log del asunto por si a alguien le ocurre,( o me vuelve a pasar).

23 de septiembre de 2009

¿Podés hablar?

La frase "¿Podés hablar?" intenta ser parte del protocolo de comunicación
para un llamado telefónico. Es un bug, y puede elminarse con una simple regla
(y así ganar millones de dolares, horas-hombre, etceteras, al rededor del mundo).

BugFix:

"Si no puede hablar, no atienda"

//
//Source.java
//

//...

try {

if(puedeHablar())
{
atenderLlamado();
}
else
{
Thread.yield();
}

} catch(Exception ex)
{
System.out.println("Exceptions are exceptional (or they should be)");
}

10 de septiembre de 2009

SwingWorker

¿Qué está haciendo el programa ahora?

Un dibujo de un reloj de arena no suele responder la pregunta.

Para informar lo que va pasando, y actualizar una interfaz en java (Swing)
mientras algún hilo más interesante se ejecuta en background
existe el SwingWorker.

Típicos ejemplos son mover una barra, dar mensajes actualizados
de qué está haciendo el soft, informar progresos de algún proceso de fondo.

Hay un thread, llamado Event Dispatching Thread (EDT)
que es el encargado de actualizar los componentes visuales.
Este señor EDT sin embargo, no se ejecuta completamente si hay un thread corriendo,
es decir, no se actualizará la interfaz hasta que el hilo termine o ceda el control.

¿Cómo se usa el SwingWorker?

Se crea un objeto "worker" donde se implementa el hilo que cumpla la función,
o el "trabajo" que realizará en background del cual queremos tener noticias,
el hilo del worker no se ejecuta en la EDT, es decir, no actualiza directamente
la interfaz, sin embargo permite agregar propiedades que llaman a listener que
sí se van a ejecutar en EDT!

Básicamente como en este ejemplo