Duna

Es Duna, mega best-seller de la ciencia ficción, la gran novela que sus fans creen? Yo diría que no. Pero cabe preguntarse si alcanza a ser una buena novela.

Hay mucho que reconocerle a Duna: el libro explora varios temas originales (sobre todo para la época) y además propone un universo que es una delicia para el amante de la fantasia/ciencia ficción. Se trata de un futuro bastante oscuro, tecnológicamente avanzado (dominan el viaje espacial), controlado por aristócratas en constante forcejeo de poder. Se sabe que en el pasado la humanidad tuvo que entrar en guerra contra las máquinas inteligentes, que en algún momento se salieron de control (como suele ocurrir). En consecuencia, la inteligencia artificial está prohibida. Para suplir el vacio que dejaron las máquinas pensantes, ciertos humanos han desarrollado habilidades mentales excepcionales gracias a diferentes técnicas de entrenamiento y, sobre todo, al uso de una sustancia llamada “melange”.

Un elemento bastante original es que la navegación espacial es controlada por un tipo de seres con este tipo de especialización mental y que se han convertido en una organización esencialmente apolítica, por fuera del control del imperio. El transporte del resto de la gente, incluidos los aristócratas, el emperador y sus ejercitos, depende de ellos. Esto, junto a toda la simbologia aristocratica, la ausencia de computadores y la inutilidad de las armas de proyectil debido a “escudos de energía” personales, logra crear una seductora atmosfera pre-electrónica/pre-armas de fuego, en un futuro avanzado (sin ser steam-punk).

La ciencia ficción moderna probablemente le debe mucho a esta serie, que exploró temas como la ecología y la ingenieria social (me parece que el cuento de haber “plantado” una religión como parte del plan de las bene-gessirit era una idea excelente que el autor no desarrolló tanto como hubiera podido, al menos en el primer libro. Es Paul Atreides efectivamente un mesías o una fabricación manejada  por otras fuerzas?). Recordando los viejos capítulos de Star Trek puede darse uno cuenta de que la influencia de Duna fue enorme.

La historia en si misma es prometedora y con personajes potencialmente interesantes (sobre todo del lado de los malos, los buenos son mas bien sosos, comenzando por el personaje principal, el heroe mas aburridor de la galaxia). Desafortunadamente, luego de un buen comienzo, la novela entra completamente en el modo “joven con super-poderes predestinado a salvar el mundo” que siempre he encontrado insoportable. Hay dialogos en abundancia, casi todos sin interés. El destino del universo parece decidirse en una serie de escenas a recinto cerrado con conversaciones sobreactuadas, como de telenovela. Luego están los elementos misticos de la novela, que son como artefactos regados por todos lados sin que el lector sepa que hacer con ellos o para que están ahi. Hay varios huecos en la lógica de la historia (por nombrar solo uno: como es posible que el imperio nunca se haya interesado seriamente en conocer a fondo el unico planeta que produce la sustancia de la que depende TODO el universo?) pero personalmente soy indulgente con ese tipo de problemas en la narración.

En resumen, una historia del todo bien contada en un universo genial. Hay que verlo sin embargo con los lentes de hace 40 años, tal vez el estilo de narración “space opera” tenia mas sentido en ese entonces, pero creo que no ha resistido bien del todo el paso del tiempo.

  • Share/Bookmark
 

Presencia pasiva en las redes sociales

Las “redes sociales” se están conviertiendo en los sitios donde ocurren todas las conversaciónes en internet. Pienso, como muchos otros, que sería mas sano que las conversaciones ocurrieran en blogs y paginas personales. Varios personas que conozco estan dejando de usar las redes sociales y yo he pensando varias veces hacer lo mismo. De Facebook cada vez me interesa menos participar en discusiones, ni mantener al día mi información personal ni lista de contactos, ni enterarme por ese medio de las “noticias” de los demás, etc. Sin embargo, mantengo abierta mi cuenta porque me parece util que la gente pueda encontrarme facilmente y escribirme mensajes si así lo desean.

Esta mañana estaba pensando que en vez de cerrar completamente la cuenta, podria simplemente dejar de usarla y poner un mensaje con el url de mi blog. Esto sin embargo deja abierto el problema de que la gente podria seguir escribiendome por facebook, agregando informacion sobre mi (contactos, tagging), etc, lo cual me obliga a estar pendiente de mi cuenta. Estaba pensando que en las redes sociales uno deberia poder reclamar su identidad sin tener que participar en los demás servicios, y que esto deberia ser soportado tecnicamente por la red social. Es decir, uno deberia poder existir en facebook sin que la gente asuma que uno usa facebook. En este modo de utilización, los demas usuarios de facebook deberian ser capaces de encontrarme, pero no deberian poder enviarme mensajes ni agregarme a su lista de contactos, etc. Simplemente podrian ver algún mensaje de mi parte (por ejemplo el url a mi pagina personal, o a otra red social en la que sí participe). Supongo que no hay mayor incentivo para las redes sociales hoy en día en soportar esta idea. Es posible que la distincion entre “google+” y “google profiles” de cierta manera se asemeje a esto, pero no he mirado realmente.

  • Share/Bookmark
 

PixelArt fun

I recently stumbled upon this neat algorithm by Johannes Kopf and Dani Lischinski. In short, their algorithm takes a pixelart image, such as  those found in 8-bit video games, and produces a new image that somehow makes you think “hey, that looks like what the artist actually had in mind”. In other words, it tries to generate the ideal image for which the pixel art is only an imperfect representation. The results explain it better:

Mario - before, after

Mario from Super Mario Bros 3, using my own implementation. Click to zoom.

If you are interested in this kind of stuff, I really recommend you read their paper, it is well written, easy to understand even for people with no deep knowledge of computer graphics (like myself) or for people with no programming training. I partially implemented their algorithm using Common Lisp and Zach Beane’s Vecto library, here’s a very very short description, just to illustrate the different steps. Some eye-candy at the end!

Finding Vicinities

First, we find which regions of the original image are part of a single feature.

Different regions are found. Notice the blue cross near the center of the image, where we need to decide which diagonal should be kept as part of a single feature

Re-shaping Pixels

Once different regions have been found, pixels are re-shaped so that each region has a well defined contour.

Each pixel is re-shaped to a voronoi cell calculated using the center point of each cell and points defined by its vicinities

Smoothing Edges

Finally, edges are identified …

Edges are identified

Edges are identified

… and smoothed

Smoothing

Smooth edges. Have a look at Mario's eyes.

Keep in mind that this is only a partial implementation, the original algorithm also re-shapes edges to make them look more natural, reducing zig-zag curves for example. (they also use a different type of curve, b-splines, which works better than what I’m using, catmull rom) and therefore produces much better results. Have a look at their examples in the linked article.

Some Examples!

Click on the images to enlarge

Spartan

Donkey Kong

zelda

karate champ

Captain America and the Avengers

mario kart

mario kart

sagat ftw

 Thanks to Javier Moreno, Norman Garcia and Angie Bloor for their comments.

  • Share/Bookmark
 

¡Calcio!

Me gustó el libro ¡Calcio! de Juan Esteban Constain, es un libro divertido y además está escrito con cuidado. Ya solo por eso está por encima de mucho de lo que se escribe en Colombia, según las malas lenguas. En todo caso, lo recomiendo para pasar un buen rato leyendo.

El libro cuenta dos historias, una contada dentro de la otra, sobre dos enfrentamientos iguales en extravagancia. En la primera se enfrentan dos intelectuales europeos y en segundo se enfrentan el imperio español y los habitantes de una ciudad libre, en Italia.

En el contexto del enfrentamiento entre los dos maestros del mundo antiguo, el autor se excede un poco listando demasiados datos sabios y curiosos, tal vez para crear la atmosfera del mundo erudito en cuestión. A veces se vuelve un poco fastidioso y uno no sabe si en la exageración hay más bien burla o admiración. Otro punto que me pareció debil es que pareciera que el autor se esfuerza mucho en que a uno le caiga bien el personaje del sabio judio italiano, cuando el tamaño del libro y su estilo no dan para que los personajes lleguén a parecerle a uno suficientemente reales.

Dejando de lado esos detalles, me parece que ambas historias lo agarran a uno y tienen buen ritmo. Recurren a temas tradicionales y lo hacen con éxito. Se nota que el autor se divirtió escribiendolas y eso contagia al lector.

Otra nota sobre el libro aca.

  • Share/Bookmark
 

How to extend Oasis Montaj using C#

Oasis Montaj allows its users to program their own extensions. The “standard” way of creating an Oasis Montaj extension is by using the GX language, a C-like language, and its companion user interface definition language. I find this good enough for most cases. Actually, the standard actions in Oasis Montaj seem to be implemented as GX scripts that validate user input and then calls some inner functionality.

However, for more complex programs, I like to have all the bells and whistles of a main stream high level language, such as C#. In this post I will explain step by step how to create a “Hello World” C# Oasis Montaj extension.

I will be using Microsoft Visual C# 2010 express, you can download for free here. You will also need to have a licensed copy of Oasis Montaj installed (I’m using version 7.2.1). Finally, you’ll need the corresponding GX developer toolkit that you can download for free here.

1. Create a new project in Visual C# 2010 express.  Choose class library as the type of project and name it HelloWorld, for example.

2. Save the project.

3. Go to the project properties (Project -> HellowWorld Properties) and change the Target framework to .NET framework 3.5. This is the version that seem to work well for Oasis Montaj 7.2.1, but I guess it might change in the future. Anyway, version 4.0 does not seem to work.

4. In the Solution Explorer tab, right-click the HelloWorld project and then choose Add Reference. Select Browse in the dialog window and then navigate to the folder where you installed GX Developer (usually C:\Program Files\Geosoft\GX Developer). Then navigate through the folders apps -> redist -> bin. Select geonet.dll and Geosoft.GX.Controls.dll

5. Repeat the previous step to add a new reference, but instead of selecting the Browse tab, select .NET, then add System.Windows.Forms

6. Create a new class named  HelloWorld:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Geosoft.GX.Controls;
using Geosoft.GXNet;
using System.Windows.Forms;

namespace HelloWorldGX
{
 class HelloWorldGX : BaseForm
 {
 public HelloWorldGX(int i) : base(i) { InitializeForm(); }
 public int Run() {
 MessageBox.Show("Hello World");
 return 0;
 }
 }
}

7. In Visual C#, click on Build -> Build Solution. Then go to your project folder -> bin -> Release, and copy the HelloWorld.dll to the bin folder of your Oasis Montaj install

8. Create a new menu file named HelloWorld.omn in the omn folder of your Oasis Montaj install folder (C:\Program Giles\Geosoft\Oasis Montaj, usually) with the following content:


MENU "&HelloWorld"
ITEM  "&HelloWorld" ,HelloWorld.dll(HelloWorldGX.HelloWorldGX;Run)       <standard.bmp[1]>

9. Copy the geonet.dll, Geosoft.GX.Controls.dll and geoexceptions.dll from the GX Developer -> apps -> redist -> bin to the bin folder of your Oasis Montaj install. Important note: you might need to copy other dll’s when you start using some real functions from the oasis montaj API.

10. From Oasis Montaj, load the HelloWorld Menu (GX -> Load Menu), and then run the Hello World item.

At Abitibi Geophysics we have been writing Oasis Montaj’s extensions using C# with very good results.

  • Share/Bookmark
 

TweetMix

Hagamos un recuento desordenado de TweetMix. La idea se me ocurrió hace un par de semanas: coger un “chat-bot“, alimentarlo con los tweets de un usuario y ponerlo a decir bobadas. El chat-bot que usé fue escrito en perl y funciona al estilo de mega-hal, un viejo chat-bot con el que Alejo, Javier y yo jugabamos hace ya mas de diez años, cuando el internet todavía tenía gracia. Si quieren documentarse al respecto pueden buscar por cadenas de Markov. Hice una primera implementación en alrededor de una hora, usando bash, el API sin autenticación de twitter y unas cuantas herramientas de linea de comando de unix (curl, recode, cut, etc). La idea resulto buena y al cabo de un par de horas ya cerca de 150 personas le estaban sacando incongruencias a sus cerebros artificiales.

Twitter solo permite un numero limitado de hits por hora, lo que se convirtió en el primer obstaculo para que más gente usara el sitio. Muy rápido, la aplicación estaba llegando al limite en cada intervalo, así que tuve que apagarla. Decidí hacer una implementación que superara esta limitación para de paso jugar con las técnicas asociadas. Escribí entonces una nueva implementacion en lisp, usando una librería de oauth. En pocas palabras, esto permite acceder a twitter a nombre de cada usuario, multiplicando así el limite de hits por hora por el número de usuarios. Como no hay nada complicado en el programa, en unos dias de trabajo muy esporadico saque una nueva version, que volvió a tener bastante exito.

El siguiente obstaculo fue hacer el programa suficientemente robusto para soportar la alta demanda. El problema aqui era que obtener los datos de twitter y transformarlos y procesarlos es un proceso que toma tiempo y que se realiza en un proceso aparte, un llamado a perl. Esto hacia que el servidor web de lisp despachara demasiados hilos, lo que estaba terminando mal. Aplicamos entonces dos ideas. La primera fue idea de fidel: en vez de generar una frase por cada request, generar bastantes de un solo golpe e irlos consumiendo poco a poco. Así disminuimos drasticamente el número de procesos a lanzar por cada carga de la página. Comenzamos a usar redis para guardar los mixs en vez de tenerlos en el espacio de memoria del servidor web. La segunda idea fue extraer del servidor web el proceso de obtención y procesamiento de los tweets de cada usuario. Asi, cuando un usuario nuevo llega, el servidor web pone en una cola el nombre del usuario y uno (o varios) proceso aparte va tratando los diferentes nombres de la cola. Aprovechamos el redis para implementar la cola de demandas. De esa manera mantenemos bajo control el número de procesos y liberamos al servidor web de los problemas asociados con ese tratamiento. El código de tratamiento de tweets lo re-escribió Fidel en Perl. Algo que hay que notar es que los llamados a twitter fallan muy muy frecuentemente. La alta frecuencia de este tipo de problemas (los errores al llamar a un servicio exterior) es una de las dificultades particulares que enfrenta el programador en la red.

En paralelo, Juan Diego hizo un excelente diseño que es el que usamos actualmente.

Luego de un estallido de popularidad inicial, las visitas han bajado bastante, pero el uso sigue siendo importante. A la gente le gusta. Creo que puede volverse mas popular aún.

Viendo por encima, es un programa muy muy sencillo, pero que de cierta manera ilustra bien el tipo de estrategia que se puede usar en sitios de alto tráfico. Cosas cheveres que se descubrieron: redis y oauth. Igualmente he podido jugar con los amazon web-services, que me parecen bastante prácticos y muy bien implementados, pero ligeramente caros (sobre todo el costo en ancho de banda de S3).

  • Share/Bookmark
 

The truth about Lisp

“Lisp was invented a long time ago, before java, before C, before fortran, before computers, before people, before the earth was built. The universe itself is a lisp program so trivial that no true lisper would even bother implementing it.”

Ver el resto

  • Share/Bookmark
 

A Game of Thrones

When you play the game of thrones, you win or you die. There is no middle ground

Ayer terminé de leer “A Game of Thrones”, el primer libro de la aclamada serie de fantasía heróica “A song of ice and fire”. Según muchos, esta serie representa lo mejor del la literatura fantástica actual. En general me pareció un libro muy entretenido que logra hacer crecer el interés del lector capítulo tras capítulo, al estilo de una serie de televisión. Estoy de acuerdo con que es probablemente uno de los buenos libros de ese tipo.

La historia se desarrolla en un universo de inspiración medieval, como corresponde al género. Los elementos fantásticos son mas bien pocos y para nada originales: se teme el regreso de Los Otros, seres míticos desaparecidos desde hace milenios, al norte del reino. También se sabe que el reino fue conquistado con ayuda de dragones (de los cuales solo quedan los esqueletos). De resto, la atmósfera es la de un mundo feudal cargado de toda la violencia y oscuridad que uno espera. La historia principal del libro tiene que ver con las intrigas y guerras entre las diferentes familias que ambicionan la corona y otras amenazas que van creciendo simultaneamente. Cada capítulo del libro esta escrito con un personaje en particular como protagonista.

El punto debil del libro es que el ritmo es bastante desigual. Algunas partes son escritas respetando un ritmo lento que contribuye a que el universo fantastico se sienta realista. En mi parecer esto es lo mejor del libro. A su lado, otros pedazos parecen escritos a la carrera, tal vez porque la verosimilidad de los eventos que relatan es tan poca que el autor quiere pasar rapidamente por encima. Me hubiera gustado mas el libro sin los elementos de libro de aventuras que en mi parecer son culpables de los malos pedazos. Por otro lado, aunque un poco más complejos que los del libro promedio de este género, los personajes no abandonan del todo su estatus de personaje convencional de libro de caballeros medievales. Uno termina adivinando rapidamente como van a reaccionar con cada cosa que les pasa.

Conclusión: lo recomiendo a todo aquel que busque entretenerse un rato, que le guste la fantasia heroica y que no sea demasiado quisquilloso con la verosimilidad de la historia.

Ahora bien, se supone que el segundo tomo, a Clash of Kings, es mejor (nominado al premio Nebula). Ya lo empecé.

  • Share/Bookmark
 

Ventanas, Dialogos, Botones

El siguiente caso ilustra bien las diferencias de éstilo que veo entre los mundos java y .Net.

En la librería para aplicaciones gráficas de .Net, un programa puede abrir cualquier Ventana en modo Dialogo. Todos los Botones tienen asociado un atributo llamado DialogResult. Cuando este atributo tiene un valor en un botón que es oprimido, la Ventana que contiene el botón, si está en modo Dialogo, se cierra y retorna el valor asociado al botón.

Para un programador acostumbrado al estilo predominante en el mundo Java, esta manera de implementar ventanas de dialogo parece poco elegante por las siguientes razones:

  • Una Ventana de Dialogo es solo un caso particular del concepto abstracto de Ventana. De ninguna manera el comportamiento propio de ese caso particular debe incluirse en la definición  del caso general. Lo adecuado sería definir un tipo particular de Ventana que se haga cargo de esa funcionalidad especial.
  • Peor aun, el comportamiento de un caso particular de Ventana no tiene por que hacerse visible en el tipo Botón. Un botón es teoricamente un concepto independiente al de Ventana y aún más independiente del muy particular concepto de Ventana de Dialogo.

En resumen, hay cosas que no están en su lugar. Para el programador de Java, al esquema usado por .Net le hacen falta un par de clases para conservar la limpieza conceptual de cada clase.

C# acepta contaminar las clases Ventana y Botón con el fin de ofrecer la funcionalidad de una ventana de dialogo. A cambio, no necesita agregar nuevas clases, con lo cual logra mantener una estructura de clases sencilla. En contraste, en el mundo de Java se privilegia la pureza de cada clase individual sobre la simplicidad de la estructura de clases.

Pero la diferencia fundamental en mi opinión es que, en el espiritú de java, la funcionalidad de ventana de dialogo no merece ninguna consideración particular al diseñar las clases mas abstractas de una librería. En el espiritú, mucho mas pragmático, de c#, el hecho mas importante es que un diálogo es el caso más frecuente de uso de una ventana, lo cual lo hace merecer el tratamiento privilegiado.

  • Share/Bookmark
 

Best of Twitter – volumen 2

Una nueva entrega de los twits que llamaron mi atención esta semana, escogidos delicadamente como flores entre la mala hierba.

Frases célebres:

Yo sólo soy un hombre con un sueño. Un sueño el hijueputa.less than a minute ago via web


“Solo sé que tengo sé”less than a minute ago via OpenBeak



Cuentahuesos:

¿Saben dónde podrían proponer el referendo ese para que legalicen la marihuana? En el Meta. Meta Bareta.less than a minute ago via twitgether



Político-ideológico:

@donAlvar soy de derecha y malparido, pero no soy homofóbicoless than a minute ago via TweetDeck


Espero ansioso el día que @AlvaroUribeVel trine algo como: “qué se cuentan, ¿qué hay para hacer? #desparchadoless than a minute ago via TweetDeck



Gastronómicos:

Ay, cómo me gusta la palabra “galguería”. Comer galguerías, no tanto.less than a minute ago via web


En lo que se refiere a principios, tengo prioridades. El garbanzo lidera.less than a minute ago via web

(In)conciencia social:

No hay peligro de que yo me ponga a criticar lo que dice Yoani; para eso habría que leerla, y escribe muy feoless than a minute ago via web


one laptop per chapiyorkerless than a minute ago via Seesmic for Android


@angelacuartas hoy vi en un almacén “eres lo que te pones”. La publicidad al servicio del conocimiento. Eso está bien ¿no?less than a minute ago via web



Honestidad brutal:

La otra noche soñé dándome besos con un twittero. Qué porquería.less than a minute ago via web

  • Share/Bookmark