Angel "Java" Lopez

NET, Java, PHP y Desarrollo de Software

This Blog

Syndication

Search

Tags

Community

Email Notifications

Archives

.NET

ASP.NET

Windows Form

VB.NET

C#

Sitios

Blogs

September 2009 - Posts

Hacia una Historia Clínica Digital de Código Abierto

Ya desde hace un tiempo, estoy pensando en qué aplicaciones se podrían desarrollar en código abierto. La que estoy encarando personalmente, es en mejorar AjContab, un sistema de “General Ledger” dirían los americanos, sistema contable simple, abandonando mi viejo ejemplo en .NET, escribiéndola primero en PHP, y luego, ir investigando otras formas de implementarla, en Java o en .NET.

Pero también pienso en sistemas más grandes. Uno de los que vuelve y vuelve a mi mente, al leer artículos, repasar libros, y ver lo que hay por ahí, es el de Historia Clínica Digital. Quisiera pasar en limpio acá algunas cosas que estoy investigando y pensando sobre el tema.

Algunos puntos:

  • Es un sistema no trivial e interesante
  • Se puede implementar con una interfaz web, e ir pensando en otras interfaces
  • Podemos aprovechar Java o .NET, como tecnologías maduras
  • La aparición de tecnologías de apoyo a Rich Internet Application, como Silverlight, Adobe Air, permiten pensar en una interfaz que pueda evolucionar a más requerimientos de presentación, si es que la interfaz web resulta limitada para algunos requerimientos
  • Las primeras versiones deberían concentrarse en las prácticas directas, del día a día, más que en la legislación de un país. Buscaría un cliente particular, una clínica, para servir como experto del dominio, y primer usuario que brinde retroalimentación
  • Integraría el papel: muchas de las historias clínicas hoy se llevan en papel, no deberíamos ignorar ese hecho al armar este sistema. Deberíamos poder agregar información simplemente escaneada (con reconocimiento de a texto o no). En un principio, hasta que no se implemente legislaciones en firme, debemos recordar que la historia clínica en papel, o partes de ella, tienen alguna responsabilidad legal. Vería que las primeras implementaciones, sólo se ocupen de facilitar la recuperación, consulta, de la “historia médica real”, la de papel.
  • Deberíamos buscar el apoyo de empresas, como IBM, Oracle, Sun y/o Microsoft, para tener a este proyecto como “flag ship”, producto bandera para incorporar en el mercado vertical de aplicaciones médicas
  • El mundo de las aplicaciones médicas está en permanente evolución
  • Es un sistema lo bastante no trivial para que deba ser el producto del trabajo de varios, más que de una sola empresa de desarrollo
  • Servicios como firma digital, pueden implementarse en cualquier momento, no necesariamente lo pondría en los primeros requerimientos.
  • Tanto firma digital, como seguridad de acceso, se puede ir implementando como servicios a enchufar, que pueden variar de implementación concreta a otra
  • La historia clínica gana en prestaciones, si es compartida (con toda la seguridad) en “la nube”: la persona debería poder permitir el acceso a la historia clínica personal a los distintos profesionales médicos, sin necesidad de ir recolectando información que dejó en tal consultorio, en tal hospital, en tal internación. De ahí, que imagino que el éxito del proyecto, se mediría con un servicio en línea, tipo Software as a Service
  • Otro camino para “crossing the chasm”, sería brindar el servicio para que la propia persona interesada, el “paciente”, vaya registrando su historia clínica, o lo que quiera ingresar de la misma.
  • Como dije arriba, los “early adopter” deberían ser clínicas, no gobiernos. Convencer a un gobierno de usar algo, por lo menos, por estos lares, es tarea digna de las de Hércules.
  • Luego, el próximo nivel a explorar, serían las obras sociales, servicios de medicina prepaga (no sé cuál es la denominación de estas organizaciones en otros países, fuera del mío, Argentina).
  • Una forma a implementar privacidad, es, en una primera implementación inicial, no dejar ningún dato que identifique al paciente, asegurando privacidad por faltar esa información (ejemplo, tener un código que conozca sólo la persona interesada).
  • Se debe producir un resultado visible, más que esperar años para que los usuarios puedan ver algo andando. Es un tema de adopción temprana: no preocuparse tanto por temas de legislación, gobierno, leyes, firma digital, sino de que sirva a los usuarios finales. Hoy podemos construir sistemas de forma ágil, de tal forma que, si el sistema fracasa, no habremos invertido demasiado esfuerzo. Si triunfa, podemos ir armándolo de forma flexible, para que sobreviva a cambios en la legislación, imposición de formatos nuevos, etc.
  • Habrá que ir pensando en HL7 (Health Level 7), ver IHE (Integrating the Healthcare Enterprise) más que para implementarlos, ver qué temas ocupan, y tenerlos en cuenta y estudiar cuánto influyen en los desarrollos de países que no son EE.UU. Y en sistemas de imágenes como DICOM. Este último es un formato de imágenes producido por varios aparatos médicos, con anotaciones agregadas. ¿conocen algún otro estándar de ese tipo?
  • Tendría que estudiar Open Healthcare Framework (OHF) Project de Eclipse, y el Microsoft Health Common User Interface. Microsoft también tiene Microsoft Health Users Group. Para estudiar: Microsoft for the Health Industry. Por su parte, IBM tiene Healthcare and life science. Y en Oracle Healthcare Applications.
  • Otro que parece interesante es el Open Source Clinical Image and Object Management.
  • Encuentro una lista extensa de código abierto para salud: List of Open Source Healthcare Software, en Wikipedia.
  • Y hay una Open Source Health Care Alliance, aunque parece que el último congreso que tuvieron fue en 2007.
  • Es interesante la ontología y terminología que plantea OpenGalen.

¿Conocen ejemplos de proyectos de código abierto, que hayan encarado este tema, el de la historia clínica digital? He visto por ahí, al Proyecto Angel (no, a pesar del nombre, no tengo nada que ver con el mismo…:-)… en todo caso, se hubiera llamado AjAngel… :-), creo haber leído que era de código abierto, pero no encontré ninguna información cierta al respecto, y no veo donde bajarlo, ni que licencia tiene.

Pueden ver algunos enlaces sobre el tema historia clínica y sobre historia clínica digital, en:

http://delicious.com/ajlopez/medicalrecord

Sobre temas de medicina a encarar en este proyecto:

http://delicious.com/ajlopez/hl7
http://delicious.com/ajlopez/dicom

Tengo entre manos, terminar AjSharpure (con post explicativos) y seguir con AjContab, publicando algo (con post explicativos). Pero podría armar alguna prueba de concepto, algún prototipo, de lo que esperaría de un sistema como éste. Otra opción, es ir armando un pequeño sistema a adoptar por las clínicas, como “caballo de troya” benigno. El más potable, me parece, sería un sistema de turnos, que puede brindarse también como Software as a Service, o instalarse local en la empresa.

¿Qué les parece? ¿Es factible? ¿O tengo que ir abriendo mi propia historia clínica psiquiátrica? :-) :-)

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Tue, Sep 29 2009 10:32 by lopez | 17 comment(s)

VAN (Reunión Virtual) en ALT.NET Hispano sobre Generación de Código

Gracias a la comunidad de ALT.NET Hispano, mañana sábado 26 de septiembre, participaré de una VAN (Reunión virtual) sobre generación de código (hora internacional 6PM GMT, son15hs Buenos Aires). La idea es que al principio presente algunas ideas, ejemplos de AjGenesis, panorama de generación de código, comentar otras herramientas y aproximaciones, pros y contras,  y luego, se discutan los temas, entre todos.

Quisiera presentar:

  • Los por qué de la generación del código
  • Qué pedirle a una herramienta de generación de código
  • Elevar el nivel de abstracción, partiendo de un modelo
  • Resolviendo paso a paso, la aplicación más simple
  • Mostrar que es más que templates/plantillas
  • Resolver una aplicación con entidades, desde el mismo modelo, en distintas tecnologías y plataformas (Java, .NET, PHP)
  • Generación de código como servicio en línea

Si no conocen qué es una reunión VAN, pueden consultar VAN meetings

Para ver cómo se desarrolla una VAN de ALT.NET Hispano, y qué software necesitan para asistir, ver Descripcion-de-Reuniones-VAN

Pueden ver el historial de anteriores reuniones VAN (visiten las que dieron, por ejemplo, sobre NHibernate, WPF y demás)(ya había participado de VAN sobre Scrum).

Gracias al bueno de Jorge Gamba (@jorgegamba) que publicó el evento en su blog:

[Evento] Viendo la luz respecto a “Generación de Código”

Copio de ahí:

La comunidad ALT.NET Hispano realizará un evento virtual con el tema Generación de Código, con la exposición principal del reconocido especialista y maestro en desarrollo de software Angel “Java” Lopez. Será el día sábado 26 de septiembre a la hora internacional 18:00 GMT/GTU (Greenwich), con una duración aproximada de 2 horas. Para atender la reunión deben usar el programa Microsoft Office Live Meeting 2007 client, abriendo el enlace http://snipr.com/virtualaltnet.

Adicionalmente, pueden plantear sus comentarios e inquietudes sobre el tema de la reunión en la discusión Invitación a VAN Hispano Sábado 26 de septiembre - "Generación de código" con Angel "Java" Lopez, en nuestra lista de correo.

La comunidad ALT.NET hispano está muy activa, y los invito a participar de ella. Jorge escribe:

les dejo la lista de recursos compartidos de los que disponemos en la comunidad:

Como comenta Jorge, pueden ir leyendo:

Sobre la generación de código
Diez reglas principales en generación de código
La generación de código y el trabajo de desarrollo de software

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Fri, Sep 25 2009 10:32 by lopez | 1 comment(s)

Explorando objetos con Smalltalk

Estoy siguiendo a @jarober (James A. Robertson) en Twitter. El es el Cincom Smalltalk Product Evangelist. Postea enlaces, recursos y novedades sobre Smalltalk, en particular sobre los productos Cincom. Escribe un blog:

http://www.cincomsmalltalk.com/blog/View.ssp

que corre sobre Smalltalk. Si visitan ese blog, encontrarán varios posts con videas sobre Smalltalk. Hace poco, Robertson publicó:

Smalltalk Daily: Exploring Objects

Este es el video:

Robertson escribe:

Many times, you want to do something, know that it can be done - but just aren't sure how to construct the code to do it. If you have an object, you can usually solve that problem by drilling into it with the inspector and looking at it. Today we learn how to programmatically change workspace page text by drilling into a workspace.

Es refrescante ver este tipo de interacción con objetos, tan “a la Smalltalk”.

Debo reanudar mi trabajo en mi Smalltalk VM (intérprete) AjTalk, pueden leer

AjTalk, un intérprete tipo Smalltalk

Le tendría que agregar soporte visual. Mi idea, como en otros intérpretes que estoy escribiendo, es interactuar con el framework de base, en este caso, .NET con su CLR. De esta forma, puedo sacar provecho de todo lo que está armado en ese framework. En estos días, todo lenguaje debería tomar ventaja de un framework de clases ya armado: .NET y Java son las opciones obvias a tomar (ver Clojure como un ejemplo “moderno” de esta estrategia) (o AjSharp… :-)

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Thu, Sep 24 2009 10:33 by lopez | with no comments

AjSharp: un lenguaje dinámico en C#

Durante el desarrollo de AjGenesis, mi proyecto de generación de código, definí y usé un lenguaje interpretado, llamdado AjBasic, que me dió libertad para implementar tareas, plantillas y acceso a .NET, de una forma muy flexible. El año pasado comencé a separar la implementación de AjBasic del núcleo de AjGenesis, para poder irlo mejorando. Escribí el núcleo de un intérprete, AjInterpreter, y como prueba de concepto, construí sobre él a AjBasic, y a otro lenguaje AjSharp, con una sintaxis más tipo C#. Más információn en:

AjSharp- a C Sharp-like interpreter, work in progress
AjSharp – un intérprete a la C# trabajo en progreso

Ahora, este año, lo reescribí en una implementación nueva, dentro de mi AjCodeKatas Google Code. El núcleo del intérprete es ahora AjLanguage, y AjSharp es el lenguaje con un parser que se apoya en la “virtual machine” que da el AjLanguage, para armar y ejecutar un árbol de comandos y expresiones:

Pueden ver el código en desarrollo y bajarlo desde:

http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjLanguage

Variables, expresiones y comandos

Las variables no son tipadas, y son automáticamente declaradas cuando son usadas:

a = 1;
b = 2;

Estas variables contienen valores enteros, pero pueden asignarles valores de otros tipos en cualquier momento:

a = “one”;
b = “two”;

Los comandos habituales son soportados:

if (k>0)
   return;
 
for (k=1; k<=10; k++)
   sum = k+sum;
 
while (j<10)
   DoProcess(j);
 
foreach (element in elements)
   AddElement(element);

Las condiciones puede ser cualquier expresión, no solamente una que de resultado booleano. Ver más adelante, la explicación sobre el valor False.

Funciones y rutinas

Esta es la sintaxies para escribir una función factorial.

function Factorial(n)
{
    if (n<=1)
        return 1;
 
    return n * Factorial(n-1);
}

La palabra sub puede ser usada para definir subrutinas.

Funciones y subrutinas son como cualquier otrosvalores. Puede ser definidos sin nombre y asignados a variables:

Add1 = function (n) { return n+1; }
two = Add1(1);
function Apply(func,values)
{
    list = new List();
 
    foreach (value in values)
        list.Add(func(value));
 
    return list;
}
 
numbers = new List();
numbers.Add(1);
numbers.Add(2);
numbers.Add(3);
 
function Square(n) { return n*n; }
 
squared = Apply(Square, numbers);
 
squared2 = Apply(function (n) { return n*n; }, numbers);

Manejo de objetos .NET nativos

Uno de los objetivos de diseño de AjLanguage es que pudiera acceder a objetos .NET. Pueden ser creados con la palabra new:

ds = new System.Data.DataSet();
dinfo = new System.IO.DirectoryInfo(“.”);
 
foreach (fi in dinfo.GetFiles()) {
    PrintLine(fi.FullName);
}

Objetos dynámicos

Pueden ser creados usando la palabra new. Un objeto dinámico acepta nuevos miembros (variables y métodos):

dynobj = new DynamicObject();
dynobj.FirstName = “Adam”;
dynobj.LastName = "Genesis”;
dynobj.Age = 800;
dynobj.FullName = function() { return FirstName + “ “ + LastName; }

Otra notación:

dynobj = new { Name = “Adam”, Age = 800 };

Otra notación:

dynobj = new { var FirstName = “Adam”; var LastName = “Genesis”;
 function FullName() { return FirstName + “ “ + LastName; }

Los objetos dinámicos se definen automáticamente, poniendo valores en sus propiedades:

Project.Database.Provider = “…”;
Project.Database.ConnectionString = “…”;

crea el objeto dinámico Project, con una propiedada Database que es a su vez otro objeto dinámico. Ese código equivale a:

Project = new DynamicObject();
Project.Database = new DynamicObject();
Project.Database.Provider = “…”;
Project.Database.ConnectionString = “…”;

Un experimento (veré si queda en la implementación final) las litas se definen automáticamente usando el método Add:

Project.Entities.Add(new { Name = “Customer”, Table = “dbo.Customers” });

equivale a:

Project = new DynamicObject();
Project.Entities = new List();
Project.Entities.Add(new { Name = “Customer”, Table = “dbo.Customers” });

Clases dinámicas

Una clase puede ser definida usando esta sintaxis:

class Person {
    var FirstName;
    var LastName;
    var Age;
 
    function FullName() {
        return FirstName + “ “ +
            LastName;
    }
}

Una nueva instancia puede ser creada como siempre:

adam = new Person() { FirstName = “Adam”, LastName = “Genesis”, Age = 800 };

La instancia, a su vez, es dinámica: nuevos miembros pueder serle adosados, y pueden agregar o redefinir métodos:

adam.FullName = function() { return “The “ + FirstName; };

Pueden crear una clase como un valor:

Person = new DynamicClass();

pero todavía tengo que definir bien la interfaz para agregar miembros de instancia.

 

Clases ya definidas

Hay algunas clases predefinidas:

dynobj = new DynamicObject();
list = new List(); // implementing IList
dict= new Dictionary(); // implementing IDictionary

Funciones primitivas

Hay unas pocas funciones y subrutinas definidas:

Print(“Hello”);
PrintLine(“Hello World”);

Hay tres funciones predefenidas para ejecutar y evaluar código dinámicamente:

Include("program.ajs");
Evaluate("k+1");
Execute("k=1;");
Include ejecuta los comandos dentro de un archivo. Evalue analiza y evalúa una expresión. Execute compila y ejecuta comandos.

El valor false

Cualquier valor que sea false, null, 0 o el string vacío, será evaluado como falso dentro de una expresión condicional:

if (k)
    PrintLine(“true”);
else
    PrintLine(“false”);

El ejemplo de arriba imprime “false” en ejecución, si k es zero o indefinida. Si una variable es indefinida, cualquier acceso a sus miembros (que no sean métodos) retorna null, no una exception:

if (Project.Database.ConnectionString)
    PrintLine(“true”);
else
    PrintLine(“false”);

Este comando imprime de nuevo “false”, si la variable Project está indefinida.

Arreglos, listas y diccionarios

Vectores nativos puede ser definidos, usando una longitud:

firstprimes = new int[10];

o con valores:

firstprimes = new int[] { 1, 2, 3, 5, 7, 9 };

Una lista es creada dinámicamente si comenzamos a asignar valores con subíndices consecutivos, desde 0, a una variable no definida aún:

numbers[0] = “zero”;
numbers[1] = “one”;
numbers[2] = “two”;
numbers[3] = “three”;

Un diccionario es automáticamente creado si los subíndices no son numéricos:

numbers[“one”] = 1;
numbers[“two”] = 2;
numbers[“three”] = 3;

Si necesitan más características, siempre pueden usar el framework .NET nativo.

Interfaz de consola

El proyecto AjSharp.Console es una aplicación de consola, donde pueden ingresar y ejecutar comandos AjSharp (no expresiones):

No hay comando para salir, todavía. Simplemente, Control+C en Windows (no lo probé, pero todo el código debería ser recompilable en Mono).

Próximos pasos

Hay varias cosas que quisiera agregar. Una lista parcial:

- Implementar AjBasic como otro lenguaje que use AjLanguage
- Soporte de Generics
- Soporte de plantillas/templates (como en AjGenesis)
- Integrar a la generación de código de AjGenesis
- Compilar el AST a Dynamic Language Runtime (DLR)

Nos leemos!

Angel “Java” Lopez

http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Tue, Sep 22 2009 11:04 by lopez | 3 comment(s)

Preparando un curso de .NET: aplicaciones, patrones y arquitectura

Estoy preparando los temas y material, para un curso que dictaré en el Microsoft User Group de Argentina, en Octubre (seguramente quedará anunciado en el sitio del MUG). La idea es ir más allá de lo que ya dí en los cursos de .NET clásico (donde se muestra el framework, distintos tipos de aplicaciones), y un poco más extenso que el que ya dí sobre Arquitectura .NET.

Mi lista de temas (tentativo) a tratar, con ejemplos a desarrollar (tengo que ordenar los temas):

  • Capas lógicas, y el gran patrón: Service Layer
  • Capas físicas, Service Interface/Service Gateway
  • Object Relational Mapping
  • Domain-Driven Design
  • Test-Driven Development
  • Dependency Injection
  • Validaciones y Reglas de Negocio
  • Cambiando la presentación
  • Model View Controller, Model View Presenter y variantes (con distintas tecnologías de presentación)
  • Esas raras arquitecturas nuevas: aplicaciones distribuidas, grid computing, sharding, …
  • Tecnologías: WinForms, ASP.NET, ASP.NET MVC, ASP.NET Ajax, WPF (quizás Silverlight)
  • Herramientas y librerías: Moq, NUnit, NHibernate, VS Tests, Spring.NET, Rhino Mocks, …

y seguramente algún proyecto AjX… :-)

Como siempre, lo que produzcamos en el curso, enlaces a ejemplos ya existentes, ejemplos armados para el curso, quedarán en mi sitio, en

Materiales de Cursos

Como no sé si me dará el cuero para tratar tantos temas, les pregunto por acá: Cuáles serían sus temas preferidos? Falta alguno que prefieran a éstos?

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Sat, Sep 19 2009 15:20 by lopez | 6 comment(s)

Resultado de la VAN en ALT.NET Hispano sobre Scrum

Gracias a la comunidad de Alt.NET Hispano, en especial a @jorgegamba, de Colombia, que me ayudó a tener todo preparado, pude participar en

VAN en ALT.NET Hispano sobre Scrum

Hubo varios participantes, a destacar Gustavo Quiroz y Raul Uribe de Agile Perú. También me encontré con el bueno de @fabiomaulo, que planteó lo difícil que es llevar a cabo un proyecto ágil usando Scrum, ante la falta de un dueño de producto concreto.

Pueden ver la desconferencia en video, enlaces y recursos en:

VAN Hispano - 2009-09-06

Ahí hice mi habitual presentación sobre Scrum, cambiando el orden de algunos temas, y limitándola a 45 minutos, para dar cabida a la discusión y consultas en el resto de la charla. No pude interactuar al principio, porque tenía un problema en mi audio: no podía escuchar a los demás. Luego pude solucionarlo, e integrarme al grupo en la segunda hora de la desconferencia.

Me gusta mucho que una actividad realizada deje una traza en google, de esta forma: los que no pudieron participar, igual pueden ahora consultar lo que se hizo, y aprovechar las discusiones, opiniones, enlaces y recursos que fueron apareciendo en la charla. Hemos visto la luz! :-) :-)

Y YA se viene una nueva VAN:

Invitación a VAN Hispano Sábado 19 de septiembre - ORM con Fabio Maulo

Para alquilar balcones! :-)

Tienen siempre para visitar, los videos y recursos de las anteriores reuniones:

Historial de reuniones 

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Fri, Sep 18 2009 11:04 by lopez | 9 comment(s)

Lord of the REPLs (Read Eval Print Loops) y CodePad

En estos días, estuve trabajando escribiendo lenguajes interpretados. Mi primer interés es Clojure, estoy trabajando en una implementación de las ideas de Clojure en C#, escribiendo desde 0, pueden ver lo que estoy haciendo en:

http://code.google.com/p/ajlisp/source/browse#svn/trunk/AjSharpure

El año pasado escribí un intérprete Lisp AjLisp- a Lisp interpreter in .NET, AjLisp – un intérprete Lisp en .NET, que quiero mejorar, pero en las últimas semanas me dediqué más a escribir un intérprete tipo Scheme:

http://code.google.com/p/ajlisp/source/browse#svn/trunk/AjScheme

Con tanta actividad con lenguajes “lispy”, investigué sobre otras implementaciones. Mis descubrimientos fueron agregados, como es usual, a mi delicious:

http://delicious.com/ajlopez/lisp
http://delicious.com/ajlopez/clojure
http://delicious.com/ajlopez/scheme

Una de las joyitas que encontré, es esta Google App Engine:

http://code.google.com/p/lotrepls/

LotREPLs is a multi-lingual read-eval-print-loop in your browser powered by Google App Engine and the Java runtime. It's a technical demo, not something to do serious work with. The following languages are supported:

  • BeanShell
  • Clojure
  • JavaScript
  • Python
  • Ruby
  • Scala
  • Scheme

Pueden probara en línea en:

http://lotrepls.appspot.com/

Podemos ingresar un comando, y ver el resultado de la evaluación, sin instalar nada en la máquina local.

Otra aplicación similar, que soporta C, C++, D, Haskell, Lua, Ocaml, PHP, Perl, Python, Ruby, Scheme, Tcl, es:

http://codepad.org/

codepad.org is an online compiler/interpreter, and a simple collaboration tool.
Paste your code below, and codepad will run it and give you a short URL you can use to share it in chat or email.

Podemos ingresa el código, y se puede referenciarse por URL, para compartir con otros desarrolladores:

Si seguimos así, un día, todas nuestras herramientas estarán en el browser… :-)

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Wed, Sep 16 2009 10:34 by lopez | 1 comment(s)

Filed under: , ,

Robots en el depósito

Gracias a un tweet de @judell encontré el blog de Ned Gulley http://www.starchamber.com. Temas variados, tendría tanto para comentar. Pero un post me llamó la atención:

The warehouse is the robot

Vean lo que hizo la gente de Kiva Systems:

Pueden leer una explicación de la implementación de este sistema en Zappos.com:

Warehousing and Distribution Centers: Zappos.com goes Space Age

Ahí, leo:

When an order for six items hits Zappos’ WMS, the WMS immediately communicates with the robotic fleet’s central server to fill the order. If the items are located in six separate inventory pods, the system dispatches six robots to locate the correct pods and transport them to the pick station, forming a queue in front of the pickers.

Unlike traditional pick-to-light modules equipped with expensive built-in light displays, this particular picking station uses an overhead rotating laser pointer to direct the worker to pick from the correct bin. A monitor at each station indicates the number of pieces that must be picked. A worker picks the item, scans the UPC, and places the piece in the appropriate shipping box. To minimize robot travel, a picker works on multiple orders that require many of the same item—in short, travel once, fulfill many orders.

Robots navigate the DC using technologies that do not involve wire, rails, or laser guidance. Inexpensive 2D barcode stickers are applied on the floor. The robots use scanners and cameras to look up to identify the pods they are carrying and down to track where they are going. And there’s no need to feed them. The robots charge themselves when they need it. Adkins explains that the charging schedule is built into the capacity of the number of robots so there are always robots being charged, but it doesn’t slow down the operation.

Perhaps the key to this automated storage and retrieval system is its massive parallel processing system. Mitch Rosenberg, vice president of marketing for Kiva Systems, Inc., the system provider for this picking solution, explains: “By keeping track of the velocity of each item, we can project the maximum number of times at one single moment that an item will be demanded for orders and slot the items accordingly into multiple pods to accommodate the filling of simultaneous orders for that item.”

Notable e ingeniosa solución. Ned Gulley está interesado en swarm robots, conjuntos de robots que actúen juntos, para conseguir un objetivo, una idea a investigar (de hecho, mi interés en lenguaje Logo, y NetLogo en particular, viene de conseguir simular una “bandada” de agentes). Es interesante ver cómo se coordinan, y cómo resolvieron simplemente su guía, usando códigos de barra en el piso. Y el uso de procesamiento en paralelo.

Lean el artículo de Wired:

Autonomous robots invade retail warehouses

Vean una explicación y comentarios de los operadores humanos:

Más información en el sitio de Kiva:

The mobile fulfillment System

Resource Library

Hmmm… podría necesitar un sistema de esos, para organizar mi biblioteca… :-)

Hoy, robots en el depósito, mañana, programando sistemas completos en una consultar (espero que usando AjGenesis… :-)

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Sat, Sep 12 2009 17:25 by lopez | with no comments

Filed under:

Lego FlexPicker

Una de las ramas más activas de desarrollo robótico, donde se ha formado desde hace años, es la robótica industrial. Por otro lado, los hobbistas encontraron en Lego elementos para construir robots, en proyectos desde simple a complejos. En estos días, encuentro (no recuerdo quien lo envió a Twitter), el post:

Industrial Robot built out of Lego

Vean primero, el robot industrial de ABB FlexPicker, considerado el más rápido del mundo:

Quiero uno así para ordenar los libros que dejo en el suelo en mi depto… :-)

Alguien se propuso armar un robot similar, usando Lego, y sus extensiones para robótica. Vean el resultado:

El diseñador es LegoShep, quien comenta:

This robot is based on the ABB Flexpicker industrial pick and place robot. It uses four NXT microcontrollers with various Lego sensors and motors. It is very easy to program, each position uses an array element containing 3 motor positions, 3 motor speeds and an action such as grip, release or pause. I can easily teach it to pick anything up as long as it can reach it and it will fit into the end effecter. The robot is programmed using RobotC 1.45.

Más información sobre el proyecto en el sitio de Lego:

Lego Flexpicker

Ahí leo:

An automatic pressure sensing air compressor is used to open and close the gripper. A PF motor opens and closes the air valve.

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Fri, Sep 11 2009 10:50 by lopez | with no comments

Filed under:

Lo que no está escrito, y en Google, no existe

Hoy, si me permiten, voy a estar un poco insistente, recordando dos “mindsets” que trato de seguir en mis actividades.

Me refiero a:

Lo que no está escrito no existe

Don’t be a canuto

Cuando uno asiste a una conferencia, a una reunión pública, cuando lee un libro, conoce algo nuevo, ¿por qué no compartirlo? Escribía en el primer post de arriba:

No sirve solamente conocer, sino también compartir ese conocimiento (que puede ser parcial, erróneo, o no). Si lo que uno sabe u opina, no está escrito, entonces solamente va a servir para uno.

Por ejemplo, de 400 personas que asisten a una conferencia, ¿cuántas la transcribeno, o resumen, y publican el resultado? Pues bien, mi experiencia por estos lares, es: 0 personas. No entiendo esa actitud. ¿por qué no escriben y difunden lo que aprendieron? Y cuando leo algún blog sobre un libro, o una charla, apenas son variantes de “me gustó” o “no me gustó”.

En los tiempos que corren, si no está escrito y en Google, casi “no existe”. Sé que a veces no es fácil, y que lleva tiempo. Pero no es necesario transcribir o comentar todo lo que vivimos. Simplemente, comencemos con algo, con un compromiso: próxima reunión que asistamos, tomemos nota y publiquemos en blog. No tiene que ser una transcripción exacta, pero es bueno aunque sea, algún resumen.

Como muestra de ejemplos, donde las reuniones a las que asistimos, no "quedan solo para los asistentes”, sea primero: Ágiles@BsAs 20090908 Excelente! Pusieron los temas, los participantes que expusieron, los nombres de los productos. Tal vez faltaría que algún asistente agregue un post comentando lo que le parecieron cada herramienta, o algunas impresiones. Y como es un wiki, se puede ir enriqueciendo colectivamente.

Y como ejemplo más completo, vean cómo la gente de Alt.NET Hispano, va grabando las reuniones, y enriqueciendo un wiki: Historial de reuniones donde se toman el trabajo de !grabar las reuniones! y las comparten! Han visto la luz!! :-) :-)

Por suerte, en nuestra profesión, hay varios bloggers, que van escribiendo sobre lo que conocen, sobre lo que les parece interesante, bueno o malo. Un ejemplo a seguir, al bueno de Fabio Maulo en su blog HunabKu. Y así podría nombrar a varios más, que merecerían un post aparte.

Cuando no alcanzo a escribir sobre un tema, por lo menos lo cuelgo por palabra clave en mi delicious: http://delicious.com/ajlopez .Por ejemplo, eso me permitió hoy compartir con alguien lo que fui descubriendo sobre cómo hacer presentaciones http://delicious.com/ajlopez/presentations . Y el 80% más o menos, de mis Tweets en @ajlopez es compartiendo algo, sobre algún tema.

Buscando una imagen para este blog, la encontré en:

http://darmano.typepad.com/logic_emotion/images/share.jpg

El post donde la encontré, me sirve de refuerzo a lo que intento en éste:

The end of knowledge hoarding

Take a look at what Guy Kawasaki does here.  Now take a look at what Kathy Sierra does here.  And most recently—what I’ve done here.  I have a question: is the end of knowledge hoarding coming to an end?

No más acaparamiento de conocimiento. Comparta lo que descubra. Páselo en limpio. Póngalo a disposición de Google.

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Thu, Sep 10 2009 10:14 by lopez | 4 comment(s)

La madre de todas las demos, de nuevo

El año pasado ya había escrito sobre el tema:

La madre de todas las demos

La historia es relatada en más detalle en la entrada de Wikipedia:

http://en.wikipedia.org/wiki/The_Mother_of_All_Demos

The Mother of All Demos is a name given retrospectively to Douglas Engelbart's December 9, 1968 demonstration at the Fall Joint Computer Conference (FJCC) at the Convention Center in San Francisco, in which a number of experimental technologies that have since become commonplace were presented. The demo featured the first computer mouse the public had ever seen, as well as introducing interactive text, video conferencing, teleconferencing, email, and hypertext.

La semana pasada, en una lista de correo privada, recibí esta lista de videos. Veánlos, más de 40 años atrás, ya se demostraba muchas de las tecnologías que hoy tenemos. Según la info del usuario de youtube bigkif:

On December 9, 1968, Douglas C. Engelbart and the group of 17 researchers working with him in the Augmentation Research Center at Stanford Research Institute in Menlo Park, CA, presented a 90-minute live public demonstration of the online system, NLS, they had been working on since 1962. The public presentation was a session in the of the Fall Joint Computer Conference held at the Convention Center in San Francisco, and it was attended by about 1,000 computer professionals. This was the public debut of the computer mouse.

Pero no fue solamente el mouse:

But the mouse was only one of many innovations demonstrated that day, including hypertext, object addressing and dynamic file linking, as well as shared-screen collaboration involving two persons at different sites communicating over a network with audio and video interface.

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Wed, Sep 9 2009 10:21 by lopez | 2 comment(s)

VAN en ALT.NET Hispano sobre Scrum

El domingo que viene, habrá una reunión virtual del grupo ALT.NET Hispano, sobre el tema Scrum. Yo participaré dando una introducción de algunos temas:

- Marco de Trabajo Scrum
- Roles: Team, Product Owner, Scrum Master
- Product Backlog y Sprint Backlog
- Ceremonias: Sprint Planning, Sprint Review, Daily Scrum, Sprint
Retrospective

En general, las reuniones duran 2 horas, y en las últimas, los asistentes han participado activamente, con preguntas y dudas y planteos. Así que no es una típica charla de presentación de un tema, sino que también habrá discusión. Mi idea es presentar los temas de arriba rápidamente, en 45 minutos, y dejar documentación adicional por acá.

No tengo la confirmación, pero espero que participen también Raul Uribe y Gustavo Quiroz. La hora, no la vi publicada en el sitio de ALT.NET Hispano, pero supongo que será la habitual, 18:00 GMT (15hs en Buenos Aires, Argentina). En cuanto pueda, actualizo el post, con los datos en concreto.

Si no conocen qué es una reunión VAN, pueden consultar VAN meetings

Para ver cómo se desarrolla una VAN de ALT.NET Hispano, y qué software necesitan para asistir, ver Descripcion-de-Reuniones-VAN

Pueden ver el historial de anteriores reuniones VAN

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Fri, Sep 4 2009 11:23 by lopez | 3 comment(s)

La caída de gmail, lecciones aprendidas

Ayer, martes 1 de septiembre, se cayó el servicio web de gmail, por un tiempo (no tengo el dato exacto de falla, pero fueron por lo menos dos horas). Yo uso el servicio via web, y tengo varias cuentas, alguna personal y otras por empresa cliente. Y me parece que el servicio de gmail es muy bueno, y la interface de manejo web me resulta útil: el tener “labels” por ejemplo, para manejar los temas, es algo que deberían tener todos los programas de correo desde hace años: basta eso de que un email va en una carpeta. Es como el delicious: cada item interesante, puede clasificar en más de un tag (es idea a explorar, que tengo pendiente desde hace unos años, desde que armé mi sitio, vi delicious, y estudié topic maps y temas relacionados).

Es interesante leer en el blog de gmail, las causas y medidas que se tomaron para subsanar la falla en el servicio, por ejemplo, leo en:

http://gmailblog.blogspot.com/2009/09/more-on-todays-gmail-issue.html

Here's what happened: This morning (Pacific Time) we took a small fraction of Gmail's servers offline to perform routine upgrades. This isn't in itself a problem — we do this all the time, and Gmail's web interface runs in many locations and just sends traffic to other locations when one is offline

Bien, la “redundancia es la mejor estrategia”, una frase de “Sadrac en el horno” de Silverberg, es una frase que parece que Google sigue siempre.

However, as we now know, we had slightly underestimated the load which some recent changes (ironically, some designed to improve service availability) placed on the request routers — servers which direct web queries to the appropriate Gmail server for response. At about 12:30 pm Pacific a few of the request routers became overloaded and in effect told the rest of the system "stop sending us traffic, we're too slow!". This transferred the load onto the remaining request routers, causing a few more of them to also become overloaded, and within minutes nearly all of the request routers were overloaded. As a result, people couldn't access Gmail via the web interface because their requests couldn't be routed to a Gmail server. IMAP/POP access and mail processing continued to work normally because these requests don't use the same routers.

Vean cómo la liebre salta cuando menos se lo espera. “Esperar lo inesperado” sería algo que resume la lección aprendida. Si tenemos un sistema andando, sea software, hardware, y demás, habrá que estar preparados para cuando pase lo que no debería pasar.

The Gmail engineering team was alerted to the failures within seconds (we take monitoring very seriously). After establishing that the core problem was insufficient available capacity, the team brought a LOT of additional request routers online (flexible capacity is one of the advantages of Google's architecture), distributed the traffic across the request routers, and the Gmail web interface came back online.

Ciertamente, cuánto de nosotros planeamos las aplicaciones para que sean monitoreables? ¿o tenemos preparados los recursos para que sea tan flexible la arquitectura que permite un reemplazo rápido de los mismos? Yo debería aprender más sobre las técnicas de monitoreo, protocoles, estándares, que existen en la industria.

Vean igual que el problema se circunscribió a la interfaz web: el acceso IMAP/POP siguó funcionando.

Algunos usuarios en Twitter, empezaron a desgañitar pestes sobre google y gmail. Pero me parece la gente de Google hizo un excelente trabajo. Tengo menos caídas en Gmail, que en servidores locales de empresas cliente, que atienden a apenas decenas de usuarios.

Pienso entonces: si bien esto se puede ver como una señal de fragilidad de un servicio en línea (y de lo que pronto va a ser llamado algo difusamente “la nube”), veo que es una señal más de lo bueno que es delegar la solución de problemas a gente que está preparada para eso. ¿cuántos de nuestros servicios IT que consumimos en empresas a las que vamos todos los días, podrían reaccionar tan rápido? Yo he visto sistemas miles de veces más chicos, caídos por horas (o días), acá en estos lares.

Una opinión en contrario:

http://www.nevillehobson.com/2009/09/02/the-cloud-is-still-not-reliable-enough/

donde leo:

I still have more faith in local content and offline backups.

¿Opiniones?

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Wed, Sep 2 2009 16:53 by lopez | 4 comment(s)

Twitter para todo: TweetMyPC (y TweetMyMac también)

Una idea que quería explorar es crear un pequeño estándar de cómo usar mensajes cortos para enviar comandos y recibir respuestas de una aplicación cualquiera. Un paso hacia eso, muy ingenioso, es la de TweetMyPc (http://tweetmypc.codeplex.com/). El autor principal es Shoban, Microsoft MVP de la India.

La aplicación es chica, y cuando la ejecutamos en nuestra máquina, ingresamos los datos de nuestra cuenta de Twitter:

Una vez que arranca la aplicación, comienza a leer nuestros tweets cada 1 minuto. Es conveniente usar una cuenta para cada PC. Desde esa cuenta, desde cualquier otro lugar, podemos enviar comandos como: Shutdown, Hibernate, Lock, y hasta Download, que comienza a bajar un archivo. Una lista parcial de comandos la pueden ver en:

http://www.codegeeks.net/tweetmypc-what-next

Si uno saca un Screenshot remoto, la aplicación responde enviando un comando con una URL de la imagen tomada. Este es el tipo de respuesta que tenía en mente en el primer párrafo de este post: una forma de enviar algo más grande que un mensaje, es mediante una URL.

La aplicación está escrita en .NET. No vi el código todavía, pero está originalmente escrita en VB.Net y hay versión en C#.

Tienen también aplicación para

Otra aplicación del mismo autor:

http://www.codeplex.com/jata 

Jata is a Google Talk like Twitter Application which was developed using VB.net and Twiteroo Twitter API framework.
jata automatically checks for new messages periodically. You can post your status right from jata post message screen.
You can also reply to tweets using jata.

Habría que seguir explorando la idea de manejar aplicaciones con mensajes cortos, desde Twitter u otros.

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Tue, Sep 1 2009 10:55 by lopez | with no comments

Filed under: , , ,