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

March 2010 - Posts

Proyecto Hogwarts

En los últimos meses, estuve (y sigo) trabajando en un proyecto interno para un cliente (@southworks) llamado el Proyecto Hogwarts. El Product Owner es el bueno de @MartinSalias, y el único miembro permanente del equipo soy yo. Hemos recibido ayuda y retroalimentación de revisores internos, y estamos trabajando duro para entregar una versión beta del entregable inicial.

Pero ¿Qué es el Proyecto Hogwarts? Pudieron haber leígo mis tweets, anunciando cuándo trabajo en el proyecto, pero sin dar mayores detalles. Recuerden, es un proyecto interno para un cliente, así que no está disponible públicamente. Posiblemente, en elfuturo, más información y entregables del proyecto estén públicos. Pero aún así, puedo escribir algunas ideas base y algunos objetivos del proyecto (desde aquí, le pido a mi Product Owner escribir en su blog clarificaciones adicionales :-).

Ya sabemos que el desarrollo de software es una gran tarea, y cada proyecto no trivial necesita del auxilio de montones, parvas de técnicas, habilidades, conocimiento de parte de un grupo de desarrolladores, usualmente trabajando en un equipo. Pero si Uds. tienen una software factory o una consultar, uno de los problemas que enfrentan es la escasez de desarrolladores con experiencia. Una forma de dar más “seniority” a su grupo de programación, es incrementando sus habilidades y conocimientos. Es en este contexto que el Proyecto Hogwarts ha sido creado (el nombre Hogwarts refiere al colegio de magia al que acude Harry Potter)).

Las salidas concretas del proyecto son entregables como notas, presentaciones, ejemplos, ejercicios, evaluaciones, y más (pensamos en videos, libros). Hay varios objetivos en el proyecto, así como una misión y visión. Pero la idea básica es entregar a desarrolladores de software para incrementar sus habildiades, conocimientos y darles más “seniority”.

Hemos escogido estos temas para atacar en los primeros cursos:

- Test Driven Development

- Inversion of Controls

- Mocking y librerías

- Principios SOLID

- El uso de repositorio de código y otras herramientas esenciales

- Escribir parte de una aplicación tipo mundo-real usando los nuevos conocimientos y habilidades adquiridos.

Pero ¿cómo enseñar esto a un grupo de programadores? Estamos explorando caminos a emplear. Siguiendo los principios ágiles, estamos entregando partes del proyecto, para conseguir retroalimentación de nuestros compañeros de trabajo y desarrolladores. Lo recibido será usado para pulir el material, cambiar direcciones, o tomar nuevos rumbos enla forma de hacer las cosas. Pero ahora, en principio, estamos entregando:

- Material para el instructor, así cualquier instructor con experiencia puede tomar el material de cualquier curso y darlo para una audiencia. El material tiene presentaciones, notas explicando los principales puntos, ejemplos, ejercicios, y evaluaciones, podemos agregar máquinas virtuales para usar durante la práctica de algún ejercicio.

- Bibliografía y recursos adicionales.

- Bibliotecas de software que usamos en los ejemplos y ejercicios.

Algunos puntos clave:

- No es sólo práctica. No nos concentraremos en una sola tecnología, plataforma o lenguaje. Las versiones iniciales de los entregables están orientados a .NET y C#, basado en las necesidades actuales del cliente. Pero toda la base de los cursos podría ser readaptada a otras tecnologías y lenguajes. Necesitamos conocer PORQUE aplicamos TDD o un principio SOLID. Queremos gente pensante, no “repeating monkeys” :-)

- No es sólo teoría. Podemos ver este curso como aprender guitarra. Uno necesita practicar lo que el instructor nos enseña.

- Necesitamos ejemplos, no sólo presentaciones con lindos gráficos.

- Necesitamos ejercicios, alguno básico, otros más avanzados.

- Necesitamso practicar en una aplicación real, para integrar lo que aprendimos.

- Necesitamos “malos” y “mejores” ejemplos y soluciones, para ir entendiendo desde la base por qué elegimos un camino u otro, por qué adoptamos tal patrón y cuáles son los problemas que trata de solucionar, en vez de simplemente adoptarlo sin mayor meditación, por nos lo dicen que es “cool” o “buena práctica”.

- Quien aprende necesita ser evaluado. Y tanto más importante, necesita recibir retroalimentación sobre sus fortalezas y debilidades, para ayudarlo en su plan de carrera, en su mejora continua.

Una vez las versiones iniciales sean revisadas y mejoradas, el próximo paso será entregarlas a gente de la comunidad. Uno de los objetivos (uno ambicioso) es crear un movimiento sostenido para ayudar a desarrolladores de software para que aumenten sus habilidades, mejoren en su profesión, acá en Argentina, y esperamos, en otros países.

Estamos trabajando en la primera implementación de los cursos de TDD y de IoC, que están siendo revisados internamente. Quiero ir escribiendo posts, dando visibilidad a recursos, ideas, material producido, de que se está armando en Hogwarts.

Wingardium Leviosa!!

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Fri, Mar 26 2010 14:10 by lopez | 20 comment(s)

ALT.NET Hispano sobre Moq

La gente de la comunidad ALT.NET Hispano no para en sus actividades, y este sábado 27 de Marzo, organizan una nueva VAN (des-conferencia virtual), en el horario habitual de 18 GTM (15hs por acá en Argentina).

El tema es Moq, el framework de mocking de .NET, con características muy C# 3, con su uso de Lambda Expressions. La presentación inicial estará a cargo de Leonardo Micheloni (@leomicheloni, http://www.leonardomicheloni.com.ar/)

Leonardo describe lo que presentará en la lista de ALT.NET Hispano:

Cuándo? Sábado 27 de Marzo de 2010 a las 18:00 GMT/ UTC con una
duración de más o menos 2 horas
Dónde? es una reunión virtual, para verla hay que entrar con
NetMeeting en http://snipr.com/virtualaltnet
Resumen:
En la actualidad el software requiere altos niveles de calidad, las
pruebas unitarias son una herramienta indispensable para alcanzar
dicha calidad, desarrollar un software que sea fácil de probar
requiere utilizar herramientas y patrones de diseño específicos, el
mocking permite simular escenarios controlados para relizar nuestras
pruebas. Dentro de los framework de mocking disponibles para .NET se
destaca Moq por su facilidad de uso y limpieza de código, en este
reunión virtual vamos a repasar los conceptos que son necesarios para
una correcta prueba unitaria y descubriremos la potencia y belleza de
Moq.
Temas a tratar:
Teoria sobre mocking:
- Necesitdad
- unit testing
- Inyección de dependencias inversión de control
- Qué es un mock object? y un stub?
- Expectations
- Limitaciones
- Breve introducción  a frameworks de mocking: NMocks, Rhino, Typemock
isolator, Moq
Moq:
- Mocks al estilo C# 3
- Ventajas
- Comportamientos
- Limitaciones
- Belleza, simplicidad, magia
links útiles:
Sitio de Moq en Google Code:  http://code.google.com/p/moq/
Sobre mock objects:  http://www.mockobjects.com/

Agrego mis enlaces:

http://delicious.com/ajlopez/mocks
http://delicious.com/ajlopez/moq

Más información sobre cómo asistir a la reunión virtual, software necesario, enlaces: http://altnet-hispano.pbworks.com/Descripcion-de-Reuniones

El enlace para entrar a la reunión es http://snipr.com/virtualaltnet

(Micheloni que alguna vez escribió un comentario por acá sobre que iba a postear sobre AjGenesis… hmmm.. no vi, che, o me lo pasé ;-)

Nos leemos!

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

Posted Wed, Mar 24 2010 12:30 by lopez | 1 comment(s)

Filed under: , , ,

ALT.NET Hispano VAN sobre MVC Turbine

La gente de la comunidad ALT.NET Hispano sigue preparando eventos. Gracias a su inicitiavi, se han realizado ya varias VANs (DesConferencias virtuales). La próxima es mañana, Sábado 20 de Marzo, a la hora habitual 18 GMT (3 de la tarde acá en Buenos Aires). El bueno de Cristian Prieto (@cprieto) explica el tema en la lista de grupo, y cómo invitó al creador del proyecto MVC Turbine:

De varias semanas para acá he estado conversando con Javier Lozano, creeador de Mvc Turbine y conocido ASP.NET Insider, no sólo le gustó la idea de darnos una VAN acerca de su proyecto MvcTurbine (personalmente una de las mejores opciones para crear futuras aplicaciones composite en ASP.NET MVC.

Javier ha decidido nombrar su VAN "Hablando MVC con Turbine", un poco acerca de la biografía de Javier (en inglés, sorry! el me la pasó!)

"Javier is an ASP.NET Insider and MVP that specializes in ASP.NET, system architecture, and training. He has helped co-found the Iowa .NET Users Group as well as the Iowa Code Camp.

On his blog, http://blog.lozanotek.com, you can find posts on ASP.NET, Silverlight, architecture, and design patterns just to name a few topics. Javier is an avid supporter of the community and likes to give back by speaking at user groups, local/regional .NET events, participating in forums, and by writing articles. In his spare time, Javier loves spending time with his family and enjoys writing about himself in the third person."

Pueden leer un poco más acerca de Turbine en el blog de Javier http://lozanotek.com/blog/archive/2010/02/05/mvc_turbine_v2.0_for_mvc2_rc2_.net3.5.aspx

Pueden seguir a Javier Lozano en @jglozano.

El bueno de Jorge Gamba (@jorgegamba) publicó más detalles en su post:

Extensibilidad y Composición en para tus aplicaciones ASP.NET MVC con MVC Turbine

Leo ahí:

MVC Turbine es un plugin para desarrollar aplicaciones ASP.NET MVC compuestas y extensibles. Normalmente para lograr esto, recurrimos a algún contenedor IoC para inyectar dependencias en nuestros controladores, filtros de acciones, módulos, etc. toda esa configuración y ajustes no son muy difíciles de lograr, pero uno tal vez quisiera que una herramienta se encargara de estos asuntos permitiéndonos despreocuparnos de esos detalles del cómo implementamos nuestra aplicación para concentrarnos en lo que realmente nos debe importar, el qué debería hacer nuestra aplicación, bueno, pues eso es precisamente lo que logra MVC Turbine y veremos en la VAN.

Algunos enlaces a material de lectura (en Inglés) que les pueden resultar útiles para consultar antes de la VAN son estos:

Más información sobre cómo asistir a la reunión virtual, software necesario, enlaces: http://altnet-hispano.pbworks.com/Descripcion-de-Reuniones

El enlace para entrar a la reunión es http://snipr.com/virtualaltnet

Como aclara el bueno de Jorge:

Hay que aclarar que no se requiere ningún tipo de registro, simplemente acudir el día y la hora indicados a la dirección Web http://snipr.com/virtualaltnet, eso sí, deberán tener instalado el programa cliente de Live Meeting; hay más instrucciones sobre cómo hacer esto y otras indicaciones en la página wiki Descripción de Reuniones. Adicionalmente les recomendamos comprobar la hora correspondiente para su localidad, esto lo pueden hacer con la ayuda de la página Historial de Reuniones y nuestro Calendario de Reuniones, al cual se pueden suscribir

Hay un grupo de Google, recién creado, dedicado MVC Turbine:

http://groups.google.com/group/mvcturbine?pli=1

Un interesante post mostrando hacia donde apunta MVC Turbine:

Why MVC Turbine? 

Algo más en

MVC Turbine Redux

Gracias a la comunidad por prepararnos estas VANs!

Nos leemos!

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

Posted Fri, Mar 19 2010 10:52 by lopez | 1 comment(s)

Ganando un libro en Twitter

El jueves 11 de Marzo, hace semana y media, recibí un mensaje por Twitter, diciendo que si hacía retweet de un mensaje específico del usuario @tobint podía llegar a ganar un libro de Microsoft. Serían elegidos dos ganadores: uno en EEUU y otro internacional. El premio sería entregado via Amazon. Yo hice retweet del mensaje, y seguí mi vida. El viernes temprano, sorpresa! Había ganado! (mi entrada fue seleccionada al azar). Tobin estaba trabajando desde un Starbucks, supongo que era de noche donde estaba, creo que era Redmond. Recibí estos mensajes:

El libro es CLR Via C# 3rd Edition (una nueva edición) de Jeffrey Richter

http://www.amazon.com/CLR-via-Pro-Developer-Jeffrey-Richter/dp/0735627045

Descripto:

Dig deep and master the intricacies of the common language runtime (CLR) and the .NET Framework 4.0. Written by a highly regarded programming expert and consultant to the Microsoft® .NET team, this guide is ideal for developers building any kind of application-including Microsoft® ASP.NET, Windows® Forms, Microsoft® SQL Server®, Web services, and console applications. You'll get hands-on instruction and extensive C# code samples to help you tackle the tough topics and develop high-performance applications.

El perfil de Tobin Titus en Twitter:

Pueden visitar su sitio personal Abstract Syntax

http://tobint.com/

Twitter es una gran experiencia para mí. Puedo compartir información, conocimiento, enlaces, chistes, estados de ánimo, con gente interesante, en mi ciudad, Buenos Aires, de mi país Argentina, y de todo el mundo conectado.

Gracias por el libro Tobin!

Nos leemos!

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

Posted Wed, Mar 17 2010 9:56 by lopez | with no comments

Filed under:

Haciendo Scripting sobre WatiN usando AjSharp

AjSharp es un lenguaje interpretado que escribí en C#. Es un lenguaje dinámico, con clases y objetos dinámicos, valores funcionales, canales y gorutinas, entidades similares a agentes, acceso a objetos .NET nativos. Fue creado como un derivativode mi trabajo previo en AjBasic, el lenguaje interpretado y dinámico que use como base de AjGenesis, mi proyecto de generación de código. Mi plan es unificar ambos lenguajes usando el núcleo AjLanguage, y agregarlos al AjGenesis, permitiendo también el uso de to otros lenguajes, como plugins. Pero eso todavía está en plan.

El código de esto post está en el trunk del AjCodeKatas Google Project:

http://code.google.com/p/ajcodekatas/source/browse/

en trunk/AjLanguage/Src/AjSharp.Examples

Uno de los objetivos de diseño de AjSharp es servir como un shell liviano para invocar librerías .NET. Como prueba de concepto, escribí una simple clase para acceder a WatiN, la librería de automatización de pruebas web. Esta es la clase que estoy usando (y aplicando en un proyecto de desarrollo actual):

class Wat
{
  var Browser;
  
  function Wat()
  {
    WatiN.Core.Settings.WaitForCompleteTimeOut = 480;
    this.Browser = new WatiN.Core.IE();
  }
  
  sub Browse(url)
  {
    this.Browser.GoToNoWait(url);
    this.Browser.WaitForComplete(480);
  }
  
  function Button(name)
  {
    button = this.Browser.Button(name);
    
    if (button.Exists)
      return button;
      
    button = this.Browser.Button(WatiN.Core.Find.ByName(name));
    
    if (button.Exists)
      return button;
      
    button = this.Browser.Button(WatiN.Core.Find.ByValue(name));
    if (button.Exists)
      return button;
      
    return null;
  }
  
  function TextField(name)
  {
    textfield = this.Browser.TextField(name);
    
    if (textfield.Exists)
      return textfield;
      
    textfield = this.Browser.TextField(WatiN.Core.Find.ByName(name));
    
    if (textfield.Exists)
      return textfield;
      
    return null;
  }
  
  function Link(name)
  {
    link = this.Browser.Link(name);
    
    if (link.Exists)
      return link;
      
    link = this.Browser.Link(WatiN.Core.Find.ByUrl(name));
    
    return link;
    
    if (link.Exists)
      return link;
      
    return null;
  }
  
  function Contains(text)
  {
    return this.Browser.ContainsText(text);
  }
  
  sub Close()
  {
    this.Browser.Close();
  }
}

Se puede extenderla con otras características. Igual deja expuesto el WatiN browser, por si necesitamos algo que no esté expuesto en el código de arriba. Un ejemplo de uso:

Include("Tests.ajs");
System.Reflection.Assembly.Load("WatiN.Core");
Include("Wat.ajs");
wat = new Wat();
wat.Browse("http://google.com");
wat.TextField("q").TypeText("Angel Java Lopez");
wat.Button("Google Search").Click();
Assert(wat.Contains("ajlopez.com"), "No content");
wat.Browse("http://www.ajlopez.net/");
Assert(wat.Contains("Java"), "No content");
Assert(wat.Link("http://ajlopez.zoomblog.com/").Exists, "No link 4");
wat.Link("http://ajlopez.zoomblog.com/").Click();
Assert(wat.Contains("Ciencia"), "No content 2");
wat.Close();
exit;

El único problema que encontré al invocar a WatiN, es su requerimiento de ejecutarse dentro de un STAThread (Single Thread Apartment model). Así que cambié el método de main de AjSharp.Console, agregádole el atributo STAThread (¿habrá forma de elegir ese modelo por código, al lanzar un thread?). Estoy usando este tipo de scripts para probar una aplicación web real en desarrollo en un equipo ágil. Una cosa que podría agregar es soporte de excepciones y logueo de los mensajes de Assert (esto no es de Wat, sino de Test.ajs).

Pueden usar utilitarios más robustos sobre WatiN, como el Wax, que permite escribir tests usando planillas Excel. Por ahora, con lo que uso de arriba, me ha sido suficiente en el proyecto actual. Es un buen ejercicio para ir haciendo dog-fooding y probar las capacidades, fortalezas y debilidades de AjSharp en un requerimiento real.

Nos leemos!

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

Posted Tue, Mar 16 2010 15:41 by lopez | with no comments

Modelos para Generación de Código en AjGenesis

Quisiera hoy enumerar y pasar una corta revista a las opciones que tenemos para escribir, describir un modelo en  AjGenesis, mi proyecto open source de generación de códgio.

Una de las ideas básicas de AjGenesis es tener un modelo de libre definición, como punto de partida. No es un modelo fijo. ¿Qué significa esto? Que podemos crear y usar nuestro propio modelo. Veamos un ejemplo concreto. Si quisiéramos modelar una clásica aplicación "Hello, World”, podemos comenzar escribiendo un modelo simple como el siguiente:

<Project Company="ajlopez.com">
   <Message>Hello, World</Message>
</Project>

Y si queremos tener múltiples mensajes, lo extendemos en cualquier momento a:

<Project>
    <Messages>
        <Message>Hello, World One</Message>
        <Message>Hello, World Two</Message>
        <Message>Hello, World Three</Message>
    </Messages>
</Project>

Más información sobre este ejemplo sencillo en A Hello World Application in AjGenesis. (Generando Código: Hello World con AjGenesis).

Pero XML no sólo una de las versiones SERIALIZADAS de un modelo (el modelo es abstracto, AjGenesis lo maneja en memoria, y lo recupera desde donde lo digamos, en las primeras versiones, sólo de XML). En la versión del trunk podemos escribir y usar el modelo serializado como texto:

Project
    Messages
        Message = "Hello, World One"
        Message = "Hello, World Two"
        Message = "Hello, World Three"
    End Messages
End Project

Más información sobre modelos textuales en

Textual Model for Code Generation in AjGenesis
Modelo textual para generación de código con AjGenesis

Si queremos describir una Entidad en una especie de modelo de dominio, podemos escribir algo como este XML de libre formato:

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<Entity>
    <Name>Employee</Name>
    <Description>Employee</Description>
    <SetName>Employees</SetName>
    <Descriptor>Employee</Descriptor>
    <SetDescriptor>Employees</SetDescriptor>
    <SqlTable>employees</SqlTable>
    <Properties>
        <Property>
            <Name>Id</Name>
            <Description>Id</Description>
            <Type>Id</Type>
            <SqlType>int</SqlType>
        </Property>
        <Property>
            <Name>EmployeeCode</Name>
            <Description>Code</Description>
            <Type>Text</Type>
            <SqlType>varchar(20)</SqlType>
        </Property>
        <Property>
            <Name>LastName</Name>
            <Description>Last Name</Description>
            <Type>Text</Type>
            <SqlType>varchar(100)</SqlType>
        </Property>
        <Property>
            <Name>FirstName</Name>
            <Description>First Name</Description>
            <Type>Text</Type>
            <SqlType>varchar(100)</SqlType>
        </Property>
        <Property>
            <Name>IdDepartment</Name>
            <Description>Department</Description>
            <Type>IdRef</Type>
            <SqlType>int</SqlType>
            <Reference>Department</Reference>
        </Property>
    </Properties>
</Entity>

Más detalles del uso de un modelo como éste en Application Generation using AjGenesis. (Generando aplicaciones con AjGenesis).

Pero si leer XML nos hace doler los ojos, podemos volver a escribir el mismo modelo en forma textual. El ejemplo de arriba, abreviado:

Entity Employee
    Description = "Employee"
    SetName = "Employees"
    ...
    Properties
        Property Id
            ...
        End Property
            ...
        Property Name
        End Property
    End Properties
End Entity

 

No lo implementé, pero quiero agregar hojas de cálculo como modelos:

Escribí sobre eso en: Another Model for AjGenesis (Otro modelo para AjGenesis).

Pero a veces, queremos usar algo ya existente como fuente de nuestro modelo. Y con AjGenesis, podemos! Una de las más “populares” fuentes de seudo-modelos es la base de datos misma. En mi opinión, la base de datos no es el modelo ideal, pero, dependiendo del proyecto y de nuestras necesidades, puede ser una solución pragmática (recordemos, AjGenesis y generación de código son soluciones pragmáticas a algunos problemas en el desarrollo de software), así que no dudemos en adoptar fuentes convenientes, sólo hay que estar advertidos de sus limitaciones.

Escribi algún ejemplo en: Generating a Model From the Database Using AjGenesis (Generando un modelo desde la base de datos usando AjGenesis) y en AjGenesis: Generating the Model from the Database (AjGenesis: Modelo desde la base de datos).

AjGenesis nació y fue diseñado para sobrevivir al “fashion development”: no está orientado a una tecnología en particular, a una plataforma, framework, lenguaje determinado. Puede generar cualquier cosa que se un artefacto de texto (y yo diría que más): Java, C#, VB.NET, PHP, archivos de configuración, XML, scripts de base de datos, aún COBOL. Podemos escribir tareas, plantillas y lo que queramos generar, en cualquier momento. Podemos empezar en pequeño, e ir creciendo, agregando más abstraciones y transformaciones. Pero tareas y templates son temas que merecen otro post. Dicho esto, podemos usar como modelo un proyecto complilado. Como ejemplo, escribí sobre el trabajo de Dario Quintana usando .NET y Reflection en at:

AjGenesis: Generating the model from assemblies
AjGenesis: Modelo generado desde los assemblies

En el mundo Java, se acostumbra a generar código desde anotaciones en el propio código (mencionaría como ejemplo al venerable XDocLet). O desde archivos de configuración, la gente de Hibernate tiene hbm2java. NHibernate, la más popular librería open source de Object Relational Mapping en el mundo .NET, no tiene esas herramientas. Como en Java, AjGenesis puede usar los tags meta que se agregab a los archivos de mapeo .hbm, para usarlos en la generación de código. Vean:

Generating Code with AjGenesis using NHibernate Hbm Mapping Files
Generando código con AjGenesis usando archivos de mapeo de NHibernate

(Tengo un ejemplo más completo en el trunk actual, que genera una solución completa en ASP.NET y NHibernate).

Pueden bajarse el proyecto desde el trunk de código en:

http://www.codeplex.com/ajgenesis

Próximos tópicos: tareas, plantillas, abstracciones vs “technicalities”, modelos en memoria, transformaciones modelo a modelo, completando el modelo, tomando decisiones, sistemas expertos e inteligencia artificial aplicada a la generación de código y AjGenesis.

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Fri, Mar 12 2010 10:01 by lopez | 4 comment(s)

ALT.NET Hispano VAN Sobre Aspect Oriented Programming

La gente de la comunidad ALT.NET Hispano prepara una nueva VAN (DesConferencia Virtual) para el próximo sábado 13 de Marzo, a la hora habitual 18 GMT (3 de la tarde acá en Buenos Aires). El tema  será AOP (Aspect Oriented Programming) y la presentación del tema estará a cargo de José Romaniello (@jfroma).

El temario, según lo presentó José, será:

Esta es la lista de temas de la VAN Introducción a AOP:

  • ¿Qué es AOP? ¿Qué tipos de problemas podemos resolver con AOP?
  • Historia de AOP
  • Conceptos básicos
  • Diferentes técnicas disponibles en .Net Framework
  • Frameworks de AOP y frameworks que utilizan AOP
  • Ejemplo de código: Implementación de un cross-cutting concern con DynamicProxy y PostSharp.
  • Ventajas y desventajas entre los diferentes frameworks
  • Ventajas y desventajas entre las diferentes técnicas de weaving
  • ¿Cómo testear código implementado con AOP?
  • AOP en Chinook Media Manager

Algunos enlaces que aportó José para ir leyendo sobre el tema

AOP en wikipedia http://en.wikipedia.org/wiki/Aspect-oriented_programming

Castle DynamicProxy http://www.castleproject.org/dynamicproxy/index.html

Postsharp http://www.sharpcrafters.com/

7 Approaches for AOP in .Net http://ayende.com/Blog/archive/2007/07/02/7-Approaches-for-AOP-in-.Net.aspx

Pueden seguir la discusión y presentación de este tema para la VAN en la lista de correo de ALT.NET Hispano.

Más información sobre cómo asistir a la reunión virtual, software necesario, enlaces: http://altnet-hispano.pbworks.com/Descripcion-de-Reuniones

El enlace para entrar a la reunión es http://snipr.com/virtualaltnet

Nos leemos!

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

Posted Wed, Mar 10 2010 10:04 by lopez | with no comments

Yo y mi tía Carlota

Este es un post persona. Es más, será un post quejoso. Pero es tiempo de escribirlo, como para pasar en limpio algo.

Amo el desarrollo de software. Por más de 30 años, me dediqué al desarrollo de software. En este siglo, luego de haber encontrado al movimiento ágil, compré la idea de “entregrable”. Para cada actividad interesante que encaro, elijo entregar un “deliverable”. Mis tareas no son leer “Leer el libro X”, sino son más parecidas a “Leer el libro X y escribir un post comentándolo”. Lo mismo en software development. Cada ejemplo, prueba de concepto, librería, aplicaciones, o cualquier otra cosa que aprendo y preparo para mis cursos, en mi trabajo público, o en mi tiempo libre, termina publicado de una u otra forma. Eso ha sido la motivación para comenzar a escribir mis blogs, ya hace unos años. Muchos de mis posts son entregrables de alguna actividad. Escribir, pasar en limpio ideas, lecturas, compartir información y conocimiento, mi propia opinión, son, para mí, buenos entregables. La evidencia esta aquí, en este blog, en mi blog en inglés, en mi blog no técnico y en mi propio sitio personal. Aún lo que no consigo escribir, lo dejo en mi Delicious, y en los últimos dos años, mi cuenta de Twitter.

Pero a veces, además de cumplir con un entregrable, he esperado alguna retroalimentación de mis compañeros de desarrollo: personas a las que encuentro en cada día, a los que veo personalmente, trabajando en el mismo lugar, en el mismo proyecto, en el mismo escritorio o piso. Desarrolladores que son mis compañeros de trabajo, algunos desde hace más de una déecada. O miembres de mis propios equipos. Durante los últimos dos años, he conducido test informales sobre el nivel de conocimiento de mis compañeros sobre lo que escribo: posts, ideas, código fuente, ejemplos. El resultado es desalentador. Aparentemente, ninguno de mis compañeros lee, usa, comenta, critica, ni aún dedica un mínimo retweet, a lo que he publicado (ok, no será ninguno, será 1 entre cada 50/60). Hasta me ha pasado que alguien pregunta sobre un tema, delante mío, sin conocer que he pasado años escribiendo sobre el tema, dando charlas más de una vez al año, escrito docenas de posts, y hasta armado cursos sobre el tema. Esto es el origen de una de mis frases estereotípicas: “Vos no lees mi blog” (más info en mi post Vos no lees mi blog). He recibido mucha más respuesta de gente alrededor del mundo, o de otras ciudades en mi país, que desde mi ámbito personal.

Y esta es la razón de otras de mis aj-frases: “este post/código fue leido/bajado sólo por mí y mi tía Carlota” (una tía imaginaria). Aparentemente, sólo a una tía pondría gustarle mi trabajo.

Todo indica, que tengo un problema de comunicación. Deberé trabajarlo. Pero por lo menos, quería pasar en limpio la situación. Ahora, por un tiempo largo, dejaré de esperar algún feedback, comentarios, críticas de mis compañeros de trabajo. Pero seguiré produciendo entregables, compartiendo ideas, disfrutando de hacer cosas.

Pero basta de queja! Vuelvo a mi amor incondicional, el desarrollo de software, al código fuente, ideas, y más.

Nos leemos, Tía Carlota! ;-)

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

Posted Tue, Mar 9 2010 9:57 by lopez | 16 comment(s)

Trabajando en AjObjects: objectos dinámicos/documentos en memoria

Al comienzo de este sigo, cuando apareció .NET, comencé a practicar programando proyectos personales. Había tres principales: AjStorm (Simple Tool for Object Relational Mapping), AjGenesis (Code generation) y AjObjects (objectos nativos en memoria con consultas dinámicas). Sólo el segundo proyecto está hoy activo. Pero aprendí sobre Reflection en los tres proyectos, sobre cómo implementar simples consultas en AjObjects (ahora, tenemos Linq en .NET). Pueden ver algo de código prehistórico en:

https://sourceforge.net/projects/ajstorm/

A fines de los noventa, cuando aprendí PHP, encontré en ese lenguaje una implementación de objetos dinámicos (por lo menos, de propiedades dinámicas, si no métodos; propiedades que se pueden agregar a un objeto en cualquier momento, sin haberlas definido en una clase previamente). Viendo lo flexible que eran en PHP, y luego de haber experimentado con generación de código en PHP, pasé a implementar esas ideas en AjBasic, el lenguaje interno de AjGenesis. Hace dos años, más o menos, agregué objetos dinámicos a otro lenguaje interpretado, AjSharp. Tanto AjBasic como AjSharp permite escribir cosas como:

abel.Name = "Abel"
abel.Age = 600
abel.Father.Name = "Adam"
abel.Father.Age = 800

sin una previa definición de los objetos y propiedades. En AjSharp seríawithout previous definition of the object and its properties. In AjSharp you write:

abel.Name = "Abel";
abel.Age = 600;
abel.Father.Name = "Adam";
abel.Father.Age = 800;

Más información en:

AjSharp: Dynamic Classes and Objects
AjSharp: Clases y Objectos Dinámicos
AjSharp posts
AjSharp posts en español

Muchos lenguajes sobre las VM de .NET y Java ahora está reconociendo el poder de estas características dinámicas (En .NET 4 tenemos una implementación de ExpandoObjects, creo que nació con el DLR Dynamic Language Runtime, ahora la palabra clave dynamic es lo “nuevo”).

Estuve jugando con objetos en memoria desde hace un tiempo, el año pasado escribí algún experimento llamado AjTwitter, mensajes en memoria. Y estuve escribiendo una implementación más relacional, en AjBase. Esos proyectos está en el trunk de:

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

Impresionado por el movimiento NoSQL, decidí “to push the envelop” de mi tiempo libre, y hace una semana, como code kata, escribí el esqueleto base de algo inspirado por MongoDB, que es conocidad como una base de datos orientada a documentos. Mi proyecto está escrito en C#. Pueden ver el código en el proyecto mencionado AjCodeKatas, con el nombre AjObjects.

Definí un BasicObject (similar al BasicDBObject en el driver Java de MongoDB):

El BasicObject puede ser llenado usando la propiedad indexada default:

BasicObject newobj = new BasicObject();
newobj["Age"] = 800;
newobj["Name"] = "Adam";

o por un método factoría:

BasicObject newobj = BasicObject.CreateObject("Name", "Adam", "Age", 800);

Collection es el contendor de BasicObjects:

Podemos insertar y borrar bjetos. Un nuevo objeto insertado obtiene un Guid. Podemos recuperar ese objeto via su Guid. Hay un método Find(Predicate<BasicObject>) que retorna un Cursor sobre los objetos que cumplen con el predicado pasado como parámetro:

El método Update(Predicate<BasicObject>,Action<BasicObject>) aplica la acción a los objetos seleccionados de una colección.

La adopción de predicados y acciones, podría complicar la implementación de estas invocaciones cuando llegue a programar las llamadas distribuidas. Deberé trabajar en la serialización de esos predicados y acciones: ver de trabajarlos como Expression lambda, que recuerde, éstas son serializables (lo vi alguna vez en expresiones LINQ que viajaban de nodo a nodo en Microsoft Robotics).

Debo trabajar, como próximos pasos, en:

- Concurrencia: Actualmente, una colección tiene locks en cada uno de sus métodos. Los cursores obtienen una copia de la lista actual de objetos (copia la lista, no los objetos). Mientras se usa el curso, la colección original puede ser actualizado, sin cambiar el contenido del cursor.

- Persistencia: Hay un BasicObjectSerializer, a mejorar: más tipos básicos, necesito una implementación de BasicList.

- Distribución: Planeo tener varios hosts con réplicas, con consistencia eventual (tengo que estudiar la terminología).

Nos leemos!

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

Posted Mon, Mar 8 2010 10:09 by lopez | with no comments

Agile Open Buenos Aires 2010 - Calidad en el desarrollo de software

Se acerca una nueva reunión ágil en Buenos Aires. Será el próximo Sábado 13 de Marzo, desde las 9hs, hasta entrada la tarde. Lugar: el Centro Cultural Borges, Viamonte y San Martín. Pueden leer el anuncio en:

Agile Open Buenos Aires 2010

Leo ahí:

Luego de los exitosos eventos Ágiles 2008, Ágiles 2009 y de los Agile Open Buenos Aires, Córdoba, Tandil, La Plata y Mar del Plata 2009, se organizará el evento Agile Open Buenos Aires 2010, enfocado en el tema de la calidad en el desarrollo de software Agil.

En el post de Juan Gabardini hay algo más de detalle:

Agile Open Buenos Aires 2010

Escribe ahí el bueno de Juan:

Sobre el tema
Estamos pensando en CI, B/TDD, ATDD, pair programming, calidad por procesos, ... pero lo importante, ¿qué es la calidad para vos?
Este evento está orientado a los que están aplicado metodologías ágiles y están interesadas en contar experiencias, escuchar y aprender de otros, en todo lo que para vos esté relacionado con la calidad.

Lo hacemos bien liviano en cuanto a organización: compramos pizzas o empanadas en el momento y llevamos mate o café para los breaks…
(pero si alguna empresa quiere pagar las pizzas o traer catering para los breaks... les agradecemos, me contactan)

Que recuerde, el año pasado hubo sponsors que aportaron la comida. Sino, será cuestión de llevarse el sanguche de tortilla y la cantimplora con coca… :-)

La agenda es:

09:00 - Registración y Desayuno
09:30 - Apertura
10:30 - Sesiones 1
11:30 - Sesiones 2
12:30 - Almuerzo
13:30 - Sesiones 3
14:30 - Sesiones 4
15:30 - Coffe Break
16:00 - Sesiones 5
17:00 - Break
17:15 - Cierre

¿Por qué no tienen títulos las sesiones? Porque las eligen en el momento los mismos participantes. Cualquiera puede proponer un tema, y los demás pueden apoyarlo con votos. Luego, los interesados discuten, usando el formato Open Space. Las sesiones propuestas hasta ahora en:

http://www.agiles.org/agile-open-buenos-aires-2010---calidad/sesiones

Se organiza de forma gratuita, armado por los propios participantes, no cuesta nada asistir, y en un horario fuera del horario laboral. Si no conocen del tema ágil, igual pueden asistir, aunque convendría leer algo antes de algunos términos y conceptos.

En general, lo que encuentro interesante lo dejo en:

http://delicious.com/ajlopez/agile
http://delicious.com/ajlopez/scrum

 

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Sun, Mar 7 2010 12:27 by lopez | 1 comment(s)

Próxima Nerddinner en Buenos Aires

Se viene una nueva Nerddinner en Buenos Aires, la tercera que yo sepa. Será el próximo jueves 11 de Marzo, en Pizza Piola, Libertad 1078, confirmar el lugar e inscribirse en

ATENCION: Actualización  hoy a partir de las 19:00hs: San Martín 975 - http://www.filo-ristorante.com

http://www.nerddinner.com/1757

Cualquier duda le preguntan a @masaez. En base a la inscripción, @masaez va preparando la reservación. (No se guien por el mapa, que apunta a cualquier lado).

La segunda Nerddinner y algo de descripción de la primera en:

Segunda Nerddinner en Buenos Aires

Como comentaba ahí:

Siempre pueden organizar una nerddinner en su ciudad, Uds. mismos, visitar la portada del sitio:

http://www.nerddinner.com

Ven ahí las que están siendo planeadas para los próximos días, en todo el mundo.

La aplicación que soporta al sitio está hecha con ASP.NET MVC, y está publicado el código en:

http://nerddinner.codeplex.com/

Para entender cómo lo fueron haciendo en ASP.NET MVC, se pueden bajar un .pdf desde http://tinyurl.com/aspnetmvc. Pueden probar de ejecutarlo en Mono, leer: http://www.jprl.com/Blog/archive/development/mono/2009/May-14.html

Por ejemplo, hace un tiempo hubo una en Tandil, organizada por @cwalzer:

Nerddinner en Tandil

Otras Nerddinner en Argentina?

Nos leemos!

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

Posted Sat, Mar 6 2010 14:45 by lopez | with no comments