viernes, septiembre 15, 2006

¡Mi primer vídeo!

El otro día por la tarde me dió por hacer un vídeo y subirlo a Youtube, la primera vez que hago las dos cosas :-)

Es la demo de introducción de un juego del antiguo sistema MSX, con el que me inicié en esto de la informática hace ya unos cuantos añitos. Se llamaba Psycho World, empezaba tal que así:



El juego en era bastante divertido, el clásico de plataformas, con unos gráficos sencillos pero muy resultones, en otra tarde tonta intentaré hacer otro vídeo de una partida del mismo.

El proceso para crearlo fué un tanto laborioso, y para ello usé las siguientes herramientas, todas sobre Linux, of course.

- La demó la ejecuté en el emulador openMSX. Dispone de una opción para grabar el sonido de lo que emula en un fichero wav, mediante la orden soundlog start.

- Para capturar la imagen en movimiento utilicé un programa bastante simple y antiguo llamado Xvidcap. Permite seleccionar un recuadro de la imagen de la pantalla y grabar en un fichero MPEG un vídeo de lo que ocurre en ella.

- Ya tengo el vídeo y el audio por separado, ahora hay que recortarlos un poco y unirlos. Para ello uso Avidemux, pero tiene un problema, y es que no deja editar vídeos si no son AVI, y el que yo tengo es MPEG.

- Lo convierto a ese formato con otro programa más, Mencoder, que viene con Mplayer, un gran reproductor de vídeo para Linux que se traga prácticamente todo lo que le eches.

- Una vez convertido a AVI, lo abro con Avidemux, le digo que le ponga el audio de un fichero externo, y me dedico a cortar por aquí, poner desfases por allá, para que lo que se ve y se oye esté lo más sincronizado posible.

El resultado es bastante decente, más que nada porque el sonido y la imagen no están fuertemente relacionados. El problema que me encontré fue que en el vídeo faltan frames, porque mi ordenador no da de sí lo suficiente para correr el emulador y comprimir MPEG2 en tiempo real. Tendré que probar alguna optimización, como reducir el tamaño de la ventana del emulador, o capturar en imágenes fijas y luego generar el vídeo en lugar de comprimirlo al mismo tiempo.

Por cierto, resulta curioso que en trasto que corre a 2400 Mhz necesite más o menos un 30% - 40% de CPU para emular un cacharro que iba a 3,5 Mhz :-)

viernes, septiembre 08, 2006

Fechas del futuro

El otro día un usuario me llamó para decirme que tenía un problema extraño con una aplicación. Cuando arrancaba le salía el siguiente error:

system clock has been set back

A lo que inmediatamente le pregunto si ha cambiado la fecha del ordenador y me dice que sí, que estaba mirando el calendario del Windows y sin querer adelantó dos meses la fecha actual. Le digo que le ponga la fecha bien y pruebe otra vez, y me dice que ya lo ha hecho y sigue sin funcionarle.

Me acerco porque nunca me ha pasado algo como esto y quiero verlo con mis propios ojos. Primero sincronizo el reloj del ordenador al segundo con el controlador del dominio con el comando 'net time /set /yes \\servidor_de_dominio'. Vuelvo a intentarlo y nada, pasa lo mismo.

Desinstalo el programa y lo vuelvo a reinstalar un par de veces sin ningún resultado. Fijándome bien en la ventana del error me doy cuenta de que el problema no es del programa en sí (Ansys, en este caso) sino de su gestor de licencias, FlexLm. Lo siguiente que hago es reinstalar solo este componente, sin que tampoco se resuelva el problema. Después de desinstalarlo una vez más, elimino la carpeta donde estaba, que se había quedado sin borrar junto con un par de ficheros, y elimino toda referencia que encuentro en el registro del Windows. Reinicio, lo instalo, vuelvo a probar, y nada, que sigue sin funcionar.

Meto el error en el google y encuentro muchas páginas donde se habla sobre el error, pero ninguna dice cómo solucionarlo. Tras un buen rato al fin encuentro una pista. Viene a decir que hay que buscar todos los ficheros del ordenador que tengan fecha del futuro y borrarlos. Y que si alguno de ellos es del sistema (alguna DLL), entonces no queda más remedio que reinstalar el Windows.

Vuelvo al ordenador y hago eso, con el buscador del pu*o perro del XP busco todos los ficheros de fecha posterior a la que me encontraba y me salen muchos. Y como era de esperar, algunos son programas que si me los cargo así sin más puede suceder cualquier cosa. Y desde luego, me niego a reinstalar el ordenador solo porque a causa de un cambio de fecha uno de los programas no funciona. ¿Qué hacer? Si fuera un sistema Linux lo arreglaría en dos patadas con los comandos find y touch, pero en Windows no se cómo hacerlo. Mientras, el perro de la ventana de búsqueda me mira sonriente a través de la pantalla, como regondeándose de mi adversidad.

Entonces se me ocurre... ¿y por qué no arreglarlo igual que lo haría en Linux? No cuesta nada probarlo, así que voy y me bajo el Cygwin, que es un conjunto de utilidades y programas de Linux portadas a Windows, y que tiene herramientas como el bash, el find y el touch. Lo instalo, y observo con agrado que la instalación por defecto trae esas utilidades y no tengo que seleccionar entre varias decenas de paquetes adicionales, así que le doy a Siguiente -> Siguiete -> Siguiente y en pocos minutos lo tengo instalando.

Entonces me abro una ventana de bash y ejecuto estas dos únicas órdenes:

touch ahora_mismo.txt
find / -newer ahora_mismo.txt -exec touch {} \;

touch sirve para cambiar la fecha y hora a un fichero. Si no se especifica ninguna, pone la de ese momento. Si se indica un fichero que no existe (ahora_mismo.txt) lo crea vacío.

find es para buscar ficheros que cumplan alguna condición en todo el árbol de directorios, en este caso ficheros que sean más nuevos que el que acabo de crear. Con -exec le digo que para los ficheros encontrados ejecute la acción que va a continuación, que es de nuevo el comando touch para poner la fecha de ahora al fichero, que se indica mediante las dos llaves {}. El \; del final es para indicar el fin del comando.

O sea, lo que hace es buscar todos los ficheros del disco duro cuya fecha de creación sea del futuro, y a los que encuentre les ponga la fecha actual.

Lo dejo corriendo unos minutos mientras oigo como rasca el disco duro. Observo en la ventana del bash que además de en los ficheros busca también en las claves del registro de Windows, cosa que yo no sabía. No puede modificarlas porque no tiene permiso, pero me lo apunto en mi cabeza por si puede serme útil en el futuro. Cuando termina, procedo a lanzar otra vez el programa.

Y funciona :)

Eso es solucionar el problema 'a la Unix way'.

lunes, septiembre 04, 2006

Backup al apagar el ordenador

Mi amigo Ocularis recientemente se ha hecho ubuntero y un día hablando me preguntó si era posible hacerse una copia de seguridad de su directorio home cada vez que apagase el ordenador. La respuésta es que , de forma bastante sencilla. Como no es la primera persona que me pregunta eso (de hecho es la segunda :-) lo voy a explicar porque puede ser de interés para quienes caigan por aquí googleando.


Directo al grano

Lo primero que hay que hacer es programarse un pequeño script que sea el que haga la copia de seguridad en sí mismo. Se puede crear con tu editor de texto favorito (vi, emacs, nano, pico...). Por ejemplo, algo como esto:

#!/bin/sh
DIR_ORIGEN=/home/pepito
DIR_DESTINO=/mnt/disco_externo/copia_seguridad

echo "******************************"

echo "Haciendo copia de seguridad..."
echo "******************************"

cp -Ru $DIR_ORIGEN $DIR_DESTINO


Que lo que hace es copiar (comando cp) el directorio DIR_ORIGEN (/home/pepito) y todos sus subdirectorios (opción -R) en el directorio DIR_DESTINO (/mnt/disco_externo/copia_seguridad). La otra opción de cp, la -u es de update, y lo que hace es que si ya existen en el destino los ficheros, solo los copia (sobrescribiéndolos) si el fichero de origen es más reciente. De esta forma, la primera vez que hagamos la copia le costará un rato, pero en las veces sucesivas solo se copiarán los ficheros que hayamos modificado y será más rápida. La primer línea (#!/bin/sh) sirve para indicar qué interprete de comandos ha de usarse para ejecutar el script. Si no entiendes que significa esto, no pasa nada, quédate con que es la forma habitual correcta de comenzar un script.

Ya tenemos el script, que supongamos que hemos llamado backup.sh. No olvidéis darle permisos de ejecución para que no haya problemas: chmod +x backup.sh


Ahora vamos a hacer que se ejecute cuando apaguemos el ordenador. Para ello nos situaremos en el directorio /etc/rc0.d Una vez ahí escribiremos lo siguiente:

sudo ln -s /home/pepito/backup.sh K10mi_backup

Si listamos el contenido del directorio veremos que aparece una línea:

lrwxrwxrwx 1 root root 18 mar 21 2005 K10mi_backup -> /home/pepito/backup.sh

Lo que hemos hecho es un link, que es una forma de nombrar un fichero cualquiera (/home/pepito/backup.sh) con otro nombre diferente (K10mi_backup). Y además, por haberlo puesto en ese directorio, se ejecutará cuando apaguemos el ordenador.

Pues ya está, sencillo ¿verdad?


Mejoras (para nota):
- Comprimir lo que se va a copiar (Pista: tar cvfz... ).
- Guardar varias copias de fechas distintas.
- Informar al usuario en el siguiente arranque del resultado de la copia (por ejemplo con un mail).
- Lo anterior solo funciona al apagar el ordenador, pero no al reiniciarlo. ¿Cómo hacer que también se ejecute en ese caso? (pista: leer el siguiente apartado y saber que el nivel 0 es el de apagado y el 6 el de reinicio)


La explicación

Se me han ido las ganas de escribir, ja ja, pero en este link tenéis una explicación muy completa de cómo funciona el arranque y parada de un sistema Linux. Lo anterior se aplica a casi todas las distribuciones de Linux con pequeñas variaciones, y a otros sistemas Unix como Solaris o HP-UX. En cambio, en otras familias (AIX, FreeBSD y derivados) la cosa funciona de otra manera.

Editado: En la explicación del link anterior hay un pequeño error, que un anónimo usuario de ubuntu ha descubierto y comentado.