Han pasado muchas líneas de código desde que escribí sobre programación aquí la última vez y voy a hacer un resumen de las novedades en mis proyectos OpenSource. ¡Que son muchas y muy emocionantes! Posiblemente haga algún post específico por proyecto para estas novedades.
D Psp Emulator r301

Acabo de sacar la revisión r301 de mi emulador de PSP. La última release salió hace más de un año. Llevo ya varios meses trabajando en él a ratos, aunque me estaba esperando para liberar una revisión. Inicialmente estaba esperando a que saliese la parte comercial de http://kawagames.com/ aunque se ha alargado mucho y he decidido sacarlo antes. En cualquier caso la parte comercial de Kawagames debería salir dentro de no demasiado. En cuanto los desarrolladores que tenemos en la lista terminen de actualizar sus juegos y los suban.

En fin, a lo que vamos. Voy a empezar por un mini-changelog resumido:

  • ¡Ya se ejecutan algunos juegos comerciales! Echa un vistazo a nuestra lista de compatibilidad, y no dudes en añadir los juegos que falten.
  • ¡¡Un nuevo núcleo multihilo hecho de cero!! Utiliza un hilo nativo por cada hilo de la psp. Así que será mucho más rápido en CPUs modernas con varios núcleos. Multitud de juegos usan varios hilos de cpu, uno para el juego, otro para decodificar audio… antes de esta release, la cpu se ejecutaba en un único hilo nativo, ahora usará un hilo de windows por cada hilo de psp que se ejecutará en paralelo en diversas cpus sin ninguna penalización del intercambio de hilos, porque no habrá ninguno.
  • ¡Morphing y skinning de CPU!
  • Componentes sincronizados mediante mutex y eventos en vez de hacer polling. (Aunque aún no es perfecto). Un diseño mejor y más rápido que elimina con algunos cuellos de botella.
  • ¡Más compatibilidad con homebrews!
  • ¡Ahora se usa eclipse como IDE, usando DDT para tener autocompletado! Mucho más productivo.
  • Limpieza de código
  • Más APIs implementadas
  • Filtros de salida: hq2x y escalado bilinear…
  • Trucos (habilitados por línea de comandos)
  • Línea de comando para usuarios avanzados. “pspemu.exe –help” para ver un listado de comandos.
  • Muchísimo trabajo
  • Soporte de música de fondo (Atrac3+) habilitados al disponer de SonicStage (y el codec WaveOut).
  • Y mucho más…

Muchas novedades y muy emocionantes.

Multihilo por thread nativo en un emulador de una consola es algo muy raro de ver. Sólo se puede conseguir con una emulación HLE, y en máquinas de un solo core, puede llegar a haber problemas en juegos que hagan uso de que cada hilo va a ejecutar un número X de instrucciones antes de pasar a algún otro. Si no está sincronizado, puede haber problemas. Aunque se puede simular un entorno singlecore pausando y reanudando hilos. Y es posible que lo haga como un modo de compatibilidad para ciertos juegos que estén mal programados y no hagan un uso correcto de las primitivas de sincronización.

Los juegos comerciales no habían funcionado nunca porque no había implementado correctamente ni la carga dinámica de módulos, ni funcionaba correctamente el relocalizador de código. Y todos los juegos de la PSP usan PIC (Position Independent Code).

Ejecuta el juego Tales of Eternia. Fue mi primera traducción, mi primer hacking, mi primera introducción a los algoritmos de compresión… Y ahora también uno de los primeros juegos comerciales que emulo.

Hablaré sobre más detalles y cosas interesantes del emulador en un post próximo.

as3exec

Tras sufrir lo insufrible haciendo unittesting cutre con ActionScript3 usando ASUnit. Y ante la imposibilidad de poder automatizar la ejecución automática de tests. Que es una práctica fundamental en los procesos de integración continua, decidí montar algo para poderlo hacer. Y el resultado es este proyecto OpenSource.

La idea es muy sencilla. Usando .NET, creo una ventana invisible donde coloco un componente ActiveX con un reproductor de flash cuya versión puedo elegir pasándole a la aplicación su correspondiente archivo OCX. Al componente ActiveX se le pasan una serie de métodos mediante el ExternalInterface que permiten escribir por la salida estándar y terminar la aplicación. (Justo lo necesario para automatizar y analizar ejecuciones).

Monté la aplicación en C#, el ExternalInterface y un miniframework para hacer unittesting.

http://code.google.com/p/as3exec/source/browse/#svn%2Ftrunk%2F](http://code.google.com/p/as3exec/source/browse/#svn%2Ftrunk%2Fbin)

Así que si quieres hacer TDD en AS3 y te gustaría poder automatizar los tests, no dudes en usar este proyecto. Aunque tiene muy pocos commits, creo que es lo bastante sencillo para poderse considerar medianamente estable y usarse en proyectos reales.

CSharpUtils.Templates

Este es el proyecto con el que he estado los últimos tres días. Lo empecé hace tiempo, pero ahí se había quedado.

Últimamente estaba empezando a notar lo lento y poco estable que es PHP en casi todo. Y he encontrado la solución a la lentitud e inestabilidad de PHP: No usarlo.

Estuve varios días investigando formas de usar FastCGI de verdad en PHP. Vi el proyecto PHPDaemon, pero no se ajustaba a lo que me interesaba. Implementa libevent y programación asíncrona. La mar de chunga. Porque PHP no está pensado para eso y es muy incómodo. Los delegados son infumables en cuanto intentas acceder a los contextos ascendentes te das cuenta de que lo han hecho incómodo de la leche intentando mantener algo más de rendimiento.

PHP es un amasijo de cagadas. Mal diseño, interpretado y lento, lleno de memory leaks y antipatrones de diseño que hacen que hayan bugs y fallos de seguridad por todas partes. Y además no puedes hacer nada serio con él. Porque a la mínima te salta un FatalError y te jode el invento. Y si te estás planteando en montar FastCGI con PHP, el que no hayan FatalErrors es fundamental. Porque es el propio PHP el que tiene que mandar el resultado por un socket. Y si peta en mitad de una ejecución, no vas a poder mandar nada. PHPDaemon intentaba solventar el tema usando forks. Pero no tengo muy claro que eso sea lo más eficiente.

Últimamente estoy usando en mis proyectos de PHP, Twig. Twig es un sistema de templates cojonudo al más puro estilo django, con soporte para herencia de templates, macros y cosas cañerillas. Es muy sencillo de usar y quedan unos templates muy claros y concisos.

¿Qué pasa? Que Twig, tiene bastantes clases y bastante código que ejecutar para arrancar. Y PHP funciona de una maravillosa forma que cada vez que alguien hace una petición se empieza de cero. Y he ahí mi interés en usar FastCGI. Con FastCGI puedes tener en memoria todas las clases, templates y caché de primer nivel que quieras y además es una memoria compartida si usas threads en vez de procesos. Y el código de inicialización de las librerías se hace una única vez: al iniciar el servidor de FastCGI.

Pero nuevamente, FastCGI real es incompatible con PHP y lo va a ser para el resto de la eternidad.

Así que como PHP no es el que va a cambiar, voy a ser yo el que haga el cambio. Estuve mirando ASP.NET, pero era demasiado “on rails” para mi gusto. A mí me gusta tener control total sobre mi aplicación. Tener una aplicación normal y que cada parte se ejecute por un código controlable y a mi gusto.

Me gustan los templates de django/Twig, quiero usar el servidor web que me de la gana (voy a usar nginx) y me quiero montar mi framework como quiera.

Monté el proyecto CSharpUtils con esa idea en mente. Y ahora hay un montón de módulos interesantes.

Para empezar tengo un módulo para montar un servidor de FastCGI y una clase que extiende de esa para gestionar peticiones fastcgi de HTTP fácilmente.

Luego tengo mi sistema de Templates tipo Twig/Django. Los sistemas de templates tienen que ser cómodos de usar y tragarse todos los errores, así que he hecho que funcione con tipado dinámico y que se trague todos los errores. Con .NET #4.0 es bastante fácil.

Si quieres hacer cosas escalables y mantenibles con el tiempo conviene usar TDD. Visual Studio soporta TDD de una forma muy cómoda.
También tener tipado estático y autocompletado ayuda mucho. En PHP muchas veces no era posible. Y aunque Eclipse hacía maravillas, en PHP se pierden los tipos por todas partes y acaba siendo un engorro. Esto se acabó para mí con .NET. Tengo tipado estático y la máquina virtual de http://mono-project.com/Main_Page que es la leche de rápida. Adiós a implementar algoritmos con guarradas mediante funciones de alto nivel para que funcionasen bien en PHP.

Por cierto, antes usando PHP, el flujo de deploy consistía en actualizar una carpeta, borrar cachés pertinentes y demás.
Ahora mi flujo será: compilar el ejecutable embebiendo código y templates, subir archivos estáticos que servirá nginx directamente, parar progresivamente los servidores fastcgi de los que sirva nginx e ir lanzando los nuevos. Que por cierto FastCGI permite lanzar el programa con cualquier usuario, así que aunque alguien pudiese obtener acceso de ejecución de código (cosa muy jodida con .NET), tendría los privilegios del usuario desde el que hubiese lanzado la instancia de mi servidor FastCGI.

Médicos sin Fronteras

Me estaba esperando a que saliese el emulador y Kawagames para hacerlo público. Pero voy a empezar a hacer donaciones a organizaciones de caridad a partir de ya, utilizando los beneficios que me reporten mis proyectos comerciales o de las donaciones que me pudiese hacer la gente.

Voy a donar el 10% de todos mis beneficios en mis proyectos: Kawagames, publicidad del emulador de PSP, donaciones y futuros proyectos comerciales.

La donación la haré trimestralmente, empezando desde que salgan los juegos comerciales en Kawagames.

Desde mi punto de vista creo que todas las personas que ejerzan actividades comerciales, deberían donar un porcentaje a buenas causas. Si lo hiciese todo el mundo, este planeta sería un lugar mejor. Así que no dudéis en hacerlo. Un pequeño gesto individual no marca la diferencia como tal, pero entre todos podemos hacer de éste un mundo mejor.

Y bueno, por ahora quería contar todo esto. Ya iré dando más detalles poco a poco.