Node.Net: Servicios, sistema virtual de archivos asíncrono y soporte LESS #nodenet #async #dotnet

Estos días he seguido trabajando en Node.Net. He corregido muchos bugs, haciendo el sistema más estable y le he metido soporte de servicios NT al sistema. Simplemente cualquier programa compilado con Node.Net podrá funcionar como un servicio sin hacer nada especial. Lo único que hay que rodear el código principal del Core.Loop. Y he metido un sistema virtual de archivos asíncrono que se podrá usar en cualquier sitio donde esté Node.Net y también he metido soporte para LESS CSS.

Sistema Virtual de Archivos Asíncrono con File Watching:

He añadido un sistema virtual de archivos asíncrono que permitirá hacer un uso transparente de cualquier implementación del sistema de archivos. Desde un sistema local de archivos, pasando por un archivo zip, una iso, un sftp o ftp… Se podrán servir y leer archivos y directorios desde cualquier sistema de archivos.
Además los sistemas de archivos permiten file watching, que permite saber cuando se ha modificado un archivo. Ideal para evitar polling de cara a saber si un archivo se ha modificado. Así que en cada petición se sirve el archivo cacheado sin hacer ningún acceso a disco y en cuanto se modifica el archivo se borra de la caché. Es óptimo y funciona muy bien tanto en desarrollo como en producción. El sistema virtual de archivos también centraliza en un sitio el tema de rutas relativas, y si se usa no habrá posibilidad de bugs en relación a salirse de una carpeta.

Mejoras:</span>

He añadido soporte para cabeceras ETag, Last-Modified y otras y pronto añadiré soporte para compresión con caché de archivos comprimidos para estáticos.

LESS CSS:</span>

He metido soporte para LESS CSS haciendo uso de la librería DOTLESS. El soporte permite trabajar de forma transparente con archivos .less. Simplemente registrando el módulo LESS y cuando pides un archivo CSS, se mirará si hay un archivo .less con el mismo nombre y si lo hay lo procesará y cacheará el resultado. Si se modifica el archivo .less el File Watching se entera y borra la caché de forma transparente. Además la caché asíncrona que monté hace que si hay dos peticiones concurrentes y se está generando un archivo, la segunda petición se espere a que la primera termine. Con lo que esto también es óptimo.

Leer más...

Node.Net: Integrado sistema de templates con herencia y de caché asíncronos #nodenet #async

Módulos asíncronos actuales integrados en Node.Net:

Templates (introducción)

Acabo de portear mi sistema de templates similar a Django y Twig a asíncrono. El sistema de templates lo hice inicialmente para CSharpUtils y era síncrono (aunque empecé a soportar asíncrono, pero no llegué a terminarlo en su momento).

AsyncCache

https://github.com/soywiz/NodeNet/blob/master/NodeNetAsync.Tests/Utils/AsyncCacheTest.cs

También he añadido un sistema de caché asíncrono AsyncCache<TKey, TValue>. Lo utilizo en el filtro para servir estáticos y ahora también en el sistema de templates.
El funcionamiento es muy sencillo: se instancia el objeto y se lanzan peticiones GetAsync con una clave y un delegado que generará el valor a cachear en el caso de que no esté ya en la caché. La ventaja que tiene es que si la clave ya se está generando, el GetAsync espera a que el otro generador termine, evitando race conditions y evitando ejecutar el generador varias veces.

Leer más...

Novedades en Node.Net : Websockets, Redis y más #nodenet #dotnet #async

He estado haciendo más cosas en Node.Net.

Cliente de Redis:

Por lo pronto he añadido un cliente de Redis (junto al que ya hice de MySQL):
Aquí podéis ver un ejemplo: https://github.com/soywiz/NodeNet/blob/master/NodeNetAsync.Examples/RedisTestProgram.cs

Soporte para WebSockets:

(Conexión bidireccional que permite hacer push desde el server en vez de tener que hacer polling desde el cliente.)

Y por otro lado he añadido soporte parcial de WebSockets. Por ahora únicamente he probado con Google Chrome y únicamente soporta la versión 13 de las especificaciones. He implementado un servidor de chat con alguna cosilla interesante.

https://github.com/soywiz/NodeNet/blob/master/NodeNetAsync.Examples/WebSocketTestProgram.cs](https://github.com/soywiz/NodeNet/blob/master/NodeNetAsync.Examples/WebSocketTestProgram.cs)

Leer más...

Presento: Node.Net alternativa real a Node.JS (¡Video Tutorial incluído!) #csharp #nodejs #dotnet #async

Ya expliqué los principales ventajas e inconvenientes de Node.JS, PHP y .NET en otro post: http://blog.cballesterosvelasco.es/2012/01/comparativa-entre-php-nodejs-y-net-php.html
Llevo un par de días montando Node.Net. Una alternativa a Node.Js que hace uso de las nuevas características de .NET 4.5.

Poned el vídeo a 720p y a pantalla completa para que se vea bien.

Proyecto: https://github.com/soywiz/nodenet

¿Qué sentido tiene montar otra cosa como Node.JS?

Aquí es donde entran los inconvenientes de Node.JS:

  • Tipado completamente dinámico (los IDEs lo tienen difícil con el autocompletado) y generalmente se trabaja sin autocompletado y detectando los errores al ejecutar o al depurar en vez de detectarlos mientras se escribe el código
  • No hay un IDE en condiciones
  • Flujo orientado a eventos
  • Javascript no tiene clases ni muchísimas cosas que se echan en falta.
  • La forma en la que en Javascript se extienden cosas es muy problemática (en .NET con los extension methods es mucho mejor)
  • La propagación de excepciones de penosísima y es prácticamente inexistente (precisamente porque los eventos no mantienen un estado restaurable)

Leer más...

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:

Entry Point

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

var Runtime = new Php54Runtime(InteractiveErrors: false);

https://github.com/soywiz/nphp/blob/master/irony/NPhp/NPhp/Runtime/Php54Runtime.cs

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();

Leer más...

Suscribirse via RSS