January 2009 - Posts
El jueves, estaba preparando una presentación para ayer viernes, explicando cálculo lambda, su historia, su aplicación en lenguajes de programación. Al final de la presentación, mostré cómo las lambdas llegaron a .NET: delegados, notación lambda y expresiones lambda.
Haciendo una rápida búsqueda de enlaces para la charla, encontré esta implementación "cool" de un "parser" de expresiones dinámicas, en el ejemplo:
DynamicLinq.cs
Ese código menciona el post de Scott Guthrie:
Dynamic LINQ (Part 1- Using the LINQ Dynamic Query Library)
El código está incluido en el directorio DynamicQuery en:
C# Dynamic Query Library (included in the -LinqSamples-DynamicQuery directory)
Mi idea inicial para la charla era describir una fórmula y compilarala, usando System.Linq.Expressions. Pero la implementación de arriba, tiene una característica notable: en lugar de construir un árbol de expresiones, paso a paso, creando cada nodo, toma un string y los analiza en el momento, convirtiéndolo a una versión compilada.
OK, este truco es usado por muchas implementaciones de query en Linq, pero no conocía que entre el código de ejemplo de Microsoft estuviera este código.
Usando el DynamicLinq.cs, pude crear una aplicación WinForm, donde la fórmula se ingresa y se compila en el momento:
Vean que podemos usar clases de .NET. "x" es el parámetro que uso como variable en el cálculo de la fórmula.
Este es el código clave en el archivo Calculator.cs:
public Delegate CompileFormula(string formula)
{
ParameterExpression x = Expression.Parameter(typeof(double), "x");
LambdaExpression e = DynamicExpression.ParseLambda(new ParameterExpression[] { x }, null, formula);
return e.Compile();
}
El delegado compilado puede ser invocado, proveyendo el valor del parámetro "x":
public double[] Calculate(Delegate formula, double from, double to, double step)
{
List<double> values = new List<double>();
for (double x = from; x <= to; x += step)
values.Add((double) formula.DynamicInvoke(x));
return values.ToArray();
}
Pueden descargar este ejemplo de:
http://code.google.com/p/ajcodekatas/source/browse#svn/trunk/DynamicExpressionsExample
Otra implementación de expresiones dinámicas compiladas:
To Bind or Not To Bind – Dynamic Expression Trees – Part 3 - B# .NET Blog
To Bind or Not To Bind – Dynamic Expression Trees – Part 2 - B# .NET Blog
To Bind or Not To Bind – Dynamic Expression Trees – Part 1 - B# .NET Blog
Algunas ideas a explorar:
- Extender el ejemplo a tres dimensiones (podría usar un ejemplo que viene en F# con DirectX como base)
- Enviar una fórmula como texto, para ser procesada en una aplicación distribuida, grilla, o cluster de HPC. Por ejemplo, la fórmula del fractal a calcular en forma distribuida.
- Code kata escribiendo mi propio .Parse y .Compile para alguno de mis lenguajes de scripting
Si necesitan más poder, el próximo nivel de lenguajes dinámicos y su compilación a .NET, ese el namespace Microsoft.Scripting dentro del código fuente de IronPython:
http://www.codeplex.com/IronPython/SourceControl
Introducciones a IronPython y la iniciativa DLR:
CLR Inside Out- IronPython and the Dynamic Language Runtime
CLR Inside Out- Dynamic Languages and Silverlight
InfoQ- Microsoft Surpasses Java's Dynamic Language Support-
CLR Inside Out - IronPython
Enlaces relacionados sobre lambda, Dynamic Language Runtime, y lenguajes dinámicas en general:
http://delicious.com/ajlopez/lambda
http://delicious.com/ajlopez/dlr
http://delicious.com/ajlopez/dynamiclanguages
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Estuve codificando una librería de algoritmos genéticos, usando C#. El código está en mi proyecto AjCodeKatas en Google Code dentro de:
http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjGa
El proyecto principal es AjGa (con AjGa.Tests para testing):
Las principales interfaces son:

Uso generics, con dos tipos genéricos: G, que es el tipo de implementación de un gen, y V como el tipo al que se evalúa un genoma (por ejemplo, int, double). Con ese valor se catalogan los genomas.
IPopulation es una colección de genomas.
IGenome es una colección de genes, que es evaluado a un valor de tipo V.
IEvaluator está a cargo de evaluar un genoma.
La implementación de IEvolution ejecuta generaciones sobre una población, que va cambiando, usando mutadores, operadores de cruzamiento, para irla modificando después de cada ejecución.
Hay interfaces para generar un genoma, mutar uno existente o hacer cruzamiento de dos genomas.
Para probar estas ideas, implementé un proyecto con gen, genoma, y operadores, que ataca el clásico problema del Travelling Salesman Problem, el vendedor que tiene que visitar una serie de ciudades, minimazando la distancia a recorrrer:
En este ejemplo, el evaluador tiene una lista de posiciones de ciudades a visitar:
public class Evaluator : IEvaluator<int, int>
{
private List<Position> positions;
public Evaluator(List<Position> positions)
{
this.positions = positions;
}
El tipo de gen acá es int, y cada valor de genoma se expresa como un int. El genoma mantiene una lista de enteros, que representan el número ordinal de las ciudades a visitar:
using AjGa;
public class Genome : BaseGenome<int, int>
{
public Genome(int size)
{
for (int k = 0; k < size; k++)
{
AddGene(k);
}
}
Esto es, cada gen es un int, y un genoma con genes 2, 0, 1, representa un viaje que visita la tercera ciudad, pasa por la primera, y termina en la segunda.
Podemos ejecutar el proyecto WinForm, para probar esta implementación:
En la ejecución de arriba, la distribución de ciudades es al azar. Las ciudades pueden ser distribuidas en una grilla:
De esta forma, podemos probar la eficiencia del algoritmo para encontrar un solución óptima, que en el caso de disponer las ciudades en grilla, se conoce de antemano.
Si queremos implementar un nuevo proyecto GA, tenemos que:
- Definir el tipo que tendrán los genes
- Definir el tipo valor a usar
- Escribir operadores (creadores, mutadores, cruzadores) de genomas
Los tests que tengo están en verde:
Buen Code coverage:
En 4 horas tuve la primera versión, gasté 3 horas explorando TSP, y cerca de 8 horas preparando y "tuneando" la aplicación WinForm.
Como de costumbre, ¡me divertí escribiendo este ejemplo!
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Hace un año, escribí un post, comentando el trabajo de Ian Piumarta work:
Self-sustaining sysmtes, Cola, Pepsi y Mate
Proponía que una implementación de las ideas Ian Piumarta y Warth, era posible en .NET o en Java. En vez de usar C como lenguaje base, se podría implementar todo sobre un lenguaje con máquina virtual, con un framework rico de clases de base, y con un garbage collector automático. Para mí, era una interesante idea, que merecía algo de atención.
Para entender las ideas ideas de Piumarta y Warth, lean lo que describieron sobre una implementación mínima en:
http://piumarta.com/pepsi/objmodel2.pdf
http://piumarta.com/pepsi/objmodel.pdf
Encontrarán el código de una implementación en C, en esos papers. Un diagrama aclaratorio:
(tomado deOpen Extensible Dynamic Programming Systems Dls )
Esta semana pasada, puse manos a la obra, y estuve trabajando en una implementación en C# de esas ideas. Publiqué mi código en my Proyecto Google Code AjCodeKatas, dentro de:
http://code.google.com/p/ajcodekatas/source/browse#svn/trunk/AjSoda
La solución tiene cuatro proyectos (dos librerías de clases, y otros dos que son sus respectivos tests). El proyecto principal es el AjSoda:
Un diagrama de las interfaces principales:
IObject es la interfaz que escribí para representar un objeto genérico. Tiene un "payload", que es un arreglo de referencias a objectos .NET arbitrarios.
Una alternativa que consideré, era apuntar solamente a IObjects. Pero quiero tener la capacidad de apuntar y manipular directamente objetos .NET (u objetos Java, si lo reimplemento en ese lenguaje). La alternativa hubiera sido apuntar solo a IObjects, e implementar un digamos DotNetWrapper : IObject que encapsulara los accesos a un objeto .NET (algo así está armado en el AjBasic).
El método más importante en IObject es Send. Usando este método, podemos enviar un mensaje (selector y argumentos) a cualquier instancia de IObject.
IBehavior es mi implementación de lo que Piumarta y Warth llaman una vtable (me recuerda a las tablas de métodos en viejas implementaciones de C++). Es un objeto que contiene una lista por nombre de métodos que pueden atender los mensajes que se envía a un IObject.
Cada IObject tiene una propiedad Behavior que apunta a un IObject. Podría haber elegido apuntar a un IBehavior, pero de esta manera, el Behavior de un objeto puede ser reemplazado por cualquier otro objeto que entienda un mensaje con selector #lookup:.
No necesité hasta ahora, implementar el concepto de Closure, como lo describen Piumarta y Warth en su paper. Usando closures, ellos implementan slots a la Javascript o Self. Pero en los experimentos que hice, no necesité aún implementar eso.
Las clases principales de implementación son:
Cada BaseObject implementa un IObject, manteniendo un arreglo interno de objetos como "payload" del objeto:
public class BaseObject : IObject
{
private object[] values;
public BaseObject()
{
}
public BaseObject(int size)
{
this.values = new object[size];
}
public int Size
{
get
{
if (this.values == null)
{
return 0;
}
return this.values.Length;
}
}
public IObject Behavior { get; set; }
(Noten que la propiedad Behavior es un IObject, por las razones que expliqué antes).
El método más interesante es el Send:
public virtual object Send(string selector, params object[] arguments)
{
if (selector == null)
{
throw new ArgumentNullException("selector");
}
if (this.Behavior == null)
{
throw new InvalidOperationException("No behavior in object");
}
IMethod method = (IMethod) this.Behavior.Send("lookup:", selector);
if (method == null)
{
throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "Unknown message '{0}'", selector));
}
return method.Execute(this, arguments);
}
No uso directamente this.Behavior.Lookup para obtener el IMethod asociado a un selector. En cambio, uso directamente el método Send para enviar un mensaje al object apuntado por Behavior. De esta forma, obj.Behavior puede ser dirigido a cualquier objeto IObject que quiera implementar la lógica de lookup de un método por selector. Esta decisión tiene impacto en el rendimiento, pero permite explorar nuevas estrategias de obtención de métodos. Pueden leer en los papers mencionados, cómo implementan herencia múltiple y Traits, usando esta capacidad de redefición de lookup.
AjPepsi
En el código encontraran un proyecto adicional, AjPepsi, donde implementé un parser, y intérprete de bytecodes, de un lenguaje parecido al que usaron language Piumarta/Warth como prueba de concepto en sus escritos. Acepta código como:
Object new [^self class basicNew initialize]
Object initialize []
List : Object(head tail)
List head [^head]
List tail [^tail]
List head: newHead [head := newHead]
List tail: newTail [tail := newTail]
list1 := [^List new]
list2 := [^List new]
[list1 head: 'Hello']
[list2 head: 'World']
[list1 tail: list2]
Object y List son prototipos. Dejaré una explicación más detallada de este lenguaje y su implementación para un futuro post. AjPepsi aún está en desarrollo; probablemente, refactorearé gran parte del núcleo de la implementación. Tomé el código de AjTalk como base, pero no estoy seguro de haber tomado la decisión correcta: AjPepsi es muy orientado a prototipos, y basado en AjSoda, así que tuve que trabajar bastante para llevarlo a estas ideas.
Una gran "feature" pendiente: generar código C# a partir del estado de la máquina virtual (clases, métodos e instancias). Vean en el sitio de Piumarta cómo implementó un compilador de su propio lenguaje en C, y que genera en ese lenguaje el código de su propio intérprete. De ahí la idea de "lenguajes auto sustentables".
Los tests están en verde:
El "code coverage" es bueno:
Hay algún "code smell" para refactorear. Un ejemplo clásico: el gran switch con toneladas de código en el intérprete de byte code. Pero la mayoría de ese código oloroso está en el proyecto AjPepsi. AjSoda está tomando forma, yendo hacia una versión estable. Me tomó sólo 4 horas escribir el código de AjSoda, pero estoy gastando muchas horas escribiendo AjPepsi (10 horas hasta ahora).
Como de costumbre, ¡me divertí escribiendo este código!
Más enlaces sobre las ideas de Piumarta/Warth:
http://lambda-the-ultimate.org/node/2483
http://piumarta.com/
http://piumarta.com/pepsi/pepsi.html
http://piumarta.com/software/cola/
Comentarios, sugerencias, bienvenidos.
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com/
http://twitter.com/ajlopez
Encuentro esta demo de un nuevo auto, el Chrysler 200C EV, donde la presentadora usa Surface para mostrar las nuevas características. El panel delante del conductor, en el auto, es una aplicación multitouch (aunque no entendí qué tecnología tiene instalada, ¿será también Surface?):
Pueden ver el auto andando, y manejado desde el interior, e interactuando con un IPhone, en:
Parece que las interfaces multitouch están destinadas a usarse en varios lugares cotidianos. Por ahora, Surface es caro. Pero poco a poco, lo multitouch se va adoptando. Hay soluciones más accesibles, como la que comenté en
Multi-Touch G2 de PQ Labs
Encontré esta información a partir de un tweet de @stevecla, con su post:
Microsoft Surface In The Car
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com/
http://twitter.com/ajlopez
En el 2007 había posteado sobre
Crayones y Física
donde mostraba un video de un software que simulaba interactivamente un ambiente con física (gravedad, cuerpos, inercia). Ahora me entero de este excelente trabajo:
de
Phun - 2d physics sandbox
Leo ahí:
It may look like a toy, but Phun is based on highly competitive technologies for interactive multiphysics simulation, ranging from novel physical models and variational integrators to high performance numerical methods. Phun is off-spring from research at Umeå university, and a MSc project of Emil Ernerfeldt, now further developed at Algoryx Simulation. Algoryx also develops a professional 3D multiphysics engine called AgX.
Pueden ejecutarlo (y jugarlo) en Windows, MacOS y Linux.
De nuevo, excelente implementación de la idea, muy bueno el trabajo de Emil Ernerfeldt:
Emil Ernerfeldt is a 23 year old Swedish programmer for Algoryx. Emil lives in Umeå, which is also where Algoryx is located. He made the '2D Physics Sandbox' Phun for his master thesis in about 6 months. Later on, Phun increased in popularity, and was transferred to Algoryx, a company founded by Emil's MSc supervisor Kenneth Bodin, and his colleagues from Umeå University
Es decisión del autor, pero no hay descarga de fuentes.
Encontraran información sobre los algoritmos de implementación en:
http://www.phunland.com/wiki/FAQ
Como muestra:
Where can I get hold of the details of how Phun works?
In Emil's thesis, when he has finished writing it! Phun is based on a 2D physics engine that solves for constraint forces. A constraint is a physical/mathematical condition that makes sure that a hinge holds together or that two contacting bodies do not penetrate. The solver in Phun solves a large linearized system of equations using an iterative method, computes the required constraint forces and updates the velocities with these forces, and finally also computes new positions and orientations. The method for computing the constraint forces is based on SPOOK, from the work of Claude Lacoursière in his PhD thesis, Ghosts and machines: regularized variational methods for interactive simulations of multibodies with dry frictional contacts, Dept. of Computing Science, Umeå university, 2007. The resulting time stepper is closely related to the Leapfrog integration scheme. The fluid simulations in Phun are based on a method called Smoothed Particle Hydrodynamics (SPH). SPH is a particle based method where the forces between the particles are designed so that the resulting dynamics approximates the Navier Stoke's equations for a fluid.
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Hoy recibo un email en la lista de Latin America Agile Software Development del bueno de Juan Gabardini, anunciando la próxima reunión que estan organizando:
¡Ya podés inscribirse en Agile Open Buenos Aires 2009!
http://agileopenbsas2009.wetpaint.com/page/Inscripción
Y porque querrías hacerlo, te preguntarás.
- Porque nos juntaremos 100 personas con muchas ganas de implementar metodologías ágiles en nuestros trabajos
- Porque tu participación será activa, con el formato Open Space (ver abajo)
- Porque lo organizamos de manera que te permita asistir sin depender de otros (gratuito, fuera de horario laboral, lugar de fácil acceso)
Cuando: marzo 6 (18:30 a 21hs) y 7 (9 a 18hs)
Dónde: Centro Cultural Borges (Viamonte y San Martín)
Costo: gratis (excepto quizás la comida, depende de los sponsors que consigamos).
Más información en http://www.agiles.org/agile-open-buenos-aires-2009
Formato Agile Open / Open Space
Esta forma de organización de eventos permite con relativamente poca preparación previa realizar eventos de alta calidad en forma auto-organizada. Funciona para reuniones desde 5 personas hasta reuniones de varios miles de personas.
Es particularmente apto para encuentros en los que se discuten temas que son relevantes, complejos y que los asistentes tienen interés y pasión por tratar.
La pasión y el interés se logra por un proceso de autoselección ya que una vez definido el Tema de la conferencia, los asistentes a los que les interesa el tema se anotarán, y al ser en un día no laboral, no dependen tanto del interés de las empresas en las que trabajan como en su deseo personal de participar. A su vez, los temas a tratar en cada sesión son propuestos y votados por los asistentes.
Ejemplos
http://www.agileopen.net / http://agileopencalifornia.com / http://www.agileopennorthwest.com
http://www.openspaceworld.org/
Ya el grupo organizó una reunión diferente, que resultó excelentemente organizada (a la manera ágil):
Agiles 2008 – La emoción de que las cosas sucedan
Esperemos que esta nueva reunión, de formato distinto, permita a gente interesada en el tema, para conocerse entre sí, y aprender más de Agile en general.
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Son un usuario fanático de Twitter. Una cuenta a la que sigo es @delicious_prog, que envía varios mensajes por día, relacionados con programación, desarrollo de software en general. En uno de esos tweets, encontré el post
The Clean Code Talks -- Inheritance, Polymorphism, & Testing
de Daniel Wild, donde incluye el vidio de una Google Talk:
de Misko Hevery en Google Tech Talks.
Es claro e interesante. Es una charla explicando los usos del polimorfismo, y también, las formas de realizar test sobre métodos polimórficos. Me gusta encontrara en este vido varios argumentos similares a los que uso en mis charlas de desarrollo. Hace unos días, estuve usando polimorfirsmo en mi intérprete AjCat (un intérprete del lenguaje cat que me hizo conocer el bueno de @rodolfof):
http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjCat
Esta es mi implmentación de Integer Binary Operation:
public abstract class IntegerBinaryOperation : Expression
{
public abstract int Apply(int op1, int op2);
public override void Evaluate(Machine machine)
{
int op2 = (int) machine.Pop();
int op1 = (int) machine.Pop();
machine.Push(this.Apply(op1, op2));
}
}
Las operaciones Add y Subtract sobreescriben el método Apply:
public class IntegerAddOperation : IntegerBinaryOperation
{
private static IntegerAddOperation instance = new IntegerAddOperation();
private IntegerAddOperation()
{
}
public static IntegerAddOperation Instance
{
get
{
return instance;
}
}
public override int Apply(int op1, int op2)
{
return op1 + op2;
}
public override string ToString()
{
return "add_int";
}
}
public class IntegerSubtractOperation : IntegerBinaryOperation
{
private static IntegerSubtractOperation instance = new IntegerSubtractOperation();
private IntegerSubtractOperation()
{
}
public static IntegerSubtractOperation Instance
{
get
{
return instance;
}
}
public override int Apply(int op1, int op2)
{
return op1 - op2;
}
public override string ToString()
{
return "sub_int";
}
}
Es muy similar al ejemplo presentado en el video. Estuve algo más perezoso en mi implementación de operadores en AjPython (otro intérprete, de nuevo en C#, trabajo en progreso):
http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjPython
public class BinaryOperatorExpression : BinaryExpression
{
private Operator @operator;
public BinaryOperatorBLOCKED EXPRESSION;
}
}
Pero confío en refactorearlo, tengo espaldas para hacerlo, gracias una buena base de test ya escritos.
Es bueno encontrar este tipo de material, como esta charla, la recomiendo, gracias a @delicious_prog y a Daniel Wild!
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Si Ud. tiene tantos años en desarrollo de software como yo, probablemente recuerde, que por unos pocos meses, a mediados de los 80, las revistas de desarrollo de software comenzaron a incluir rectángulos verticales con pequeñas marcas blancas y negras, a los costados de las páginas de algún artículo de programación. De esa forma, el autor del artículo publicaba el código fuente: la imagen de ese rectángulo podía escanearse, y transformarse en texto. Fue una gran idea, pero fue prontamente olvidada cuando se popularizó la inclusión de diskettes (y luego CDs, y DVDs) en cada entrega de una revista.
Ahora, en 2009, Microsoft lanzó una nueva aplicación para IPhone, que de nuevo escanea información, pero con una gran cantidad de usos: Microsoft Tag
Una idea a explorar: todo objeto físico, paquete de correo, mercadería en estantes o en tránsito, equipaje, podría ser codificada con ese tag, apuntando a una URL con una interface de Web service o REST, donde cualquier software podría actualizar el estado, posición del objeto asociado, usando una aplicación en dispositivos móbiles. El endpoind podría describirse a sí mismo, indicando las operaciones habilitadas para actualizar el estado del objeto. Cada objeto físico podría tener un estado actualizable en el cloud, apuntado por su propio dibujo de tag.
Mi primer contacto con esta tecnología, fue gracias a un twitter del bueno de @MartinSalias (otro uso de Twitter: una forma liviana y rápida de enterarse de nuevas cosas, podría reemplazar los readers de centenares de blog posts). En estos días, Arvindra Sehmi también publicó sobre Microsoft Tag:
Microsoft Tag - Snap. Blink. Wow!
Más información en la página oficial de Microsoft Tag:
http://www.microsoft.com/tag/
Para armar sus tags, ir a:
tag.microsoft.com
e ir a gettag.mobi para bajarse la aplicación de escaneo.
Otros posts sobre el tema:
Microsoft Releases Tag, Its Second iPhone Application
Another Useless iPhone App From Microsoft- 'Tag' (MSFT)
Microsoft Joins the Physical World Connections and Interactions Space with Microsoft Tag
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com/
http://twitter.com/ajlopez
Ya publiqué algunos posts sobre interfaces, muchos mostrando productos multi touch, como Tocatú y Microsoft Surface. Ahora, en la 2009 International CES, January 8-11 la gente de PQ Labs presenta su solución multi touch, que no necesita cambiar de hardware, sino que se monta sobre monitores ya existentes. Encuentro en un twitter de @paulfabretti su post:
Touchscreen WoW - simply fantastic
donde expone un video de Crunchgear
Look out, Microsoft Surface - the iTable might just trump you in every way
El video oficial es:
¡Yo también quiero jugar! :-)
Leo en el sitio:
http://multi-touch-screen.net/hardware.html
PQLabs Multi-Touch G² is a touch screen overlay that can be easily mounted onto any LCD or Plasma TV monitors. This simple, lightweight and low cost solution let you deploy Multi-Touch technology instantly to existing monitors without the need of any configuration. Multi-Touch G² is connected to the computer via a USB cable (No power cable is needed).
Because of the simplicity and portability of Multi-Touch G², it can be easily used in the meeting room, conference, exhibition, command & control, event shows, classrooms. It can be easily placed on a stand, on the wall or built into a coffee table.
Esas características son muy buenas. Mientras que para tener una Surface, había que hipotecar un departamento, este producto de PQ Labs promete ser más accesible, y adaptable al hardware y software existente. Por ejemplo, ejecuta sobre Windows XP, si es necesario. No necesita un sistema operativo especial.
Habrá que ver la aparición de algunas "killer apps" para que alguna solución de multi touch tome el mercado y se estabilice como el estándar a seguir. Los juegos, manipulación de imágenes, exploración de datos, exploración de mapas, todos son candidatos a que estas tecnologías multi touch, dentro de unos años, sean tan ubicuas como lo es hoy el mouse.
¿Programando en Eclipse con los dedos? ;-)
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com/
http://twitter.com/ajlopez
Me encontré con este artículo
A Robot That Learns to Use Tools
que describe al UMan, un robot desarrollado en
Robotics and Biology Labs
de la Universidad de Massachusets. Me gustó mucho el camino que eligieron: el robot va interactuando con el entorno, y va aprendiendo a manipular los objetos que encuentra, deduciendo sus relaciones.
Visiten la página del proyecto
http://robotics.cs.umass.edu/?n=Main.AMM
Ahí pueden ver estos dos videos
IP1.wmv
IP2.wmv
donde va explorando una tijera sobre una mesa, sin conocerla de antemano. Siempre es interesante encontrar este tipo de aplicaciones de aprendizaje. En lugar de tener que codificar laboriosamente su conducta, mediante software precargado, el agente puede aprender del entorno, e ir mejorando su interacción. Me parece un campo fascinante para explorar, donde la inteligencia artificial puede dar una gran ayuda en el desarrollo de este tipo de agentes corporizados autónomos.
Leo ahí sobre Autonomous Mobile Manipulation:
Autonomous Mobile Manipulation could be considered the holy grail of robotics: a successful approach to autonomous mobile manipulation has to integrate virtually every aspect of robotics, including mechanism and sensor design, low-level control, motion planning, machine learning, computer vision, and reasoning. Currently, most of the available robotic applications are either capable of performing a very limited set of skills, or can only operate in relatively structured environment. The task of bringing robots to houses and to our daily life remains a challenge. The commercial potential is promising. Truly autonomous robots could dramatically affect health care and planetary exploration. Moreover, those robots could contribute to logistic and military applications, maintain satellites in orbit, and many other tasks currently performed by humans.
Hay varios "papers" interesantes para leer en la página del laboratorio y del proyecto, por ejemplo, sobre elastics roadmaps. El más relacionado con este tema es
Dov Katz, Emily Horrell, Yuandong Yang, Brendan Burns, Thomas Buckley Anna Grishkan, Volodymyr Zhylkovskyy, Oliver Brock and Erik Learned-Miller. The UMass Mobile Manipulator UMan: An Experimental Platform for Autonomous Mobile Manipulation. In IEEE Workshop on Manipulation for Human Environments, Philadelphia, USA, August 2006.
Download as pdf
¡Excelente trabajo!
Más información, con otros proyectos, en:
Hot Robots
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com/
http://twitter.com/ajlopez
Los que me conocen, saben que no uso teléfono. Así que no estoy al tanto de las últimas características de los móbiles que cada vez vienen con más prestaciones. Hasta hace poco, ¡no conocía que la misma tecla servía para discar y para cortar! Bueno, lo mío es Twitter o la web... ;-)
Pero veo por ahí, todo lo que ha desatado el iPhone. Vean un uso original, de su acelerómetro:
¡Una birra para la señora!
(me enteré por un tweet de @JayOatway) (algo me había comentado @SebaRenzi pero creo que no me envió ningún enlace, de canuto .. ;-).
La mayor parte de las aplicaciones son juegos, quiero jugar con:
Un clásico juego revivido:
No siempre se puede obtener todo lo que uno quiere tomando datos del acelerómetro (ver los comentarios):
Combinado con el "touch"
Pero lo que realmente me gustó, es este ichalky, el "stand up guy", muy buena explicación de la física:
Los diseñadores de juegos le están sacando jugo al tema del acelerómetro:
Corto con tres aplicaciones:
Cambiando de aparato, vean al Arduino usado para controlar movimiento:
Una vieja implementación la GyroTablet de Microsoft
Voy coleccionando enlaces en
http://delicious.com/ajlopez/accelerometer
http://delicious.com/ajlopez/iphone
http://delicious.com/ajlopez/gamedevelopment
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com/
http://twitter.com/ajlopez
En algún tweet de @delicious_prog (que suele enviar varios mensajes con enlaces relacionados con la programación en general, que terminan agregados en mi propio delicious), encontré este post:
del que saco este video:
Vean el trabajo que se tomó esta persona para conectar a una máquina lavadora de ropa, para que al detectarse que terminó su trabajo, envíe un mensaje a una cuenta de Twitter, @pimpy3wash. Pueden ir ahí y ver que no hubo mucho trabajo en este fin de semana.
Habrá que ver si es todo un montaje, o realmente funciona. Pero más allá del sentido del humor que tiene el autor de esto, es interesante ver podemos usar Internet, con mensajes que ya existen, para avisar de eventos, o accionar en dispositivos remotos, o recibir información de sensores.
Como ejemplos de aplicaciones más serias, pueden ver los proyectos de la gente de Instedd (donde trabaja el bueno de Eduardo Jeziersky), como:
SMS Geo-Chat
Pueden ver cómo puede usarse en
Golden Shadow
También tienen el interesante:
Twitter Bots
al que usan también en otro proyecto
Instedd Directory
Uno de los enlaces que mencionan es lo que tiene la gente de research de Microsoft India:
http://www.codeplex.com/smstoolkit
Más sobre Twitter y aplicaciones relacionadas en:
http://delicious.com/twitter
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com/
http://twitter.com/ajlopez