pop goes the weasel
Para hacer funcionar el código, cree un nuevo documento de Flash ActionScript 3 y meta tres textfields con nombre de instancia status_txt, link_txt, y weasel_txt. Puede cambiar el texto objetivo (variable target) por cualquier otro que tenga letras de la A a la Z (mayúsculas), espacio, punto y signo de exclamación. Si quiere más letras tiene que modificar la funcion randomLetter().
El máximo número de generaciones que me ha generado para este texto es de 1452.
El código (AS3):
var target:String = "O TRUE APOTHECARY! THY DRUGS ARE QUICK. THUS WITH A KISS I DIE."; var current:String = ""; var numSiblings:Number = 100; var variation:Number = 5; var stepsNeeded:Number = 0; var generation:Array = []; var timer:Timer = new Timer(10); function newGeneration():Array { var i:Number; var thisGeneration:Array = []; for (i=0;i < numSiblings;++i) { thisGeneration.push(createSibling(current)); } return thisGeneration; } function newParent():String { var i:Number, r:String = ""; for (i=0;i < target.length;++i) { r += randomLetter(); } return r; } function createSibling(dad:String):String { var i:Number; var sibling:String = ""; for (i=0;i < dad.length;++i) { if (Math.random()*100<variation) { sibling += randomLetter(); } else { sibling += dad.charAt(i); } } return sibling; } function randomLetter():String { var r:String; var n:Number = Math.floor(Math.random()*28)+62; if (n==62) { r = " "; } else if (n==63) { r = "."; } else if (n==64) { r = "!"; } else { r = String.fromCharCode(n); } return r; } function qualifyGeneration():Number { var i:Number, j:Number; var qualification:Array = []; var tempQ:Number = 0; for (i=0;i < generation.length;++i) { tempQ = 0; for (j=0;j<generation[i].length;++j) { if (generation[i].charAt(j)==target.charAt(j)) { tempQ += 1; } } qualification.push(tempQ); } var maxQIndex = 0; var maxQ = 0; for (i=0;i < qualification.length;++i) { if (qualification[i]>maxQ) { maxQ = qualification[i]; maxQIndex = i; } } return maxQIndex; } function parseGeneration(event:TimerEvent) { status_txt.htmlText = "GENERACIONES: " + stepsNeeded; generation = newGeneration(); current = generation[qualifyGeneration()]; weasel_txt.text = current; if (current == target) { timer.stop(); status_txt.htmlText = "COMPLETADO LUEGO DE " + stepsNeeded + " GENERACIONES"; link_txt.htmlText = "<a href=\"event:restart\">OTRA VEZ</a>"; } else { stepsNeeded++; } } function doClick (e:TextEvent) { if (e.text=="stop") { link_txt.htmlText = "<a href=\"event:continue\">CONTINUAR</a>"; timer.stop(); } else if (e.text=="continue") { link_txt.htmlText = "<a href=\"event:stop\">DETENER</a>"; timer.start(); } else if (e.text=="restart") { init(); } } function init () { stepsNeeded = 0; current = newParent(); timer.start(); var style:StyleSheet = new StyleSheet(); var link:Object = new Object(); link.textDecoration = "underline"; style.setStyle("a:hover", link); link_txt.styleSheet = style; link_txt.htmlText = "<a href=\"event:stop\">DETENER</a>"; } link_txt.addEventListener(TextEvent.LINK, doClick); timer.addEventListener("timer",parseGeneration); init();
Múltiples views no-jerárquicas en iPhone
(English version at the bottom of this post)
Recientemente he estado trabajando en XCode y Cocoa Touch para un proyecto que estoy haciendo para el iPhone. Objective-C (el lenguaje de programación usado) tiene sus mañas (como todo lenguaje), pero he encontrado bastante ayuda en la web, gracias especialmente a Stanford, Google y a Stackoverflow.
Creo que es pertinente devolver algo a la comunidad, en particular a los hispanoparlantes, en este caso en forma de un mini framework para desarrollo de aplicaciones con múltiples pantallas no-jerárquicas ni lineales (simplemente que uno pueda saltar de una pantalla a otra sin ningún orden en particular, cuando el UITabBarController no es una opción). En realidad es basado en este otro de Jeffrey Berthiaume, pero con la adición de NIBs (Berthiaume hace las pantallas a punta de código).
Algo importante a tener en cuenta al usar NIBs es que para que el iPhone efectivamente libere la memoria usada por NIBs con imágenes, lo mejor es cargarlas con código (pero ese es otro post). De pronto luego pongo un tip acá pero por ahora mejor visite mi pregunta al respecto de esto en Stackoverflow.
Si lo que acabo de escribir suena un poco a chino avanzado (para aquellos no familiarizados con Obj-C), en parte es porque lo es (para mi Obj-C ha sido como un camino zen… el camino del ninja o algo así). Inauguro, entonces, el tag “iphone” en mi blog con este ZIP que pueden bajar y usar libremente (y si se le tira el proyecto que está haciendo no me eche la culpa):
Para que los angloparlantes puedan llegar a este post, a continuación la versión en inglés:
English version
This is a a framework based on the work of Jeffrey Berthiaume for developing NIB-based iPhone applications with non-linear, non-hierarchichal UIViewControllers, when the UITabBarController is not an option (games with multiple NIBs come to mind). Keep in mind that, in order for Obj-C to free NIBs with UIImageViews from memory, you need to load the images via code without using imageNamed. More info regarding this can be seen in this question in Stackoverflow:
El chef recomienda: Johnny Lee y el Wii
Varios meses sin publicar acá (un poco distraído en general) pero regreso con unos buenos links. Sin más rodeos:
Johnny Wii
Johnny Lee es un estudiante de doctorado del Human-Computer Interaction Institute de la Carnegie Mellon University. Lee posee varias patentes y trabaja desarrollando versiones simples y económicas de tecnologías usualmente costosas. Como él mismo menciona en su enunciado de investigación:
My work solves real world problems of applying research concepts by simplifying implementation and reducing system cost. This does two things: first, it enables more researchers to explore the domain advancing the state of research; second, it results in a more practical commercialization increasing distribution, adoption, and overall impact.
Entre los proyectos de Lee se destaca el trabajo que hace con el Nintendo Wii. Usando la tecnología presente en el control del Wii, Lee ha creado desde interfases similares a las que se vieron en la película Minority Report, hasta ambientes inmersivos tridimensionales. Lee documenta sus proyectos Wii en su sitio web. El software requerido para uno implementar esas interfases, si es que tiene un Wii, yo tengo el mío :), está disponible para descarga. Sin embargo lo que más descresta es la simplicidad como explica y presenta los proyectos, como se puede ver en el siguiente video:
vía Gizmodo
Hay otro video de la interfaz tipo Minority Report, un video de un pizarrón electrónico y un impresionante video de pantallas plegables, todos muy recomendados.
Recomendaciones del chef
Nos gustan las recomendaciones. A pesar de tener una amplia selección en un menú, algunos restaurantes tienen “menú del día” o “el chef recomienda”. ¿Por qué destacan un producto sobre otro? ¿Acaso no todos los platos son igual de buenos? Barry Schwartz, psicólogo y profesor en Swarthmore College plantea en su libro The Paradox of Choice: Why More Is Less que la multiplicidad de opciones no necesariamente nos beneficia:
Infinite choice is paralyzing, Schwartz argues, and exhausting to the human psyche. It leads us to set unreasonably high expectations, question our choices before we even make them and blame our failures entirely on ourselves.
En su charla en TED Talks Schwarz menciona ejemplos que aclaran su idea que muchas opciones en realidad perjudican nuestro bienestar generándonos un estrés innecesario. En un restaurante contamos con un mesero que, esperamos, nos va a dar una buena recomendación basada en la información que proveamos: “no puedo comer pescado y no me gustan los pepinillos”. En internet, sitios web como Amazon se basan en millones de clics que hacen los compradores para encontrar patrones que sivan como punto de partida para recomendaciones: de los que compraron la última película de Harry Potter una gran cantidad compró Piratas del Caribe. Entre más compras se hagan (y más compras haga usted) más precisa es la recomendación… o por lo menos eso creemos; si compra un regalo para alguien con gustos muy diferentes a usted estará “dañando” futuras recomendaciones.

¿Qué me recomienda?
¿Cómo generar un sistema de recomendación más preciso? Entre más acertada sea la recomendación, más valioso será el sistema. Precisamente fue esta la razón por la que Google prevaleció sobre Altavista, AskJeeves y otros buscadores que estuvieron primero: daba mejores resultados a las búsquedas (hoy día algunos pueden debatir eso pero ya Google está en una posición ultra dominante que ha sabido explotar). En el mundo musical la cosa es más complicada: ¿si me gusta “Let It Be” me van a gustar todas las canciones de los Beatles? ¿solamente las escritas por Paul McCartney? ¿sólo las baladas? ¿sólo las que son dedicadas a alguien cercano al autor? ¿las que tienen determinado patrón compositivo? Todos quisiéramos tener una emisora personalizada que pusiera los hits que más nos gustan pero que también nos sugiera nueva música: que no suene un reguetón después de “Hey” de Pixies… de hecho que no suene nunca un reguetón. Hasta el momento la mayoría de sistemas de recomendación, como los de Amazon y Google, se basan en modelos matemáticos. Este artículo cubre (superficialmente) tres aproximaciones a este problema que se reflejan en tres sitios web: MeeMix, Pandora y Last.fm. Para los últimos dos sitios hay mayor detalle en este otro artículo:
Algorithmically, Pandora versus Last.fm is something like the nature versus nurture debate. Taking the nature side, Pandora’s recommendations are based on the inherent qualities of the music. Give Pandora an artist or song, and it will find similar music in terms of melody, harmony, lyrics, orchestration, vocal character and so on. Pandora likes to call these musical attributes “genes” and its database of songs, classified against hundreds of such attributes, the “Music Genome Project.”
On the nurture side (as in, it’s all about the people around you), Last.fm is a social recommender. It knows little about songs’ inherent qualities. It just assumes that if you and a group of other people enjoy many of the same artists, you will probably enjoy other artists popular with that group.
Otros están experimentando con la aplicación de algoritmos matemáticos ya no a la recomendación sino a la creación. Dichos algoritmos se inspiran en la evolución biológica (reproducción, mutación, recombinación y selección):
EAs take two parent designs – for a boat hull, say – and blend components of each, perhaps taking the surface area of one and the curvature of another, to produce multiple hull offspring that combine the features of the parents in different ways. Then the algorithm selects those offspring it considers are worth re-breeding – in this case those with the right combination of parameters to make a better hull. The EA then repeats the process. Although many offspring will be discarded, after thousands of generations or more, useful features accumulate in the same design, and get combined in ways that likely would not have occurred to a human designer.
[...]
To encourage more of this kind of work, SIGEVO runs the annual Human Competitiveness Awards, dubbed the “Humies”. The idea is to reward designs produced by EAs that are “competitive with the work of creative and inventive humans”.
[...]
Celebrated UK innovator James Dyson, inventor of the bagless vacuum cleaner, has a more emotional objection. “Evolutionary algorithms will mean the end of those exciting stories about how people made great inventions by accident,” he says. “Human ingenuity and intuition should remain crucial in making a success of any product.”
El chef recomienda estos otros posts anteriores relacionados:
Actualización 2/6/2009:
Desde su salto a la fama, Johnny Lee ha hablado en las TED Talks y consiguió trabajo en Microsoft donde está trabajando en Natal, un proyecto que pueden ver mejor en su blog y en este video:
Pueden ver una demostración de las diferentes tecnologías disponibles en Natal en la rueda de prensa de Microsoft en E3 (fijarse en la parte final del video).
Para que brilles con luz propia
Leah Buechley es investigadora en el Departamento de Computer Science de la Universidad de Colorado en Boulder. Investiga con tejidos y joyas buscando una intersección entre los textiles y la tecnología. Un problema común al tratar unir circuitos con textiles son las restricciones que presenta el característico rectángulo rígido de una tarjeta electrónica. Con esto en mente, Buecheley ha desarrollado una técnica de fijación de circuitos a telas a base de calor (algo como esos estampados que uno puede imprimir en casa y pegar con una plancha). Sin las limitaciones de tamaño y rigidez se pueden crear prendas cómodas, interactivas, programables. Uno de sus proyectos es el e-textile construction kit, que explora nuevas posibilidades estéticas para la electrónica y consiste en una serie de “parches” como este:
… que se utilizan para crear prendas como esta:
… donde los LEDs en la prenda son controlados desde el parche. Hay un video que muestra la prenda en acción. [vía]
En busca de una vida programable
Todas las actividades que hacemos se pueden descomponer en una serie de pasos. Si repetimos dichos pasos, bajo condiciones similares a las originales, los resultados tenderán a ser los mismos de la original. Frecuentemente nos enfrentamos a listados de pasos para lograr objetivos (recetas, manuales, direcciones) que luego memorizamos y modificamos según nos convenga. Los lingüistas llaman a estas recetas algoritmos: una lista finita de instrucciones para lograr una tarea que, dado un estado inicial, terminará en una estado final determinado.
Los algoritmos fueron inicialmente definidos y utilizados por los matemáticos para lograr cálculos complejos (como encontrar aproximaciones a Pi, encontrar el máximo común denominador y encontrar raíces de números). Los algoritmos también son usados por programadores para desarrollar software como el que ahora les permite leer este artículo. Inspirados por esto y por As We May Think, un legendario artículo publicado en 1945 por Vannevar Bush (y el cual vale la pena leer), la gente de Squid-Labs creó Instructables:
We like to think about the physical world as something that is programmable. We like to think of objects or stuff you make as ‘code’. In other words, we are approaching the physical world as something that is describable and replicable. CAD files are obviously part of this. The CAD file I use to design and cut out my bicycle parts is the same file that you can use to cut similar bicycle parts. However this is not everything, CAD descriptions alone don’t fully describe heating schedules, or filing methods… the art involved in certain processes of making things. [...] We are trying to think about the ‘art’ or ’skills’ required to actually build things as defineable, sequential sub-routines that can be well illustrated with words and pictures. Cooking is an excellent example, processes like sauteeing, frying, filleting, and mashing are generic subroutines that have specific instances which require other detail for different meats. If you are writing a recipe, why not call upon the generic sauteeing subroutine and just add the unique details specific to your recipe. [texto completo]
En Instructables se pueden encontrar instrucciones para hacer cualquier cosa en diferentes categorías como arte, tecnología y comida. Si no encuentra lo que quiere construir puede contribuir sus propias instrucciones. Contribuciones notables incluyen instrucciones para hacer cerveza, para hacer un bananófono? y para crear graffitis electrónicos, o Electro-Grafs (las imágenes de este artículo son de este último). Los Electro-Grafs son una idea original de Evan Roth y Joshua Kinberg desarrollada durante sus estudios en el Parsons School of Design. El Graffiti Research Lab, un grupo de diseñadores/artistas/geeks que forma parte del Eyebeam OpenLab y que experimentan e investigan con diversas tecnologías, adoptó los Electro-Grafs:
The Graffiti Research Lab is dedicated to outfitting graffiti writers, artists and protesters with open source tools for urban communication. The goal of the G.R.L. is to technologically empower individuals to creatively alter and reclaim their surroundings from commercial and corporate culture.
Hay un video del proceso (algoritmo :) ) de elaboración de un Electro-Graf:
Gracias a Leonardo Parra por sus aclaraciones sobre los Electro-Grafs.






