Archivo de Junio 2006

10 cosas que un programador Java debería saber

Miércoles, 28 de Junio de 2006

He encontrado un artículo muy interesante que trata sobre los 10 errores más comunes (o 10 cosas que deberías saber) cuando desarrollas bajo Windows, pero tu aplicación va a correr sobre Linux/Unix. El artículo original está aquí en Javalobby. Como está en ingles pero me parece muy útil, he decido hacer un resumen un poco libre y en castellano sobre los puntos que trata.
En este post van los 5 primeras, mañana o pasado publicaré los 5 siguientes:

10 cosas que un programador Java debería saber

10 Uso especial de puertos
En unix, solo el usuario root puede abrir puertos por debajo de 1024. En Windows cualquiera puede hacerlo. Si tu aplicación usa un puerto por debajo de 1024 piensa que en Unix solo funcionará si el proceso corre como root.

9 No hay bloqueo mágico de ficheros
Windows protege automáticamente contra escritura los ficheros abiertos, pero en Unix no: tu puedes estar leyendo un fichero y otra aplicación/hilo puede borrarlo.
El siguiente código falla en Windows (protegiendo el fichero), pero en Unix no falla y el fichero es eliminado.

// Se abre el fichero
InputStream is = new FileInputStream("foo.txt");

// Se borra el fichero: en Windows falla, en Unix no
(new File("foo.txt")).delete();

// Intentamos leer el fichero
// En Windows nunca llegamos hasta aquí, pero en Unix
// el contenido del mismo ya ha sido borrado
int ch;
while( (ch = is.read()) > 0 )
    System.out.println( "char: " + (char)ch );
is.close();

8 A veces no hay interfaz
En Unix no siempre hay interfaz, ya sea gráfica o de consola. Y a veces no hay ni consola, puede ser que la máquina sea un servidor que no tenga pantalla, ni teclado, ni ratón, ni nada. Tu aplicación puede ser un simple proceso lanzado en background por un cron por ejemplo. Si la salida estándar no está redirigida a un fichero (para hacerlo, utiliza el método setOut de la clase System), puede que tus System.out.print() se pierdan para siempre.
Utiliza siempre un sistema de logs que escriban a fichero tus trazas.

Otra cosa: aunque no uses AWT directamente (por ejemplo, en una aplicación J2EE) puede ser que utilices sin querer la interfaz gráfica del sistema al manipular imágenes con el Api AWT del JDK (por ejemplo, al cambiar el tamaño de imágenes). Si tu Unix/Linux no tiene unas X, fallará. La solución a esto consiste en utiliza el parámetro -Djava.awt.headless=true en el arranque de tu máquina virtual.
Más información: JDK 1.4.2 AWT Changes, Mindprod glossary: Headless

7 En unix no hay registro
Unix no tiene un lugar central donde almacenar toda la configuración del sistema. En su lugar, utiliza ficheros en texto plano repartidos en diversos directorios (/etc/* la mayoría).
Si usas el registro de Windows para localizar información del sistema, intenta averiguar su equivalente en Unix. Piensa que incluso será más comodo leer un texto plano que tener que acceder al registro.

6 Barras invertidas

En Windows, el separador de directorios es “\” (backslash), por ejemplo: C:\Archivos de Programa\Mola
Pero en Unix el backslash es el carácter de escape, así que el separador de directorios es “/” (slash), por ejemplo: /etc/passwd.

Lo bueno es que Windows admite los dos separadores, mientras que Unix no, por lo que tiene fácil solución: usar siempre “/” (slash)

Si has utilizado en tu código y ficheros de configuración el separador de carpetas “\”, puedes cambiarlo tranquilamente por “/” para que funcionen en Unix y seguirán funcionando también en Windows.
Si por alguna razón necesitas saber en tiempo de ejecución que separador utilizar, siempre puedes utilizar la constante java.io.File.separatorChar

IMPORTANTE: el artículo original tiene una errata y dice que la constante a utilizar es java.io.File.pathSeparatorChar, confundir estas dos constantes también es un gran error muy común: pathSeparatorChar es el separador para los elementos del CLASSPATH y no para los directorio. Valdrá “:” para Unix y “;” en Windows, que no es lo mismo que separatorChar.

En efecto, está usted loco

Martes, 27 de Junio de 2006

El secreto encanto de las start-up

Desde el recientemente constituido Departamento de Filtraciones Extraoficiales de Negonation: parte del secreto encanto de trabajar en una start-up viene de momentos como estos,

Intenta cambiar el mundo, mientras te lo pasas como los indios… :-)

Via: Enrique Dans

?qué significa “Yep”?

Lunes, 26 de Junio de 2006

Genial.

Q:
What does ‘yep’ really mean?

Does it mean “Yes, thank you for telling me, i understand?”

Does it mean “I don’t understand a single thing you just said, but I’m polite and you seem to like the sound of your own voice, so please keep going?”

Or does it mean “I already knew that. You’ve just wasted your breath talking to me. Shut up in future, big nose.”

A:
Yep

Via secretGeek

Reproductor mp3 portatil “Winamp”

Lunes, 26 de Junio de 2006

?No es una pasada?

Un Winamp en tu mano

Via: TecnoCHICA, Gizmologia , Gizmodo

Más libros de Java gratis

Lunes, 26 de Junio de 2006

Vía Javahispano, tenemos una página con bastantes libros gratuitos interesantes. Ya tenéis algo que leer este veranito!

CSS: background, eliminar parpedeos en IE6

Domingo, 25 de Junio de 2006

Si alguna vez has utilizado imágenes como fondo de elementos con CSS, te habrás fijado que en Internet Explorer 6.0, cuando pasas por encima el cursor del ratón, se produce un molesto parpadeo o “flick”.
Es decir, con tener un código CSS y HTML simplemente como éste:

.mifondo {
    background: url('img/cuadradito.gif') no-repeat;
}

<div class="mifondo">Aqui aparece un cuadradito de fondo</div>

En IE6 para Windows no se va a ver bien al pasar por encima el ratón.
Es un error conocido, y en esta página te explican como reproducir el error y la solución de cada uno (para poder ver los ejemplos de la página hay que utilizar IE6 claro):

De todas formas, y tras probar varias soluciones, la que he utilizado y que recomiendo, es la siguiente:
Solo tienes que subir al directorio en tu servidor Web donde están las imágenes que vas a utilizar como fondo en tus CSS un fichero .htaccess con el siguiente contenido:

ExpiresActive On
ExpiresByType image/gif A2592000
ExpiresByType image/png A2592000
ExpiresByType image/jpg A2592000
ExpiresByType image/jpeg A2592000

Esta solución esta completamente explicada en:

El resto de soluciones son más laboriosas y algunas no son 100% efectivas. De todas formas sigue siendo muy recomendable leer el artículo para ver los diferentes bugs que tiene el IE6 con los background en CSS.

Quitar el WGA de Windows XP

Viernes, 23 de Junio de 2006

Vía Kriptopolis, ya tenemos una utilidad para eliminar el WGA.

WGA, la polémica utilidad “antipiratería” que permite a los ordenadores con XP conectarse a cada arranque con Microsoft y transmitir cierta información a la casa madre, podría tener los días contados.
[…]
RemoveWGA es una herramienta que acaba con esa limitación, puesto que respeta la función de validación de WGA, pero elimina la polémica función notificadora, velando además en silencio para que ésta no vuelva a ejecutarse…
[…]
Se trata de una descarga de sólo 10 KB, que ha sido elaborada por una firma que parece fiable y que funciona en Windows XP con SP1 ó SP2.

Si tienes XP, ya estás tardando en descargártelo de aqui o aqui.

Aprobada la reforma de la LPI que extiende el canón

Viernes, 23 de Junio de 2006

Vía Error500

A partir de ahora el canon se extiende a cualquier ’soporte idóneo’ para grabar y reproducir archivos, por lo que podrá ser aplicado a reproductores MP3 y teléfonos móviles. Desde ya, queda redefinido el concepto de copia privada, que queda recluida al “ámbito privado”. Desde hoy queda prohibido “civilmente” el saltarse medidas tecnológicas anticopia. Y, dado que establece que creadores y productores tendrán también una compensación directa por la “puesta a disposición” de sus obras en Internet, abre las puertas a denuncias por uso de redes P2P para compartir contenidos con copyright. Todo eso se ha aprobado hoy en el congreso.

ESPELUZNANTE. Nos gravan con impuestos para sufragar la perdida de beneficios que tendrán las discográficas y productoras, dando como cierta la suposición de que cada formato digital que compremos servirá para grabar musica o películas.
?Si dan por hecho que vamos a hacer copias, porque es ilegal bajárselas, si ya pagamos impuestos por copiarlas? ?Si ya pagamos por copiar, porque llevan sistemas anticopia (DRM) los discos que compramos? Que contradicción y que falta de conocimiento de la sociedad y de la tecnología por parte de los políticos que aprueban estas leyes. ?Realmente va a ayudar esta ley a algo, salvo a enriquecer a unos pocos? ?Es mejor para la sociedad de la información y para España un canón que afecta a todo el mundo para enriquecer a unos pocos? Esta claro que no, pero ellos no lo quieren ver.

Más información: El mundo, 20 minutos, Interiuris, David Bravo, Barrapunto, El País.

Y gracias a Jorge Cortell, nos cuenta como podemos eludir esta ley abusrda y abusiva. Es muy fácil, según nos indican:

El proyecto aprobado aclara que la ?copia privada? de una obra debe ser realizada por una persona física para uso privado y a partir del original.

Por lo que, (es solo un resumen, ver el post original para leerlo completo), estas son las medidas a tomar:

  • Hay que comprar los soportes sujetos al pago del canon a nombre de una persona jurídica. O sea, que los CDs, móviles, DVDs, etc lo compre la empresa, que al no ser persona física no podrá realizar copias privadas, y por lo tanto el soporte que compre no estará sujeto a pago del canon.
  • Si lo que se quiere es hacer Copias Privadas, y no preocuparse de si la copia se realiza de ?original? o no, no hay problema: en el mundo digital es imposible diferenciar la copia del original. Por lo tanto hay que hacer copias exactas.
  • Si tememos a lo de ?uso privado?, lo tenemos fácil: usad auriculares con el MP3, poned el aire acondicionado en el coche y subid las ventanillas, etc. ?Y el ordenador? Está considerado como ámbito privado, por lo tanto, aunque se emplee una red P2P, se puede hacer como copia privada, de acceso privado, a nuestro original digital.
  • Y, sobretodo, en caso de duda, emplead reproductores que admitan archivos digitales, los cuales aun siendo copia, son indistinguibles del original. En ese caso, no os tenéis que preocupar, pues hasta que restrinjan el ámbito de uso del original, nadie podrá, con la ley en la mano, dudad de que el ?original? que lleváis en el reproductor (de DVD, de MP3, disco duro del ordenador, etc) es un ORIGINAL.

Lenguajes de programación esotéricos

Miércoles, 21 de Junio de 2006

La Wikipedia contiene una entrada en castellano para los Lenguajes de programación esotéricos.
El propósito de estos lenguajes es resultar más curiosos que útiles. Quizá como resultado de algún proyecto de universidad, un estudio sobre lenguajes, quien sabe.
Algunos contienen muy pocas instrucciones, pero las codifican con palabras claves graciosas y muy parecidas entre sí, dando lugar a un lenguaje totalmente ilegible.

Uno de ellos es Oook!, un lenguaje cuya lectura de su código fuente recuerda al idioma de los monos. Solo tiene tres palabras claves que combinadas de dos en dos, dan lugar a 8 instrucciones en total.
El lenguaje final es tan estrambótico como éste, un programa que simplemente pinta “Hola Mundo”:

Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook?
Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook? Ook.
Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook? Ook!
Ook? Ook. Ook? Ook! Ook? Ook. Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook.
Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook!
Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook?
Ook? Ook! Ook? Ook. Ook? Ook! Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook.
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook.
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook!
Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook? Ook. Ook? Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook? Ook! Ook? Ook.
Ook? Ook! Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook.
Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook!
Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook?
Ook? Ook! Ook? Ook. Ook? Ook! Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook.
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook.

Otro, por ejemplo, INTERCAL nace como una parodia siniestra de FORTRAN y COBOL cuyo único objetivo es ser extremadamente difícil de programar y de entender.
Contiene instrucciones redundantes y con nombres irónicos como “READ OUT”, “IGNORE”, “FORGET” o “PLEASE”, codifica los operadores binarios y unarios (and, or, not, xor) con otros símbolos extraños que no se encuentran directamente en el teclado, obligando al programador a hacer algún truco para teclearlos.
Por ejemplo, la manera más sencilla de almacenar en una variable de 32-bit el valor 65536 se convierte en esta pequeña pesadilla:

DO :1 <- #0?#256

Las entradas y salidas están muy limitadas: las entradas de los dígitos tienen que ser deletreadas y las salidas de los números se hacen en formato romano. Un horror.

Un simple “Hello World” en C como éste:

#include <stdio.h>
int main(void) {
    printf("Hello, world!n");
    return 0;
}

Se convierte en esta deliciosa pieza de código en C-INTERCAL como ésta:

        DO ,1 <- #13
        PLEASE DO ,1 SUB #1 <- #234
        DO ,1 SUB #2 <- #112
        DO ,1 SUB #3 <- #112
        DO ,1 SUB #4 <- #0
        DO ,1 SUB #5 <- #64
        DO ,1 SUB #6 <- #194
        DO ,1 SUB #7 <- #48
        PLEASE DO ,1 SUB #8 <- #22
        DO ,1 SUB #9 <- #248
        DO ,1 SUB #10 <- #168
        DO ,1 SUB #11 <- #24
        DO ,1 SUB #12 <- #16
        DO ,1 SUB #13 <- #214
        PLEASE READ OUT ,1
        PLEASE GIVE UP

Por supuesto, tiene la instrucción COMEFROM, que a modo de chiste, es lo contrario que la antigua y obsoleta (por romper la estructura del código) instrucción GOTO: Recordemos que GOTO sirve para provocar un salto en la línea de ejecución de nuestro programa a una línea concreta en nuestro código. CAMEFROM sirve para lo contrario, indicamos que se debe seguir la ejecución a partir de la línea actual donde esta la sentencia COMEFROM cuando se ejecute la línea indicada.
Justo al reves. Por ejemplo, esto:

10 PRINT "Hello!";
20 GOTO 10

Se convierte con CAMEFROM en:

10 COMEFROM 30
20 PRINT "Hello!"
30 REM

De esta manera, sabemos cuando se efectúa el salto al leer el destino, no el origen de la línea que lo provoca. Vamos, una auténtica pesadilla de la programación que sobrepasa el absurdo y solo sirve para rendir culto a su complejidad. Más información en la Página oficial de Intercal. No apta para cardíacos, ya te avisan en la propia home: “Abandon All Sanity, Ye Who Enter Here”.

Por cierto, esto me recuerda a otra entrada de la Wikipedia también interesantísima que hace poco mi amigo kotrina me envió por correo.
Es una lista de programas que escriben “Hello World” en más de 250 lenguajes, sistemas, plataformas y programas diferentes. Desde Java o C, pasando por XSLT hasta calculadoras programables. O incluso escribir esta frase desde POV-Ray, una aplicación para renderizar gráficos realistas a partir de scripts.
Curioso e interesante, aunque no vienen ni Ook ni INTERCAL, ?será que no son dignos de considerarse lenguajes de programación? ?Qué intolerancia a las minorias! :-)

Vía (aunque ya había oido hablar de Ook hace bastante tiempo, no había visto la entrada en la Wikipedia hasta que lo ví en Meneame): Meneame)

2001 Japanese Tetris Finals

Lunes, 19 de Junio de 2006

Una partida de la final del Tetris Grandmasther 2 en “death mode”. Realmente espeluzante, sobre todo el final. Mas de 5 minutos cayendo piezas a la velocidad del rayo y este jugador lo borda.
Impresionante y atroz: Mira tu mismo la 2001 Japanese Tetris Finals (o a lo mejor prefieres descargatela, nunca se sabe…)
(Via 86400.es)

Y de regalo: The Matrix Bastardization, una foto-novela de Matrix con la historia variada. Mismos fotogramas pero con un texto diferente.
Mola! (en ingles, visto por ahi navegando.)