martes, 30 de septiembre de 2008

Error al intentar abrir un proyecto desde Proyect Server

Síntoma:

Cuando acabas de guardar un nuevo proyecto, y te permite guardarlo, e incluso publicarlo. Pero luego cierras el proyecto y no te permite abrir no indicando donde este el origen del error. Si puedes publicar un proyecto y luego no abrirlo son señales que hay algo que esta impidiendo que puedas comunicarte con el Proyect Server, y tengas instalado algún firewall en tu computador, muy probablemente esta es la causa.

Solución:

La solución es avisar al departamento de IT, para que te ayude, o configurarlo tu o simplemente desintala dicho FireWall a nosotros nos sucedió con el firewall de Norton que muy restrictivo por default, por la premura de tiempo y como no era el estándar de la empresa, procedimos desintalarlo, y esto soluciono el problema con la comunicación de Proyect Server. Si es el Firewall standard que utiliza la compañía deberás indagar el puerto conque se comunica Project Server y habilitarlo en el firewall para poderte comunicar adecuadamente.

Espero te ayude esta rápida solución. Hasta la próxima!.

Manolo Herrera

Reuniones de la comunidad en Octubre 2008

Quiero hacerles formalmente la invitación a las próximas reuniones de Octubre del 2008.

Tendremos con nosotros a nuestro MVP Luis Alfaro con el tema F# (wikipedia: is a multi-paradigm programming language, targeting the .NET Framework, that encompasses functional programming as well as imperative object-oriented programming disciplines.) el miércoles 8 de octubre.

Y continuaremos la tercera parte de la mesa redonda con nuestro amigo Cristian Prieto el cual hablará sobre disciplinas y herramientas de prueba como lo son: TDD, BDD, Mocking, etc. El 22 de Octubre.

Así que no faltes a ninguna de ellas y sumate a los desarrolladores que estamos hambrientos de conocimientos.

Te esperamos,

Manolo Herrera

lunes, 29 de septiembre de 2008

patterns & practices: App Arch Guide project ahora disponible!

La nueva guía de los amigos de P&P sobre las aplicaciones construidas sobre el .NET Framework  ofrece una guía a nivel de diseño sobre la arquitectura de las aplicaciones.  Enfocada en los tipos de aplicaciones mas comunes: Aplicaciones en capas, componentes, servicios y  llevan al lector sobre las características claves del diseño de cada una de ellas.

Para los interesados esta es la dirección: http://www.codeplex.com/AppArch

Una imagen sobre el marco de trabajo conceptual de la guía.

image

 

Saludos,

 

Manolo Herrera

sábado, 20 de septiembre de 2008

Avanzando en el desarrollo de SharePoint a Mejores Practicas y Modelos de desarrollo

Desde que inicie mi carrera de aprendizaje en SharePoint pude notar la ausencia de buenas prácticas de desarrollo con el Modelo de Objectos de SharePoint que para nada es amigable y abierto, sino rígido y algo limitado para aplicar TDD y una forma desconectada y desacoplada para probar nuestro lógica dentro de dicho modelo.

Hay una necesidad imperante de mejorar este modelo actual del cual tenemos de coexistir y desarrollar por la gran demanda que hay hoy en día de esta plataforma muy productiva de Portales y Colaboración.

Motivado por esta imperiosa necesidad, por la iniciativa de los amigos de Patterns & Practices con su SharePoint Guidance para SharePoint, por el articulo de Francis Cheung sobre "Unit Testing para SharePoint Apps", y por ultimo por la influencia de El Diseño Basado en Dominio, me veo en la obligación de publicar este y una serie de artículos que desarrollare para contribuir a el esparcimiento de mejores prácticas de desarrollo para el modelo de objetos de SharePoint, junto con soluciones que ayuden y den como resultado la practica de TDD y patrones dentro de este ambiente deliberadamente hostil hasta esta versión.

Iniciemos con describir a lo que nos enfrentamos:

image

En español, es difícil separarnos del ambiente conectado, y emularlo para nuestras pruebas unitarias o Unit Testing, porque las interfaces (fundamental para Implementar Mocking dentro de Unit Testing) son escasamente utilizadas dentro del modelo de objetos de SharePoint.

Para incrementar la dificultad están selladas, es decir no podemos sobrescribir, ni sus propiedades, ni sus métodos, ni tampoco heredaras (esto se hizo apropósito me imagino y con justificada razón para asegurar el buen comportamiento, pero dejaron a las pruebas unitarias entre otras cosas).

Ajuste de penas!, como por si fuera poco los constructores de las clases son internos por lo que no podemos crear en memoria para emular estos objetos fuera del contexto conectado las clases del modelo de SharePoint, esto si que fue adrede colocar esta complejidad (Algo desconfiados mis amigos del Equipo de SharePoint).

Y para las colecciones no tiene métodos Add y no implementan el IEnumerable para agregar picante el problema, Es decir no puedo utilizar LinQ en la colecciones de SharePoint porque no implementan la interfase mas básica de las colecciones. Esto si es el colmo!, pero no se asuste amigo, hay formas de usar LinQ dentro de SharePoint, aunque no sean las nativas (Vea este enlace LintQ to SharePoint).

image

Que opciones para realizar pruebas unitarias tenemos entonces!:

Bueno primero pues nos que damos con lo establecido (Status Quo), es decir contra una instancia en vivo de SharePoint, Ugh!. Aunque ya podemos instalar SharePoint en Windows Vista, para realizar un prueba sencilla necesitamos hacer un deployment o por lo menos una copia de dll nuevo, No way!, para esto esto todo este discurso para encontrar otra solución.

Una solución elegante, pero tediosa y difícil es crear clases Wrapper y Facade para separar el modelo conectado con las pruebas unitarias a esto le llamamos "Separation of Concers", hablaremos mas adelante de este tema. Pero que si podemos generarlo con la ayuda de una aplicación, ya no suena tan mal y esta solución pueda que se las presente en siguientes post en mi blog. Pero por le momento diremos que es una solución no tan viable si la desarrollamos a manita.

Hay por allí unos magos que inventario una herramienta para eliminar las barreras de constructores internos y clases selladas para podemos emular estos objetos y desarrollaron esta herramienta denominada Typemock Isolator la cual cubre el 80% de código dentro del modelo de objetos de SharePoint, el cual es un porcentaje aceptable para asegurar la tranquilidad de los desarrolladores en la plataforma SharePoint, especialmente los que hoy en día no validan nada y esta corrigiendo constantemente sus errores por no tener cobertura de pruebas de su código.

image

Así que la motivación para el cambio es esta frase: "La separación de las áreas de preocupación, de los aspectos", para concentrarnos por separado en cada una de ellas. Esto implica la independencia y separación de responsabilidad de cada objeto dentro de mi área de preocupación, aspecto o concern. Y esto es lo que pretendemos hacer en el modelo de objetos de SharePoint, es separarnos de el para probar nuestra lógica de este modelo y al mismo tiempo estemos integrados para que luego encajando los concerns (mi lógica y el modelo de objetos de SharePoint) obtengamos una aplicación que funcione, y que este asegurada en un buen margen para nuestra tranquilidad y la mantenibilidad de nuestra solución.

image

Así que unidos todos estos argumentos desarrollamos el siguiente modelo(gracias a nuestro amigo Cheung):

Utilizar el patrón MVP o Model View Presenter que lo que hará para el caso de los WebParts dentro de SharePoint es separar la Vista o Control de Usuario del Presentador y este a su vez del Modelo (mi lógica de negocio el dominio). Este patrón esta muy bien documentado en la red y básicamente podemos hacer lo siguiente de una manera muy práctica y ligera:

Definimos dos interfases, que nos servirán de base para aplicar el patrón y luego para utilizar de plantilla para la interfase particular de cada WebPart:

public interface IViewBase
{
string MensajeError { set;}
}

Esta propiedad será la base para recordarnos que la forma para acceder la vista o user control será a través de una interfase que herede de esta y que por lo menos maneje los mensajes de error para la interfase de usuario (disculpe si le hablo en chino pero es de madrugada y no quiero hacer un libro, sino solo un articulo de este tema).

La segunda interfase será para el presentador el que va a contener la lógica del control no así del dominio que es una capa mas abajo. Este es el código:

public interface IPresenterBase
{
void SetView(IViewBase view);
}

Esta interfase me recordará que debo implementar en mi clase Presentador este método donde debo de pasarle la instancia de mi vista al presentador, de esta forma:

public class TareaPendientePresentador : IPresenterBase
{
private IViewBase _view;
public void SetView(IViewBase view)
{
_view = view;
}

}

Y en mi control de usuario o WebPart (depende como hagamos la implementación del WebPart) implementamos la interfase IViewBase o la que hereda de esta, de la siguiente forma:

public partial class Demo : System.Web.UI.UserControl, IViewBase
{
private readonly TareaPendientePresentador presentador = new TareaPendientePresentador();


protected void Page_Load(object sender, EventArgs e)
{
presentador.SetView(this);
}

public string MensajeError
{
set
{
ContenedorMensaje.InnerText = value;
}
}
protected override void CreateChildControls()
{
presentador.MostrarTareas();

}

}

image

De esta forma ya separamos la vista del presentador, luego a través de servicios o un controlador podemos acceder a nuestro modelo (en otro post profundizare en este tema y mostrare el código), que es donde esta la lógica que deseamos probar, lejos del aspecto de la capa de presentación, de la lógica de esta para concentrarnos en nuestro modelo. cada aspecto deberá ser probado gracias a que logramos separarlos.

image

Regresemos a donde íbamos, El Patrón que sigue es el Repositorio, este con el fin de encapsular las listad dentro de SharePoint, he aquí la separación del modelo de objetos de SharePoint y mi lógica si lo vemos en capas el Patrón MVP esta adelante iniciando del de la capa 7 de presentación y el patrón de Repositorio esta luego de la separación de mi modelo en la capa de Acceso a Datos que en este caso es a las listas de SharePoint donde se persiste la información de este modelo de programación. Quiero aclarar Mi modelo es mi lógica es lo que deseo enfocarme, el modelo de SharePoint son la definición de las clases que utiliza para representar la persistencia de la información almacenada en la bases de datos de SharePoint.

image

Y por último utilice TypeMock para emular el API de SharePoint, y este es el que le da el jaque mate a levantar una instancia de SharePoint para probar nuestro código este creará de una forma emulada la API de SharePoint para que yo pueda probar mi código sin necesidad de tener que estar haciendo el deployment por cada cambio y prueba que deseo realizar.

Así que amigos, esta es la primera parte de una serie de post donde implementaremos esta solución, e incluiré referencias a la Guidance de P&P, para que vayamos juntos por el camino para desarrollar soluciones dentro de SharePoint de una forma mas asegurada y profesional, minimizando los errores y disfrutando de lo que nos gusta hacer Code4Fun!.

Nos vemos luego!,

Manolo Herrera

martes, 16 de septiembre de 2008

La saga continua... segunda parte de la mesa redonda

Debido al interés mostrado por los asistentes de la primera mesa redonda de la comunidad que compartimos sobre los orígenes de El  Diseño basado en Dominio, nuestro amigo Cristian Prieto continuará el tema este miércoles 24 de Septiembre del 2008.

En palabras de nuestro amigo:

"Los esperamos para la continuación dentro de 15 días, partiremos un
poco de los conceptos de DDD que brindamos en la charla anterior y
ahondaremos en el "proceso" de la construcción, como alcanzar mejor
calidad mediante sencillas prácticas como CI, DBC, TDD, BDD y
desarrollo iterativo."

Así que los esperamos, para compartir y aprender de estas téncias, disciplinas y tendencias de la industria hoy en día.

Nos reunimos en Executrain, Centro Comercial los Proceres, a las 18:30 hrs. Entrada por el parqueo 4to nivel de comerciales. El costo del parqueo antes de las 9:00 son Q 5.00 y después de las 9:00 p.m. es Q 30.00.

Hasta el próximo miércoles amigos!,

 

Manolo Herrera

Lo que no debemos de olvidar cuando hacemos el primera instalación (o deployment) de un Web Part en SharePoint

  1. Construya el proyecto para que se cree el ensamblado (DLL).

El Procedimiento de instalación por primera vez es este:

  1. Copie el dll del proyecto en Visual Studio en el directorio bin del servidor donde esta instalado MOSS 2007 (normalmente es C:\Inetpub\wwwroot\wss\VirtualDirectories\80\bin; donde 80 es el puerto de la aplicación web de nuestro portal, encontrará varios números porque por lo menos encontrara otras aplicaciones web como Central Administration, y la aplicación del proveedor de servicios compartidos o SSP en el caso de MOSS 2007).
  2. Copie los archivos con extensión .ascx al directorio donde indico que estaban ubicados en el proyecto o simplemente en el directorio base de la aplicación web es decir en C:\Inetpub\wwwroot\wss\VirtualDirectories\80.
  3. Registre el Web Part como un Safe control en el web.config.

<SafeControl Assembly="Nombre del dll sin extensión" Namespace="Espacio de Nombre" TypeName="*" Safe="True" />

Un ejemplo:

<SafeControl Assembly="MiWebPart" Namespace="MiCompania.WebParts" TypeName="*" Safe="True" />

3. Eleve el nivel de confianza de la aplicación para que acepte los Web Parts personalizados. Vaya al Web.config y modifique la sección trust level:

< trust level ="Full" originUrl="" />

4. Publique el Web Part en la galería de Web Part de la colección de sitios.

5. Finalmente Agregue el Web Part en una página de Web Parts.

Code4Fun!,

Manolo Herrera

Desarrollo Basado en el Comportamiento o BDD

Creo que los principios orientados a Objetos o mas conocido como OOP han encontrado eco a lo largo de los años, y disciplinas recientes han enfatizado la importancia de los mismos, en otras palabras la madurez de esta teoría hoy en día se ve mas cercana a la práctica y el uso generalizado de estas herramientas permitirán que llegemos a dicha madurez.

El Desarrollo Basado en el Comportamiento o Behaivor Driven Design, desafía a los desarrolladores a cuestionar cuales son las responsabilidades que ellos asigna a sus clases son apropiadas o pueden delegarse o moverse a otra clase. Cuestionarse de esta forma y utilizar Mocks para llenar los roles requeridos de colaboración de las clases, promueve el uso de interfaces basadas en roles, y esto también ayuda a mantener las clases pequeñas y desacopladas.

Al igual que el Diseño Basado en Dominio este describe el propósito y beneficio de su código.

Permite a los desarrolladores concentrarse en por qué el código debería de ser creado, en vez de los detalles técnicos, y minimiza la traducción entre el lenguaje en el cual se escribe y el lenguaje hablado por los usuarios.

(Extracto de WikiPedia)

Al final el Desarrollo Basado en Comportamiento no es mas que la evolución del Desarrollo Orientado a Pruebas o TDD. Veamos esta evolución en pasos, de como el aprendizaje y la adopción de TDD a llevado a su evolución y a convertirse en BDD:

  1. El desarrollador inicia escribiendo Pruebas Unitarias de su código con frameworks de prueba como NUnit.
  2. Cuando el conjunto de pruebas se incremente el desarrolladores disfruta y aumenta su sentido de confianza en el trabajo que realiza.
  3. Como consecuencia el escribir pruebas antes de escribir el código ayuda al desarrollador a concentrarse en escribir solamente el código que necesita.
  4. Así mismo, el desarrollador utiliza las pruebas como una forma de documentación para el código que no ha visto por algún tiempo.
  5. Llega el momento que el desarrollador se da cuenta que escribir pruebas en esta forma ayuda a descubrir la interfase de la aplicación de su código y TDD llega a ser parte del proceso de Diseño.
  6. Los expertos en TDD señalan que los desarrolladores se dan cuenta que TDD es acerca de definir el comportamiento en vez de las pruebas.
  7. El Comportamiento es acerca de las iteraciones entre los componentes del sistema y el uso de Mocking es fundamental para el avance de TDD.

(Extracto del sitio BDD.org )

La motivación es que iniciemos el camino al desarrollo basado en pruebas y evolucionemos al basado a comportamiento y mejor aún podamos desarrollar el modelo basado en dominio.

Hasta una próxima amigos!,

Manolo Herrera