martes, 4 de diciembre de 2007

Eclipse Quick Access (aka Ctrl + 3)

Ya que les estuve comentando algo de Eclipse Europa en el post anterior, les paso otro tip. Este me lo pasó mi amigo Claudio.

Se trata de la madre de todos los atajos. Si te gusta usar atajos de teclado, entonces probá Ctrl + 3 en Eclipse Europa.

Con eso se abre la ventana del Quick Access. Permite acceder a cualquier Vista, Perspectiva, Comando, Editor, etc con sólo tipear su nombre (o parte de él, porque, por supuesto, al igual que el buscador de clases Ctrl+Shif+T, soporta caracteres comodines, escribir sólo las iniciales de lo que se busca, etc, etc).

Básicamente, se puede acceder a casi todo con el Ctrl+3!!!

miércoles, 26 de septiembre de 2007

Save Actions en Eclipse Europa

A esta altura, esta característica de Eclipse Europa no es nada nueva, pero vale la pena comentarla.

A partir de la versión Europa de Eclipse existe la posibilidad de definir ciertas acciones a ejecutar automáticamente cada vez que se grabe un archivo.

Yo en general sólo uso las que están marcadas en la figura, que te autoformatean el código (como hacer Ctrl+Shif+F, digamos) y te organizan los import (análogo a Ctrl+Shif+O).


Pero hay un montón de cosas que se pueden configurar como Additional Actions. En la figura de abajo se ven algunas, pero esta es la lista simplificada (para más detalles mirá directamente en Eclipse que está todo muy claro):
  • Que automáticamente ponga o no bloques en los if/else/for/while.
  • Automáticamente convertir los for en foreachs (cuando se pueda, claro).
  • Rodear las condiciones (o no) con paréntesis.
  • Hacer que automáticamente se agregue la palabrita final a los métodos, variables privadas y/o variables locales.
  • Usar o no el this para acceder a métodos y variables de instancia.
  • Forzar que automáticamente se use el nombre de la clase cuando se utilicen métodos o campos estáticos.
  • Remover automáticamente miembros privados que no sean usados (ojo con este porque te hace desaparecer las cosas si las dejaste de usar temporalmente).
  • Remover casteos innecesarios
  • Agregar automáticamente las anotaciones @Deprecated y @Override.
  • Remover espacios en blanco al final de las líneas.
  • Ordenar los métodos (de acuerdo a cómo se configure en Members Sort Order)


Eso es todo, ojalá les sirva!

viernes, 6 de julio de 2007

¿Por qué la gente hace e.printStackTrace() en vez de relanzar como RuntimeException?

¿No les pasó de ver código similar a este?
try {
    InputStream input = new FileInputStream("myFile.txt");
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
Seguro que sí. Desde verlo en ejemplos en libros de texto (porque "total, es un ejemplo, se entiende que no es lo correcto") hasta en códigos de programas reales. ¡Pero si hasta eclipse autogenera ese try-catch!

Es una porquería. No sirve para nada y oculta bugs. La razón más común por la que se lo hace creo que es porque no se quiere manejar la excepción. Esto puede ser porque ese error nunca ocurre, porque no quiero que mi método tenga que tener un throws, o por desconocimiento, no se.

La forma correcta es esta:
try {
    InputStream input = new FileInputStream("myFile.txt");
} catch (FileNotFoundException e) {
    e.printStackTrace(); // esto es opcional, obviamente
    throw new RuntimeException(e);
}
De esta manera, al relanzar la excepción como RuntimeException nuestro método no tiene que declarar throws FileNotFoundException (para este ejemplo, claro está) y si el error ocurre lo vamos a ver enseguida porque nuestra aplicación va a fallar con un hermoso stack trace.

Podemos hacer que eclipse nos ayude con esto, modificando el code template. Vamos a Windows->Preferences->Java->Code Style->Code Templates y buscamos el que se llama Catch Block Body.

El valor por default es:
// ${todo} Auto-generated catch block
${exception_var}.printStackTrace();
Yo sugiero cambiarlo a:
${exception_var}.printStackTrace();
throw new RuntimeException(${exception_var});

Ah, de paso les comento, con respecto a lo que comenté hace un tiempo, que ya salió el Eclipse Europa.

Disfruten!

martes, 19 de junio de 2007

El blog para escribir y del.icio.us para poner links

Este post va dedicado a los bloggeros que aparecen en codear, pero es extensible a todos los bloggers en general.

No está bueno leer post que sólo tiran un link sin ninguna explicación. Para eso está del.icio.us. Ahí uno puede tener feed de la persona que quiera (los míos, por ejemplo, están acá) y ver qué links le gusta guardar.

No se cómo es la estrategia de lectura de feeds de la gente, pero en mi caso particular tengo muchos y no leo en profundidad todos. Los leo por encima y si alguno me interesa, profundizo. Si un post sólo tiene un link ni lo leo porque acceder al link ya retrasa todo (y sin ninguna certeza de que el tema vaya a interesarme).

miércoles, 13 de junio de 2007

Se viene el nuevo Eclipse Europa

The Next Total Eclipse
Así como el año pasado salió el Eclipse Callisto, este año sale el Eclipse Europa. Como dice en el sitio web, Europa es la salida en simultáneo de 21 proyectos con el objetivo de eliminar las posibilidades de incompatibilidades entre ellos.

Faltan 16 días...

sábado, 26 de mayo de 2007

HTML a PDF y otras transformaciónes con Open Office como Server

El problema

Hace unos días me vi forzado a buscar una manera de convertir documentos HTML a PDF por un requerimento en el laburo. Los prerrequisitos eran: tiene que ser algo que se pueda hacer desde Java y que no haya que pagar ninguna licencia.

Primera aproximación

Comencé mi búsqueda en Google con cosas como html2pdf java. Más allá de que era complicado encontrar algún resultado copado, la mayoría de las estrategias que aparecían iban por el lado de:
  1. Convertir el HTML a XHTML (por ejemplo con JTidy)
  2. Convertir el XHTML a XSL-FO (Extensible Stylesheet Language Formatting Objects) usando una hoja de estilo XSL y un trasformador XSLT (por ejemplo con Xalan)
  3. Formatear el XSL-FO para finalmente generar un PDF (por ejemplo con FOP)
Esta guía explica muy bien cómo seguir esta estrategia. El asunto es que FOP aún no soporta por completo el estandar de XSL-FO y los PDF generados mediante esta técnica no quedan nada bien.

Cambio de estrategia

Juan me comentó acerca de este post en PC++ que hablaba de la posibilidad de usar a Open Office en modo servidor y enviarle mensajes mediante un socket. En esos mensajes se le podían decir cosas tan geniales como "abrí este archivo y exportalo a PDF". El post hablaba de usar un script en python, pero tenía que haber una manera de ejecutar eso desde Java (sin llegar a JPython).

Efectivamente, en la página de la API de Open Office encontré que está disponible para Java, C++ y Python.

La Solución

Luego de lidiar un rato con la API de Open Office dije "tiene que haber algo más fácil". Fue así como llegué a JODConverter (Java Open Document Converter).

JODConverter es una bibiloteca que encapsula las dificultades de conexión a Open Office que impone el uso de la API oficial y hace que su uso sea tan simple como esto:
  // it will guess the format based on the file extensions
File inputFile = new File("document.doc");
File outputFile = new File("document.pdf");

// connect to an OpenOffice.org instance running on port 8100
OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
connection.connect();

// convert - input and output formats are guessed from file extensions
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
converter.convert(inputFile, outputFile);

// close the connection
connection.disconnect();
JODConverter tiene pocas dependencias, pero está en el mvnrepository, así que si usás maven vas a salir andando en 5 minutos.

Configurando Open Office

Y sí, algo hay que hacer para que Open Office responda mis pedidos de conversión de archivos, pero también es muy simple. Hay que iniciarlo en modo servidor y decirle que escuche en algún puerto (para estos ejemplos, uso el puerto 8100, pero cualquiera que esté libre debería servir). Suponiendo que el ejecutable es soffice:
soffice -headless -accept="socket,port=8100;urp;"
Issue conocido

Hay un problema reportado en Open Office que impide que el servidor de Open Office pueda correr en una computadora diferente a la que lo invoca.

En el ejemplo de más arriba usamos a la clase SocketOpenOfficeConnection. Esta clase lo que hace es usar el socket con Open Office para darle las instrucciones, pero el archivo se pasa por referencia y Open Office debe tener permiso para abrirlo del Filesystem (y permiso de escritura para guardar el resultado). Existe otra clase llamada StreamOpenOfficeDocumentConverter que envía y recibe el contenido de los archivos por socket. Esta clase es la que no funciona bien por el bug de Open Office.


Espero que a alguien le sirva toda esta data :D

miércoles, 2 de mayo de 2007

Linux Ubuntu vendrá preinstalado en algunas Dell

Tanto en el sitio de Ubuntu como en el de Dell están anunciando oficialmente que algunas computadoras Dell podrán venir con Ubuntu 7.04 Feisty preinstalado.

Es una gran noticia y estaría bueno que otras marcas de computadoras los imiten. A mi me encanta Ubuntu, así que el hecho de que esa sea la distro de Linux elegida me pone también muy contento, pero también podrían ser otras las distros a elegir.

Claro que hay distros que nunca podrían venir preinstaladas porque se perdería su filosofía. Tengo un amigo al que le encanta Gentoo, pero claro, le gusta instalarlo él mismo :D

jueves, 26 de abril de 2007

apt-get con poderes de super vaca!!


Hoy me sorprendí con algo que se ve que existe hace mucho pero que yo no conocía.

El apt-get tiene poderes de super vaca!!! (ver la imagen que se obtiene luego de ejecutar apt-get --help)

Más divertido aún es lo que aparece con apt-get moo :D

domingo, 1 de abril de 2007

lunes, 15 de enero de 2007

Se me llenó el GMail

Hoy se me llenó la casilla de Gmail. La estaba dejando llenar para ver qué pasaba. Pues bien, llega un momento en el que no te deja enviar mail porque dice que no tiene lugar (en la imagen se ve el mensaje).

También se puede ver que la cuenta no está en realidad llena, sino que sobran tres megabytes (usando 2802 de 2805 MB). Vaya uno a saber si es un bug o una feature :P