Archive for the '17574' Category

CobolScript (4) Páginas Web con Plantillas, en Node.js

Monday, January 21st, 2013

Anterior Post

En el anterior post mostré a CobolScript generando salida basada en plantillas. Hoy quiero mostrar que eso se puede usar para generar páginas web. El ejemplo está en:

https://github.com/ajlopez/CobolScript/tree/master/samples/templateweb

El programa a ejecutar es simple:

var cobs = require('../..'),
    http = require('http'),
    fs = require('fs');

var program = cobs.compileTemplateFile('./factorial.cobp');

http.createServer(function(req, res) {
    program.run(cobs.getRuntime({ request: req, response: res }));
}).listen(8000);

console.log('Server started, listening at port 8000');

La parte clave es la llamada a compilar el archivo de plantilla. Esto produce una función JavaScript ya compilada, que puede invocarse varias veces. El llamado program.run ejecuta la plantilla ya compilada, dado un contexto de ejecución (“runtime context”). Ese contexto es armado en cada pedido web, dándole los objectos request y response de ese pedido. El contexto se arma internamente, de manera tal que toda la salida producida por el programa CobolScript se deriva a la salida del response. De esta manera, el programa no sabe nada de web, sólo genera texto. Podemos ver a este contexto de ejecución como un proveedor de servicios para el programa CobolScript. Sus propiedades pueden ser accedidas si definimos una LINKAGE SECTION como en COBOL clásico. Pero eso sería tema para otro post. Ese acceso no fue necesario en este simple ejemplo.

El archivo de plantilla contiene:

<h1>Factorial</h1>
<p>Page generated by CobolScript, using templates</p>
<table>
<tr><th align='right'>n</th><th align='right'>n!
</th>
</tr>
<#
local n.
perform show-factorial using n varying n from 1 to 10.
#>
</table>
<#
.
stop run.

show-factorial section using n.
local result.
perform factorial using n giving result.
#>
<tr>
<td align='right'>${n}</td><td align='right'>${result}
</td>
</tr>
<#
.

factorial section using n.
local m.
if n = 1 then return n.
subtract 1 from n giving m.
perform factorial using m giving m.
multiply n by m.
return m.
#>

Lanzamos el servidor con la línea de comando:

node server

Luego, navegar a localhost:8000, para obtener el resultado:

Próximo post: un sitio web dinámico, escrito en CobolScript, ejecutando sobre Node.js, accediendo a una base de datos MySQL.

Nos leemos!

Angel “Java” Lopez

http://www.ajlopez.com

http://twitter.com/ajlopez

Code Katas en JavaScript/Node.js usando TDD

Monday, January 14th, 2013

En estas semanas pasadas, he estado trabajando en ejemplos y módulos JavaScript/Node.js, usando TDD en cada paso. Practicar, practicar, practicar, el camino a la maestría.

Pueden ver mi progreso y revisar los commits que hago ante cada test. Lo que sigue es un resumen de este trabajo:

CobolScript: Ver mis posts un implementación de compilador de COBOL a JavaScript, con ejemplos de consola ejemplo web, usando MySQL y SimpleWeb.

SimplePipes: Una manera de definir pasaje de mensajes usando ‘pipes’ para conectar diferentes nodes/funciones en un grafo. Quiero extenderlo para que tenga proceso distribuido.

SimpleBoggle: Un programa que resuelve un tablero de Boggle, juega mejor que yo! Ver ejemplo de consola.

SimpleMemolap: procesamiento tipo OLAP multidimensional, pero usando un modelo en memoria. Hay ejemplo web que usa mi SimpleWeb (“dog fooding”):

SimpleChess: En progreso, define un tablero usando SimpleBoard, y ya calcula movidas. Estoy también trabajando en SimpleGo, para tener un tablero, un juego y evaluadores.

SimpleRules: Motor de reglas  “forward-chaining”, hacia adelante (ahora que está de nuevo “de moda” la programación reactiva. Trabaja inspirada en algoritmo RETE-2, detectando los cambios de estado para disparar las acciones apropiadas.

SimpleScript: Ver mi post con las primeras ideas sobre este lenguaje, que compila a JavaScript, trabajo en progreso.

Py2Script: Compilador de Python a JavaScript, primeros pasos.

SimpleWeb: Una capa de “middleware”, a la Connect, con un ejemplo web:

BasicScript: Mis primeros pasos para compilar Basic a JavaScript. Quiero usarlo como lenguaje de programación para juegos en el browser.

SimplePermissions: El code kata de este sábado a la mañana ;-). Implementa Sujetos (Subjects), roles, permisos, otorgados en contexto.

SimpleFunc: Serialización/Deserialización de funciones y objectos con funciones.

SimpleMapReduce: Explorando la implementación del algoritmo Map-Reduce (y una variante, que llamo Map-Process) tanto sincrónico como asincrónico.

SimpleTuring: Implementación de una máquina de Turing.

Cellular: Implementación de autómatas de estado, lineales o de otras dimensiaones. Incluye un ejemplo de juego de la vida en consola.

Y en estos dos días pasados, agregué:

NodeDelicious: Para recuperar mis enlaces desde la cuenta de Delicious (sin tener que lidiar con el XML que devuelve directamente la API), ahora que el sitio ha sido rediseñado y no tiene paginación. La gente de Delicious sigue pensando que uno usa los enlaces como un feed (que lo viejo se pierde), pero no, muchos usamos a Delicious como un “Mis favoritos” en la nube y queremos acceder por rango de tiempo.

SimpleSudoku: Una reescritura desde 0, con TDD, de mi anterior AjSudoku, resuelve tableros de Sudoku.

Tengo que trabajar en:

SimpleDatabase: Base de datos en memoria, puede que en algún momento le agregue persistencia en archivos.

Y como siempre, todo esto es muy divertido 😉

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

CobolScript (3) Plantillas

Sunday, December 30th, 2012

Anterior Post 
Siguiente Post 

Me gusta tener un motor de plantillas en los lenguajes que implemento, así que agregué uno a mi proyecto de código abierto CobolScript, un compilador COBOL a JavaScript. El primer ejemplo:

https://github.com/ajlopez/CobolScript/tree/master/samples/template

El código:

<#
data division.
working-storage section.
01 n.

procedure division.
#>
Factorial
---------

<#
perform show-factorial varying n from 1 to 10.

show-factorial.
local result.
perform factorial using n giving result.
#>
${n}!= ${result}
<#
.
factorial using n.
local m.
if n = 1 then return n.
subtract 1 from n giving m.
perform factorial using m giving m.
multiply n by m.
return m.
#>

El archivo plantilla es compilado a COBOL transformando cada texto en un comando DISPLAY … WITH NO ADVANCING (los saltos de línea ya están en el texto). El código entre <# y #> se copia tal cual en el programa COBOL. Cada expresión entre ${ y } se expande como otro parámetro al comando DISPLAY. Entonces, luego de compilar todo el texto a COBOL, CobolScript compila el resultado a JavaScript. La sintaxis de la plantillas es, entonces, una especie de “syntax sugar”.

La salida del programa anterior:

Factorial
---------

1!= 1
2!= 2
3!= 6
4!= 24
5!= 120
6!= 720
7!= 5040
8!= 40320
9!= 362880
10!= 3628800

Podría usar las plantillas para generar archivos de texto, y entonces, implementar generación de código en CobolScript, así como lo hice en AjGenesis (tanto en la variante clásica en .NET, como en Ruby o JavaScript/NodeJs). Antes de eso, ya tengo una implementación de páginas dinámicas basadas en este motor de plantillas (sí, páginas dinámicas en CobolScript, cosas vederes Sancho ;-). Pero es tema para otro post.

Nos leemos!

Angel “Java” Lopez

http://www.ajlopez.com

http://twitter.com/ajlopez