ContextFreeArt: Arte Gráfico Generado por una GLC

Encontré un uso “artístico” de las Gramáticas de Libre Contexto. Ya hay algunos antecedentes en computación gráfica sobre aplicaciones orientadas a generar arte (que lamentablemente no tengo a mano), pero este es el primero en el que veo que se utiliza una gramática de libre contexto.

La aplicación se llama Context Free Art, el enlace es:

http://www.contextfreeart.org/

Es interesante mencionar que la búsqueda realizada en Google por medio de la que llegué a Context Free Art fue “context free grammar graphics computing”.

Context Free Art tiene su tiene su origen (o está inspirado) en una aplicación llamada SCIgen (An Automatic CS Paper Generator), que como su título indica, no es más que un “Generador Automático de Artículos (científicos) de Ciencias de la Computación”. Se puede encontrar más información sobre SCIgen en:

http://pdos.csail.mit.edu/scigen/

Esta última aplicación fue desarrollada por estudiantes de postgrado del MIT y no tengo claro aún, si lo hicieron sólo por diversión o con un objetivo científico/tecnológico concreto en mente. Aunque definitivamente suena a una buena broma. SCIgen también usa una gramática de libre contexto para generar de forma automática, imagino que dentro de ciertos parámetros y usando cierto lenguaje técnico codificado en la gramática, artículos científicos (con figuras, referencias y todo lo demás). Es evidente que, son artículos científicos totalmente inútiles, que no aportan nada. Sin embargo, es probable que alguien que no sepa mucho de computación (o un lector descuidado) caiga en la trampa y confunda un artículo generado por la aplicación por uno real. Por cierto que, el dolor de cabeza, el gran esfuerzo para tratar de entender un artículo generado por SCIgen y la frustración al no entender nada, probablemente son características que los artículos generados por esta aplicación comparten con muchos artículos científicos reales (¿humor académico?).

Inclusive, el grupo de SCIgen ha logrado que algunos de los artículos generados fuesen aceptados en conferencias (no es broma), y hasta han ido a las conferencias a defenderlos, según ellos, con una charla también completamente generada usando la misma técnica ¿curioso verdad? Los detalles de los artículos, e inclusive los detalles del arbitraje y la aceptación se pueden encontrar en el sitio web de SCIGen.

Volviendo a Context Free Art, la idea detrás de este generador de arte es definir una GLC que se utiliza para generar una figura (que usualmente está compuesta por otras figuras). Para lograr esto, al igual que en toda GLC hay una producción base y un conjunto de producciones alcanzadas desde la producción base, tal y como se muestra en el código del ejemplo 1:

S -> CIRCULO(55,55,5)RECTANGULO(50,50,10,10)ANIDAR(50,50,10/2,10/2)
ANIDAR(X,Y,W,H)     -> CIRCULO(X+W/2,Y+H/2,W/2)RECTANGULO(X,Y,W,H)
CIRCULO(X,Y,R)      -> terminal_circulo(X, Y, R)
RECTANGULO(X,Y,W,H) -> terminal_rectángulo(X,Y,W,H)
ANIDAR(X,Y,W,H)     -> vacío

(Código del Ejemplo 1)

El código anterior es una simplificación para poder explicar la idea, es decir, no está escrito aún usando la sintaxis de Context Free Art.

Excepto por los parámetros de las producciones, el código es muy similar a una GLC. La idea es que la gramática en lugar de generar un lenguaje formado por caracteres o símbolos, pueda generar un lenguaje formado por figuras. De esta forma, la gramática anterior genera el lenguaje de “todos los rectángulos que tienen un círculo inscrito dentro, y que a su vez, tienen recursivamente rectángulos y círculos de la mitad de tamaño del rectángulo padre”. Esto suena algo complicado por lo que es mucho más fácil visualizarlo con una imagen, de modo que se puede decir que el resultado del ejemplo 1 muestra dos “palabras” que estarán incluidas en el lenguaje descrito por la gramática anterior.

circulos_rectangulos
(Resultado del Ejemplo 1)

El ejemplo 2, fue uno de mis intentos de lograr una imagen atractiva utilizando la sintaxis de Context Free Art. Logré obtener el conjunto de cuadrados que se muestran en el resultado del ejemplo 2. Aún estoy intentando, sin mucho éxito pero acercándome poco a poco, escribir el código para generar el resultado de mi ejemplo inicial. El texto que está precedido por “#” son mis comentarios.

startshape begin_here  # Esta es la forma/producción inicial

CF::Background = [hue 120 sat 1 b -0.5]
CF::MinimumSize = 0.1  # Esto establece el máximo de recursión

shape begin_here { # La producción inicial
# Invoca a otra producción, equivalente a begin_here -> some_rect
 some_rect [x 100 y 100 size 100]
}

# Invocada por la producción anterior y por si misma
shape some_rect{
 SQUARE [x -1 y -1 size 0.5]
# Se invoca a si misma, equivalente a some_rect -> some_rect
 some_rect [x -1 y -1 size 0.5]
}

(Código del Ejemplo 2)

rectangulos
(Resultado del Ejemplo 2)

Un aspecto interesante es que en el código del ejemplo 2 pareciera que hay una producción recursiva que nunca termina, es decir, some_rect -> some_rect. No hay una producción nula, como es el caso de ANIDAR(X,Y,W,H) -> vacío en el ejemplo 1. Para solucionar este problema, Context Free Art expande las reglas recursivamente, hasta que las formas generadas tienen un mínimo de tamaño. Este tamaño, en el ejemplo 2 se define por medio de CF::MinimumSize = 0.1, o al menos es lo que entiendo hasta los momentos.

Mi ejemplo es el de un aprendiz que apenas tiene algunas horas entendiendo la sintaxis de Context Free Art, pero con un poco más de práctica y conocimiento, es posible usar los mismos principios para crear imágenes más complejas, tales como la que se muestra en el ejemplo 3:

complejo
(Resultado del Ejemplo 3)

Usando código tan simple como el siguiente:

startshape CIRCLES
CF::Background = [b -1]

shape CIRCLES
{
loop 12 [r 30] CONCENTRIC[x 100]
}

shape CONCENTRIC
{
loop 720 [r 0.5 h 0.5] SQUARE [x 100 b 1 sat 1]
CONCENTRIC[s 0.9 h 10]
}

(Código del Ejemplo 3)

Las Listas Azules

Cuento / Julio 2013

En el año 2113 el planeta estaba dividido en dos bandos. En cierto sentido se estaba librando una guerra, no una de esas que se pelean con tanques y balas, sino una nueva forma de guerra, una que se pelea en algo llamado Internet, específicamente en las Redes Sociales.

Dos posiciones políticas estaban enfrentadas, ambos bandos estaban muy parejos. Mientras que uno de ellos agrupaba al 51% de la población, el otro agrupaba al 49% restante. En realidad había un porcentaje de gente que no apoyaba a ninguno de los dos bandos, pero ese para muchos era un detalle insignificante. Ambos bandos de una u otra manera trataban de adjudicarse este porcentaje de gente.

Podría llamar “los verdes”, “los azules” o “los amarillos” a un bando y “los colorados” al otro, pero eso sería persistir en esa mezquina y miserable costumbre humana de asociar colores (lindas longitudes de onda) a cosas tan groseras y feas como movimientos políticos, religiones, etc, de modo que me voy a conformar con llamarlos 49%istas y 51%istas, o para ser breve, los 49 y los 51.

Se podría decir que los 49%istas estaban en desventaja numérica, y de hecho, los 51%istas afirmaban que eran una clarísima y contundente mayoría, por lo que los otros debían someterse absolutamente a su voluntad, pero en el fondo esto no era así, y los 49%istas representaban también una fuerza importante en el mundo. También los 49 decían que eran mayoría, y que los otros habían manipulado las estadísticas, aunque me parece que en el fondo los números eran bastante dinámicos y que en ocasiones los 49 tenían el 51% y los 51 pasaban a ser el 49%.

Como ya dije, si bien el asunto tuvo repercusiones en la realidad y en la vida cotidiana, dado que los 51%istas querían imponer su 51%ismo al otro bando, y probablemente también al contrario, uno de los campos principales de combate fue una red social llamada Critter, cuyo logotipo era una extraña especie de pájaro extraterrestre de color azul con dientes muy afilados (no pregunten).

En Critter se podían escribir mensajes cortos, mencionar a otros usuarios, etc, de modo que al principio todo se resumía a un simple toma y dame de insultos. Los 51%istas decían algo, los 49%istas respondían y se burlaban, los 51%istas se indignaban, los 49%istas argumentaban, los otros contra-argumentaban, y así el ciclo se repetía. Argumentos iban y venían, algunos muy razonables, otros en extremo absurdos. En algún momento se llegaba, de parte y parte a los insultos y las palabras fuertes, aunque debo decir que los 51%, por ser mayoría y controlar los poderes públicos en muchos casos abusaban.

Yo apenas tenía unos meses de estar registrado en Critter, cuando alguien “recritteo” un mensaje de un usuario que se llamaba #La_Molotov. El mensaje decía algo como:

“Este usuario #ErCommie, es una basura 51%ista, darle BAS masivo”

Debo decir que en algún momento de mi vida fui 51%ista, pero luego me harté, se pusieron muy pesados, gobernaban mal, fallaron en todo lo que habían prometido, y el mundo era un lugar… bueno, un tanto sucio. Los 49%istas no me simpatizaban mucho tampoco, en ese momento estaban disfrazados de corderos, pero uno veía a los personajes y a los voceros y en el fondo sabía que eran lobos. En cualquier caso, en ese momento al menos, los 49%istas eran una alternativa mejor a los 51%istas.

Me dio curiosidad y me puse a revisar la cuenta de #ErCommie. Realmente asqueroso, insultos van, toma, dale, y otro. Me harté. Aún quedaba por averiguar que era BAS. Finalmente descubrí que BAS viene de “Block and Spam”, que significa bloquear y declarar como “spam” (embasurador, bombardeador de publicidad, etc).

Resulta que “Critter” tiene una funcionalidad en la que uno puede marcar a un usuario como Spammer y al mismo tiempo bloquearlo. La idea es no ver más nunca mensajes de ese usuario, pero también, esta función le permite a “Critter” saber quienes son los usuarios problemáticos. Si mucha gente declara a un usuario como BAS entonces “Critter” bloqueará definitivamente (RIP) la cuenta de dicho usuario.

Claro que es una funcionalidad interesante, considerando todo el Spam que hay en el mundo… pero cuando está en las manos equivocadas y se usa de la forma incorrecta, eso es otra cosa.

Con esta nueva arma la guerra había escalado. Pasó de ser un asunto de simples argumentos e insultos a ser uno de BAS. Cuando te encontrabas algún extremista en la red simplemente BAS. Si alguien te insultaba… BAS. Si alguien decía algún argumento estúpido BAS… si alguien blandía un argumento interesante que la otra parte no podía refutar… BAS. Si, esto último no está bien, pero muchas veces ocurría.

Se formaron divisiones, como en el ejercito, #La_Molotov lideraba una de ellas, por eso el mensaje de BAS. Nuevamente revisé la cuenta de #ErCommie, pura basura, no me gustó. ¡Pum! BAS y así fue como disparé mi primer tiro en la guerra virtual.

Días después volví a revisar la cuenta de #ErCommie, muerta, difunta, RIP. La cuenta estaba indefinidamente bloqueada. De esa forma comencé a participar en la “guerra de las listas azules”, meter a alguien la lista azul significaba no sólo darle BAS, sino recrittear para que tus seguidores 49%istas le dieran BAS, mientras más tiros más posibilidades de que “Critter” bloqueara la cuenta atacada. Y claro… los 51%istas no se quedaban atrás, de hecho nadie estaba seguro de quién había disparado el primer tiro.

Las listas azules crecieron, los BAS proliferaron, las cuentas murieron, poco a poco. Yo disparé muchos tiros, #La_Molotov eventualmente cayó, RIP con su cuenta, alguien tomó su lugar como líder de la división, ese también cayó, luego tomó el liderazgo alguien llamado #El_Justiciero_BAS y luego otro, y otro, cada uno probablemente con un nombre más ridículo y absurdo que el anterior. Finalmente la guerra había terminado. Los 49%istas habían ganado pese a su aparente inferioridad numérica. Fue entonces cuando sucedió la división, y entre los mismos 49%istas comenzó el pleito, nadie sabe cual fue la diferencia de opinión, pero se comenzaron a hacer BAS entre ellos. Yo por su puesto tomé partido. BAS, BAS, BAS, BAS… y así sucesivamente, con el tiempo las cosas se fueron suavizando, y allí fue cuando no me gustaron las opiniones de #El_Heroico_Patriota. Demasiado insustanciales, ofensivas ¡Cómo no me di cuenta antes! BAS, BAS, BAS. RIP #El_Heroico_Patriota, el mundo era un lugar más tranquilo… y solitario.

En ese momento, con horror, me di cuenta de lo estúpido que había sido al participar en la guerra. Me di BAS a mi mismo y con eso fue bloqueado por spam el último usuario de “Critter”.


Dedicado a Julio Coll, quien en las “Las Columnas de Cyborg” escribió un cuento genial sobre las Listas Amarillas

¡Estaba en llamas cuando me acosté!

Cuento / Octubre 2010

¡Camina, camina, camina! El hombre se movía lentamente por los oscuros corredores. Al final del pasillo se veía un poco de luz. Con suerte, lograría alcanzar lo que aparentemente era al final del día una salida. Sigue caminando, arrastrando una pesada carga. Un pico en la mano derecha que utiliza de bastón y hace un rato usaba para extraer carbón.

catacumbas1

No quieren que se vaya. A cada paso que da se encuentra con algún desagradable demonio. Le hablan, le tratan de engañar, le tratan de convencer. Lo agarran de los pies, algunos intentan retenerlo por la fuerza, le golpean.

Pero el hombre esta decidido a escapar, ya lleva mucho tiempo en esa oscura caverna, sus días se han vuelto insoportables y su vida miserable. Antes no era así, alguna vez estuvo feliz en las catacumbas, encantado con el brillo de los diamantes y las vetas de oro, engañado por los demonios. ¡Pero ya no, ya no más! Los diamantes ya no tienen valor para él, son solo frías e inútiles piedras brillantes, el oro no es mas que ilusiones refulgentes pegadas a la pared. Y los demonios, los demonios son lo peor. Ya no le engañan, ya no los vé altos, hermosos y vistiendo ropas elegantes como los veía al principio, sino tal como son, unos seres encorvados, llenos de verrugas y pústulas despreciables, con unos cuernos deformes, de tamaños variados y en algunos casos carentes de total armonía, casi sin ropa, vistiendo apenas unos deshilachados taparrabos, que alguna vez fueron blancos pero ahora están negros del uso. En general, son seres verdaderamente despreciables, algunos caminan por el techo o por las paredes, en dos patas o en cuatro, es indiferente, algunos hablan en una lengua olvidada hace mucho tiempo y su tono de voz grave en combinación con el sobre uso de monosílabos y la carencia de vocales de su idioma haría temblar al más valiente.

Cada vez el hombre está más cerca. Ha dejado plantados en el piso a varios demonios, y el camino que ha recorrido esta lleno de cadáveres. El olor que dejan es pestilente, y eso que la mayoría no llevan mucho muertos. El pico y el rostro del hombre están llenos de sangre, y su taparrabos está también ennegrecido por el uso. Camina semi-desnudo con un sólo objetivo: llegar hasta la puerta.

En el camino pasa por la entrada a una galería que se abre a la izquierda. La pared del fondo de la galería está cubierta de diamantes. Antes de que pueda reaccionar de la galería se le arroja encima una sombra. Con la velocidad de un rayo caen al piso y ruedan, el trata de rodar hacia la salida, luego se separan y el hombre sigue arrastrandose en dirección a la luz. Hace calor, el hombre suda, tiene sed, tiene hambre, pero su anhelo de libertad es mayor que todo eso. ¡Se arrastra! La sombra se recupera, le toma por los tobillos y le propina un golpe en la espalda que le produce un dolor insoportable. Pierde el aliento, y luego de un esfuerzo logra recuperar la respiración. Se voltea y logra zafarse de las garras del demonio que le retiene. Lo conoce, quizá es el peor de todos, sus garras han lacerado sus tobillos, pero aún así se incorpora y lo golpea. El demonio sangra, curiosamente, a pesar de lo desagradables y fuertes que son, en el fondo su cuerpo sangra y se deshace al menor golpe. La cara se le llena de sangre, está atontado, pero no tardará en recuperarse, es el momento decisivo, el hombre toma el pico y vuelve a golpear. Un golpe seco y el demonio está muerto. Bueno, muerto es un término muy relativo, ellos no mueren en verdad, su cuerpo se deteriora, se pudre y luego encarna de regreso, por eso son pestilentes y son tan fáciles de herir, porque ya están muertos, son muertos en movimiento.

Finalmente está cerca de la salida, el peso que lleva colgado del cuello ahora casi no lo deja moverse, mientras más cerca de la salida es más difícil de llevar, mientras más cerca de la salida más pesado se hace. Está sujeto al cuello con un candado, que es prácticamente imposible de soltar. En el mundo inicial de la ilusión, cuando creía en los demonios, cuando estos le engañaban el peso parecía una joya, y el grillete con el candado al rededor de su cuello parecía una joya, y como todo en esas épocas, era hermosa. Poco a poco se fue evidenciando la verdadera naturaleza del artefacto, poco a poco así como se fue revelando la verdadera identidad de los demonios también se reveló la naturaleza del grillete.

Ya casi llega a la salida. Mira hacia atrás y ve la mina en todo su esplendor, el calor es insoportable, las hogueras de las fundiciones resaltan en la oscuridad, y se pueden ver las sombras de otros demonios y esclavos moverse de un lado a otro, levando piedra, atizando fuego, agitando látigos. El demonio que acaba de matar ya se está regenerando, debe apurarse, porque no tardará mucho en levantarse.

Sigue caminando, está al borde de la salida, da un paso, después otro y finalmente logra salir. La luz del exterior le ciega, el aire fresco le quema los pulmones, y entonces le asalta esa extraña sensación de no saber que hacer, de falta de propósito. Ha pasado tanto tiempo en la mina que tiene dificultades en comprender cual será el siguiente paso. Los demonios no salen de la mina, así que ya no le pueden prender, pero el mundo exterior puede resultar intimidante.

catacumbas2

Entonces se quita su carnet de identificación del cuello y lo guarda en el bolsillo de la chaqueta. Acomoda las carpetas que lleva debajo del brazo, se sube el cuello de la chaqueta y se pierde entre la multitud rumbo a su casa.