lunes, julio 31, 2006

Windows Vista Gadgets

Los Gadgets son un nuevo tipo de aplicaciones usadas en Windows Vista. Los que han usado este OS los habrán visto en su Sidebar. Bueno, investigando un poco de que opciones hay para desarrolladores de Vista, enconte como desarrollar Gadgets. No es nada espectacular, sobre todo para aquellos que han desarrollado web.

Ok, de esto se trata, necesitas un archivo de manifiesto (gadget.xml con ciertos datos sencillos como decirle donde está el Gadget, el titulo de este, una descripción, información del autor, etc. Todo lo demás es hacer una página web a ciertas medidas. Dentro del mismo folder puedes tener tus imágenes, archivos de javascript y css. Puedes configurar una página de Settings y guardar la configuración de tu Gadget, también podrás tener muchas instancias de tu Gadget abierto cada uno con su propia configuración. Estos Gadgets los puedes depurar desde Visual Studio. Por último una vez listo tu Gadget, simplemente comprime todo el folder en un zip o lo empaquetas en un cab y le cambias la extensión a .gadget y listo, lo distribuyes desde tu sitio web.

Una gran ventaja es que estos Gadgets pueden usar el Gadget Object Model que nos permite desde JavaScript acceder a información del Sistema Operativo como variables de entorno información de la batería, uso de CPU y muchas otras cosas. Al parecer es bastante poderos.

Un área interesante de explotar seria la manera en que pudiéramos combinarlos con Ajax para estar trayéndonos información, pudieran ser anuncios, alertas de un sitio web como alguna venta del sitio que la persona este administrando, traerse imágenes de un fotoblog.

Bueno no quiero aburrirlos con tanto rollo, lo mejor es que vean directamente el ejemplo introductorio a como crear Gadgets.

domingo, julio 30, 2006

Más de VSTS for DB Pros

Aquí les dejo algunas pantallitas con comentarios.



DB for Pros, agrego nuevos Project Templates, vamos a probar con el de SQL Server 2005 y agregarlo SourceControl a nuestro proyecto de Investigaciones.



Uuups. Nunca me preguntaron por una instancia de SQL y al parecer no se pudo conectar a ninguna. “Project Creation Failed”.


Intentemos de nuevo, pero en esta ocasión sin agregarlo a SourceControl.


Mismo error, nuevamente. ¿Hasta aquí llegamos? No… vamos a intentar con otro tipo de proyecto.


No es exactamente lo que buscábamos, pero a ver, agreguemos un proyecto para crear clases que se usen en SQL Server.


Tal como esperábamos, ahora nos pide la instancia.


Wow, desde VS 2002, siempre fue algo complicado el depurar SQL, y esto parece que va a dejar todo listo para poder hacerlo de manera sencilla. Sólo no hay que depurar en un servidor de producción. Hagan esto en alguno de prueba. Según la nota: “Todos los managed threads se detendrán durante la depuración”.


Al agregar un nuevo Item, estas son nuestras opciones. Se está volviendo lento y tardado poner una imagen de cada paso. Por lo que voy a probarlo sólo y luego les paso lo más importante. Este es mi primer post con imágenes desde Word 2007 directo a blogger, así que quería probar que tal se subían. Pero bueno, suficientes imágenes para mi prueba.

Bueno realmente no hubo mucho más que mostrar.

  • Agregue el proyecto a SourceControl sin problemas.
  • Le agregue uno de cada uno de los ítems que mostré anteriormente.
  • Les hice cambios a estos y cree unos tipos de datos, clases y otras cosas sencillas. Nada que no hubiéramos podido hacer desde otro lugar.
  • Al presionar F5 me empezó a hacer el deployment y todo fue a dar a mi base de datos sin problemas.
  • Al final me dijo que no tenía suficientes permisos para depurar.


Bueno y a que le hizo el deployment. Me copio mi Assembly, creo un StoredProcedure y mi type.

Es importante mencionar que el proyecto tiene unos Test Scripts. Estos Scripts se corren al momento de hacer el deployment, para estos prueban tus StoredProcedures u otros objetos de SQL.

Ok, vale la pena entonces probar alguna otra funcionalidad aparte de el puro deployment y SourceControl.

Refactoring: hice un simple rename a mi tipo para que ahora se llame Type2 y voila!!! F5 y todos los cambios aplicados también en mi base de datos y afectando a mi StoredProcedure.

CREATE
PROCEDURE [dbo].[StoredProcedure1]

@miTipo [dbo].[Type2]

Algo que me llamo la atención es la manera en que podemos crear Stored Procedures. Finalmente es un metodo estático dentro de una clase decorado con ciertos atributos. El metódo puede regresar algún tipo de dato y recibir tantos parametros como sean necesarios, esto finalmente se traduce en código como el que vimos arriba.

Unit Testing: cree una sencilla prueba unitaria para algunas propiedades y metodos y todo sin problema. Sin embargo, no se que tal se comporte al querer hacer unit testing sobre un stored procedure ya en la base de datos o sobre algún mock database. Aún no se como vaya a trabajar eso.


Hay mucho por conocer de está herramienta, les sugiero que la bajen y se pongan a jugar un rato. Aunque no estoy completamente satisfecho con el producto, parece ser algo prometedor.

sábado, julio 29, 2006

Problemas instalando Windows Vista Beta 2

Les dejo el link de un Post muy interesante respecto a como instalar Windows Vista.

Word 2007 y mis Posts pendientes

Les comento que Word 2007 tiene una nueva funcionalidad para publicar directamente a diferentes proveedores de blogs, entre ellos blogger. Bueno mis últimos posts prometían ser algo más completos con mejor formato y colorsitos y más importante aún fotos. Sin embargo, Word 2007, al parecer aún no puede subir bien las fotos.

Así que les debo tres posts más hasta que tenga oportunidad de subir las fotos manualmente a algún otro lugar. Mientras les dejo un abstract de los posts:
1. Como usar Continuous Integration con VSTS TFS, hay una herramienta que permite que se automatice está tarea, en lugar de que se configure por tiempo, ahora detecta que hay cambios en el código y corre el build al momento.
2. Algunos Screenshots de la spruebas con DataDude (VSTS for Database Professionals).
3. SmallDtoWrapper, es un patrón de diseño de arquitectura que nos ha resultado muy útil para optimizar el consumo de ancho de banda al usar WebServices. Desde que empece a leer de patrones de diseño, siempre quise tener el mio, bueno, porfín posteo respecto a mi primer patrón de diseño.... Espero comentarios...

martes, julio 25, 2006

Visual Studio Team System for Database Professionals

Esta es la descripción que encontré de la herramienta:

Herramientas para construir bases de datos de SQL en un entorno de proyecto administrado con soporte para versiones, despliegue (deployment), pruebas unitarias, refactorización, y desarrollo SQL desconectado. Este release (CTP de Junio de 2006) está enfocado en un escenario de funcionalidad completa para SQL 2000 e incluye el sistema base con ingeniería en reversa, un nuevo editor de consultas, comparador de esquema y datos, generador de datos, pruebas unitarias y refactorización de nombres.

En un post anterior ya les había hablado de DataDude (codename) para este nuevo producto. Bueno, ya pueden bajar los bits de Junio, pero no les dejo ese link, mejor el del CTP4.

Estos son links de algunos bloggers the DataDude:

Luego que lo prueba más publicare algunas fotos.

miércoles, julio 19, 2006

DataEventArgs

Despues de publicar mi post anterior, me di cuenta de que la clase DataEventArgs<T> no forma parte del .NET Framwork. Nosotros usamos Mobile CAB y resulta que la clase pertenece a este framework. Muy seguramente el CAB para Windows tambien lo use, pero bueno si ustedes estan programando para Web o simplemente no usan CAB, pueden usar la siguiente clase en su proyecto. Es tan sencillo el código que toma lo mismo hacerla que haber hecho algún otro EventArgs.

using System;

namespace Microsoft.Practices.Mobile.CompositeUI.Utility

{

/// <summary>

/// Generic arguments class to pass to event handlers that need to receive data.

/// </summary>

/// <typeparam name="TData">The type of data to pass.</typeparam>

public class DataEventArgs<TData> : EventArgs

{

TData data;

/// <summary>

/// Initializes the DataEventArgs class.

/// </summary>

/// <param name="data">Information related to the event.</param>

/// <exception cref="ArgumentNullException">The data is null.</exception>

public DataEventArgs(TData data)

{

if (data == null)

{

throw new ArgumentNullException("data");

}

this.data = data;

}

/// <summary>

/// Gets the information related to the event.

/// </summary>

public TData Data

{

get { return data; }

}

/// <summary>

/// Provides a string representation of the argument data.

/// </summary>

public override string ToString()

{

return data.ToString();

}

}

}

Más Generics - DataEventArgs

Cada vez le encuentro más usos a los delegados. Hace poco postee respecto al uso del generic EventHandler, que te permitia no tener que declarar un delegado para todo.

 

Sin embargo, por si sólo el EventHandler, aún necesitaba ser acompañado de algún EventArgs.

 

Bueno recapitulando normalmente haríamos lo siguiente para poder tener un evento que mande a sus suscriptores quien mando el metodo y una string con la clave del articulo seleccionado.

 

 

public delegate void ClaveSelectedEventHandler(object sender, ClaveSelectedEventArgs e);

 

Esa firma es necesaria para cumplir con las convenciones de nombres, todos los eventos en .NET tienen un delegado que requiere un objeto que indique quien lanzo el evento y unos event args con datos del evento.

 

Bueno, ahora necesitamos crear la clase ClaveSelectedEventArgs

 

 

public class ClaveSelectedEventArgs:EventArgs

{

public ClaveSelectedEventArgs(string clave)

{

this.clave = clave;

}

private string clave;

public string Clave

{

get { return clave; }

}

}

 

Note que ClaveSelectedEventArgs debe heredar de EventArgs, esto es muy útil, aunque para algunos pudiera parecer un simple capricho de convención de nombres, pero sirve para que metódos más genéricos (no generics, sino que no esperen un EventArgs tan específico aún puedan suscribirse a nuestro evento).

 

Por pen-último declaramos un evento del tipo ClaveSelectedEventHandler

 

public event ClaveSelectedEventHandler ClaveSelected;

 

Ahora si por último, lanzamos el evento:

 

if (ClaveSelected != null)

ClaveSelected(this, new ClaveSelectedEventArgs("clave");

 

Es importante validar si el evento no es nulo antes de querer lanzarlo, esto nos garantiza que realmente haya alguien suscrito y nos evita la posibilidad de generar un NullReferenceException.

 

Bueno todo listo para que alguien se suscriba de la siguiente manera:

 

this.ClaveSelected+=new MiEventHandler(View_ClaveSelected);

 

void View_ClaveSelected(object sender, SplashView.ClaveSelectedEventArgs MiEventArgs)

{

throw new Exception("The method or operation is not implemented.");

}

 

Como les comentaba, el metodo que usamos para hacer algo con ese evento, pudiera ser algo más genérico:

void View_ClaveSelected(object sender, EventArgs MiEventArgs)

{

throw new Exception("The method or operation is not implemented.");

}

 

Ese metodo puede escuchar a cualquier evento que cumpla con los naming conventions.

 

 

Bueno, ahora si, quieren ver la parte fácil? Creo que fue mucho rollo introductorio:

 

public event EventHandler<DataEventArgs<string>> ClaveSelected;

 

Eso es todo lo que tenemos que hacer en lugar de declarar un delegado y una clase EventArgs que encapsule un string. Todo el resto del código (lanzar el evento y suscribirse es identico).

 

Pero bueno como un string se puede usar para muchas cosas, valdría la pena decir que significa para nosotros:

///

/// Se lanza sl momento de que se seleccione una clave y la manda en los DataEventArgs

///

public event EventHandler<DataEventArgs<string>> ClaveSelected;

 

Eso se ve mejor.

 

Bueno, sólo para que lo vean completo, así lanzamos el evento:

 

if (ClaveSelected != null)

ClaveSelected(this, new DataEventArgs("Clave"));

 

Así nos suscribimos a el:

 

this.ClaveSelected += new EventHandlerDataEventArgs<string>>(SplashView_ClaveSelected);

 

Y así lo cachamos:

 

void SplashView_ClaveSelected(object sender, DataEventArgs e)

{

throw new Exception("The method or operation is not implemented.");

}

 

O así si quisieramos hacerlo más genérico:

 

void SplashView_ClaveSelected(object sender, EventArgs e)

{

throw new Exception("The method or operation is not implemented.");

}

 

Algo muy importante es que DataEventArgs lo puede usar con cualquier otra cosa que necesiten mandar como argumento, por ejemplo:

DataEventArgs<MiClase>

DataEventArgs<int>

martes, julio 18, 2006

Software Guru 2006

20,21 y 22 de Septiembre en el WTC y CompuSoluciones.

Si ya vieron la ultima revista de SG, es de llamar la atención que no este Microsoft en la primera de forros (luego luego dandole vuelta a la portada), así que para que hayan quitado a Microsoft uno de sus más fuertes patrocinadores para anunciar este evento es porque realmente ha de valer la pena jejeje, bueno igual MileStone Consulting le quito la contraportada a IBM, mmmm ha de ser algo importante tambien....

Bueno ya en serio, realmente si es un evento importante, basta con ver algunos de los temas. La verdad es que parecen ser tan prometedores todos que no me gusta tener que decidir cual track tomar.

Lamentablemente me ha tocado jugar un poco de cada rol, por lo que tengo ahora me interesa todo lo relacionado con mejora de procesos, pero tambien estoy muy al tanto de herramientas y tecnologías y bueno, ingeniería de software siempre será algo indispensable, pero por otro lado estrategías para empresarios presenta temas que pueden ser muy útiles para Integradores. Ya viendo todo, tal vez dirección de TI es el único no tan tan interesante, aunque pensandolo bien ahí hay muchos clientes potenciales y necesitamos saber como piensan los directores de TI, por ejemplo hay un tema "Outsourcce exitoso: Mejores prácticas y leccciones aprendidas", apoco no sería interesante al ofrecer servicios de este tipo conocer eso para tener más herramientas de venta con el cliente.

Bueno en resumen lo malo de SG06 es tener que escoger a que track entrar.

Estos son algunos de mis temas preferidos:
Herramientas y Tecnología
Windows Presentation Foundation (que parece que la va a dar Christian).
Software Orientado a Aspectos.
Desarrollo para Dispositivos Inteligentes, :( era la propuesta de tema que iba a mandar yo.
Mejora de Procesos:
Entendiendo la Arquitectura de MoProSoft para extenderlo.
MoProSoft 16 veces: leccciones aprendidas.
CMMI y/o/vs Agilidad.
Direccion de Proyectos:
Administración ágil de proyectos. (Se empalma con WPF).
Ingeniería de Software:
Especificación de Requerimientos con PNL. (Se empalma con AOP)
Desarrollo Dirigido por pruebas TDD. (Se empalma con Desarrollo para dispositivos inteligentes).
Estrategia para Empresarios:
Todas.
Dirección de TI:
Outsourcing Existoso

Bueno esos solo son los tracks.
Chequen las conferencias magistrales.
Business Collaboration Software Factories, Mauro Regio y quien es Mauro Regio, por alguna razón no le pusieron su foto como a los demás expositores ni su pérfil, pero vamos Software Factories? A quien van a mandar para hablarnos de eso? Bueno busque el pérfil de Mauro y resulta que mandaron al indicado para venir a hablar de este tema. Creo que está puede ser la mejor platica para mi gusto.
Ajax + SOA, John Crupi, de JackBee si alguien sabe de AJAX es la gente de JackBee.
Software Develpment as a cooperative game, Alistair Cockburn.
Tendencias Internacionales en Ingeniería de Software, el tema pudiera parecer no tan interesante, pero es Hanna Oktaba.

El último día hay unos talleres. Estos son los que me llemaron la atención
Desarrollo Empresarial con VSTS, llevamos trabajando casi un año con VSTS, pero siempre hay algo que podamos aprender.
Arquitecturas basadas en componentes con .NET Library 2.0.


Bueno, espero y también les llame la atención algo de esto, aunque seguramente no tendremos el mismo gusto, mejor les sugiero que vean al programa completo y escojan a que quieren entrar.

lunes, julio 17, 2006

DataDude or VSTS for Database Professional

Ok, para los que conocemos VSTS, sabemos que tiene sus ediciones de Tester, Architect y developer y que comparte una base común por ejemplo Team Explorer para navegar por los ítems de Team Foundation Server.

La mayoría de nosotros, bueno excepto aquel que no tenga mucho que ver con las bases de datos, aún usa Management Studio o Enterprise Manager y Query Analyzer. Bueno Datadude, va será el ambiente de trabajo para bases de datos.

Que ofrece?
Bueno la verdad es que después de escuchar el podcast de .NET Rocks que quedo con la idea de que está primera versión no ofrecerá cambios impresionantes, pero esto es algo de lo que están haciendo:
Partienda de que tenemos el esquema offline, es decir, creas un nuevo proyecto de base de datos y te traes el esquema a tu maquina. Ya aprovechando que tenemos esto es posible lo siguiente:
Mantener un control de cambios (Team Foundation).
Trabajar con diferentes desarrolladores y hacer merge de cambios a la base de datos.
Programar deployments y reflejar estos cambios en las bases de datos.
Proveer el impacto que pudiera tener cambios en el esquema en los datos.
Refactorizar la base de datos (como clic derecho en una columna y luego Rename) y actualizar StoredProcedures, vistas, rules, etc.

Bueno si eso les parece interesante, se decepcionaran un poco al saber que no está listo aún:
Intellisense :(


Bueno faltan algunas otras cosas a mi parecer no tan criticas como, integración con LINQ (para Diciembre que liberen DataDude aún no estará listo LINQ). Que trabaje con diferentes DBMS (actualmente sólo soporta SQL 2000 y 2005), toda la versión 2.0 de Datadude trata de esto. Algunos extension points para proveedores (hacer plugins, etc).

Bueno traen el tiempo encima, se supone que esto lo liberan para Diciembre.

Ojala y para el próximo año podamos contar con algo mejor para trabajar sobre bases de datos.

Net Framework 3

Al parecer ya está esto más listo, al menos a un nivel tan estable como para empezar a hacer nuestros primeros pininos en está nueva tecnología...

Esperamos que en próximos proyectos podamos empezar a usar algo de esto.

Pueden ver más info de lo que se incluye en un post de Christian Strevel.

Integración Continua

La integración continua es una práctica muy útil en el desarrollo de software (lastima que no la usamos, bueno no al 100%).
Recientemente escuche algo de un servidor de integración y me llamo la atención. Pense, en que podrá servirnos a nosotros, recuerdo haber visto algo de esto en internet, de pronto recorde que ya teníamos uno, que se empezo a utilizar en tres proyectos, uno de los cuales se cancelo y se quedo en un proof of concept, otro fue tan sencillo que nunca realmente se notaron los beneficios que CI (Continuous Integration) pudo haber brindado y en este último que nos hubiera servido muchísimo en algún momento se desconfiguro el Build Server y se dejo de utilizar.

Bueno en resumen, teníamos el servidor, pero no la práctica de integración continua. CI es de esas cosas como control de versión y administración de proyectos que por más que tengas CVS o MS Project (o algo mejor), si tu equipo no tiene buenas prácticas de Administración de la Configuración o Planeación de Proyecto de poco sirve. Lo mismo nos ocurre ahora...

Bueno volviendo al tema. Martin Fowler reescribió sobre CI, si quieren conocer un poco más de esto se los recomiendo.

Por último, aunque Team Foundation Server aún le falta madurar un poco en algunas de sus áreas (al igual que otras de VSTS), trae ya un servidor de Integración con el que Christian y yo estuvimos jugando.

Como funciona, simplemente creas un nuevo build, le dices que proyectos de Visual Studio o que soluciones quieres compilar, cuales dependen de cuales y que pruebas quieres correr sobre el build. Una vez que haces esto y programas la frecuencia (minímo diario), todo funciona en automático. El build server tomara del repositorio los archivos que necesita, compilara lo que le indicaste, correrá las pruebas y te deja todo el output (dlls, archivos de pruebas, exes, etc) en un dropbox (un folder compartido en red). La mejor parte es que todo esto se integra con los reportes de Sharepoint que tiene el Team Foundation, por lo que podemos ver estadísticas como las siguientes:
Pruebas fallando con bugs activos y con bugs activos,
Regresiones: pruebas que ya pasaban y ahora no.
Otros indicadores de calidad,
% de pruebas que pasan.
% de codigo cubierto por pruebas (Code Coverage).

También se pueden hacer otro tipo de revisiones aparte de las pruebas automatizadas, como para poder hacer el deployment o release de un build en partícular.

La verdad es que nosotros estamos medio güeyes, la regamos, pensamos que los builds eran para tenerlos. Como? Si pensabamos que para tenerlos y poder obtener de una fecha en partícular los ejecutables y librerías necesarias para de ahí poder hacer un release. La verdad es que esto de los builds tiene mucho mayor sentido que eso: Continuous Integration. Esto nos va a permitir saber como vamos, que tal trabajamos juntos, si vamos mejorando o empeorando, detectar rápidamente como nos pegan los cambios de otros y arreglarlos rápidamente y más que nada, tal como dice martin fowler "treat integration as a non-event", "trata la integración como si no fuera un evento", es decir, no vamos a estar al final del proyecto integrando todos los modulos.

Cómo usar ActiveSync Remote Display con Windows Mobile 5.0.

Remote Display es una herramienta bastante útil. Para hacerla funcionar con Windows Mobiles, sólo hay que copiar los archivos de "C:\Program Files\Windows Mobile Developer Power Toys\ActiveSync_Remote_Display\devices\wce400\armv4t" a "\Windows" en el dispositivo y listo.

En el link les da un poco más de rollo.

viernes, julio 14, 2006

Lazy Load usando delegates


Hace mucho un par de meses, nos vimos en la necesidad de implementar nuestro Lazy Loading a mano.
Hay diferentes formas de hacerlo, la mejor explicación que he leído es la de fowler. En su libro Patterns of Enterprise Application Architecture viene más detallado.

Bueno lazy load tiene 4 formas de ser implementado, Virtual Proxy, Ghost, Lazy Initialization y Value Holder. Frameworks de ORM como NHibernate lo manejan muy bien y de una manera casi transparente, pero en este caso no pudimos usar ningún framework de esos, por lo que tuvimos que usar muchos de los patrones que fowler describe en su libro.

Hizimos una combinación de Lazy Initialization con Virtual Proxy.

La diferencia principal con los ejemplos que da fowler, es que nosotros desde el business object, en este caso un cliente, no teníamos acceso a la capa de acceso a datos, ni siquiera a una interfaz, por lo que todo el truco fue usar un delegado. Esto último nos permitio también la posibilidad de reutilizar este mismo VirtualProxy para otras plataformas, la primera va y saca la información de una base de datos local y la otra va a sacarla de un servidor que tiene un esquema distinto, pero ambos mapean las columnas a las propiedades del business object de la misma forma.

Bueno resumidamente el diseño quedo así:
Tenemos un ClienteCoporativo que es una lista de clientes y al igual que las otras dos clases, tambien implementa ICliente, aparte de permitirnos iterar sobre la colección de clientes, tiene propiedades que nos regresan los acumulados, por ejemplo saldos.
ICliente define las propiedades y metodos que debe tener la clase.
Cliente es nuestro business entity.
ClienteLazy es nuestro Virtual Proxy y ahí está la parte interesante.

Ahora, para que es útil hacer un Lazy Loading. Bueno cuando cargamos de la base de datos información de una colección de clientes, nos interesa tener al menos el nombre y la descripción, lo cual podemos hacer directamente.

Ahora se presentan diferentes escenarios:
1. Con la lista de cliente simplemente mostramos estos al usuario quien podra seleccionar alguno de la lista y trabajar sobre uno en partícular, por lo que hasta aquí no existe la necesidad de crear completo todos los demas objetos cliente de la lista, simplemente hasta el momento en que se seleccione alguno nos terminamos de traer su información completa.
2. Seleccionaron algo como ver todos, por lo que hasta este momento es cuando necesitamos cargar toda la información en todos los objetos.
3. Simplemente resulta información suficiente el nombre y descripción, por lo que esto términa la interacción con el usuario.

El cargar un entity de este tipo se puede volvier pesado, si se considera que hay muchos objetos relacionados con este, como saldos, pudiera haber facturas, consignatarios, etc y no queremos traernos toda una gráfica compleja de objetos sino hasta el momento en que se necesite. Por otro lado no queremos que el usuario del business entity tenga que estar al pendiente de si se cargo o no ya el objeto, por ejemplo:
if(cliente.Facturas==null)
cliente.Facturas = FacturasDataAccess.GetFacturas(cliente.Clave);
cliente.Facturas.DoSomething()

Ok es enfadoso tener que estar haciendo esas validaciones, pero lo de menos es que sea enfadoso, lo malo es que es propenso a tener errores en tiempo de ejecución cuando se nos llega a olvidar (NullReferenceExcepction). Por otro lado, pudieramos no tener disponible FacturasDataAccess en todo momento. Si tenemos que hacer este tipo de validaciones pierde completamente el sentido de que el cliente tenga una propiedad Facturas si siempre que se vaya a usar debemos estar al tanto de como podríamos obtenerla de ser necesario.

Ok, así es que se vuelve impractico el querer cargar todo a la primera y se vuelve enfadoso el tener que validar y cargar las propiedades en el momento que las queramos usar.

Nuestro ClienteLazy es simplemente un wrapper para un Cliente.
De tal forma que podemos cargar nuestra colección con puros IClientes (que son más ligeros y rápidos de cargar) y cuando a un ICliente le piden algo como
Corporativos[0].Saldo
El ICliente verifica si ya tiene creado un objeto cliente con información real y de no tenerlo va y lo busca, lo crea y luego delega en el cliente para regresar la información. Los accesos subsecuentes ya no requieren ir a traerse nuevamente el cliente.

Ok, así es como lo define Fowler, como hicimos nosotros?

Como ClienteLazy y en general toda la capa de Business Objects y Business Entities no tenía acceso a la(s) capa(s) de DataAccess, tuvieron que usar un delegate para que este supiera como obener el cliente.

Este es parte del código de ClienteLazy

private Cliente c;
private GetCliente Get;
public ClienteLazy(GetCliente delegado, string clave, string nombre)
{
this.clave = clave;
this.nombre = nombre;
this.Get = delegado;
}
private void Check()
{
if (c == null)
c = Get(clave);
}


public string FormaDePago
{
get
{
Check();
return c.FormaDePago;
}


public string Nombre
{
get
{
return this.nombre;
}
}


Esta es la definicion del delegado, que marca la firma para el metodo.
public delegate Cliente GetCliente(string clave);

Si se fijan, al momento de acceder a forma de pago, vamos y nos aseguramos de tener al cliente listo y luego accedemos a su propiedad, pero al momento de regresar el nombre simplemente usamos nuestra variable local. La parte mas interesante esta en que el metodo Check usa el delegado para obtener al cliente.

Asi que los pasos son los siguientes.
Tenemos una clase (Virtual Proxy) que recibe en el constructor, la clave, nombre y otras propiedades que ustedes quieran dejar accesibles sin necesidad de ir a traerse el cliente completo. Tienen un delegado (la parte mas importante) que sabe que como crear un cliente, y por ultimo implementamos una interfaz común para hacer lucir al Virtual Proxy como el objeto real y al implementarla simplemente encapsulamos las propiedades del objeto real verificando en cada acceso que ya lo tengamos listo.

jueves, julio 13, 2006

Los sapitos


Ahora cambiando un poco del tema habitual de mi blog, les comento de un divertido y medio adictivo juego. Los sapos saltarines.

Lastima que me duro poco la adiccion porque estaba empzando a gustarme....


Para los que el juego no ha llegado a su inbox, mandenme un mail y se los paso.

miércoles, julio 12, 2006

Descubri el RSS de Blogger.com

Ayer escribí decepcionado de blogger, porque ofrecía RSS. Pero acabo de descubrir que si, sólo que no lo muestran explicítamente por alguna extraña razón.

Bueno el chiste es que aquí les paso el link para mi RSS, para los que tengan RSS Readers se pueden suscribir a miguelmadero.com/atom.xml, para los que no, les recomiendo www.SharpReader.com Para los que esten en blogger.com y quieran publicar su RSS a quien sea que los lea, pongan un link a http://sunombre.com/atom.xml

Más de delegados anónimos

Hoy necesitabamos tener toda una lista de partidas que están dentro de una compra.
Una compra es una lista de pedidos y un pedido es un diccionario de partidas, así que como sacarlo de manera sencilla.


public List Partidas
{
get
{
List partidas = new List();
ForEach(delegate(Pedido pedido) { partidas.AddRange(pedido); });
return partidas;
}
}

No sólo esto simplifico nuestro código, sino que lo hizo más seguro, encapsulando variables que no necesitaban ser de instancia.
Había otras soluciones, pero la más obvia era hacer algo como lo siguiente

List partidas; // Ahora es variable de instancia para que el delegate lo pueda usar.
public List Partidas
{
get
{
partidas = new List();
ForEach(new Action(AddPartidas)); // Ahora usamos un metodo como delegado
return partidas;
}
}

public void AddPartidas(Pedido pedido)
{
partidas.AddRange(pedido);
}

No solo el código es más largo, creamos un metodo extra muy sencillo que sólo se usa desde un lugar, sino que aparte y lo peor de todo, es que ahora cualquier metodo o propiedad de la clase puede usar la variable partidas, pensando que sirve para algo más que para regresarla a algún cliente de este objeto desde la propiedad Partidas.

RSS Readers

Ayer baje el http://www.sharpreader.net/ le configure algunos blogs y ya esta mas saturado que me Outlook, pero con información que yo seleccione como interesante.

Un RSS reader, baja todo el contenido de cierto sitio web y lo deja listo en tu máquina para que puedas leerlo offline, funciona algo similar a un cliente de correo. Si leen mucho en blogs y a veces batallan para tenerlo organizado y saber que ya leyeron o si hay algo nuevo, etc, bueno un RSS Reader seguramente será su solución, excepto para mi blog ni algún otro de blogger, que no ofrecen el contenido en formato RSS. Esto es razón suficiente para cambiarme.....

Bueno ya una vez que bajen el software, les sugiero agreguen los siguientes links:
http://www.netfx3.com/blogs/MainFeed.aspx?GroupID=-1&Type=MirrorBlogsOnly Habla de .NET 3.0 (W*F)
http://martinfowler.com/bliki/bliki.rss Martin Fowlers bliki
http://blogs.msdn.com/rjacobs/rss.xml Ron Jacobs blog
http://team.intellekt.ws/blogs/chris/rss.aspx Blog de Chrisitan Strevel
http://www.intellectualhedonism.com/SyndicationService.asmx/GetRssCategory?categoryName=dnr El RSS de DotNetRocks Audio Show.
http://channel9.msdn.com/rss.aspx?ShowID=5&format=mp3 Los audios de Channel9 en XML/Mp3

Bueno tienen ahí buen contenido para rato.

martes, julio 11, 2006

ScrumForTeamSystem

A poco no estan padres las páginas que dicen algo así como, seccionamarilla.com o integradorestecnologicos.com o computers.com, páginas que dicen exáctamente lo que estás buscando.

Hay una que me gusta mucho roller.com.mx, es una tienda de patines y es de méxico, así que que mejor dirección de roller.com.mx, patines.com.mx hubiera sido buena, pero bueno saben la idea.

Siempre que me preguntan algo como, oye donde puedo ver los resultados del prep digo bromeando, entra a resultadosdelprep.com. No sería bueno que fueran las cosas tan sencillas con los nombres de dominio?

Bueno, ahora si quieren bajarse unos templates para VSTS y dejar de manejar esos procesos de MSF, que sólo Microsoft entiende, si les gustan las metodologías ágiles y sobre todo si programas en .NET, usas Team System y Scrum es el proceso de trabajo utilizado por tu equipo... bueno entra a scrumforteamsystem.com

Hasta ahorita he estado leyendo un poco de esto y de aquello, viendo templates, etc... despues de conocerlo más (uno dos meses probalemente) les escribire más al respecto, pero si no quieren esperar tanto, vayan bajenlo, instalen los templates, usenlo en un spritn (una iteración de Scrum) y me platican.

domingo, julio 09, 2006

Software Factories

Sin duda el concepto de fabricas de Software se está convirtiendo en el nuevo parádigma de Software y a muchos nos tocara pasar la transición entre OO y SF, no se como sea esto, pero ya me estoy imaginando que será un gran cambio en nuestra industria. No me toco vivir la transición anterior (estructurado/OO), pero aquellos con más experiencia seguramente la recordaran bien.

Aunque aún falta tiempo para que estemos trabajando completamente bajo este nuevo concepto
al día de hoy existen ya varias "Fabricas de Software", algunas de ellas como HL7 no son muy relevantes para nosotros, pero existen otras tres que seguramente serán de mayor interés popular y estás dependen del tipo de aplicaciones que esten desarrollando:
Web Services
Windows Forms
Mobile

La tendencia está en que cada vez se desarrollen Software Factories más específicas, buscando atacar diferentes nichos de negocio o mercados más vertícales o aplicaciones en lugar de pensar en algo tan genérico como Windows Forms, tal vez pensar en aplicaciones Bancarias o Médicas o aún más específico, para consumir y proveer Servicios en el área médica (tal como es el caso de HL7 SF).

Bueno aquellos que programan en ASP.NEt seguramente estaran interesados en saber porque no puse un link para estas, sin embargo aunque no está realmente lejos de ser un SF el proyecto de Atlas es algo muy prometedor que seguramente cambiara la manera en que hacemos aplicaciones Web. Para los que no programan en .NET, hay otras soluciones de Ajax para plataformas como J2ee y me imagino que habrá algo para PHP.

La razón por la cual microsoft le dio prioridad a los SFs de WS, Mobile y Windows es porque creen que ASP.NET estaba más completo, tenía más herramientas, mayor soporte y una arquitectura mejor definida que las de las otras tecnologías, lo cual es un tanto cierto, sin embargo, una vez que trabajamos con un SF, vemos que no caería nada mal tener algo similar para ASP.NET. Hasta donde se aún no hay planes oficiales de hacer algo, pero seguramente una vez terminado el proyecto de Atlas, pensaran en integrar todo como un Software Factory.

El potencial real de una Fabrica de Software, está cuando empezamos a utilizarla desde que comenzamos a definir la arquitectura base de nuestra aplicación de tal forma que podamos proveer una gran punto de partida y apoyos a los desarrolladores para que tengan claro como hacer las cosas. Ya no basta con naming conventions, con plantillas de documentos como ERS, etc, ahora se vuelve importante el tener definido que patrones de diseño y de arquitectura usar en cada caso y proveer la guía para como usarlos, proveer frameworks para fácilitar ciertas tareas y darles herramientas generadoras de código que puedan automatizar ciertas partes de la aplicación.

Más adelante publicare un glosario de términos de SF y les hablare en general de los principios que propone para despues podeer entrar más a detalle a hablar del Mobile SF

viernes, julio 07, 2006

Probar un WebService desde una maquina remota.

Encontre un post muy breve e interesante respecto a como hacer esto.

Cuando entras a un WebService de IIS o del WebServer de VS te aparecen campos para que puedas pasarle parametros a los WSs sencillos para invocarlos y probarlos directamente desde web. Bueno está funcionalidad está deshabilitada cuando necesitas hacer las pruebas de manera remota.

Para arreglarlo simplemente escribe los siguiente en el web.config dentro de system.web

<system.web>
    <webservices> 
        <protocols>   
            <add name="HttpPost">   
            <add name="HttpGet"> 
        </protocols>
    </webservices>
</SYSTEM.WEB>

jueves, julio 06, 2006

Anonymous Delegates

VS 2005 viene con 400 nuevas caracteristicas, según nos presume Microsoft. Esto es para el puro IDE, aparte de los cambios en la arquitectura del framework y sus nuevas clases

Bueno entre algunas de las mejores novedades hemos encontrado obviamente Team System, todo lo relacionado con pruebas, diagramas de clases, intellisense en la ventana del Watch del depurador, code snippets.

El framework trae un monton de novedades como generics, del que ya he escrito anteriormente (DataAccess), bueno el chiste es que aunque ya la conocíamos nunca nos había parecido util el usar delegados anónimos y hoy descubrimos lo simple y prácico que es no tener que hacer todo un metódo que estorba en tu código que contiene una línea sencilla y sólo se manda llamar desde un lugar.

Por ejemplo tenemos una lista de Threads que queremos poner a todos a correr y luego esperar a que todos terminen.

threads.ForEach(delegate(Thread thread) { thread.Start(); });
threads.ForEach(delegate(Thread thread) { thread.Join(); });

Wow!!!! antes hubieramos necesita crear dos metodos aparte nada más para hacer un thread.Start y un thread.Join para el predicate del foreach de la lista.

Bueno espero y les sea útil.

A nosotros nos hubiera ayudado mucho si se nos hubiera ocurrido usar esto para unos controles EditableGrids y EditableList que usamos para pocket pcs, que usan intensamente delegados y en la mayoría de los casos hacen cosas tan sencillas como asiganarle un valor a un textbox o realizar alguna validación sencilla.

miércoles, julio 05, 2006

Team System desde fuera de la oficina.

Es triste saber que Team System, aun y que esta basado en WebServices y supondríamos que se podría trabajar directamente desde Internet, este aún tiene problemas para hacerlo de manera optima, por lo que nuestra solución estos días fue el montar una VPN y conectarnos de está manera.


Esperamos en próximas versiones ya se pueda hacer la conección direccto por internet.

:`(

Al parecer esto es por los metodos de autentificacion que por default debe usar el IIS para trabajar con los WSs del TFS.