Los Bytes Mágicos
26 Enero, 2007
¿Cómo podemos distinguir un tipo de fichero de otro? Por ejemplo, un mp3 de un archivo de vídeo. Sí, ya sé, mirando la extensión, pero qué ocurre si borramos la extensión del nombre de archivo, ¿Cómo podemos saberlo entonces?
Sí, podemos abrir el archivo en un reproductor y ver qué pasa, pero, ¿Y si no tenemos ni idea de qué puede ser el archivo? no podemos ir probando con todos los programas que tengamos a ver si el fichero se abre.
Para solucionar esto existen los Magic Bytes (Bytes Mágicos), que son nada más y nada menos que una serie de bytes que nos permiten identificar inequívocamente un archivo. Por ejemplo un mp3 contendrá las cabeceras que todo fichero mp3 debe tener, lo mismo sucederá con un archivo mpeg o un fichero ejecutable.
Una utilidad muy interesante en linux es el comando “file” que nos permite identificar ficheros sin hacer caso a la extensión. Por ejemplo:
$ file unarchivo.zip
unarchivo.zip: Zip archive data, at least v2.0 to extract
Le cambiamos el nombre y sigue saliendo lo mismo:
$ mv unarchivo.zip unarchivo
$ file unarchivo
unarchivo: Zip archive data, at least v2.0 to extract
Si probamos con un archivo avi incluso nos dirá las propiedades de este:
$ file video.avi
video.avi: RIFF (little-endian) data, AVI, 640 x 480, 23.98 fps, video: XviD, audio: MPEG-1 Layer 3 (stereo, 48000 Hz)
¡Y hasta identifica ficheros de código!
$ file otroarchivo
otroarchivo: PHP script text
Escritorio remoto con VNC
24 Enero, 2007
Actualmente es bastante frecuente dejar un PC casero encendido las 24h, descargando cosas, haciendo de servidor http o incluso, para utilizarlo desde cualquier parte del mundo como si estuvieras en tu casa, gracias a VNC.
Hay básicamente dos formas de utilizar un escritorio remoto, de forma compartida (almenos en linux) o de forma dedicada. Es decir, podemos hacer que nuestra sesión de X (o de Windows) sea compartida y otros usuarios puedan conectar a ella o podemos iniciar un escritorio al que únicamente se podrá acceder via vnc (hasta dónde yo sé esto sólo es posible en linux).
Para el primer caso, si queremos compartir nuestro actual escritorio, podemos utilizar x11vnc (apt-get install x11vnc en linux). Iniciamos el entorno gráfico (el que sea, kde, gnome, xfce, fluxbox … ) y abrimos una consola, para escribir:
x11vnc -storepasswd
Nos preguntará por una contraseña y nos dirá si la queremos guardar, introduciremos una contraseña y diremos que sí a guardar. Por defecto la guardará en ~/.vnc/passwd así que usaremos ese archivo en el siguiente comando:
x11vnc -rfbauth ~/.vnc/passwd
¡Ya está! ¡Así de fácil! Tenemos el entorno X actual disponible para acceder desde cualquier PC conectado a internet (eso sí, procura tener mapeado el puerto 5900 en tu router). Ahora sólo necesitas el visor, que puedes encontrar en la web oficial de vnc o puedes instalarlo via tu sistema de paquetes favorito (en debian apt-get install xvncviewer).
Ahora sólo te queda ejecutar el xvncviewer e indicar la ip y el escritorio, que por defecto es el 0. Si el PC donde está compartido el escritorio tiene la ip 192.168.0.4 pues pondrás en el xvncviewer 192.168.0.4:0
Si lo que quieres es crear un nuevo entorno gráfico dedicado a vnc entonces tendrás que instalar vnc4server (apt-get install vnc4server) y hacer lo siguiente:
vncpasswd
vnc4server -depth 16 -geometry 1024×768
Con el parámetro depth indicas la profundiad de color y con geometry la resolución del nuevo escritorio. Al ejecutar este comando verás algo parecido a esto:
New ‘hostname:2 (usuario)’ desktop is hostname:2
El “:2″ es el número de escritorio, es lo que tendrás que utilizar cuando lances el xvncviewer y además, mapear el puerto 5900+2 en el router, es decir, el 5902.
Para cerrar un servidor vnc sólo tienes que hacer vnc4server -kill :2 (o el número que sea).
En JavaScript los arrays asociativos no existen
22 Enero, 2007
Sí, es cierto, lo acabo de descubrir, y luego explicaré los detalles, pero antes quiero contar qué es lo que me ha llevado a afirmar esto.
La semana pasada me tocó analizar junto a un compañero un código JavaScript que no funcionaba correctamente, utilizaba arrays asociativos para almacenar distintas categorías, por ejemplo:
var paises = new Array();
paises['es'] = ‘España’;
paises['pt'] = ‘Portugal’;
paises['us'] = ‘Estados Unidos’;
paises['uk'] = ‘Reino Unido’;
Hasta aquí, todo parece normal, es un array asociativo, como clave guardo el código del país y como valor el nombre, igual que lo haría en PHP por ejemplo. Pero luego, al intentar ordenarlo con opciones.sort(); que supuestamente ordena el array, no funcionaba, ni siquiera pasándole como parámetro una función personalizada para la ordenación (Especificación del método sort)
Supusimos que el método sort() no soportaba arrays asociativos e implementamos la solución utilizando arrays normales y corrientes, con claves numéricas, a la vez que nos preguntábamos cómo podía ser que JavaScript tuviese esa falta tan grave.
Hoy me disponía a comentar este error y buscar una nueva implementación de sort que soportara arrays asociativos (o incluso hacerla yo mismo si no hubiese encontrado ninguna) cuando sin quererlo me he encontrado con que JavaScript no tiene arrays asociativos, no existen. Entonces, ¿Cómo es que el ejemplo anterior funciona? (Sin contar el método sort)
Funciona porque lo que estamos haciendo es añadirle propiedades al objeto de tipo Array. En JavaScript, cuando hacemos variable['nombre'] lo que ocurre es que añadimos una nueva propiedad con el nombre “nombre” al objeto “variable”. Por eso, si hacemos:
var paises = new Array();
paises['es'] = ‘España’;
paises['pt'] = ‘Portugal’;
paises['us'] = ‘Estados Unidos’;
paises['uk'] = ‘Reino Unido’;
alert(paises.length);
Si existiesen los arrays asociativos debería aparecer una ventanita con un 4 ¿verdad? Pues como no existen, sale un 0, porque no le estamos añadiendo valores al array, si no propiedades al objeto.
Otros hechos que hacen sospechar de que JavaScript no tiene soporte para arrays asociativos es que no hay forma de definir un array asociativo ni con el constructor del objeto Array ni con la sintaxis para crear un array de forma literal.
Me he sorprendido mucho al leer esto en http://www.andrewdupont.net/2006/05/18/javascript-associative-arrays-considered-harmful/ , pues llevo años viendo como en muchos tutoriales explican equívocamente cómo utilizar arrays asociativos en JavaScript, tal y como yo lo he hecho.
Problemas entre correos de Gmail y Hotmail
18 Enero, 2007
Desde hace algunos dias (2 o 3) vengo notando que cuando alguien me quiere enviar un correo desde hotmail a mi cuenta gmail el mensaje llega 10 horas tarde, siempre 10 horas, clavadas. Al revés parece funcionar todo bien. No me ha pasado con un correo, me ha pasado con todos los que cumplían la norma hotmail -> gmail.
No se si esto es un problema técnico, una casualidad o una manera de luchar contra la competencia pero espero que se solucione pronto.
Ha alguien mas le ha pasado?
Gnope, el Instalador de PHP-GTK
17 Enero, 2007
¿Te imaginas poder bajar, instalar, organizar y por supuesto, ejecutar todas las aplicaciones desde un mismo gestor? ¿Te imaginas poder modificar el código fuente de tu aplicación favorita en un instante y volver a ejecutarla con facilidad? Y además de todo esto, ¿Que pueda funcionar en cualquier plataforma?
Aunque en realidad no es todo tan bonito, y el dicho gestor ya está disponible en las distribuciones de Linux (apt, synaptic, yum), algo que se acerca bastante a la idea inicial es Gnope.
Sí, con Gnope puedes bajar, instalar, organizar y lanzar aplicaciones hechas en PHP-GTK. Con Gnope también puedes modificar el código fuente de la aplicación que te bajes, puesto que es PHP, volver a ejecutar la aplicación modificada y disfrutar de los cambios. Entonces, ¿Qué es lo que falla en Gnope? Pues la calidad. Tanto del gestor de aplicaciones como de las aplicaciones disponibles. En el instalador aparacen fallos durante la instalación (en la consola que se abre, aunque no afectan a la instalación, según parece) y luego, las aplicaciones que hay disponibles, además de ser pocas, son de baja calidad/utilidad y por supuesto, el hecho de que son interpretadas hace que las aplicaciones sean mucho más lentas de lo habitual.
Eso sí, hay que tener en cuenta que Gnope tiene poco más de 1 año de vida y es posible que en un futuro empecemos a ver aplicaciones útiles y más depuradas.
Si sueles programar en PHP y te interesa realizar aplicaciones “de sobremesa” con tu lenguaje favorito te recomiendo que eches un vistazo a la web de Gnope y la de PHP-GTK.
Si se puede leer, se puede copiar
16 Enero, 2007
Es algo obvio, trivial, para mi y para cualquiera, si un sonido se puede reproducir, también se podrá copiar, si un vídeo se puede reproducir, también se podrá copiar, si un disco con un determinado software se puede leer, también se podrá copiar.
¿Por qué siguen gastando ingentes cantidades de dinero para intentar hacer algo que es imposible, por pura lógica?
Esto viene de las últimas noticias que estoy leyendo, sobre la copia de las primeras películas HD-DVD, la copia de los juegos de Wii y Game Cube y por supuesto, también los de Sony (PS3). Lo mejor de todo es cómo lo han hecho, con un mínimo esfuerzo, almenos en los casos de los juegos de Sony y en los HD-DVD, que son los que más me he informado.
Resulta que puedes copiar un juego de PS3 simplemente instalando Linux y utilizando el conocido comando dd de forma habitual, lo cual es de risa. Millones invertidos en buscar métodos para que los discos no puedan ser copiados para que luego, con un simple comando, que cualquier usuario medio de Linux conoce, se puedan copiar.
Con el HD-DVD pasa algo parecido, una gran cantidad de recursos se ha invertido para desarrollar el AACS para que luego, un usuario indignado por no poder reproducir correctamente su película en su monitor, al no disponer de HDCP (sí, quieren proteger hasta las conexiones), se ponga a investigar y logre copiar la película directamente en su disco duro utilizando un pequeño programa en Java (y algo de maña en buscar las claves que decodifica un reproductor oficial, en memoria). Además, todo el trabajo de conseguir la clave de la película se lo hace un programa reproductor de HD-DVD. Lo cual también es bastante obvio, en algún punto, el programa necesitará trabajar con la clave de decodificación y la guardará en memoria, la cual podrá ser investigada con un debugger. Por lo tanto, es inútil tanta encriptación, en algún momento, algún aparato o software, tendrá que decodificar la película y ese aparato o software será manipulable.
Al fin y al cabo, lo único que se consigue poniendo todas estas trabas es que el usuario final, el que compra la película, acabe teniendo un producto de menor calidad que el que puede conseguir bajándose de internet, libre de sistemas anti copia, que podrá reproducir dónde más le guste y convertirlo al formato que prefiera, para poder ver su peli favorita incluso en su reproductor de vídeo portátil o hasta en el móvil.
Conviertiendo de iso-8859-15 a utf-8 fácilmente
15 Enero, 2007
Cada vez me encuentro con más casos en los que necesito escribir caracteres especiales, más allá de la eñe (Ñ), las tildes u otros caracteres habituales entre la mayoría de europeos occidentales (ç, à, ê, å, etc). El verdadero problema llega cuando necesitas escribir en otros idomas como ruso, árabe, chino, japonés, polaco, etc, o como mínimo, hacer tu web/aplicación compatible con estos juegos de caracteres.
El problema tiene fácil solución, se llama utf-8, un juego de caracteres especial que utiliza de 1 a 4 bytes por caracter, según sea necesario y es compatible con los canales de transmisión de 8bits. Es decir, que podemos enviar un texto con caracteres de múltiples culturas a la vez, utilizando los canales habituales, mail, web, irc, ftp, etc.
Lo único que queda por saber es cómo convertir documentos de texto que tengamos en iso-8859-15 (el juego de caracteres habitual en españa) a utf-8. Esta tarea la podemos realizar utilizando el comando “iconv” en linux (o bajando la misma aplicación en versión para Windows) y ejecutando el siguiente comando:
iconv documento.txt -f iso-8859-15 -t utf8 -o documento-utf.txt
documento.txt es el nombre del fichero que queremos convertir, -f iso-8859-15 es la codificación actual del fichero, -t utf8 es la codificación de destino y -o documento-utf.txt es el fichero dónde el programa escribirá el resultado.
Este comando me ha resultado especialmente útil para convertir algunas de mis páginas web a utf8. Por cierto, esta web usa utf-8.
Woody ha muerto, hasta siempre
14 Enero, 2007
Después de 4 años y medio de funcionamiento, la distribución Debian CNU/Linux 3.0 (Woody) dejara de estar disponible en los servidores espejo de Debian.
El soporte de seguridad finalizó en Junio del 2006, un año después del lanzamiento de Debian 3.1 (Sarge), y a la espera de pasar a ser estable tenemos la deseada Debian 4.0 (Etch) que sera la primero en llevar instalador gráfico y que se encuentra congelada hasta solucionar graves bugs.
Todos los que posean Woody pueden actualizarse a Sarge. Hay que tener en cuenta que los que utilicen repositorios no oficiales, como por ejemplo Backports, pueden dejar de funcionar si estos no se actualizan también.
El proceso de actualizaciones consiste en ejecutar apt-get seguido de apt-get dist-upgrade. Antes de actualizar hay que comprobar la lista de fallos críticos o bugs.
Jugando al 3D Lemmings con DOSBox
13 Enero, 2007
Buscando algunos juegos me he encontrado con el Lemmis, un clon del Lemmings, un poco cutre, en mi opinión, aunque almenos distribuye el código fuente. Este juego me ha hecho recordar el viejo 3D Lemmings, una versión en 3D de estos populares suicidas que salió en 1995 y me apetecía volverlo a probar. Así que descargué el juego (lo puedes encontrar en http://www.ellosnuncaloharian.com/) y al probarlo me encontré con el típico problema que tienen los juegos antiguos, está hecho para MS-DOS y no funciona en XP.
Pero este problema tiene fácil solución, y se llama DOSBox, que a pesar de ser bastante popular, todavía no había tenido la oportunidad de probarlo. Para ejecutar el juego lo único que hay que hacer es lo siguiente:
- Abrir la consola de DOSBox
- Montar en la unidad C el directorio del juego (yo lo tengo en l:\3dlem): mount c l:\3dlem
- Ejecutar el programa de configuración del juego: setup
- Y ya podemos jugar, tecleando el nombre del ejecutable del juego: l3d
Para que funcione fluido hay que aumentar un poco los ciclos de CPU (ctrl+F12). De esta forma, el juego me ha funcionado fluido, a la mayor resolución que puede, que no es mucha y con sonido. También probé un front-end para el DOSBox, el D-Fend, pero no conseguí que el juego funcionara correctamente.
Hecho sobre rentabilidad
12 Enero, 2007
Una web rentable debe ganar al año como mínimo una unidad monetaria de tu país multiplicado por el número medio de visitantes al día.
Sergio Gonzalez
Programador (Que no informático)
Es decir, que una web con 1000 visitas al día debe ganar unos 1000€ al año. Un dato curioso, que almenos en mi caso, en la mayoría de sitios a los que tengo acceso a esa información, se cumple.
