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

Resultados de Gadgetizate

Al final no tuve tiempo de poder escribir nada, como ya es costumbre :), sobre como fue el desarrollo del Gadget que había creado para el concurso.

El concurso terminó y quedé en la 4ta posición, algo es algo.

Pensaba escribir un poco más acerca de cómo fue el proceso de la elección y las votaciones de los gadgets ganadores pero prefiero dedicar el tiempo leyendo y aprendiendo otras cosas.

Lo único que quiero destacar es la amabilidad y la atención de uno, sino el único, organizador de éste concurso Miguel Jimenez Antelo quien respondió a todas mis dudas, acerca de lo que dejo picando en el punto anterior.

Esperemos que en los próximos concursos, tal y como coincidimos con Miguel, se decidan los ganadores por un sistema de elección y no de votación pública ya que esto genera muchas polémicas y la cosa nunca queda clara.

Espero disfrutar dentro de poco la licencia y los libros que he ganado�:)

  • Licencia de ComponentOne Studio Express
  • Libro ISBN:978-84-415-2021-9 Visual Basic 2005
  • Libro ISBN:978-84-415-2125-4 Superutilidades Hacker
  • Libro ISBN:978-84-415-1851-3 Hacking con Google
  • Libro ISBN:978-84-415-2131-5 Bases de datos con SQL Server 2005
  • Libro ISBN:978-84-415-2035-6 Aprende SQL

Entradas siguientes »