12 consejos para ser un Anti-Lider
Husmeando en el blog de "Mi carrera laboral informática y tecnológica", donde se encuentran notas/articulos pequeños del mundo IT, encontré uno que me gustó mucho.
El liderazgo es el pan de cada día en nuestra profesión. En un equipo siempre hay un lider, o debería, en este articulo vas a aprender como ser un excelente Anti-Lider!
Leer Articulo
Curso de Scrum en Resistencia
Este jueves y viernes estuvimos los integrantes del Polo Tecnológico del noroeste en un interesante e intensivo curso de Scrum organizado por dicho Polo.
Estuve representando a la empresa Geniar junto con los buenos de Gonzalo Diaz y Hernan Zini. Fue una interesante experiencia en la que pudimos aprender, e inclusive, en el workshop hicimos una simulación del proceso Scrum en la construcción de un juego de mesa.
Disertó el curso de una manera impecable el Sr. Fabian Loghitano. Aquí pueden bajar o ver una presentación similar a la que utilizó en el curso.
Gracias a un link que me pasó Gonzalo, bajé este mini-libro gratuito de parte de la gente de InfoQ. He leido algunas páginas y me pareció interesante; se requieren algunos conceptos básicos de Scrum previos antes de comenzar la lectura. Espero que sirva. Luego cuando lo termine seguramente haré los comentarios correspondientes.
Generando con AjGenesis desde los assemblies
AjGenesis es una herramienta de generación de código a partir de templates y un modelo libre.
Bien vayamos a esta frase, se dice rápido… pero analicemosla: "…a partir de templates…", esto no tiene nada de nuevo, MyGeneration lo hace, y millones de generadores de código que andan sueltos por ahí también. Pero el punto más que interesante está: "a partir de un modelo libre", y esto que quiere decir ? Significa que no hay restricciones sobre como debe ser el modelo. Si bien debe ser escrito en Xml, esta es una forma de representar el modelo para que lo analice AjGenesis, esto no puede ser considerado una restricción.
Ahora bien, el modelo de AjGenesis puede ser generado inclusive desde la base de Datos, existen unos ejemplos de ello disponible junto con la distribución de AjGenesis.
Hace un tiempo salió la inquietud de que AjG podría generar el modelo a partir de los hbm de NHibernate, la gente que usa NHibernate estaría contenta incluyendome. Pero estuve pensando que los xml se deberían sobrecargar con muchos datos que por ahora los defaults de NHibernate los consideran dejando el mapping más limpio y fácil de leer. Por ejemplo, mis mappings files no tienen el tipo de dato (salvo excepciones), NHibernate hace el trabajo, sin esta información, el modelo que se genere ó el código que se genere junto a los templates es casi inutil sin los tipos de datos.
Otra opción para generar el modelo, es a partir de las clases disponibles en los ensamblados de la aplicación que estemos usando. Hace un tiempo escribí esta herramienta que ahora decidí cambiarla un poco. Ahora escribí ésta herramienta que la pueden descargar aquí.
Como funciona AjGenesis.FromAssembly? Facil, es una librería que itera sobre un ensamblado especificado y devuelve una lista de Objetos que representan la estructura de las clases:
<# AjGenesisFromAssemblyPath = "..\..\bin\AjGenesis.FromAssembly.dll" function GetEntities(path) AssemblyManager.LoadFrom(AjGenesisFromAssemblyPath) obj = new AjGenesis.FromAssembly.Collector() list = obj.GetEntities(path,null) return list end function
AssemblyManager es la clase encargada de cargar el assembly, una vez hecho esto podemos trabajar con él.
Para obtener la listar las clases en el assembly usamos la clase Collector, y la función GetEntities, especificando la ruta del ensamblado.
El template para generar la configuración de IoC en el xml, podría ser similar a este:
<#
nsServices = "MyApp.Service"
assemblyName = "MyApp.Service"
moneySign = "$"
oBraces = "{"
cBraces = "}"
include "${TemplateDir}\Functions.tpl"
#>
<#
for each Entity in Entities
#>
<${Entity.Name}Dao>${moneySign}${oBraces}${Entity.Name}.Dao${cBraces}
${Entity.Name}Dao>
<#
end for
#>
Algo interesante al generar código que a su vez tiene instrucciones de un lenguaje "tipo" template, es decir con comandos de esta forma ${variable}, es que debemos usar caracteres en el código generado y en el codigo para que lo interprete el generador de código. AjGenesis en los templates y Windsor en la configuración, usan los caracteres $, {, }. De modo que para no que AjGenesis no se confunda en el parseo, creé variables que contienen estos símbolos.
Existen muchas cosas que se me ocurrieron para mejorarlo, pero la base ya está, ahora hay que empezar a retocarla. Se me planteó la inquietud crear atributos (annotations) para las clases de modo que se pueda enriquecer o restringir el modelo generado. Pero supongo que sería la primera herramienta de generación de código intrusiva que se pueda configurar por medio de annotaciones y quizas se convertiría en overhead para la aplicación.
Charla de Generación de código en Corrientes
El miercoles con unos amigos tuvimos la oportunidad de estar en una charla de el queridísimo Angel "Java" Lopez en Corrientes capital.
La charla estuvo buena, habló de la realidad del software, un poco sobre la evolución de los sistemas y la complejidad que debemos enfrentar hoy día los desarrolladores. Para poder enfrentar esta complejidad, podemos hacer uso de herramientas de generación de código y facilitarnos un poco la vida. El materia de la charla lo pueden descargar aquí. Angel no podía dejar de mostrar a su bebé
Esta es una de las imagenés de la presentación que expuso, y que muestra la realidad de nuestras aplicaciones, existe mucho código que se puede generar y otro código lo debemos escribir nosotros, y quizás este código pueda ser encapsulado en un framework para nuestro bien y del que lea el código.
Quizás la generación de código no sea "la solución" pero nos hace la vida más fácil y se encarga del código "aburrido". Miremos nuestro código y seguramente encontraremos código que podemos generar. Esto es un primer paso a la factoría de Software.
3 layer Example of NHibernate + Spring.Net + AOP
Hace un tiempo escribí este proyecto plantilla usando Spring.Net y NHibernateprincipalmente. Usé NHibernate para el acceso a datos obviamente y Spring.Net para aplicar IoC y Aop.
Esta es la clase CustomerService:
public class CustomerService : BaseService, ICustomerService
{
/// <summary>
/// This field is inyected by IoC through the property.
/// </summary>
private ICustomerDao customerDao;
public ICustomerDao CustomerDao {
get { return customerDao; }
set { customerDao = value; }
}
#region ICustomerService Members
public int CreateCustomer(string Name, string LastName) {
Customer customer = new Customer();
customer.FirstName = "Dario";
customer.LastName = "Quintana";
CustomerDao.Save(customer);
return customer.Id;
}
public void DeleteCustomer(int Id) {
Customer customer = CustomerDao.GetById(Id);
CustomerDao.Delete(customer);
}
#endregion
}
Como se puede apreciar las clases CreateCustomer ó DeleteCustomer no están envueltas en un codigo Transactional o de UnitOfWork, tampoco el método Save(customer) en la clase CustomerDao.
Entonces… donde está el soporte transaccional? Spring + AOP es la respuesta. Spring envuelve a los metodos del Servicio entre transacciones. Y la respuesta para esto son los proxies.
Cuando se realiza la instanciación de la clase CustomerService, un proxy es instanciado. Con el proxy de nuestra clase Spring.Net puede envolver los metodos configurados dentro de transacciones. Muy bueno no ?
Otra cosa que pueden apreciar en el ejemplo es el uso de uNhAddIns en el repositorio. Con esta librería podemos usar queries "detachadas" o separadas de un contexto de persistencia por medio de la clase DetachedQuery. Con DetachedQuery podemos hacer uso indistinto de Hql/SqlNativo en NamedQueries, y esto es una buena práctica que debemos tratar de adoptar.
Descargar el ejemplo
Gizmox – VisualWebGui
Se los paso al precio de costo, si no lo miran … se lo pierden. Y qué es? Es algo así como Winforms… pero Web!!! Sin palabras…http://www.visualwebgui.com/

ActiveRecord moviendose a NHibernate 2
Aparentemente los muchachos de ActiveRecord quieren mover a ActiveRecord a usar NHibernate 2.0, por ahora esto significa moverse a la version de NHibernate en el trunk (pero solo por ahora).
Esto traerá más capacidades para ActiveRecord, por ejemplo, aquí muestro como usar DetachedQuery con ActiveRecord. Usando NHibernate 2.0, podré subir un patch con este soporte sin necesitar de uNHAddIns.ActiveRecord.dll.
En este hilo pueden ver a los muchachos de la list votando por hacer esta jugada.
Otra principal caracterista para sacarle ventajas a NHibernate 2.0 es Event Listeners. En chat con Fabio Maulo:
- Yo: "No puedo ver las ventajas de usar Event Listeners en la Validacion con ActiveRecord, AR valida antes de Guardar y lo hace bien"
- Fabio: "Como podés interceptar el proceso de validación antes de hacer el Save?"
- Me: "No podés"
- Fabio: "Te contestaste vos mismo"
Interfaces fluidas en NHibernate
Ben Scheirman en esta entrada propone un tema interesante para aplicarlo en NHibernate: interfaces fluidas (Fluent Interfaces).
La idea es crear los mapeos de NHibernate programaticamente en vez de usar Xml, pero no solamente eso, sino que también usando interfaces fluidas.
Hay varias maneras de hacer interfaces fluidas para un dominio especifico, y también existen varias ventajas a la hora de usar el código, pero por sobre todo para leer el código. El código debe ser muy facil de leer y esto lo hace interesante. Escribir interfaces fluidas es un poco más complicado y requiere práctica.
Recursos:
ActiveRecord con soporte para DetachedQuery
Este fin de semana escribí las clases necesarias para el soporte de IDetachedQuery con ActiveRecord. DetachedQuery no está disponible todavía en ninguna versión de NHibernate, la podés encontrar solamente en uNHAddInsy en el SVN de NHibernate.
Agregué un proyecto a uNHAddIns: uNHAddIns.ActiveRecord. Este consiste en las clasicas clases de ActiveRecord pero con soporte para DetachedQuery.
Si queres este soporte, tenés que usar estas clases:
- ActiveRecordBase
- ActiveRecordBase<T>
- ActiveRecordValidationBase
- and ActiveRecordValidationBase<T>
Y vas a poder hacer cosas como por ejemplo:
Customer[] customers = Customer.FindAll(new DetachedQuery("from Customer Order By Name"));
Los nuevos métodos para ActiveRecordBase y ActiveRecordValidationBase son:
-
public static bool Exists(Type targetType, IDetachedQuery detachedQuery);
-
public static Array FindAll(Type targetType, IDetachedQuery detachedQuery);
-
public static object FindFirst(Type targetType, IDetachedQuery detachedQuery);
-
public static object FindOne(Type targetType, IDetachedQuery detachedQuery);
-
public static Array SlicedFindAll(Type targetType, int firstResult, int maxResults, IDetachedQuery detachedQuery);
Y los nuevos metodos para ActiveRecordBase<T> y ActiveRecordValidationBase<T> son:
-
public static bool Exists(IDetachedQuery detachedQuery);
-
public static T[] FindAll(IDetachedQuery detachedQuery);
-
public static T FindFirst(IDetachedQuery detachedQuery);
-
public static T FindOne(IDetachedQuery detachedQuery);
-
public static T[] SlicedFindAll(int firstResult, int maxResults, IDetachedQuery detachedQuery);
Esta implementación no oculta ninguna característica de las clases base de ActiveRecord, son una extensión para el soporte para IDetachedQuery.
Requerimientos
Las clases están en el ensamblado uNHAddIns.ActiveRecord.dll. Y este ensamblado requiere del principal: uNHAddIns.dll.
Descargas
Entrada en la Wiki
Validación en NHibernate
Una de las puertas que dejó abierta el port de EventListeners, es la posibilidad de crear algunas clases para poder validar objetos antes de ser guardados (como así también antes de ser borrados).
Una opción es portar Hibernate.Validator, pero… alguién realmente va a usarlo? Yo personalmente creo que no. Mirando su implementación y qué hace, no ofrece mucho más de lo que se puede encontrar del lado de .Net con algunas librerías. Quizás algún día se porte Hibernate.Validator, pero por ahora, yo creo que es más importante portar algunas otras features de Hibernate, estas se van a aprovechar más.
Una opción valida, es crear bridges entre NHibernate (EventListeners) y algunos frameworks conocidos en .Net para la validación de entradas (input validation).
Algunas opciones que se me ocurren:
La implementación ya sea Hibernate.Validator (no creo) o algún bridge para los mencionados, se hará en uNHAddIns.
Un punto interesante, sería que posea la posilidad de extensibilidad para validadores hechos por nosotros.