Custom Data Generators para Data Generators Plan (VS Database Project)

En la última semana estuve trabajando para realizar una charla en Microsoft sobre TFS 2010 y ALM. Del armado de la presentación y de los laboratorios, entre los cuales incluí una pequeña práctica sobre la creación y desarrollo de bases de datos con proyectos de base de datos sobre Visual Studio 2010, surge la creación de estos Custom Data Generators.
Entre muchas de las funcionalidades interesantes y realmente útiles que ofrece este tipo de proyectos, me llamó en especial la atención, el artefacto “Data Generetion Plan” que permite crear un plan de inserción automática de datos en las tablas que deseemos con el fin de realizar un testing mas real.

El objetivo de los mismos es generar datos para llenar una columna en una tabla de la base de datos. En Visual Studio encontraremos por defecto que existe un generador para cada tipo de dato de SQL. El problema es que a veces estos generadores, no generan datos consistentes con el dominio de la aplicación que estamos testeando. Por ejemplo si tengo una tabla con Clientes o Usuarios, se complica llenar dichas tablas con Nombres reales… Por suerte, es posible extender este comportamiento y crear nuestros propios Generadores, para crear datos significativos para nuestras pruebas.

Paso a Paso, como crear un Generador de Datos customizado

A continuacion se listan los pasos que debemos realizar para crear nuestros propios generadores de datos.

  1. Crear un nuevo proyecto de Visual Studio del Tipo Libreria de Clases.
  2. Agregar las siguientes referencias
    1. Microsoft.Data.Schema
    2. Microsoft.Data.Schema.Sql
    3. Microsoft.Data.Schema.Tasks.Sql
    4. Microsoft.Data.Schema.Tools
  3. Crear nuestra clase Generadora. Como veran en el codigo de ejemplo, la misma debe heredar de la clase base Generators. Tambien se deben agregar ciertos atributos como el DatabaseSchemaProviderCompatibility y el Output en las propiedades de salida. El unico metodo que necesitaremos sobre-escribir para generar valores es el OnGenerateNextValue.
    using System;
    using Microsoft.Data.Schema.Sql;
    using Microsoft.Data.Schema.Extensibility;
    using Microsoft.Data.Schema.Tools.DataGenerator;
    
    [DatabaseSchemaProviderCompatibility(typeof(SqlDatabaseSchemaProvider))]
    public class CountryGenerator : Generator
    {
        Random _random;
       
        public CountryGenerator()
        {
            _random = new Random(this.Seed);
        }
    
        protected override void OnGenerateNextValues()
        {
            //TODO Algoritmo para generar los datos "Output" utilizando el _random.
        }
    
        protected override void OnInitialize(GeneratorInit initInfo)
        {
            _random = new Random(this.Seed);
            base.OnInitialize(initInfo);
        }
    
        [Output(Name = "Pais", Description = "Devuelve el nombre del pais en ingles.")]
        public string CountryName { get; private set; }
    }

     

  4. Firmar el Assembly: Para firmar el Assembly, deberemos crear una llave (clave publica, clave privada) y agregar los atributos correspondientes en el proyecto.
    1. Para generar la llave debemos abrir la consola de comandos de Visual Studio y ejecutar el siguiente comando “sn.exe -k keyfile.snk”. Este comando generará la llave en el directorio VC dentro del directorio de instalacion de Visual Studio.
    2. Una vez agregada dicha clave en el proyecto, abrimos la clase AssemblyInfo.cs y agregamos la siguiente linea:
      [sourcecode language=”csharp”][assembly:AssemblyKeyFileAttribute(“keyfile.snk”)]

      [/sourcecode]

      Para mas informacion sobre las claves, vea How to: Create a Public/Private Key Pair

    3. Generar el XML con la lista de constructores: Por ultimo debemos generar un XML donde se describan todos los generadores del Assembly. Para ello necesitaremos conocer el nombre completo de nuestro Assembly. Ejecutando el siguiente comando en la ventana de comando de VS podremos obtenerlo:Una vez que tengamos el nombre de nuestro Assembly, debemos generar un  archivo que deberá llamarse “NombreDeAssembly.Extensions.xml”:
      <?xml version="1.0" encoding="utf-8"?>
      <extensions assembly="" version="1" xmlns="urn:Microsoft.Data.Schema.Extensions" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:Microsoft.Data.Schema.Extensions Microsoft.Data.Schema.Extensions.xsd">
          <extension type="DataGenerators.NameGenerator" assembly="DataGenerators, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3bf9e0786a31e281" enabled="true"/>
          <extension type="DataGenerators.CountryGenerator" assembly="DataGenerators, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3bf9e0786a31e281" enabled="true"/>
      </extensions>

      Como podemos ver en el ejemplo, debe existir un elemento “extension” por cada generador que contenga el assembly y la propiedad “assembly” de dichos elementos debe tener como valor el nombre del assembly que obtuvimos en el paso anterior.

    4. Como ultimo paso, debemos copiar el archivo .dll y el archivo .xml que se generaron en los pasos anteriores a la carpeta “{Path de instalación de VS}\VSTSDB\Extensions\CustomGenerators”. De no existir el directorio “CustomGenerators” deberemos crearlo.
Finalmente, podremos crear nuestro Data Generation Plan y ver nuestros generadores habilitados para ser seleccionados en las columnas de las tablas que intervengan en el plan, como muestran las siguientes imagenes!
Ventana del Data Generation Plan
Configuracion de los Generadores de datos para las columnas de cada tabla
Resultados de la generacion de datos customizados

Proyecto DataGenerators

Por ultimo, les dejo un link de un proyecto de Generadores que desarrolle. El mismo posee por el momento dos Generadores que necesitaba para realizar algunas pruebas en proyectos en los que estoy trabajando actualmente.

El proyecto posee un generador de Nombres personales. El mismo genera de forma aleatoria nombres de hombre y mujeres. Los mismos son generados utilizando una lista de los 100 nombres más comunes y los 100 apellidos más comunes en Argentina. El otro, genera nombre de países y provincias (todos reales, obtenidos de GeoNames.

La URL del proyecto es http://datagenerators.codeplex.com. En la pagina podrán encontrar la documentación, el código fuente (es un proyecto open source) y los binarios del ultimo release del proyecto.

Como verán, tanto en este blog, como en la página del proyecto, se agregan algunas herramientas nuevas como NuGet y CodePlex. En el próximo blog estaré profundizando sobre las mismas.

Formando parte de Stack Overflow

Hace rato que vengo leyendo el blog de Joel Spolsky y me parece muy groso. Lo descubri gracias a mi amigo Pablo Russo (iterando) otro groso.

Entre los proyectos de Joel se encuentra Stack Overflow, una comunidad que se hizo muy respetable en lo que es preguntas/respuestas hacerca de programacion. (para la gente de IT se abrio recientemente el sitio http://serverfault.com/)

En general las respuestas en Stack Overflow son bastante buenas y ayudan a resolver problemas complicados. Lo bueno del sitio es que se vota las respuestas y por lo general el que postea cierra el thread marcando la respuesta que le ayudo a resolver el problema.

Stack Overflow agrego últimamente a su funcionalidad Stack Overflow Carreers en donde uno puede subir su curriculum y a el mismo se le añade nuestro puntaje del foro (que se va ganando respondiendo preguntas).

Otra cosa que me parecio muuuy buena, es que no hace falta crearse un usuario, sino que si uno ya tiene gmail, yahoo, AOL, myOpenId, wordpress, blogger, verisign, etc, solamente debo presionar el icono correspondiente y el usuario se crea automaticamente (despues uno puede completar su perfil si lo desea…)

Ayer cree el usuario (gracias al proceso anterior no tarde mas de 5 segundos) y hoy ya estoy intentando ganar algunos puntos contestando preguntas que estén a mi alcance técnico (ej: como sumar dos enteros en c# y eso).

mmm queria dejarles mi flair, pero por los estandares de wordpress.org, no se permiten tags iframe y como uso wordpress.com tampoco puedo subir plugins… sorry. Si quieren verlo pueden aca o haciendo click sobre la imagen del flair.

Stack Overflow Flair

CardioPod un producto de Telehealth Solutions

Hace unos meses Telehealth Solutions una empresa Inglesa ubicada en Watford, lanzo CardioPod, un producto en el que venimos trabajando hace ya unos cuantos meses. El mismo permite calcular el riesgo cardio-vascular de un paciente mediante la realización de una serie de test y cuestionarios.

Por ahora el producto los están usando las tres principales servicios de medicina de inglaterra, pero esperamos que en el proximo año se sumen muchas mas.

Les dejo algunos links con articulos sobre el producto:

http://www.news-medical.net/news/20090624/Telehealth-Solutions-launches-CardioPod-for-NHS-Health-Check.aspx

http://www.european-hospital.com/en/article/6058.html

http://www.ehiprimarycare.com/news/4990/cardiopod_launched_at_nhs_camden

http://scottishhealthcare.co.uk/78/edinburgh-pharmacist-cardiopod/

SVN con Windows Authentication

En el intento de integrar un poco mas los servicios de la red interna de la empresa, cambiamos de Seguridad de Texto Plano a Seguridad Integrada con Windows Authentication (SSPI).

Cual es la idea de esto? simplemente mantener un unico password por usuario para cualquier servicio que segurizado (lo que se conoce como single-sign-on).

El cambio es realmente sencillo de realizar. Lo unico que necesitamos es tener un Dominio de Windows que realice la autenticacion y el modulo SSPI de Apache (http://sourceforge.net/projects/mod-auth-sspi/).

Porque un modulo de Apache? porque SVN no maneja la seguridad de los directorios, sino que la misma esta a cargo del Servidor HTTP, que en este caso es Apache.

Ok, el paso a paso…

  1. Bajar el Modulo SSPI de Apache (http://sourceforge.net/projects/mod-auth-sspi/)
  2. Bajar el servicio Apache en el Servidor donde se encuentra SVN.
  3. Copiar el archivo “mod_auth_sspi.so” que se encuentra dentro del archivo que bajamos en el paso 1), al directorio “\httpd\modules” dentro del directorio donde se instalo SVN, o dentro del directorio donde se encuentra instalado Apache.
  4. Ahora necesitamos cambiar la configuracion de Apache. Para esto vamos al directorio “\conf” dentro del directorio donde se encuentra instalado Apache y editamos el archivo “httpd.conf”
    1. Agregar linea “LoadModule sspi_auth_module modules/mod_auth_sspi.so” luego de la ultima linea que comienze con “LoadModule”. Esto cargara el modulo SSPI en el proceso de Apache.
    2. Cambiar la configuracion de Location. A continuacion muestro como quedo mi configuracion:

      <Location /svn>
      DAV svn
      SVNParentPath C:\path_del_repositorio
      AuthType SSPI
      SSPIAuth On
      SSPIAuthoritative On
      SSPIDomain TUDOMINIO
      SSPIOfferBasic On
      AuthName “Mi Mensaje de Autorizacion”
      AuthzSVNAccessFile C:\path_del_archivo_de_accesos
      Require valid-user
      </Location>
    3. Es necesario eliminar o comentar (con # al inicio de la linea) la configuracion anterior de “AuthUserFile”, ya que ahora la autenticación se realiza  a través del dominio.
  5. Por ultimo sera necesario modificar el archivo de acceso o autorización. Este es el archivo del que se hace referencia en el key “AuthzSVNAccessFile” en la configuracion que modificamos anteriormente. En este archivo es necesario agregarle a todos los usuarios el Dominio al que pertenecen. Ej: Guido por Dominio\Guido.
  6. Iniciamos nuevamente el servicio Apache y si todo esta bien, iniciara normalmente.

Ya tenemos nuestro repositorio con seguridad integrada!

Obviamente sera necesario que el usuario Dominio\Guido exista en el dominio de windows, o cambiar al usuario Guido por el usuario de Dominio que utiliza esa persona.

Si el servicio Apache no inicia, es posible ver los errores de inicio del servicio en el EventViewer de Windows.

Nuestro paso por el Microsoft Architecture Day

MADEl 28 de mayo se realizo en Buenos Aires el encuentro de la comunidad de arquitectos de Microsoft en el denominado MAD (Microsoft Architecture Day). Se realizaron varias charlas interesantes, con invitados ya muy conocidos en el ambiente como Martin Salias, Juan Ladetto, Cesar Possamai, Diego Gonzales y muchos mas.

El evento comenzo a las 10 am, pero los speakers tuvieron que estar a las 8:30 por motivos de organizacion. Las charlas se prolongaron hasta las 18 hs con breaks para el desallunp, el almuerzo y merienda. Hubo casi 200 personas y muy buena atención para todos.

Estuvimos dando la ultima charla del dia y expusimos una solucion de sincronizacion y depliegue montada sobre Sync Framework y ClickOnce. Esta solucion es una implementacion real utilizada en un proyecto mucho mas grande que solo “sincronizacion y despliegue” que estamos finalizando, pero fueron los temas que la gente de Microsoft le interesaba exponer en el marco del Architecture Day.

No grabamos la presentación por problemas técnicos y subirlas sin el audio no tiene mucho valor ya que eran una guía para explicar la arquitectura planteada para expandir la funcionalidad tanto de ClickOnce como del Sync Framework y solucionar nuestro problema puntual.

Lo bueno de estar en eventos de este tipo, es el contacto con otros arquitectos de software, programadores, lideres, gerentes, etc y conocer sus historias, los proyectos en los que estan trabajando, algunos tips de tecnologias que estan probando y problemas que solucionaron utilizando las ultimas tecnologias disponibles.

Las charlas no fueron muy tecnicas, solo habia 50 minutos para exponer, con lo que todos hacian una repaso del caso, la solucion y no entraban mucho en detalle (con todos quiero decir las charlas en las que estuve presente, que fueron la mitad aprox).

Esta bueno ver como microsoft mueve y motiva a la gente que utiliza sus tecnologías, es una buena estrategia para la adopción de sus productos.

Encontre este link de la noticia en la pagina de Tecnosoftware que quería compartir con ustedes. Tambien encontre esta foto, estoy abajo a la derecha.

Novedades en Tecnosoftware

MAD