Desde hace unas semanas estoy usando los servicios de
http://www.pdfchm.com
Hay de otros temas, pero en mi perfil, aparecen "computer books" de todo tipo. Semanalmente, me envían por email una lista de novedades, estas son las de esta semana:
Dear Angel Lopez.
You have received this letter because are signed on subscription.
In the text presented below, weekly news of the site www.pdfchm.com according to your current subscription:
Neural Networks and Pattern Recognition (Academic Press, 1998, English)
http://www.pdfchm.com/book/?book=10823
Scaling Software Agility: Best Practices for Large Enterprises (The Agile Software Development Series) (Addison Wesley, 2007, English)
http://www.pdfchm.com/book/?book=10826
Beginning VB 2008 Databases: From Novice to Professional (Apress, 2008, English)
http://www.pdfchm.com/book/?book=10806
Google Maps Mashups with Google Mapplets (Firstpress) (Apress, 2008, English)
http://www.pdfchm.com/book/?book=10797
Packet Forwarding Technologies (Auerbach Publications, 2007, English)
http://www.pdfchm.com/book/?book=10800
Full Frontal PR: Getting People Talking about You, Your Business, or Your Product (Bloomberg Press, 2003, English)
http://www.pdfchm.com/book/?book=10831
Putting Investors First: Real Solutions for Better Corporate Governance (Bloomberg Press, 2003, English)
http://www.pdfchm.com/book/?book=10830
The Value Factor: How Global Leaders Use Information for Growth and Competitive Advantage (Bloomberg Press, 2004, English)
http://www.pdfchm.com/book/?book=10832
What Can You Do with a Major in Biology: Real people. Real jobs. Real rewards (Cliffs Notes, 2005, English)
http://www.pdfchm.com/book/?book=10816
What Can You Do with a Major in Business: Real people. Real jobs. Real rewards (Cliffs Notes, 2005, English)
http://www.pdfchm.com/book/?book=10817
DVD Authoring and Production (CMP Books, 2001, English)
http://www.pdfchm.com/book/?book=10827
Multiplayer Game Programming w/CD (Prima Tech's Game Development) (Course Technology PTR, 2002, English)
http://www.pdfchm.com/book/?book=10822
Renaissance and Reformation: Almanac Edition 1. (Gale, 2002, English)
http://www.pdfchm.com/book/?book=10803
Working Identity: Unconventional Strategies for Reinventing Your Career (Harvard Business School, 2003, English)
http://www.pdfchm.com/book/?book=10801
Linux Transfer for Windows Power Users: Getting Started with Linux for the Desktop (Hentzenwerke Publishing, 2004, English)
http://www.pdfchm.com/book/?book=10824
Genetic and Evolutionary Computation for Image Processing and Analysis (EURASIP Book Series on Signal Processing and Communications) (Hindawi Publishing, 2008, English)
http://www.pdfchm.com/book/?book=10836
Good Cat!: A Proven Guide to Successful Litter Box Use and Problem Solving (Howell Book House, 2004, English)
http://www.pdfchm.com/book/?book=10821
IBM Pseries Sizing And Capacity Planning: A Practical Guide (IBM Redbooks) (IBM Press, 2004, English)
http://www.pdfchm.com/book/?book=10839
The Edgar Online Guide to Decoding Financial Statements: Tips, Tools, and Techniques for Becoming a Savvy Investor (J. Ross Publishing, Inc, 2004, English)
http://www.pdfchm.com/book/?book=10810
The IAF Handbook of Group Facilitation: Best Practices from the Leading Organization in Facilitation (Jossey-Bass, 2005, English)
http://www.pdfchm.com/book/?book=10798
Information Science in Theory and Practice (K. G. Saur, 2004, English)
http://www.pdfchm.com/book/?book=10820
Google Apps Hacks (Make Books, 2008, English)
http://www.pdfchm.com/book/?book=10835
How to Do Everything with YouTube (McGraw-Hill, 2007, English)
http://www.pdfchm.com/book/?book=10841
Application Design for Wearable Computing (Synthesis Lectures on Mobile and Pervasive Computing) (Morgan and Claypool Publishers, 2008, English)
http://www.pdfchm.com/book/?book=10805
Controlling Energy Demands in Mobile Computing Systems (Synthesis Lectures on Mobile and Pervasive Computing) (Morgan and Claypool Publishers, 2007, English)
http://www.pdfchm.com/book/?book=10807
GPU-Based Techniques for Global Illumination Effects (Synthesis Lectures on Computer Graphics) (Morgan and Claypool Publishers, 2008, English)
http://www.pdfchm.com/book/?book=10829
Light Field Sampling (Synthesis Lectures on Image, Video, and Multimedia Processing) (Morgan and Claypool Publishers, 2006, English)
http://www.pdfchm.com/book/?book=10799
RFID Explained (Synthesis Lectures on Mobile and Pervasive Computing) (Morgan and Claypool Publishers, 2006, English)
http://www.pdfchm.com/book/?book=10804
Big Book of Windows Hacks (O'Reilly, 2007, English)
http://www.pdfchm.com/book/?book=10833
Make Projects: Small Form Factor PCs (O'Reilly, 2008, English)
http://www.pdfchm.com/book/?book=10825
Managing Software Development with Trac and Subversion (Packt Publishing, 2007, English)
http://www.pdfchm.com/book/?book=10809
Network Administration with FreeBSD (Packt Publishing, 2008, English)
http://www.pdfchm.com/book/?book=10808
PHP 6 and MySQL 5 for Dynamic Web Sites: Visual QuickPro Guide (Peachpit Press, 2007, English)
http://www.pdfchm.com/book/?book=10840
Professional SQL Server 2000 DTS (Data Transformation Service) (Peer Information Inc, 2000, English)
http://www.pdfchm.com/book/?book=10813
Running Xen: A Hands-On Guide to the Art of Virtualization (Prentice Hall, 2008, English)
http://www.pdfchm.com/book/?book=10837
Special Edition Using Microsoft Windows Vista (2nd Edition) (Que, 2008, English)
http://www.pdfchm.com/book/?book=10828
OCP Instructors Guide for Oracle DBA Certification: A Study Guide to Advanced Oracle Certified Professional Database Administration Techniques (Rampant Techpress, 2004, English)
http://www.pdfchm.com/book/?book=10834
Teach Yourself Cobol in 21 Days (Sams Teach Yourself) (Sams Publishing, 1997, English)
http://www.pdfchm.com/book/?book=10838
Current Pediatric Therapy (Current Therapy) (Saunders, 2006, English)
http://www.pdfchm.com/book/?book=10802
Dialogue Processing in Spoken Language Systems: ECAI'96, Workshop, Budapest, Hungary, August 13, 1996, Revised Papers (Springer, 1997, English)
http://www.pdfchm.com/book/?book=10818
Software Engineering with Reusable Components (Springer, 2001, English)
http://www.pdfchm.com/book/?book=10815
MATLAB Programming for Engineers (Thomson Delmar Learning, 2001, English)
http://www.pdfchm.com/book/?book=10819
Security Modeling And Analysis of Mobile Agent Systems (Electrical and Computer Engineering) (World Scientific Publishing, 2006, English)
http://www.pdfchm.com/book/?book=10814
With best regards, PDFCHM Team.
To operate your subscription you can login into your account on the site http://www.pdfchm.com/
Algunos libros más, en mi post no técnico, orientado a otros temas y libros que me interesaron:
Libros gratis para bajarse en Internet
¿Tienen otros sitios como éste?
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com/
Leyendo al bueno de Scott Hanselman en su Twitter
http://twitter.com/shanselman
me entero de este brazo robótico, inventado por Dean Kamen (el mismo inventor de la Segway) y su gente de Deka (http://www.dekaresearch.com/):´
Es impresionante cómo la robótica avanza. Desde hace décadas la robótica ha aparecido en la investigación, saliendo de la literatura de ciencia ficción. Pero en los últimos años se han producido adelantos en los materiales, miniaturización, aparición de mercados (como el militar), capitalismo de riesgo, y la confluencia del desarrollo de software con nuevas ideas en inteligencia artificial: todo esto ha producido piezas como ésta que presenta Kamen. El mismo admite que su inspiración fue la serie de Guerra de las Galaxias, donde en la segunda película Luke Skywalker pierde parte de su brazo, en combate con quien resultaría su padre. Pero no tiene mayores limitaciones, al serle implantado una prótesis, que resulta tan parecida a la que vemos en el video. Hace unos años, eso hubiera quedado en una película. Ahora lo estamos viendo funcionando.
Angel "Java" Lopez
http://www.ajlopez.com
Y ahora, enterándome de estas cosas, en Twitter: http://www.twitter.com/ajlopez
Desde el año pasado, y más en estas últimas semanas, he estado investigando sobre Grid Computing, buscando enlaces, recursos, "papers", implementaciones. Este post es el resultado de esa investigación.
Como siempre, un artículo de la Wikipedia:
http://en.wikipedia.org/wiki/Grid_computing
Si Ud. se está iniciando en el mundo de Grid Computing, estas son buenas introducciones
New to Grid Computing
Grid Computing according IBM
The anatomy of the grid
The physiology of the grid
Interesante lista de lecturas para desarrolladores en Grid
Recommended reading list for grid developers
Grid Café tiene varios artículos y recursos
Grid Cafe Grid Projects in the world
Grid Cafe The place for everybody to learn about the Grid
What is "the Grid"?
Grid @ CERN
Sobre el estado de la industria:
http://www.gridtoday.com/ (un poco demasiado abarcativo, no es sólo sobre grid computing)
http://www.gridblog.com/
La lista completa de enlaces que mantengo, en:
http://del.icio.us/ajlopez/gridcomputing
Algunos productos para examinar:
http://www.gridgain.com
http://www.digipede.net algo más sobre Digipede en http://dotnetjunkies.com/WebLog/stefandemetz/archive/2006/12/09/Free_Grid_Computing_software.aspx
http://www.gridgistics.net/
http://sourceforge.net/projects/ngrid/
Algo relacionado, que comienza a "estar de moda":
http://en.wikipedia.org/wiki/Cloud_computing
He escrito artículos en este blog sobre Grid Computing:
http://msmvps.com/blogs/lopez/archive/tags/Grid+Computing/default.aspx
y en "Anglish", Angel's English:
http://ajlopez.wordpress.com/category/grid-computing/
donde hay algunas implementaciones sencillas de ideas a seguir explorando, como AjAgents, y AjMessages.
Esta lista de recursos, en Anglish, desde:
Grid Computing Resources
Angel "Java" Lopez
http://www.ajlopez.com
El año pasado participé del desarrollo de una aplicación que se ejecuta en una grilla de máquinas sin disco. Este año, estoy volviendo a actualizar el proyecto, espero poder bloggear sobre el resultado dentro de un mes. Mientras, quisiera escribir sobre algunas ideas a explorar.
En este post, uso el término "agente", de una forma algo libre. No definiré precisamente el concepto, quiero usarlo como término base a refinar en el futuro (llegando en algún momento a tratar el tema de agentes autónomos, que me parece más interesante). Por ahora, exploremos algunas ideas básicas (¿ingenuas?) para entender mejor los problemas relacionados con agentes y aplicaciones en grid. Algunas de las ideas acá presentadas pueden ser vistas como ingenuas, pero siento que es un ejercicio necesario, para aprehender los conceptos clave y los problemas a ser resueltos en este tipo de aplicaciones. Al final de este post, presentaré algunas sugerencias de implementación.
He descripto algunas aplicaciones para ejecutar en una grid en mis anteriores post:
Grid Computing Programming
Más programando para una grid
Programando para una Grid
Conceptos de Agentes
En este post, un agente es una pieza de software, con conducta y estado. Se ejecuta en un host de agentes, una aplicación que provee los servicios de base para que el agente pueda "vivir" y trabajar. Representaremos al agente con esta figura:
Patrones de comunicación de agentes
Hay mucha literatura sobre comunicación de agentes, desde simples técnicas hasta elaborados contratos, negociaciones, y más. Podemos tener agentes con creencias, deseos e intenciones. En este post, un agente es más simple: sólo tiene estado, puede enviar y recibir mensajes. Puede recibir estímulos de otros agentes y desde el ambiente de su host.
El más simple patrón de comunicación es un agente enviando un mensaje a otro agente:
Algunas notas:
- El agente enviador conoce al agente receptor. Quiero decir, alguna forma de identidada debe ser implementada. El mensaje no es enviado a cualquiera: el que envía intenta enviar el mensaje a un determinado agente.
- El mensaje transporta datos, y debe ser entendido por el receptor, posiblemente procesado por uno de sus métodos de implementación.
- En enviador no espera por una respuesta. No está interesado en un mensaje de respuesta inmediato.
- Los agentes pueden residir en diferentes máquinas en la grila, y la comunicación se produce tanto local como remota.
Durante su vida un agente puede enviar muchos mensajes a distintos agentes, que debe conocer de alguna manera:
Algunas veces, el agente enviador recibirá un mensaje desde el agente receptor, notificando algun trabajo hecho, o enviando algún dato procesado. Dependiendo de la aplicación, el mensaje de respuesta podría acarrear información para identificar al mensaje original:
En este caso, el enviador original debe estar preparado para recibir la respuesta de una manera asincrónica. Esto podría ser un interesante problema a resolver: un agente puede enviar varios mensajes, y sería mejora si puede seguir ejecutando sin recibir todas las respuestas a tiempo. Por ejemplo, en una aplicación de un juego de tablero, un agente puede delegar la exploración de un árbol de jugadas a otros agentes, y, luedo de un tiempo, sería posible tomar una decisión, con sólo algunas respuestas recibidas.
Nubes ("clouds") en el cielo de la grilla
Otro caso: un agente puede estar interesado en enviar un mensaje, pero no a un receptor determinado. Al contrario, quiere enviarlo a una "nube" de agentes, así cualquiera interesado en el mensaje tendría la oportunidad de procesarlo.
Esta característica puede ser implementada usando estas estrategias:
- Un agente envía un mensaje a un sistema de pizarra (blackboard), que otros agentes están vigilando.
- Una agente enviaría una mensaje a la aplicación host, indicando un tópico (como en una cola de mensajes), así cualquier agente subscripto recibirá el mensaje. Una variante: sólo algunos subscriptores reciben el mensaje, dependiendo de parámetros de aplicación.
- Un agente podría enviar un mensaje dirigido a alguna definición de proveedor de servicio. Un proveedor de servicio es un agente, que declara al comienzo de su vida, sus capacidades y los servicios que puede proveer.
Un ejemplo, tomemos una aplicación de un juego de tablero, ajedrez o go. Un agente en esa aplicación puede enviar un mensaje reclamando resolver cierta posición de ataque. En un sistema de pizarra, publicará el pedido. En un sistema de tópicos, lo enviaría al tópico "ataques". En una estrategia de proveedor de servicio, envía el mensaje a uno o más de los proveedores del servicio AttackResolver.
Como en el patrón anterior, un agente puede recibir una respuesta asincrónica, ahora desde "la nube":
Duplicación de agentes
Un agente tiene conducta y estado. Si el agente puede dividir su trabajo, podría tomar el camino de duplicarse a sí mismo:
Es algo extraño, pero podría ser útil, dependiendo de la aplicación a desarrollar.
Agentes y la Grilla
Cada agente puede ser albergado en un nodo de la grilla. El mecanismo de envío de mensajes debe ser capaz de enviar un mensaje a otro nodo. La aplicación host mantiene una lista de agentes por identidad, y conoce cúal es local o remoto. Una prueba ácida: una aplicación de grilla con agentes debe ser capaz de correr en una sola máquina, o en una grilla, sin cambiar el código o el algoritmo.
Como en otras implementaciones de grilla (discutidos en los post que mencioné al principio), un servidor central está a cargo de la distribución de las tareas entre los nodos de la grilla. "Grid as a Service" es una nueva frase que podemos aplicar a esta situación.
Moviendo al Agente
Un agente puede iniciar sus actividades en un node. Pero en algún momento, puede decidir de continuar su trabajo en otro nodo (la aplicación host que lo alberga también puede tomar esa decisión, independientemente del agente). Entonces, su estado sería enviado de un nodo a otro (otro caso: podría querer duplicarse y que su clon siga el trabajo en otra máquina).
Noten que la conducta del agente (que puede estar compilada o puede estar escrita en un lenguaje dinámico o de agente), no viaja. Pero bien podría ser que viaje, incluso, que haya agentes que vayan adaptando su conducta en el tiempo.
Inyectando conducta
La conducta de cada agente podría ser expresada en código compilado (archivos .jar en Java, assemblies en .NET). Otras alternativas son posibles: la conducta podría ser especificada en un lenguaje de scripting dedicado a agentes (pienso en una adaptación del AjBasic, por ejemplo).
Si la conducta se expresa en forma compilada, uno o varios servers puede tomar la responsabilidad de almacenar y distribuir esos componentes:
Ideas de implementación
Muchas de estas ideas pueden ser implementadas en cualquier lenguaje/tecnología apropiada, como Java y .NET, que soporte múltiples threads, invocación remota, serialización de mensajes, etc...
En los últimos tiempos estuve trabajando en mis projectos AjMessages y AjAgents, más información enestos post:
AjMessages: a message processor
Agents using Concurrency and Coordination Runtime (CCR)
AjMessages- hacia un procesador de mensajes
Agentes usando Concurrency and Coordination Runtime (CCR)
Algoritmos Genéticos con AjAgents y Concurrency and Coordination Runtime (CCR)
Genetic Algorithms with AjAgents and Concurrency and Coordination Runtime (CCR)
(Tengo otro proyecto, AjGrid, no publicado aún). Para este post, creo que el AjAgents podría ser una implementación de esas ideas. AjMessages tiene ahora soporte de ejecución remota, pero está más orientado a un proceso tubería ("pipeline"): es más difícil de implementar en semejante sistemas las ideas de este post.
Estoy agregando algunas características a AjAgents (ahora, AjAgents trabaja sólo en local):
- Configuración: Carga y creación de agentes en ejecución, según alguna información de configuración, ya sea al inicio o en el medio de la ejecución.
- Assembly remoto: Así un nodo de grilla pueder ser inyectado con nuevos agentes.
- Identificación de Agente: Para identificar al agente de manera única (un UID debería bastar).
- Transporte de mensaje: Windows Communication Foundation es un candidato, otro podría ser DSSP.
Un posible camino es tomar Decentralized System Services (DSS) del Microsoft Robotics Developer Studio. Un agente podría ser implementado como un servicio de DSS, ejecutando en un host DSS. La comunicación entre máquinas puede ser implementada usando DSSP como protocolo.
"Stay tuned", vendrá más código.
(Esta es una actualización y traducción de mi post en "Anglish", Angel's English:
Agents in a Grid
)
Angel "Java" Lopez
http://www.ajlopez.com/en
La tecnología Component Object Model (COM) de Microsoft hace años que prácticamente no la uso, más que de forma escondida. En la situación actual de .NET y otras herramientas, no parece hacer falta más. Pero como por una década a todos nos enseñaron sobre componentes COM distribuidos, y stateless y stateful, y transacciones requeridas, y esas cosas (como Apartment Threading Model, algo que sólo existe en el universo donde un runtime de Visual Basic no es reentrante), creo interesante poner algunos puntos de la situación actual. No soy un experto en todo COM, pero recuerdo haber devorado su implementación, y la curiosa IUnknown, que fue una solución pragmática a la diversidad de lenguajes, a la resolución de binding en runtime, y la necesidad de comunicar programas:
- COM Surge de OLE, y éste de DDE, que a su vez nacen de Office y el embebido de documentos en otros documentos, para tener componentes que binariamente, sin dependencia de lenguaje y de otros temas, se puedan comunicar entre si, como cajas negras, mediante una interfaz bien definida, o descubrible en runtime.
- Aparecen componentes COM visibles, luego llamados ActiveX Controls, que cumplen una serie de interfaces para poder ser albergados en cualquier contenedor de ActiveX controls, como el Visual Basic clásico.
- Aparecio COM distribuido, con los conceptos de tener marcados los metodos o componentes, para manejar transacciones (Required, Required New....) Habrán visto aparecer también esos conceptos en J2EE y otros lados, en los noventa del siglo pasado.
- Pero la realidad, es que hoy por hoy, todo se puede hacer sin COM, incluso el manejo de transacciones. En .NET 1.x dependiamos de System.Enterprise (no recuerdo el namespace) que interactuaba con COM, pero con .NET 2, practicamente no se necesita COM (nada más en lo de más abajo, sin verlo directamente).
- Los componentes visuales ahora son .NET, y hay varias empresas que migraron sus ActiveX controls a .NET "puro", desde hace años.
- El manejo de transacciones ahora esta en System.Transaction (muy interesante que haya transacciones en objetos, y que tus objetos puedan tener un "rollback")
- El manejo de threads es hermoso en .NET .... a la Java... ;-)
- El manejo de comunicacion distribuida, con seguridad y demas, esta en manos de Windows Communication Foundation, o por lo menos, con Web Services o Remoting (este ultimo se le esta "soltando la mano" de parte de MS, todo esta puesto en WCF).
- La necesidad de registrar el componente en el Registry, y solamente una versión del componente, ha conseguido crear el infierno de las DLL (DLL Hell), que en .NET es prácticamente inexistente.
Asi que, de alguna manera, COM no es indispensable. Puedo hacer todo lo de COM con esto que fue apareciendo con el tiempo.
Aunque se recomienda tomar con pinzas lo que aparece en Wikipedia, leemos ahí sobre COM:
The COM platform has largely been superseded by the Microsoft .NET initiative, and Microsoft now focuses its marketing efforts on .NET. COM was often used to hook up complex, high performance code to front end code implemented in Visual Basic or ASP.
To some extent, COM is now deprecated in favor of .NET. Since .NET provides rapid development tools similar to Visual Basic for both Windows Forms and Web Forms with just-in-time compilation, back-end code can be implemented in any .NET Language including C#, Visual Basic and C++.
Le dan algo de esperanza:
Despite this, COM remains a viable technology with an important software base. As of this writing, Microsoft has no plans for discontinuing either COM or support for COM. It is also ideal for script control of applications such as Office or Internet Explorer since it provides an interface for calling COM object methods from a script rather than requiring knowing the API at compile time. The GUID system developed for COM has wide uses any time a unique ID is needed.
Información sobre COM en Microsoft:
http://www.microsoft.com/com/default.mspx
Seguiremos teniendo COM en varios programas de Microsoft, pero no parece haber necesidad de incorporarlos en nuestros propios desarrollos.
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com/
En enero, me vi sorprendido por una implementación de grid computing en el browser, leer
Grid Computing in the browser
En estos últimos años hemos asistido al crecimiento de potencia y uso de JavaScript, con nuevas librerias y el uso intensivo de sus capacidades de prototipos y redefinición de funciones. Eso y otros elementos (como el XMLHttpRequest) han hecho surgir lo que se ha llamado Ajax. También tenemos librerías que convierten código en el servidor en código en el cliente, tengo que estudiar Volta de Microsoft, por ejemplo.
Esta semana, gracias a la lista de ClubSmalltalk me entero del estado del proyecto de Diego Gomez Deck (a quien creo recordad de las reuniones de SUGAR, Smalltalk User Group de Argentina, en los noventa): el Smalltalk Web Toolkit, pueden ver el blog del proyecto:
http://ceibo.wordpress.com/
Copio la descripción que enviara Hernan G, a esa lista:
¿Cuáles son las cualidades de este nuevo framework?
SWT rompe con la asimetría del protocolo HTTP, es decir, a través del hack Comet, ahora el servidor puede enviar contenido a los clientes conectados. Esto hace que se quiebre la barrera impuesta por el protocolo HTTP y el servidor no solamente pueda enviar contenido solo con un pedido del cliente, sino que a través de esto, en cualquier evento que se produzca en el servidor pueden ser informados los clientes (o los navegadores).
¿Cuál es su arquitectura?
SWT consta de una parte cliente y una servidora. Es decir, el comportamiento del cliente lo desarrollamos íntegramente sobre Smalltalk. Gracias a un framework que traduce de Smalltalk a Javascript contamos con un mini-ambiente Smalltalk del lado del navegador. A partir de este esquema, se puede contar con un MVC (Model-View-Controller) distribuido. Este MVC logra ciertas optimizaciones para presevar el recurso más limitado, la red.
¿De donde obtengo más información?
En el blog ceibo.wordpress.com podrán encontrar información de cómo usarlo, ejemplos, links a downloads, tutoriales, etc.
Ceibo es un proyecto de barajas 3D sobre la web que usará SWT como arquitectura.
Interesante lo de Comet:
http://es.wikipedia.org/wiki/Comet
Comet es una técnica de programación Web muy similar a AJAX, que utiliza XMLHttpRequest, se utiliza para la entrega de datos entre cliente servidor a través del protocolo HTTP, y la entrega de datos se hace sin que el cliente lo haya solicitado.
Comet también es conocido como server push, HTTP push, HTTP streaming, Pushlets, Reverse Ajax, y otros.
Jeje... de nuevo el XMLHttpRequest... grande el chiquitín.... :-)
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com/
Estuve jugando con el nuevo CTP release de Microsoft Robotics Developer Studio. Tiene nuevas características, como instalación y ejecución de un diagrama de Visual Programming Language en muchos nodos.
Para explorar algo de esta nueva funcionalidad, escribí el sueño de todo programador: un programa de dibujo distribuido multiusuario...;-)... Bueno, es uno bastante simple, pero funciona, y puede ejecutarse en varias máquinas, exponiendo y compartiendo nuestros más inspirados dibujos de mouse. El código puede ser descargado desde aquí.
El proyecto
Tengo la versión 1.5 del MSRS y el nuevo CTP MRDS (nueva sigla), ejecutándose en la misma máquina, sin mayores problemas. Comencé creando un nuevo proyecto del tipo Simple Dss Service RDS 2008:
El proyecto contiene un service component llamado DssScribble, y un Windows form, que está a cargo del dibujo:
Al comienzo del service component, crea el formulario, y lo connecta para usar los ports y su cola de dispatcher:
protected override void Start()
{
base.Start();
// Add service specific initialization here.
WinFormsServicePort.Post(new RunForm(CreateForm));
}
private Form CreateForm()
{
return new CanvasForm(_mainPort, linePort, TaskQueue);
}
Cada línea que el usuario dibuja en la ventana es enviada al service component, para ser distribuido a cada subscriptor interesado en el dato:
[ServiceHandler(ServiceHandlerBehavior.Exclusive)]
public IEnumerator<ITask> PostLineHandler(PostLine postLine)
{
SendNotification<PostLine>(_submgrPort, postLine);
yield break;
}
Las líneas son recibidas en el NewLineHandler (el modo de conectar dos componentes es via VPL, como veremos más adelante). El linePort es el port para comunicarse con la instancia del formulario:
[ServiceHandler(ServiceHandlerBehavior.Exclusive)]
public IEnumerator<ITask> NewLineHandler(NewLine newLine)
{
linePort.Post(newLine.Body);
newLine.ResponsePort.Post(DefaultUpdateResponseType.Instance);
yield break;
}
El service component no tiene estado. Uso una clase para transportar la información de las nuevas líneas a dibujar y distribuir:
[DataContract()]
public class DssScribbleState
{
}
[DataContract()]
public class DssScribbleLine
{
[DataMember()]
public int fromX;
[DataMember()]
public int fromY;
[DataMember()]
public int toX;
[DataMember()]
public int toY;
public DssScribbleLine()
{
}
public DssScribbleLine(int fromX, int fromY, int toX, int toY)
{
this.fromX = fromX;
this.fromY = fromY;
this.toX = toX;
this.toY = toY;
}
}
Dibujando con VPL
El Visual Programming Language es una herramienta fascinante, lleno de "features". Se puede arrastrar y soltar services components desde la toolbar. Cuando esta herramienta es lanzada, se puede buscar el DssScribble service en el área inferior izquierda:
Arrastré dos instancias del DssScribble service component, y las renombre a DssScribble1 y DssScribble2:
Conecté las instancias, así pueden escuchar sus notificaciones. Cada línea producida en una instancia es transmitida a la otra. De esta manera, lo que dibujemos en una ventana, aparecerá en la otra.
La conexión es entre la notificación PostLine y la notificación NewLine:
Para lanzar la aplicación, ir al menú Run -> Start. Aparece una ventana, mostrando el log de mensajes:
Esperamos unos momentos, y dos instancias del componente DssScribble son creados, cada uno mostrando un formulario. Podemos dibujar en cualquiera de los dos, arrastrando el mouse, siendo reproducido el dibujo en el otro formulario:
Este es mi autorretrato: una lágrima se me escapa, de la emoción de un dibujo distribuido.... ;-)
Ejecutando en nodos distribuidos
La IDE del VPL IDE tiene un diseñador de nodo. A la derecha, hay una rama Node en el árbol del proyecto. Cada nodo representa un DSS host conteniendo servicios DSS. Agregué dos nodos, el primero conteniendo una instancia del Scribble y arrastré la segunda instancia al segundo nodo:
Noten el panel inferior derecho: definí ahí las propiedades para el nodo Windows0, en el mismo localhost, pero con otras puertas (el primer nodo correrá en las puertas 50000/50001). En otro proyecto, probé tener una máquina remota, y la aplicación distribuida funcionó sin problemas. Podemos definir varios nodos, cada uno en una máquina distintas, poner en ellos instancias de DssScribble, enlazarlas por notificaciones, y podemos dibujar con nuestro compañeros de trabajo.... ;-)
Para ejecutar la aplicación en forma distribuida, se debe compilarla. Usar el menú Build -> Compile as a Service . Debe ingresarse un directorio donde generar el código y la solución. Entonces, la herramienta VPL compila solución, y genera los paquetes de instalación. Se puede abrir la solución generada con Visual Studio (el código es muy interesante, bastante astuto, implementando, por lo que ví, una máquina de pila, ver los métodos Decrement, Increment).
Cada nodo debe tener corriendo un servicio llamado package deployer, que ejecuta en otra puerta (la misma para todos los nodos, el valor asumido es 55555). Ir a ejecutar el directorio bin de Microsoft Robotics Developer Studio, y ejecutar el rundeployer.cmd:
Nota: si queremos compilar el servicio de nuevo, debemos parar el deployer: el generador de código usa el directorio bin y trae conflictos con el deployer andando.
Ahora, estamos listos para distribuir nuestra "killer app": ejecutar Run -> Run on distributed nodes. El sistema avisa de tener los deployers ya andando:
Y la magia comienza: cada nodo es contactado, y la aplicación es instalada en ellos. Un nodo DSS es iniciado en cada nodo, y sus correspondientes instancias de servicios son creadas. En este ejemplo, tendremos dos nuevas ventanas de consola, ejecutando cada una un nodo DSS. Esta es la ventana de mi segundo nodo:
Ahora, cada noda muestra su ventana de dibujo, y la diversión comienza.... :-)
Notas
No estoy usando partners en este ejemplo. En cambio, uso notificaciones de eventos, en este caso, nuevas líneas, así otros componentes pueden recibir esas notificaciones. Podemos escribir otros componentes, otras ventanas de dibujo, para recibir y procesar las líneas. Una idea es usar las coordenadas de una nueva línea para controlar el motor de un robot, o para persistir las líneas producidas usando un componente de persistencia nuestro. Para controlar el motor de un robot, podemos usar VPL, sin necesidad de reescribir el componente original.
Conclusiones
Usando VPL podemos componer nuevas aplicaciones usando componentes ya existentes. Podemos crear nuestras propias actividades. Y usando diagramas de nodos (en VPL o usando el DSS Manifest Editor) con el packager deployer, podemos distribuir la aplicación en muchos físicos nodos, en cualquier manera que creamos conveniente. Pero debemos definir cada nodo y componente: no hay facilidades para programar una grilla, con nodos dinámicos. Una aplicacion gridificada para DSS puede ser escrita, pero en mi opinión, debe ser creada con código nuestro. Idea para explorar: escribir una aplicación de control, usando package deployer, instalara tareas en los nodos en una grilla.
Todas estas herramientas abrieron mi cabeza. Escribir DSS services components es una nueva forma de pensar y programar, algo que quise explorar por años: cómo escribir objetos con un proceso de mensajes de una vía, en una forma distribuida y paralala (AjAgents está motivado por esa objetivo). Me imagino un sistema que modele las ideas de Minsky sobre la mente humana.
Bueno, es un nuevo mundo. Dorothy: no estamos más en Kansas... ;-)
Angel "Java" Lopez
http://www.ajlopez.com
Esta semana pasado, el gigante de Redmond anunció su nueva creación, Live Mesh (tech preview):
https://www.mesh.com/Welcome/Welcome.aspx
Gracias al post de Arvindra Sehmi:
http://blogs.msdn.com/asehmi/archive/2008/04/24/introducing-live-mesh.aspx
tenemos ahí una lista de comentarios sobre el nuevo bebé Microsoft. Esta nuevo producto de Redmond no es fácil de describir brevemente, pero merece que se le preste atención. Es una incursión de Microsoft en Web 2.0 y en su propia creación, Software plus Service.
(para bloggers, noten el uso de enlaces con screenshots, buena idea Arvindra!)
Este video explica la arquitectura a alto nivel (gracias a Matias Woloski por este link)
http://channel9.msdn.com/Showpost.aspx?postid=399577
In la lista de artículos de Arvindra, encuentro esta introducción de la inefable Mary Jo Foley
Ten things to know about Microsoft's Live Mesh
Leamos el punto uno:
1. The definition. As has become the norm with so many of its Software + Services products and strategies, Microsoft isn’t the best at coming up with a succinct Live Mesh definition. The closest I found (in a Live Mesh reviewer’s guide) was this: “Live Mesh is a ’software-plus-services’ platform and experience from Microsoft that enables PCs and other devices to ‘come alive’ by making them aware of each other through the Internet, enabling individuals and organizations to manage, access, and share their files and applications seamlessly on the Web and across their world of devices.” If I were in charge of defining Live Mesh, I think I’d go with “a Software + Services platform for synchronization and collaboration.”
Acá detecto algunas ideas de Bill Joy para Jini, una tecnología que nació demasiado temprano:
The Jini Technology Vision
Jini technology redefines the concept of a client. Instead of a fixed set of "local" devices, Jini technology supplies the Java client with a federation of remote "plug and play" devices in a dynamic configuration (the Jini Federation) that is personalized for each client. With Jini technology, the network truly becomes the client computer!
Toda esta nueva movida de MS podría ser el resultado visible de algunas ideas de Ray Ozzie, expresadas hace años en el notable memo:
The Internet Services Disruption
Supongo que Microsoft se está moviendo más y más hacia (recordemos el asunto Yahoo). Es una compañía que adopta la frase de Andy Grove: solo los paranoicos sobreviven. Tienen apuesta en RIA (Rich Internet Applications), Silverlight, Web 2.0, Rich Client... Todos los números de la ruleta están cubiertos, aún el doble cero... ;-)
Una nota: me asombra, que después de todo este esfuerzo, Microsoft todavía siga revelando nuevas herramientas solamente pare residentes de EE.UU. Google, por el contrario, pone sus innovaciones a disposición del mundo, sean betas o lo que sea. Toc, toc, McFly.... algún MS VP leyendo esto? ;-)
Angel "EverMeshed" Lopez
http://www.ajlopez.com
El domingo pasado, el bueno de Arvindra Sehmi referenció en un post suyo a un trabajo mío sobre una killer application que escribí: un scribble distribuido :-) Pero luego también escribió sobre este robot:
Es de Boston Dynamics, according to Wikipedia:
http://www.bostondynamics.com/
http://en.wikipedia.org/wiki/Boston_Dynamics
Boston Dynamics is a small engineering and robotics design company best known for the development of BigDog, a quadruped robot designed for the U.S. military with funding from DARPA [1], and DI-Guy, COTS software for realistic human simulation. Early in the company's history, it worked with the American Systems Corporation under a contract from the Naval Air Warfare Center Training Systems Division (NAWCTSD) to replace naval training videos for aircraft launch operations with interactive 3D computer simulations featuring DI-Guy characters. [2]
Marc Raibert is the company's president and project manager. He spun the company off from the Massachusetts Institute of Technology in 1992.[3]
Que bien resuelto está el tema de caminar y mantener el equilibrio y balance en distintas situaciones, y hasta hacer algún galope. Es notable que se haya logrado un algoritmo que implemente esa conducta. Según el bueno de Leandro Boffi (que además de mago se dedica a la robótica), eso se llama equilibrio dinámico.
Bueno, dejo algunos enlaces en
http://del.icio.us/ajlopez/robotics (últimamente, muy orientado a Microsoft Robotics Developer Studio)
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com/
En estos días, estuve investigando algo sobre grid computing y Microsoft Robotics Studio, usando DSS y CCR. Encontré un interesante documento:
High Performance Multi-Paradigm Messaging Runtime Integrating Grids and Multicore Systems
Los autores son Xiaohong Qiu, Geoffrey C. Fox, Huapeng Yuan, Seung-Hee Bae, de la Indiana University de Bloomington, y George Chrysanthakopoulos, Henrik Frystyk Nielsen, de Microsoft Research. Nielsen y Chrysanthakopoulos son los "creadores" del Concurrency and Coordination Runtime (CCR) y de Decentralized Software Services (DSS), tecnologías que son pilares de Microsoft Robotics Studio, y que pueden ser usandas más allá de robótica. Más información sobre estas tecnologías en:
http://www.microsoft.com/robotics
El "abstract" del documento dice:
eScience applications need to use distributed Grid environments where each component is an individual or cluster of multicore machines. These are expected to have 64-128 cores 5 years from now and need to support scalable parallelism. Users will want to compose heterogeneous components into single jobs and run seamlessly in both distributed fashion and on a future “Grid on a chip” with different subsets of cores supporting individual components. We support this with a simple programming model made up of two layers supporting traditional parallel and Grid programming paradigms (workflow) respectively. We examine for a parallel clustering application, the Concurrency and Coordination Runtime CCR from Microsoft as a multi-paradigm runtime that integrates the two layers. Our work uses managed code (C#) and for AMD and Intel processors shows around a factor of 5 better performance than Java. CCR has MPI pattern and dynamic threading latencies of a few microseconds that are competitive with the performance of standard MPI for C.
¿Que es MPI? Son las siglas de Message Passing Interface. Según la Wikipedia:
Message Passing Interface (MPI) is both a computer specification and is an implementation that allows many computers to communicate with one another. It is used in computer clusters.
Hay una There is a implementación de Microsoft:
Microsoft Message Passing Interface (MS MPI) is an implementation of the MPI2 specification by Microsoft for use in Windows Compute Cluster Server to interconnect and communicate (via messages) between High performance computing nodes. It is mostly compatible with the MPICH2 reference implementation, with some exceptions for job launch and management. MS MPI includes bindings for C and FORTRAN languages. It supports using the Microsoft Visual Studio for debugging purposes.
Gua! FORTRAN..... Esos buenos viejos días! ;-). Recuerdo haber trabajado con la implementación de Lisp en Fortran del bueno de Gregory Chaitin, en el siglo pasado. Pero no hay vuelta atrás, parafraseando a David Hilbert: Nadie nos expulsará del paraiso que Java y .NET han creado para nosotros.... ;-). Pueden leer la cita original en este interesante thread.
Pero estoy divagando. Volvamos al tema.
Los principales sitios sobre MPI son:
http://www.mpi-forum.org/
http://www.open-mpi.org/
http://www.lam-mpi.org/
Yo estaba pensando en implementar algo de las ideas de MPI en .NET o Java, cuando encuentro:
http://www.purempi.net/
PureMpi.NET is a completely managed implementation of the message passing interface. The object-oriented API is simple, and easy to use for parallel programming. It has been developed based on the latest .NET technologies, including Windows Communication Foundation (WCF). This allows you to declaratively specify the binding and endpoint configuration for your environment, and performance needs. When using the SDK, a programmer will definitely see the MPI'ness of the interfaces come through, and will enjoy taking full advantage of .NET features - including generics, delegates, asynchronous results, exception handling, and extensibility points.
PureMpi.NET allows you to create high performance production quality parallel systems, with all the benefits of in .NET
Es una implementación lista para bajar y usar, con VS 2005 o VS 2008. Usa generics para implementar canales tipados en MPI.
Me bajé la librería, y la instalé en una máquina con Visual Studio 2008. El programa de instalación agregó un nuevo template de proyecto, Mpi.NET:
Cree un proyecto, que aparece:
Modifiqué el Program.cs a:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Mpi;
namespace Mpi.NET1
{
class Program
{
static void Main(string[] args)
{
ProcessorGroup.Process("MPIEnvironment",
delegate(IDictionary<string, Comm> comms)
{
Comm comm = comms["MPI_COMM_WORLD"];
Console.WriteLine(comm.Rank);
IAsyncResult result =
comm.BeginSend<string>(0, "", "Rank: " + comm.Rank, TimeSpan.FromSeconds(30), null, null);
if (comm.Rank == 0)
{
for (int i = 0; i < comm.Size; i++)
{
string receivedMsg =
comm.Receive<string>(i, Constants.AnyTag, TimeSpan.FromSeconds(30));
Console.WriteLine(receivedMsg);
}
}
comm.EndSend<string>(result);
});
}
}
}
La clase ProcessGroup se encarga de los procesos a ejecutar. Notar el uso de delegados para especificar el proceso. Un proceso MPI recibe un diccionario de objetos Comm, que son los canales para comunicarse con otros procesos MPI.
La clase ProcessGroup tiene esta estructura (según la información de metadata):
namespace Mpi
{
public class ProcessorGroup : IDisposable
{
public ProcessorGroup(Environment environment, Processor processor);
public ProcessorGroup(string environment, Processor processor);
public Environment Environment { get; }
public ICollection<IAsyncResult> Results { get; }
public void Dispose();
protected virtual void Dispose(bool disposing);
public static void Process(string environmentConfigName, Processor processor);
public void Start();
public void WaitForCompletion();
}
}
El número y configuración de procesadores puede ser definida en el archivo App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="Mpi" type="Mpi.ConfigurationSection, Mpi"/>
</configSections>
<Mpi>
<Environments>
<Environment name="MPIEnvironment">
<Hosts>
<Host comms="MPI_COMM_WORLD"
client="MpiClient1"
service="MpiService1" />
<Host comms="MPI_COMM_WORLD"
client="MpiClient2"
service="MpiService2"/>
<Host comms="MPI_COMM_WORLD"
client="MpiClient3"
service="MpiService3"/>
</Hosts>
</Environment>
</Environments>
</Mpi>
<system.serviceModel>
<client>
<endpoint address="net.tcp://localhost:8080/MpiService" binding="netTcpBinding"
bindingConfiguration="" contract="Mpi.IMpiService" name="MpiClient1">
<identity>
<userPrincipalName value="" />
</identity>
</endpoint>
<endpoint address="net.tcp://localhost:8081/MpiService" binding="netTcpBinding"
bindingConfiguration="" contract="Mpi.IMpiService" name="MpiClient2">
<identity>
<userPrincipalName value="" />
</identity>
</endpoint>
<endpoint address="net.tcp://localhost:8082/MpiService" binding="netTcpBinding"
bindingConfiguration="" contract="Mpi.IMpiService" name="MpiClient3">
<identity>
<userPrincipalName value="" />
</identity>
</endpoint>
</client>
<behaviors>
<serviceBehaviors>
<behavior name="MpiServiceBehavior">
<serviceDebug httpHelpPageEnabled="false" httpsHelpPageEnabled="false"
includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="MpiServiceBehavior" name="MpiService1">
<endpoint address="net.tcp://localhost:8080/MpiService" binding="netTcpBinding"
bindingConfiguration="" name="MpiServiceEndpoint" contract="Mpi.IMpiService" />
</service>
<service behaviorConfiguration="MpiServiceBehavior" name="MpiService2">
<endpoint address="net.tcp://localhost:8081/MpiService" binding="netTcpBinding"
bindingConfiguration="" name="MpiServiceEndpoint" contract="Mpi.IMpiService" />
</service>
<service behaviorConfiguration="MpiServiceBehavior" name="MpiService3">
<endpoint address="net.tcp://localhost:8082/MpiService" binding="netTcpBinding"
bindingConfiguration="" name="MpiServiceEndpoint" contract="Mpi.IMpiService" />
</service>
</services>
</system.serviceModel>
<system.runtime.serialization>
<dataContractSerializer>
<declaredTypes>
</declaredTypes>
</dataContractSerializer>
</system.runtime.serialization>
</configuration>
Jeje, usan <host..>... Me recuerda a AjMessages... ;-)
La ejecución de programa produce:
Bueno, no vamos a decir "Huy, que bruto que programa", pero es mi primer programa MPI. Hay 3 "ranks", porque así esta configurado en el archivo de arriba.
Encontran varios ejemplos ejecutables en la distribución de Pure MPI.NET. En mi opinión, es una interesante implementación de ideas de MPI, con algunas vueltas de tuerca adaptadas al mundo .NET: generics y delegates , bienvenidos.
¿Grid y MPI? Puede ser. Tengo que estudiar las referencias mencionadas en el "paper" que nombré al principio. Aunque ese trabajo está dedicado a cuestiones de alto rendimiento, tiene un buen resumen conceptual de los modelos de ejecución, y las relaciones posibles entre MPI, CCR, y DSS.
(Había publicado este artículo en "anglish", Angel's English, en:
Message Passing Interface, CCR, DSS, and Pure MPI.NET
)
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com
El año pasado había implementado un ejemplo con AjAgents usando CCR:
Agentes usando Concurrency and Coordination Runtime (CCR)
Agents using Concurrency and Coordination Runtime (CCR)
Escribí en mi blog en "anglish" (Angel's English) algunas ideas para explorar:
Agents in a Grid
Recordemos que Concurrency and Coordination Runtime es parte de Microsoft Robotics Studio, puede leer más sobre esta librería en
Concurrent Affairs: Concurrency and Coordination Runtime
y consultar mis enlaces de Delicious
http://del.icio.us/ajlopez/ccr
http://del.icio.us/ajlopez/msrs
En estos días, extendí mi ejemplo AjAgentsCCR-0.1.zip con dos nuevos proyectos. Uno de consola AjAgents.Genetic01, y otro de ventanas AjAgents.WinGenetic01:
La idea básica es ejecutar un algoritmo genético usando agentes, los elementos de AjAgents, que se envían mensajes usando ports de CCR. Cada agente procesa sus mensajes entrantes, y envía mensajes salientes a otros agentes, en paralelo. El problema que encaro es el clásico Travelling Salesman Problem. Leo en la Wikipedia:
If a salesman starts at point A, and if the distances between every pair of points are known, what is the shortest route which visits all points and returns to point A?
La ventana de ejemplo es sencilla:
La clase Genoma representa el viaje (una lista de Points y un valor de distancia total):
class Genoma
{
public List<Point> travel = new List<Point>();
public int value;
}
class Point
{
public int x;
public int y;
}
Al comenzar la ejecución, los agentes son creados y conectados:
best = new BestSoFar();
evaluator