miércoles, 29 de febrero de 2012

Tutorial: Cómo hacer un compilador de PHP. Cosas básicas expresiones y sentencia IF #php #compiladores #dotnet

En relación a "Tutorial: Cómo hacer un compilador de PHP. Proyecto NPhp : Introducción #php #compiladores #dotnet"

Lo básico:

Partes:

NPhp está separado actualmente en 3 partes fundamentales:


Para ejecutar un archivo PHP lo primero que se hace es instanciar Php54Runtime

var Runtime = new Php54Runtime(InteractiveErrors: false);

El Runtime se encarga de instanciar una gramática que permitirá parsear el código, también se instancian varios ámbitos: ámbito de funciones, ámbito de variables globales y ámbito de constantes globales.

Posteriormente se le añaden las funciones globales nativas de forma lazy: Runtime.FunctionScope.LoadAllNativeFunctions();

El runtime permite generar un método nativo de .NET que se podrá ejecutar posteriormente:
var Function = Runtime.CreateMethodFromPhpFile(File.ReadAllText(args[0]), File: args[0], DumpTree: false, DoDebug: false);

Function es un Php54Function con un delegado de .NET generado dinámicamente on the fly.

Ejecutamos dicha función con un ámbito concreto, que para el caso de un archivo será el ámbito global:
Function.Execute(Runtime.GlobalScope);

Finalizamos el runtime, que finalizará los bufferes ob_ y que lanzará los callbacks de register_shutdown_function:
finally
Runtime.Shutdown();

Tutorial: Cómo hacer un compilador de PHP. Proyecto NPhp : Introducción #php #compiladores #dotnet

Este es el primer post sobre una serie de posts que quiero escribir sobre creación de compiladores y generación de código.

Para esta serie de posts he creado un proyecto en github con una pequeña implementación de PHP que permite ejecutar algunos programas pequeños.

Proyecto en github:
Submódulos míos usados:
Proyectos externos usados:
Para inventar pegarme una matada con parsers y lexers como ya ha hecho muchas veces: https://github.com/soywiz/as3evalhttps://github.com/soywiz/csharputils/tree/master/CSharpUtils/CSharpUtils.Templateshttps://github.com/soywiz/atpl.js he decidido usar Irony, un proyecto genial que permite definir gramáticas de una forma muy sencilla. Así que este tutorial irá dedicado a usar Irony y a la generación de código.
Inicialmente iba a usar goldparser que era el que conocía (y que además permitía importar las sintaxis del YACC), pero los tiempos de compilación que vi eran nefastos y probé irony, que es muy rápido (aunque la inicialización es algo lenta la verdad). Conservo las pruebecitas del goldparser aquí: https://github.com/soywiz/nphp/tree/master/sandbox

Mi nuevo emulador de PSP en C# #psp #emuladores #dotnet #csharp

Anoche hice pública la primera versión de mi nuevo emulador de PSP. Últimamente no tengo mucho tiempo y no he podido dedicarle el tiempo que me gustaría, pero como llevaba ya tiempo pudiendo ofrecer algo interesante, he apañado la interfaz y el repositorio y me he decidido a publicar la primera versión.

El post oficial es el siguiente:
http://pspemu.soywiz.com/2012/02/new-version-soywizs-psp-emulator-2012.html



Este emulador es el sucesor espiritual de mi anterior emulador de PSP que hice en D.
Dejé D de lado porque tardaba tanto en refactorizar código y en compilar, que no me merecía la pena. D es un buen lenguaje, y desde luego mucho mejor que C/C++, pero carece o al menos carecía de un buen IDE y en proyectos grandes el tiempo de compilación era excesivo (especialmente en mi caso que hacía un uso intensivo de los mixings y la metaprogramación que es o era interpretada y cuyos resultados no se podían cachear).

Unos meses después de abandonar el emulador de D, me reintroduje en el mundillo de .NET y actualmente lo que más uso es C# y PHP. Y C# ha pasado a ser mi lenguaje preferido desde entonces.

Creo que ya he hablado de las bondades de .NET y de C# concretamente, así que voy a obviar ese punto y me voy a centrar en las características del emulador.


Repositorio:


lunes, 20 de febrero de 2012

Simpre te recordaré Judini

Judini era mi gatita. Una gata que ha estado a mi lado casi 20 años. Judini, hija de gata blanca, y la gata negra que nunca trajo mala suerte y que ahora ya no está entre nosotros.

Hace 20 años, teniendo yo 5 añitos y cuando aún no le habíamos puesto nombre y no sabíamos si era macho o hembra, la perseguía por toda la casa. Para "sobrevivir" a mis incesantes persecuciones tuvo que aprender a esconderse y a desaparecer. Como rara vez la encontrábamos, decidimos ponerle de nombre Houdini, pensando que era un macho y en honor al mago escapista. Al final resultó ser una hembra, pero ya estaba el nombre en el registro y le mantuvimos en nombre.

Judini tuvo tres hijos: dos machos y una hembra, engendrados en algún verano cuando íbamos al chalet que tuvimos en la cañada. Dos de ellos los tuvimos que dar y nos quedamos con la hembra, Margarita; una gata con piel tigresa muy bonita. La tuvimos una temporada, pero cuando crecieron ambas gatas no podían ni verse, en un hábitat tan pequeño, tenían que marcar territorio meándose en los marcos de las puertas y bufándose a la primera de turno. Sin querer abandonar a Judini, tuvimos que dar también a Margarita y seguimos con Judini.

Por mi parte Judini tardó muchos años en perdonarme todas las cosas que le hice de pequeño. En compensación yo la cuidé, protegí y mimé todo lo que pude, intentando redimir mis pecados cometidos en una joven etapa de inmadurez e inconsciencia.

Ha vivido el último periodo de su vida en casa tranquilita, como a ella más le gustaba. Le dábamos de nuestra comida a diario y se la veía siempre ilusionada por tomar un poco de leche por la mañana y algo de nuestra comida al medio día y/o por la noche.

Hoy la hemos llevado mi madre y yo al veterinario para que dejase de sufrir. Llevaba meses con un tumor en el estómago que no había hecho más que crecer e ir degenerándola. Era una gata que no se rendía nunca. Vomitaba, se caía, pero siempre se volvía a levantar. Hasta el último momento estuvo luchando por seguir adelante, y fue una decisión muy difícil, pero poco a poco iba estando peor y hubiese acabado sufriendo todavía más.

Yo lo único que puedo hacer ahora es seguir adelante, sin olvidarla pero adelante. Va a ser muy triste ir a la cocina y no ver sus cosas, no verla despertar por las mañanas al sonido de abrir el recipiente de la leche, no verla subirse a todas partes o verla dormida en cualquier silla o en su cunita.

Judini fue un regalo de cumpleaños de mi padre para mi hermana. Y más que una mascota, para mí ha sido una amiga y una hermana. Te recordaré siempre Judini.

martes, 7 de febrero de 2012

Sitios recientes + Vincular destino = Productividad #trucos #windows #productividad

Introducción:

Aunque sabía que existía esta carpeta especial, no la utilizaba nunca. No me había parado a pensar lo útil que es.
Para los que no lo sepan, la carpeta "Sitios recientes" de Windows 7 (no sé a partir de qué  versión empezó a estar), guardar las últimas carpetas en las que hemos abierto un archivo. Cuando trabajamos en diferentes carpetas en el disco duro al final acabamos utilizando las mismas, y si están en rutas largas, encontrarlas acaba siendo un trabajo tedioso en el que invertimos más tiempo del necesario.

Sitios Recientes:

La carpeta de "Sitios recientes" la podemos encontrar en el explorador de Windows, aquí:



lunes, 6 de febrero de 2012

Transiciones alpha de máscara en C#/XNA para WP7 (sin shaders) #xna #wp7 #dotnet

Las transiciones alpha de máscara consisten en aplicar una máscara alpha con un desplazamiento a una imagen.

Hacer este efecto con cualquier sistema de shaders es trivial. Por ejemplo, yo he hecho esta animación con after effects y pixel bender:


jueves, 2 de febrero de 2012

Cargar archivos .OGG en XNA (o silverlight) #dotnet #xna

Actualmente me estoy enfrentando al problema de reducir al máximo una serie de recursos para un port a XNA de un juego. Al embeber archivos de imagen y de sonido como contenido de XNA, los archivos acaban siendo mucho más grandes que sus equivalentes en png, jpg o ogg.

Descubrí que XNA permite cargar archivos gif, png o jpg directamente:

Image = Texture2D.FromStream(GraphicsDevice, TitleContainer.OpenStream("image.jpg"));

Y luego vi el equivalente de SoundEffect. El FromStream de SoundEffect requiere que el archivo que se le pase sea un WAV. Hace no mucho empecé un pequeño port de la librería Jorbis (que a su vez está basado en libvorbis/libogg) a .NET administrado.
He hecho algunos apaños para que cargar archivos en XNA sea muy fácil:

SoundEffect = SoundEffect.FromStream(new OggToWavStream(TitleContainer.OpenStream("file.ogg")));

Para usarlo en proyectos XNA, basta con incluír la librería/proyecto NVorbis que se puede encontrar aquí:

https://github.com/soywiz/nvorbis/tree/master/NVorbis

El proyecto no tiene ninguna dependencia y es una librería portable. Para poderla abrir en el VisualStudio hace falta el siguiente plugin paa cargar librerías portables:
http://visualstudiogallery.msdn.microsoft.com/b0e0b5e9-e138-410b-ad10-00cb3caf4981/