Webcast para Latinoam茅rica sobre HPC con WCF

English Version

El d铆a 11 de diciembre de 2008, estuvimos dando un Webcast para Latinoam茅rica de la mano de mi amigo y mentor Johnny Halife acerca de c贸mo desarrollar aplicaciones distribuidas mediante el uso de Windows HPC Server 2008.

El objetivo de la charla fue explicar la plataforma que nos provee Windows HPC Server 2008 para desarrollar aplicaciones distribuidas con una arquitectura orientada a servicios (SOA) utilizando Windows Communication Foundation (WCF).

Adem谩s tuvimos la oportunidad de hacer una peque帽a demostraci贸n en nuestro laboratorio desplegado en Southworks de una aplicaci贸n sencilla.

Para los que no pudieron asistir al Webcast, pueden visualizar y/o descargarse la grabaci贸n del mismo en la siguiente direcci贸n http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032390257&Culture=es-AR.

Registraci贸n

Espero que les guste.

Un año y cuatro meses después…

English Version

Ayer por la noche después de haber tomado unas cervezas con compañeros del trabajo, llegue a casa, me tiré en la cama y me puse a pensar en este último año y cuatro meses desde que entre a Souhtworks.

Mientras me remontaba en el tiempo recordaba los proyectos y los clientes para los cuales había trabajado, como “Microsoft Architecture Strategy Team”, “Microsoft Depeloper & Platform Evangelism Team”, “Microsoft Connected Services Framework Team”, “Microsoft SQL Server Team”, “Grupo Sancor Seguros” entre otros, y la gente importante que había conocido personalmente, como Eugenio Pace y Gianpaolo Carraro.

Luego comenzaron a aparecer en mi mente palabras y acrónimos de conocimientos técnicos que había adquirido e incorporado en este último tiempo en Southworks. En ese momento comencé a imaginarme como una especie de “TagCloud” mental y fue ahí cuando decidí escribir este post, para dejar esto como una bitácora de experiencia y poder compararla más adelante con nuevas palabras que seguramente se agregaran a mi “Mind TagCloud”.

Mas allá de todas todos estos tags, quería agradecer a todos los Southies que me ayudaron a llenar mi mente de todos estos conocimientos y en especial a mis dos  mentores Johnny Halife y Matias Woloski a quienes hoy en día sigo admirando y respetando, pero con los que también en los momentos donde no hay computadoras de por medio me sigo divirtiendo.

Ahi va mi "Mind TagCloud":

  Refactoring    Code Analysis    Retrospective    TDD    WCF    WSDL    Continuous Integration    Patterns    Cluster Server    ISO    Virtualization    SOA    Singleton    Cyclomatic Complexity    WPF    Model View Controller    REST    Linq to XML    Mocks    Paravirtualization    Sprint    Hyper-V    Lamda Expressions    Repository    SAN    Synchronization Framework    iSCSI    LUN    Powershell    SCRUM    Ssds    Agile    Spike    NAS    Iteration Planning    Dependency Injection    Factory    Linq to SQL    Code Coverage    Subversion    Security Token Service    CMMi    StyleCop    Model View Presenter    Strategy  FxCop    Serialization    Apache    Prototype    Datamember    Composite Application Block    Build Server    RSS    DIT    S+S    Backlog    Commitment    Inversion Of Control    Scaffolding    Abstract Factory    Reflection    LCOM    Iteration Review    Software As A Service    DataContract    TFS    Code Query Language    SOAP    Dynamic Language Runtime    Lightweight Directory Services 

Actualizando los archivos AssemblyInfo usando las Southworks SDC tasks

English Version

Johnny and Ezequiel han publicado en sus Blogs acerca de las Southworks SDC Tasks que hemos publicado dos semanas atr谩s en Google Code. Este projecto es un set de tasks para MSBuild tasks que construimos mientras madurabamos nuestro proceso de build.

Durante este tiempo voy a intentar darles una gu铆a sobre estas tasks que hemos desarrollado por medio de un ejemplo de cada una de ellas.

En este post van a encontrar de que forma se pueden actualizar los archivos AssemblyInfo con informaci贸n de la empresa utilizando la task UpdateAssemblyinfo facilmente.

Esta task es basntate simple, entonces, vamos a crear un simple projecto de MSBuild (.proj) para demostrar como funciona.

Referenciando el assembly SDC en el proyecto de MSBuild

El primer paso es a帽adir la referencia para esta task en particular configurando los nodos AssemblyFile y TaskName con los siguientes valores:

<Project DefaultTargets="UpdateAssemblyInfos" 
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <UsingTask AssemblyFile="d:\test\Southworks.Sdc.Tasks.dll"
             TaskName="UpdateAssemblyInfo"/> 
</Project>

Hay que tener en cuenta que el nodo DefaultTargets indica cual va a ser el target que va a ejecutarse primero, m谩s adelante voy a incluir este target.

Definiendo que files van a ser actualizados

El siguiente paso es indentificar y configurar cu谩les van a ser los archivos que modificar谩 nuestra task y donde se encuentran. Para esto vamos a crear un ItemGroup. Si quer茅s conocer m谩s acerca de incluir y/o excluir items mira este link http://msdn.microsoft.com/en-us/library/646dk05y.aspx.

<Project DefaultTargets="UpdateAssemblyInfos"
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 
  <UsingTask AssemblyFile="d:\test\Southworks.Sdc.Tasks.dll"
             TaskName="UpdateAssemblyInfo"/>  
  <ItemGroup>
    <AssemblyInfos Include="d:\test\**\AssemblyInfo.cs"/>
  </ItemGroup>
 
</Project>

Configurando el target UpdateAssemblyinfo

Por 煤ltimo debemos crear y configurar el nuevo target especificando la informaci贸n que va a ser reemplazada en los archivos que hemos configurado en el paso anterior.

<Project DefaultTargets="UpdateAssemblyInfos" 
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 
  <UsingTask AssemblyFile="d:\test\Southworks.Sdc.Tasks.dll"
             TaskName="UpdateAssemblyInfo"/>
  
  <ItemGroup>
    <AssemblyInfos Include="d:\test\**\AssemblyInfo.cs"/>
  </ItemGroup>
 
  <Target Name="UpdateAssemblyInfos">
    
    <UpdateAssemblyinfo Include="@(AssemblyInfos)"
                      AssemblyCopyright="Southworks (r) copyright"
                      AssemblyCompany="Southworks"
                      AssemblyProduct="Sample product " />
  </Target>
  
</Project>

Verificaci贸n

Para comprobar que todo esta funcionando, podemos ejecutar el projecto con MSBuild como se muestra en la siguiente imagen:

image

Por 煤ltimo, abriendo alguno de los  AssemblyInfo.cs incluidos y veremos como se ha actualizado:

image

Gracias, y sigan atentos!

Utilizando wildcards de la forma \**\ en CruiseControl.Net

English Version

Esta 煤ltima semana estuvimos trabajando en nuestro Build Server utilizando CruiseControl.Net para permitir la posibilidad de ejecutar m煤ltiples Test / Code Coverage tasks para dos o m谩s soluciones.

Una vez que tenemos configurado el MSBuild Project para ejecutar, por ejemplo, un set de dos o m谩s RunTests / RunCoverage tasks, necesitamos fusionar estos resultados al log de MSBuild luego de su ejecuci贸n.

Entonces, nuestro primer intento fue modificar el archivo ccnet.config para poder fusionar los archivos generados por estas tasks usando el mismo patr贸n utilizado por MSBuild, quiero decir, usando /**/, algo como esto:

<merge>
    <files>
        <file>D:\srv\ccnet\logs\project\**\*.trx</file>
        <file>D:\srv\ccnet\logs\project\**\*.cvg</file>
    </files>
</merge>

En ese momento nos dimos cuenta, que CruiseControl.Net no posee esta funcionalidad, 煤nicamente nos permite la utilizaci贸n de Wildcards de la forma convencional, por ejemplo D:\srv\ccnet\logs\project\theProject\*.trx, y como el c贸digo fuente de CruiseControl.Net est谩 disponible, me puse a escribir algunas l铆neas de c贸digo para modificar el assembly ThoughtWorks.CruiseControl.Core para que nos permita utilizar /**/ como lo hace MSBuild.

En este post van a encontrar el c贸digo fuente de un Spike que escrib铆 con una serie de test para implementar esta funcionalidad y el c贸digo fuente del archivo WildCardPath.cs actualizado que forma parte del Core de proyecto CruiseControl.Net.

  • Solucion Spike con unit tests [Download]
  • El archivo donde se encuentra la clase WildCardPath del assembly Core de CruiseControl.Net [Download]

Una vez actualizado el proyecto Core con esta nueva implementaci贸n, tendr铆an que seguir los siguientes pasos para dejarlo con esta nueva funcionalidad

  1. Compliar el Core Project
  2. Parar el servicio de CruiseControl.Net (ccservice)
  3. Reemplazar el assembly ThoughtWorks.CruiseControl.Core por el Nuevo
  4. Levantar nuevamente el servicio

Y eso es todo, a usar wildcards como en MSBuild :)

Microsoft Source Analysis for C# 4.2 publicado

English Version

Microsoft ha publicado una gran herramienta llamada Microsoft Source Analysis for C#, conocida tambi茅n como StyleCop.

Esta herramienta nos permite controlar y mejorar la calidad del c贸digo que escribimos. Esta totalmente integrada con Visual Studio, lo que quiere decir que con un simple click derecho en nuestra soluci贸n, proyecto o file, podemos comprobar nuestro c贸digo teniendo en cuenta las mejores pr谩cticas definidas en una serie de reglas como se muestra a continuaci贸n.

Pueden encontrar una descripci贸n mas detallada (ingl茅s) en el siguiente post: Announcing the release of Microsoft Source Analysis for C# y descargarse el instalador desde aqu铆.

Otra de las opciones que nos brinda esta herramienta, es la posibilidad de personalizar qu茅 reglas van a ser ejecutadas, utilizando la configuraci贸n que viene integrada en la UI.

Por 煤ltimo, otra punto importante, es que nos permite integrar este chequeo en nuestro proceso de build por medio de MSBuild. Les recomiendo este blog post (ingl茅s) de Jason Allor’s en la p谩gina de Source Analysis donde 茅l explica c贸mo hacerlo.

Y otro post intereando del MSBuild Team Blog , donde anuncian este release.

Disfrutenlo y diganle adios a los documentos con est谩ndares de c贸digo :)

ASP.Net MVC Conferencia Online en MSDN

English Version

Este martes (13 de Mayo de 2008) Matias Woloski y yo, dimos un webcast acerca del framework de ASP.Net MVC para la comunidad Hispana.

Quiero agradecer a todos por haber participado de la charla y espero que continuemos dado m谩s de este tipo de charlas con Microsoft sobre las 煤ltimas tecnolog铆as.

Como les promet铆, ac谩 les dejo varias versiones del codigo fuente de la aplicaci贸n que mostramos en la demo:

  • Translator Demo [MVC Preview 2 (original)] : Download
  • Translator Demo [MVC Preview 2 + TDD (usando MoQ) + WCF Services] : Download
  • Translator Demo [MVC Preview 3 + TDD (usando MoQ) + WCF Services] : Download

Espero que estos ejemplos les sean de utilidad, y cualquier comentario o duda que tengan, pueden consultarme dejando un comentario en este blog.

Para saber m谩s sobre los cambios en la versi贸n 3 les recomiendo vistar este post de ScottGu. http://weblogs.asp.net/scottgu/archive/2008/04/16/asp-net-mvc-source-refresh-preview.aspx

Como obtener el testId generado por Visual Studio en un archivo .loadtest

English Version

Durante estos días hemos estado trabajando en Southworks haciendo una herramienta para automatizar la ejecucion de load tests.

El objetivo era parsear el archivo .loadtest, basandonos en un template, que estaba configurado para un escenario en particular con un set de counters. Una vez parseado este template ya estamos listos para agregar el nodo TestMix y un nodo TestProfile por cada test que deseamos ejecutar, los cuales se encuentran definidos en el assembly del loadtest.

El obstáculo

En el momento de crear el nodo TestProfile, nos dimos cuenta que cada unit test tenía un id especifico (representado por un identificador único a.k.a. Guid). Lo que no sabíamos hasta ejecutar el load test, era que éste identificador era generado dinámicamente por Visual Studio.

Intentamos descubrir de qué forma estos identificadores se generaban usando reflector con varios assemblies de Visual Studio pero no tuvimos suerte.

Una posible solución

Buscando en internet, después de un buen rato, encontré este post, en el que el autor mostraba de qué forma se podía calcular este id:

private static Guid GetGuidFromString(string value) { SHA1CryptoServiceProvider provider = new SHA1CryptoServiceProvider(); byte[] buffer1 = provider.ComputeHash(Encoding.Unicode.GetBytes(value)); byte[] buffer2 = new byte[0x10]; Array.Copy(buffer1, buffer2, 0x10); return new Guid(buffer2); }

Con esta función ya podemos recorrer todo el assembly en busca de los métodos de tipo test y asignarles el id correcto, como muestro a continuación:

private static IList<TestEntry> GetUnitTests() { IList<TestEntry> unitTests = new List<TestEntry>(); Assembly assembly = Assembly.LoadFrom("Tests\\PerformanceTests.dll"); Type[] assemblyTypes = assembly.GetTypes(); foreach (Type type in assemblyTypes) { if (type.IsClass && type.GetCustomAttributes(typeof(TestClassAttribute), false).Length > 0) { MethodInfo[] info = type.GetMethods(); foreach (MethodInfo m in info) { if (m.GetCustomAttributes(typeof(TestMethodAttribute), false).Length > 0) { Guid testGuid = GetGUIDFromString(type.FullName + "." + m.Name); unitTests.Add(new TestEntry(testGuid, m.Name)); } } } } return unitTests; }

Espero que este post les sea de utilidad.

WSDL Viewer

English Version

Hace unos días descubrí una herramienta muy práctica en el website de .NetFramework 3. Ésta, nos ayuda a visualizar y comprender, de una forma muy simple, la metadata (WSDL) que expone un servicio.

La pueden descargar desde aquí.

WSDLViewer

Espero que les sirva.

Tres canteros

English Version

Tres canteros al pie de una catedral, que están haciendo el mismo trabajo: tallar piedras.

Un hombre se acerca al primero y le dice "¿Qué haces?"

El cantero le dice: "Tallo piedras" y la hosquedad de su mirada parece que "¿No lo está viendo?"

El segundo responde diciendo: "Me gano la vida" y con su gesto de resignación parece añadir: "Es duro, ¿sabe usted?"

El tercer cantero, al escuchar la pregunta, levanta la cabeza, mira a lo alto, le brillan los ojos y dice: "Estoy construyendo una catedral"

Caigamos en la cuenta de que la misma acción puede tener distintos niveles de significado, sin embargo, es el tercero quien indudablemente hace su trabajo buscando la excelencia, porque ve en el mismo una finalidad más elevada.

Fuente: Las causas del fracaso de las empresas (como aprender de la experiencia ajena)
Enrique Zamorano

Enterprise Library 3.0 "Liberada"

La gente de Patterns & Practices han liberado la version 3.0 de la ya conocida Enterprise Library, y puden descargarla desde éste enlace.

Esta versión incluye:

  • Caching Application Block
  • Cryptography Application Block
  • Data Access Application Block
  • Exception Handling Application Block
  • Logging Application Block
  • Policy Injection Application Block
  • Security Application Block and Validation Application Block

Entradas siguientes »