Leopard sin soporte para Java 6

Publicado en Java, Noticias el 30 de October, 2007 por Fran. (1 comentario)

Me entero por blaxter que Leopard, el nuevo sistema operativo de la manzanita, no traerá (o trae) soporte para Java 6.

La verdad es que no deja de sorprenderme este hecho, porque Apple siempre ha instalado en sus sistemas operativos una versión especial de Java, de modo que Sun nunca ha ofrecido un paquete explícito (o eso creo) para instalar Java en Mac OS, pero sí en los otros sistemas operativos. De todos modos, últimamente se había creado una fuerte comunidad de desarrolladores Java sobre Mac OS, así que no creo que la manzanita tarde mucho tiempo en soportar Java 6.

Y para terminar os dejo con el enlace con el que termina blaxter su post. ¡Muy bueno!

Jornadas técnicas del GUL-UC3M

Publicado en Noticias el 29 de October, 2007 por Fran. (Sin comentarios)

Me entero de que ya está el calendario definitivo de las jornadas técnicas del GUL de mi universidad, estas jornadas tratan de ser una pequeña introducción a temas concretos sobre software libre, programación, informática, …. y la verdad es que están bastante bien, yo todavía no sé si iré a alguna, ya que no sé si estaré currando o no.

Así que ya sabéis si algún tema os parece interesante pasaros por allí.

Por cierto, dicho GUL tiene una lista de correo en la que se habla (poco) sobre programación, y también nosotros tenemos un grupo de google sobre programación. ¡Animaos y apuntaros!

¿Versión web de Eclipse?

Publicado en Java el 23 de October, 2007 por Lek. (2 comentarios)

Al parecer, es algo más que una profecía:

we will see a viable online alternative to the desktop IDE soon (fuente: Veremos una alternativa online viable a los IDE de escritorio pronto)

Para quien aún no lo sepa, Eclipse es quizá en estos momentos el entorno de desarrollo para Java líder del mercado. Él solito envió al anterior líder, JBuilder, a la ruina más absoluta. Y por lo visto les ha gustado la idea lanzada por, por ejemplo, CodeIDE de tener el entorno de desarrollo en la web, disponible desde cualquier PC con conexión, ¡¡actualizado y sin petar!!.

Una idea muy interesante a la que habrá que seguir la pista para ver si son capaces de sorprendernos de nuevo.

(Vía: Chris Aniszczyk)

gotApi

Publicado en Recursos el 20 de October, 2007 por Lek. (Sin comentarios)

Estreno la categoría de recursos con esta web. Creo que fue Chuidiang a quien leí que lo mejor para aprender un lenguaje es (aparte de practicar, practicar, practicar, prac…) leerse las APIs del lenguaje.

Pues bien, gotApi es una página que reune unas decenas de ellas: Java, Ruby, Python, XML, AJAX, PHP… aunque Google sigue siendo el principal soporte para cualquier programador, no está de más tenerla a mano por si las moscas.

Compresión ZIP en Java

Publicado en Java el por Lek. (2 comentarios)

Había pensado titular al post como “Cuando 2 gigas no son suficiente“, pero al final lo dejaré como está. Este post va de compresión en ZIP, pero también de lo que mentaba el otro día de trampear los límites de la programación…

Un caso típico en programación es tener que comprimir un archivo o una serie de informaciones para enviarlas por HTTP, FTP, LOQUESEATP… pero, ¿qué pasa cuando la información tiene un tamaño descomunal? La clase ZipFile tiene un límite en el tamaño de ficheros que puede aceptar de 2GB. Esta limitación es externa y debida a la estructura de 32-bits, así que debería tener muy mala solución ya que no nos vale con ejecutar el programa con chopocientos gigas de RAM.

¿O no?

Rebuscando, rebuscando, por la red uno llega a casa de la abuelita y decide probar la clase ZipInputStream. Prueba de fuego, traga con el fichero (2′3 gigas sin inmutarse). Pero ahora, ¿cómo la usamos? En los códigos que yo tengo, la clase ZipFile tiene un método entries() que nos devuelve una enumeración con todas las entradas que contiene. Luego las recorremos una a una, cogemos el inputStream de cada una, leemos, escribimos y se acabó (es el ejemplo típico de compresión en ZIP):

ZipFile zip = null;
try {
    zip = new ZipFile (this.origen);
} catch (ZipException e0) {
    e0.printStackTrace ();
} catch (IOException e1) {
    e1.printStackTrace ();
}
if (zip != null) {
    Enumeration enums = zip.entries () ;
    while (enums.hasMoreElements ()) {
        ZipEntry entry = (ZipEntry) enums.nextElement ();
        BufferedInputStream bis = null;
        int tamano = 0;
        final int N = 1024;
        byte [] buffer = new byte [N];
        int ln = 0 ;
        try {
        bis = new BufferedInputStream (
          zip.getInputStream (entry));
        try {
            try {
                tamano = (int) entry.getSize ();
                //Escribimos el fichero
                while (tamano > 0 &&
                  (ln = bis.read (buffer, 0, Math.min (
                    N, tamano))) != -1){

                    System.out.write (buffer, 0, ln);
                    tamano -= ln;
                }
//.... vamos cerrando cosas..

Esto ya no sirve. La nueva clase tiene un método getNextEntry() que nos devuelve las entradas una a una. Es el cambio más visible. También es importante que ya no podemos coger el inputStream de cada entrada, pues ya estamos trabajando con uno. El tercer cambio importante es que las entradas devueltas por el ZipInputStream tienen siempre tamaño -1, por lo que no podemos fiarnos de esta variable para la lectura del inputstream. Por resumir, a mí la cosa me queda en algo similar a esto:

ZipEntry entry = null;
BufferedInputStream bis = null;
while ((entry = zip.getNextEntry ()) != null) {
    if (! entry.isDirectory ()) {
        //Esto es siempre -1
        //tamano = (int) entry.getSize ();
        final int N = 1024;
        byte [] buffer = new byte [N];
        int ln = 0;
        try {
            bis = new BufferedInputStream (zip);
            try {
                while ((ln = bis.read (buffer,0,N)) != -1){
                    System.out.write (buffer, 0, ln);
                }
//.... vamos cerrando cosas..

Es un código a buen seguro francamente mejorable (si veis el real mucho más), pero lo importante es que funciona. Y parece más simple que el original :)