27 noviembre 2007

Pasar DVD a AVI a mano

- Obtener del DVD los archivos VOB de la película

- Convertir los VOB a AVI (uno a uno)
mencoder -oac mp3lame -ovc lavc -lavcopts acodec=mp3:abitrate=192:vcodec=mpeg4:vbitrate=800 -vf scale=512:384 -o salida.avi VTS_01_1.VOB

- Se puede modificar abitrate, vbitrate y scale para modificar la calidad final

- Juntar varios AVI en uno solo
cat salida1.avi salida2.avi ... > entrada.avi
mencoder -ovc copy -oac copy -o final.avi -forceidx entrada.avi

mencoder viene con el mplayer

25 noviembre 2007

Encuentran código fuente en una ROM del Zelda de GB

Últimamente leo bastante Reddit Programming. Es parecido a Menéame pero de pirulas de programación. Casi siempre hay cosas sobre programación declarativa, haskell y cosas así de rancias, pero de vez en cuando aparecen artículos curiosos.

Hoy he visto éste: Game Development Archeology: Zelda on Game Boy comes with source. En él un pavo que se ve que domina bastante ensamblador cuenta como en algunas ROMs de juegos antiguos es posible encontrar trozos de código fuente en C, en ensamblador o de ficheros que no tienen nada que ver con el juego.

Lo que he entendido después de leer el artículo es que a veces se hacían juegos que ocupaban menos KB que el tamaño de la ROM y en esa época el MS-DOS no tenía protección de memoria a veces podía rellenar por error el espacio sobrando de la ROM con otros datos de la memoria que no tenían relación con el juego.

El autor explica cómo ha encontrado código en C en un juego de Zelda para Game Boy (no es el código fuente del juego) y otros ejemplos de cosas raras encontradas en ROMs de juegos.

22 noviembre 2007

Ejecutables "compactos"

¿Qué ocurre si compilas este código en C con gcc? ¿Cuánto ocupa el ejecutable generado?


#include <stdio.h>
#define TAM 10000

int matriz[TAM][TAM] = {{1, 2, 3, 4}};

int main(int argc, char *argv[]) {
return 0;
}



xim@cagallon:~/Desktop/lalala$ gcc big.c
xim@cagallon:~/Desktop/lalala$ ls -lah a.out
-rwxr-xr-x 1 xim xim 382M 2007-11-22 20:17 a.out


Sólo 382 megas. Esto es debido a que hemos creado una matriz muy grande y la hemos inicializado. Aunque sólo hemos puesto unos pocos valores, el gcc ha creado la matriz entera en el ejecutable.


#include <stdio.h>
#define TAM 10000

int matriz[TAM][TAM];

int main(int argc, char *argv[]) {
matriz[0][0] = 1;
matriz[0][0] = 2;
matriz[0][0] = 3;
matriz[0][0] = 4;
return 0;
}


Inicializando la matriz en el main en vez de en la definición nos ahorramos un poco de espacio en disco.


xim@cagallon:~/Desktoplalala$ gcc big.c
xim@cagallon:~/Desktop/lalala$ ls -lah a.out
-rwxr-xr-x 1 xim xim 6,2K 2007-11-22 20:19 a.out

14 noviembre 2007

Alegría Frontpage

Hoy me he llevado una gran alegría al enterarme de que el MS FrontPage dejó de desarrollarse hace años. La última versión que existe es la que viene con el Office 2003.

Según la WP ha sido sustituido por el programa MS Espression Web que forma parte del Expression Studio. Expression Studio es un "nuevo" paquete de MS especial para diseñadores. Ya que no tenía mucho sentido que el editor de páginas web formara parte de Office.

Cuanto daño ha hecho el Frontpage al mundo...

10 noviembre 2007

Metaprogramación en C++

No te acostarás sin descubrir alguna pirula nueva sobre programación.

Como todo el mundo debería saber, C++ incluye plantillas con las que puedes hacer estructuras de datos genéricas (por ejemplo listas) para luego utilizarlas con el tipo de datos que quieras sin tener que modificarla la plantilla (por ejemplo listas de enteros).

Hace unas semanas aprendí a hacer plantillas básicas para una clase que representa un autómata finito y no me pareció muy intuitivo lo de las plantilla.

Pues bien, el sistema de plantillas es tan potente y complejo (y difícil) que es capaz de simular un lenguaje de programación funcional (como haskell).

Se pueden crear expresiones funcionales con las plantillas, que se basen en el resultado de otras plantillas para crear expresiones más complejas (incluso recursivas). Como muestra un ejemplo que he visto por ahí en el que se define el factorial utilizando programación funcional en C++.


#include <iostream>
using namespace std;

template<int N>
class Factorial {
public: enum { value = N * Factorial<N-1>::value };
};

template<>
class Factorial<1> {
public: enum { value = 1 };
};

int main(int argc, char *argv[]) {
cout << Factorial<5>::value << endl;
return 0;
}


Este programa se compila con g++ y no da ningun problema. Se ejecuta y escribe por pantalla 120. Increíble.

Hay que ver las que cosas que se inventan...
Hay que ver lo pesado que es Ángel cuando cometes una o dos faltas de ortografía...

03 noviembre 2007

Lenguajes de programación

Antes he hablado de J y se me ha ocurrido mirar a ver qué otros lenguajes de programación tienen una triste letra como nombre. Hasta el día de hoy sólo había usado C y R (es un lenguaje interpretado orientado a los cálculos estadísticos) y había oído hablar de D como "mejora" de C++.

Esta es la lista de lenguajes que he encontrado:

APL (Significa A Programming Language, así que se considera válido)

B

C

D

E

F

G (es un "lenguaje" gráfico)

H

¿I?

J

K

L

¿M?

¿N?

¿O?

¿P?

Q

R (es una implementación open source de S)

S

T

¿U?

V

¿W?

¿X?

Y

Z

Si alguien está pensando en crear un nuevo lenguaje de programación, que tenga en cuenta que sólo quedan estas letras disponibles: I M N O P U W X. Habrá que ir mirando en utilizar caracteres UNICODE para poder poner más nombres...

Destaca el hueco de M N O P ¿qué pasa que nadie usa esas 4 letras?

Habría que fundar la LIANA (Language International Assigned Namee Authority) que se encargue de gestionar las concesiones de nombres de lenguajes de programación.

J

Acabo de descubrir el lenguaje de programación J. Me he enterado de que deriva del lenguaje APL. Al parecer son lenguajes que utilizan el paradigma array programming. No sé si soy un ignorante pero no conocía este paradigma, ni lo entiendo ahora que lo conozco.

Jugar al ajedrez con un filtro antiSPAM

Como todo el mundo sabe los filtros antiSPAM utilizando técnicas de Reconocimiento de formas* clasifican el SPAM. Para ello tenemos que marcarle los correos que son SPAM para que vayan "aprendiendo".

Pues bien, a este pavo se le ha que puede jugar al ajedrez con el filtro antiSPAM que ha creado. Para ello le pasa miles de partidas de ajedrez como si fueran emails SPAM para "enseñarle" y luego con unos scripts juega partidas con el filtro.

Un ejemplo más de lo que puede llegar a hacer la gente...

* Reconocimiento de formas es la traducción al castellano de "pattern recognition". En inglés no dice nada de formas porque se usa para reconocer cualquier cosa. En castellano se usa para reconocer cualquier cosa pero se le llamada reconocimiento de formas. Que tontos estamos...