Publicando Jargonaut

Estos últimos meses he estado trabajando en un nuevo proyecto en JavaScript. Después de romperme la cabeza para encontrarle un nombre, he acabado llamándolo Jargonaut: “jargon” significa jerga o argot en inglés, y “jargonaut” es quien está acostumbrado a escuchar o utilizar jerga.

Jargonaut es un intérprete de lenguaje Jargon, definido mediante un juego de instrucciones ampliable, que se vuelven cada vez más específicas con cada plugin que añadas. El código se escribe mediante XML, aunque implementar soporte para JSON sería muy sencillo. La librería del intérprete se carga en una página web, y al instanciarlo se le indica el fichero con el programa para que lo cargue mediante AJAX. El programa Hola Mundo sería:

<?xml version="1.0" encoding="UTF-8" ?>
<function id="MAIN_FUNCTION">
	<alert>¡Hola Mundo!</alert>
</function>

Inicialmente, el proyecto surgió de un experimento para programar un juego del género novela visual, que son unos juegos con mucho texto y algunas imágenes, centrados en contar una historia de forma parecida a como hacen los libro juegos. Poco a poco el experimento fue creciendo, y me di cuenta de que podía generalizar el motor para que pudiera realizar otras tareas menos específicas. Así cree un núcleo y una serie de plugins, ofreciendo cada uno nuevas instrucciones para permitir realizar distintas acciones.

El intérprete se apoya en las librerías de software libre jQuery y jQuery UI para el crossbrowsing y los efectos visuales sobre una página web. El lenguaje Jargon tiene una sintaxis muy simple: soporta variables locales y globales, estructuras de control y bucles, funciones e hilos simulados, pero no orientación a objetos. Utiliza el lenguaje subyacente, JavaScript en esta implementación del intérprete, para realizar diversos cálculos aritméticos y acciones más complejas.

Ayer me entretuve en subir a GitHub los distintos componentes de Jargonaut, incluyendo un par de librerías que ya utilizaba en CanvasBooster, que he aprovechado para mejorar. Podéis seguir los links a los repositorios desde la página del proyecto.

  • Facebook
  • Twitter
  • Google Plus
  • Delicious
  • Meneame
  • StumbleUpon

Plantilla POO para JavaScript

Últimamente estoy programando mucho en JavaScript. Este lenguaje se basa en prototipos en lugar de en la instanciación de clases como C++ o Java, y resulta un cambio de paradigma un tanto extraño para el que está acostumbrado a esos otros lenguajes. Desde que empecé a usar en serio JavaScript, hace unos tres años, he ido puliendo una pequeña plantilla para la creación de prototipos que creo que está lo bastante decente como para compartirla con el mundo:


// --- %Package%/%Class%.js ------------------------------------------------------

// --- Constants ---

// %Package%.%CLASS%={};

// --- Class ---

%Package%.%Class%=function(%param%){

// --- Attributes ---

// --- Reset ---

	this.reset=function(%param%){
// 		%Package%.%Class%.prototype.reset.call(this);

// 		// Inheritance protection
// 		if(%param%!==undefined){
// 			// Initialization
// 
// 		}
	};

// --- Other methods ---

	this.toString=function(v){
		var
			r='[object '+this.className
		;
		if(v===true){
			r+=' '+JSON.stringify(this);
		}
		return r+']';
	};

// --- Reset call ---

	this.reset(%param%);

};

// --- Inheritance ---

// %Package%.%Class%.prototype=new %ParentPackage%.%ParentClass%;
// %Package%.%Class%.prototype.parent=%ParentPackage%.%ParentClass%;
%Package%.%Class%.prototype.constructor=%Package%.%Class%;

// --- ClassName ---

%Package%.%Class%.prototype.className='%Class%';

// --- Static ---

// %Package%.%Class%.prototype.=function(){};

Utilizo los caracteres de porcentaje para poder hacer reemplazos rápidos después de un copia y pega. Incluso podrías generarte un script que te pregunte por las sustituciones y genere el archivo ya listo para usar.

Como véis, el prototipo se genera mediante una función, que se llama constructora. Al hacer un new de esa función obtendremos un nuevo objeto con las características especificadas en la función. Podemos crear métodos y propiedades asignándoselos a this, que representa a la instancia generada. De esta forma, las propiedades y métodos creados serán accesibles desde cualquier otro punto de nuestro programa, como cuando en otros lenguajes les atribuimos visibilidad public. Para hacerlos inaccesibles desde el exterior como si fueran private, hay quien utiliza la palabra reservada var, que define variables. Personalmente no lo recomiendo porque esas propiedades y métodos no serán heredables. Realmente, JavaScript no está preparado para ese tipo de ocultación, aunque hay quien sigue la convención de nombrar a las propiedades y métodos que deberían ser privados empezando con un guión bajo, por ejemplo: this._propiedadPrivada. No impedirá que se acceda desde el exterior, pero indicará a los programadores humanos que no tendrían que estar haciéndolo.

Las líneas de código tras la función sirven para asignar un prototipo del que heredar propiedades. Mirad un momento el comentario de “Inheritance protection” dentro del método reset. Utilizo ese if para no inicializar el objeto cuando otro prototipo se defina como heredero de éste, cosa que se hace al igualar el prototipo propio al del padre. Mirad la línea de código justo después del comentario “— Inheritance —”.

Tengo también la costumbre de incluir una propiedad llamada className en el prototipo para ayudarme a identificar los objetos. Cualquier cosa que se asigne directamente al prototipo de la clase será compartida inmediatamente por todas las instancias de la misma, algo que puede resultar muy útil, pero que a mí me parece un poco caótico y sólo lo hago en este punto. También serán propiedades o métodos accesibles sin necesidad de instanciar un objeto, por lo que los métodos se parecen a los static de otros lenguajes.

JavaScript es un lenguaje que puede resultar extraño si nunca has salido de los tradicionales lenguajes basados en la instanciación de clases, pero es muy potente si eres capaz de cambiar el chip y aprendes a usarlo como toca. Espero que mi plantilla os ayude a entenderlo mejor.

  • Facebook
  • Twitter
  • Google Plus
  • Delicious
  • Meneame
  • StumbleUpon

ImageMagick por Línea de Comandos e Impresiones Desatendidas con Java

Recientemente he estado desarrollando una pequeña aplicación para mi padre, encargada de facilitarle la creación e impresión de etiquetas para supermercados.

La aplicación se divide en un archivo BAT y un programita en Java:

  1. El archivo de procesamiento por lotes se encarga de leer un fichero CSV con la descripción de las etiquetas, a modo de base de datos. Va componiendo una a una cada etiqueta y después las combina en varias páginas de 3 columnas y 8 filas. Para ello realiza llamadas a los programas por línea de comandos del paquete de software libre ImageMagick. Es una biblioteca de funciones para trabajar con imágenes, muy útil y popular, que suele utilizarse para generar miniaturas, previews, marcas de agua y muchos otros efectos en páginas web y programas.

    Etiqueta de muestra

    Etiqueta de muestra con datos falsos. Aunque la biblioteca ImageMagick es capaz de realizar muchos efectos visuales, esta apariencia era suficiente para el proyecto.

    Os dejo aquí el código del BAT por si tenéis interés. Está publicado como dominio público, así que podéis hacer con él lo que queráis, aunque estaría bien que dejárais un comentario por aquí si os resulta útil.

  2. Una vez generadas las páginas con etiquetas, es necesario imprimirlas. Debía hacerlo desde MS-DOS y de forma desatendida, es decir, sin mostrar ventanas de configuración de página e impresión. Estuve buscando en Internet algún programa que ya hiciera esto, pero tras un par de horas infructuosas decidí implementarlo yo mismo. Escogí Java porque ya lo conozco y he trabajado previamente con el IDE NetBeans, aunque de tener tiempo me hubiera gustado utilizar Python.

    Tuve que inspirarme un poco en los ejemplos que encontré por Internet, pero el resultado fue aceptable. El programa recibe por parámetros la imagen a imprimir, el nombre de la impresora a utilizar, y un fichero XML de configuración de página y trabajo de impresión. De esta forma el proceso queda desatendido, y pueden lanzarse cientos de trabajos sin intervención del usuario.

    Pego a continuación el código por si a alguien le interesara. ¡Dejad algún comentario si os resulta útil!

La aplicación ya está en producción y mi padre más feliz que una perdiz. :)

  • Facebook
  • Twitter
  • Google Plus
  • Delicious
  • Meneame
  • StumbleUpon

Descontinuando TemaLibre

Bueno, hace unas semanas que terminó el plazo de Lánzanos para recaudar donaciones con las que financiar el proyecto TemaLibre, y lamentablemente no alcanzó la cantidad que solicitaba. Aunque me puse en contacto con muchas asociaciones de padres y de profesores, creo que no conseguí darle la difusión necesaria.

Tablón de anuncios en la Universidad Politécnica de Valencia, con un cartel del proyecto TemaLibre.

Tablón de anuncios en la Universidad Politécnica de Valencia, con un cartel del proyecto TemaLibre.

Una cosa sobre la que he estado reflexionando estos días es el tipo de proyectos que salen adelante en las plataformas de crowdfunding: suelen ser libros, videojuegos, discos de música, películas… Cuando el proyecto finaliza, hay un producto que puede venderse. Normalmente, una de las recompensas que ofrecen estas iniciativas por realizar una donación es el propio producto, una vez finalizado el proyecto. De esta forma, los mecenas sienten que están comprando por adelantado el producto final.

El proyecto TemaLibre no era así. Era más abstracto, y no espoleaba el deseo de poseer algo, sino el de realizar un pequeño bien a la comunidad. Tal vez a mucha gente no le resultaba suficientemente atractivo.

Poco después de finalizar el plazo de Lánzanos recibí una notificación de una empresa catalana, indicándome que habían empezado a ofrecer un servicio muy similar al de TemaLibre. Puesto que son una empresa, tienen todo el desarrollo ya realizado y un equipo de profesionales lo mantiene, creo que es un buen momento para descontinuar mi proyecto y pasar página. Por si hay algún interesado, la web de los catalanes es Liberdocs.

  • Facebook
  • Twitter
  • Google Plus
  • Delicious
  • Meneame
  • StumbleUpon