jueves, 21 de febrero de 2008

Templarios Negros

Un vídeo que me ha recordado a los tiempos en que jugaba bastante a Warhammer 40K. Quién tuviera una servoarmadura así...

martes, 19 de febrero de 2008

Windows: ¿plataforma ideal para desarrollo web?

Puesto que llevo una temporada en la que estoy realizando bastante desarrollo web no he podido evitar meditar sobre cuál es la plataforma más cómoda para ello. Teniendo en cuenta que todas las herramientas que empleo son multiplataforma (Tomcat, GWT, Eclipse, Gimp) la única diferencia que encuentro es el número de navegadores que soporta cada sistema operativo, para poder realizar las pruebas necesarias. Así estas son las combinaciones que conozco/he podido instalar:
  • En Linux disponemos de Konqueror 4, Epiphany, Opera 9 y Firefox 2 (nunca he conseguido hacer funcionar Internet Explorer 7 con Wine).
  • En Mac podemos emplear Safari 3, Opera 9 y Firefox 2.
  • En Windows está a nuestra disposición Internet Explorer 7, Firefox 2, Opera 9, Safari 3 y Konqueror 4.
A la vista de estos resultados parece que la mejor plataforma, en cuanto a disponibilidad de navegadores, es Windows pues hay versiones de los navegadores más representativos del resto de plataformas, de forma que es relativamente rápido probar características concretas en multitud de navegadores en muy poco tiempo, sin necesidad de recurrir a máquinas virtuales ni segundas máquinas.

Ahora bien, si alguien me encuentra un Howto for dummies sobre cómo ejecutar IE7 sobre Linux me libero de Windows.

jueves, 14 de febrero de 2008

PRESS PLAY ON TAPE

Desde hace años me he dedicado a coleccionar versiones originales, remixes y todo tipo de variaciones de bandas sonoras de juegos antiguos, ya fueran midi, módulos, mp3 o cualquier otro tipo de formato de audio.

Además de coleccionarlas me gusta ver a gente interpretándolas. No es lo mismo un fichero midi que un instrumento real. De esta forma, buscando en Youtube di con un vídeo de la banda PRESS PLAY ON TAPE (sí, el nombre es todo en mayúsculas) que se dedica a tocar este tipo de música. En su página hay bastantes enlaces a sus mp3 para descargar y vídeos, así como información extendida sobre ellos.

De todos me quedaría con estos dos:



miércoles, 13 de febrero de 2008

Ramdisk comprimido en Linux

Existen situaciones en las que se dispone de poco espacio de almacenamiento y, en cambio, de bastante memoria volátil. Un ejemplo de ésto es un sistema embarcado, en los que muchas veces el almacenamiento persistente está muy limitado en comparación con la cantidad de memoria volátil (no hablo de ROM, sino de algún tipo de Flash). Para estas situaciones es bastante interesante lo que voy a tratar en este pequeño texto: cómo crear un disco virtual en RAM (ramdisk) que se almacena en memoria persistente comprimido, por lo que se ahorra mucho espacio.

Entorno inicial

Todo lo que aquí voy a explicar ha sido reproducido durante la redacción del texto para asegurar su funcionamiento en un Fedora Core 3 y ha sido probado en un Debian 3.0 muy limitado. Debería funcionar de igual manera en cualquier distribución relativamente reciente.

Creación de la imagen del disco virtual

Lo primero es crear la imagen del disco virtual. ¿Qué es esto? Pues bien, se trata de un archivo cuyo contenido es un sistema de archivos completo de tamaño reducido. Puede parecer extraño, pero se verá más adelante con mayor claridad (de momento podemos imaginar que se trata de una nueva unidad de disco recién comprada). Lo primero es crearlo vacío, sin contenido. Para ello no hay más que teclear en la consola:
dd if=/dev/zero of=disco.img bs=1k count=4096

Con esta orden hemos volcado una cantidad de ceros a un nuevo archivo llamado disco.img. ¿Cuántos bytes? Pues si bs es el tamaño del bloque (1k) y count es el número de bloques (4096), hemos creado un fichero vacío de 4 MB.

Ahora hay que crear un sistema de archivos dentro del fichero. Para comprenderlo mejor es útil imaginar el archivo como un disco duro sin formato, de tamaño 4 MB. Para crear el sistema de archivos usaremos la siguiente orden:
mke2fs -m0 disco.img

Puede aparecer una pregunta indicando que no es un dispositivo real: habrá que responder que se desea continuar de todas formas. Esto creará un sistema de archivos del tipo ext2, soportado por la inmensa mayoría de kernels. El parámetro -m0 indica que no se ha de reservar espacio para el super usuario.

Montado y preparación de la imagen

De poco nos sirve la imagen si no alberga algún programa o datos en su interior. Por ello vamos a montarla antes de comprimirla y dejarla lista para ser usada sólo en memoria RAM. Para montarla hay que tener un directorio destinado a ello (en mi caso /mnt/ramdisk) y ejecutar la siguiente orden:
mount -o loop disco.img /mnt/ramdisk

Ahora hay que copiar las aplicaciones y datos que se quieran al directorio creado. Para comprobar que está bien montado se puede ejecutar el comando df. Un ejemplo de su resultado sería:
[root@MORDOR test]# df
S.ficheros Bloques de 1K Usado Dispon Uso% Montado en
/dev/mapper/VolGroup00-LogVol00
4386480 3185068 978592 77% /

/dev/hda2 101105 11613 84271 13% /boot
none 128000 0 128000 0% /dev/shm
/dev/hda1 24141872 23615776 526096 98% /mnt/win32
/root/test/disco.img 3963 29 3934 1% /mnt/ramdisk

Como se puede observar en la última línea todo ha marchado correctamente. Una vez que la imagen contenga todos los datos que queremos no hay más que desmontarla:
umount /mnt/ramdisk

Compresión de la imagen

Ahora vamos a comprimir la imagen, para lograr el objetivo de que ocupe muy poco espacio en disco. Para lograrlo ejecutaremos la siguiente orden:
gzip -9c disco.img > disco.img.gz

El nuevo archivo creado, llamado disco.img.gz, es el que habremos de distribuir si queremos que otra persona pueda usar la imagen comprimida, o cuando queramos llevarla a nuestro sistema embarcado.

Uso de la imagen del ramdisk

Con nuestra imagen lista sólo nos falta saber cómo utilizarla. El proceso que vamos a seguir es el siguiente:
  1. Descomprimir la imagen directamente en la memoria RAM.
  2. Montar el espacio de RAM con la imagen en el sistema de ficheros.
Como se puede observar en la descripción no se utiliza espacio de disco adicional, que es el objetivo principal. Para descomprimir en memoria la imagen utilizaremos gzip:
gzip -dc disco.img.gz > /dev/ram

Ahora que tenemos en la memoria la totalidad de nuestra imagen podemos montarla en el sistema de ficheros. Para ello vamos a utilizar el mismo directorio que utilizamos cuando creamos y dotamos de contenido inicialmente a la imagen:
mount /dev/ram /mnt/ramdisk

Con esto, ya se puede acceder a través del punto de montaje de la forma habitual. Su comportamiento será el esperado de cualquier sistema de ficheros normal, con posibilidad de lectura y escritura.

Consideraciones finales

Aunque con el método descrito se puede leer y escribir en el ramdisk, los cambios realizados se perderán cuando se desmonte (ya sea por acción del usuario o por apagado de la máquina). Existe la posibilidad de grabar en disco de nuevo la imagen comprimida cuando se termine de usar, pero conlleva el riesgo de que una interrupción de este proceso puede hacer perder todos los datos de la imagen. El script que presento permite grabar la imagen comprimida en otro archivo, y realizar el cambio cuando finalice. Sin embargo, choca contra el objetivo original de no gastar espacio adicional. Más convendría hacer que los datos que las aplicaciones puedan necesitar modificar se encontraran fuera de la imagen. Aún así el script es el siguiente:
umount /mnt/ramdisk gzip -9c < /dev/ram > tmp-disco.img.gz
mv tmp-disco.img.gz disco.img.gz

Para finalizar aquí hay un script que descomprime y monta la imagen una vez que ya está lista. De esta manera se hace mucho más ameno su uso, pues sólo se ha de ejecutar en el mismo directorio en donde se encuentre la imagen comprimida cada vez que se quiera utilizar.
gzip -dc disco.img.gz > /dev/ram
mount /dev/ram /mnt/ramdisk


Este texto lo escribí hace ya algunos años. Dado que su contenido aún es aplicable he considerado oportuno rescatarlo de mi antigua página y volver a publicarlo aquí, para que no se pierda en el tiempo.

domingo, 10 de febrero de 2008

Flashback

Hoy, rebuscando entre las copias de seguridad de ordenadores viejos, me he encontrado con las páginas web que he ido haciendo desde tiempos pasados. Todas las fui dejando abandonadas según mis intereses se fueron moviendo de un campo a otro hasta que al fin he llegado a este blog, que tiene menos peligro de correr la misma suerte pues en cada post lo que escribo es del tema que en ese mismo momento me apetece.


Esta ha sido la web más reciente que he tenido. Estuvo activa desde enero del 2002 hasta mediados de 2005. Versaba principalmente sobre infografía y, en los últimos tiempos, añadí una sección dedicada a temática más general relacionada con el desarrollo software (la última actualización de la parte de infografía con contenido data de mayo de 2003). A lo largo de su no muy larga historia estuvo hospedada en galeon, iespaña y en lo que se convirtió en su ubicación definitiva: el servidor web de un amigo. Hay un par de textos que me parecen interesantes y aún son aplicables que creo que volveré a postear aquí, para que no se pierdan en mis discos duros.


Aquí está la primera página que realicé y publiqué con los dos aspectos que desarrollé. Estuvo activa desde su creación en la primavera de 1999 hasta mediados de 2001. En esta página se podían encontrar trucos para juegos de ordenador, mapas para Starcraft y Warcraft II, comentarios y análisis de numerosos juegos, diversos enlaces clasificados en categorías, algunos programas que hice en Visual Basic y recursos para 3D Studio. Estuvo hospedada en Teleline desde los tiempos del primate Aurelio y aún hoy sigue disponible en Terra.

Con esto finaliza mi repaso por las páginas que he ido manteniendo. He desarrollado bastantes más con diversos fines o bien para otras personas, pero éstas son las únicas que mantuve como páginas personales. Ya me estoy acordando de cuando me quejaba de Mosaic para Windows 3.1 porque no mostraba las animaciones de los GIFs que las tenían...

sábado, 9 de febrero de 2008

Licencia Creative Commons Share Alike

He decidido publicar todo el contenido del blog bajo la licencia Share Alike de Creative Commons. En pocas palabras, cualquiera es libre de copiar, distribuir, modificar y vender cualquier contenido original de este blog, siempre y cuando el resultado esté bajo la misma licencia o una compatible y se haga referencia al autor original (en este caso yo) y a la URL de este blog.

Para más detalles y el texto legal según la jurisdicción española se pueden consultar los enlaces que aparecen junto al nuevo botón de Creative Commons que he puesto en el panel lateral, bajo la referencia a mi perfil.

viernes, 8 de febrero de 2008

GWT: Window.getClientHeight() erróneo

Desarrollando una aplicación en GWT me he encontrado con la necesidad de saber cuál es la altura del área destinada al documento para poder ajustar el tamaño vertical de un HorizontalSplitPanel. Para ello empleé, inicialmente, Window.getClientHeight().

Según su descripción es justo lo que necesito:
Gets the height of the browser window's client area excluding the scroll bar.

Cuál es mi sorpresa cuando bajo Internet Explorer 7 lo que retorna es la altura del elemento BODY, no del área destinada al documento (al menos en GWT 1.4.61). Tras una búsqueda en el grupo de GWT descubro que es un fallo reportado, y que sólo afecta cuando el navegador está en modo Strict, no en Quirks. Por desgracia en este caso particular estoy usando Strict, pues intento crear una interfaz basada al máximo en CSS con porcentajes para tamaños, sin tener que emplear JavaScript para dimensionar los elementos.

Puesto que pasar a Quirks no era una opción (todo se convertía en un horror al eliminar la definición del DTD) tuve que implementar mi propia función que retornara la altura que yo deseaba accediendo directamente a la propiedad en JavaScript, gracias a JavaScript Native Interface (JSNI). Así la función deseada resultó muy simple:
public static native int getClientHeightFixed()
/*-{
return $doc.documentElement.clientHeight;
}-*/;

Esta pequeña función me ha funcionado sin problemas tanto en IE7 como en FF2. Espero que le resulte a alguien de utilidad y le ahorre un buen rato de búsqueda por la red.