sábado, 29 de septiembre de 2007

jueves, 27 de septiembre de 2007

Smart Clients Connection Monitor

La semana pasada tuve la oportunidad de asistir a una charla informativa en el paseo "La Plaza" en Buenos Aires acerca de las nuevas tecnologías de Microsoft. Si bien los temas eran más bien conocidos el nivel de los presentadores no podría haber sido mejor: Matías Wolosky, Diego Gonzalez, Rodolfo Finochietti, Angel "Java" Lopez y Martín Salías (a quien agradezco haberme conseguido un lugar en el evento). Con la presentación de Ezequiel Glinsky, entre todos los temas interesantes (WPF, AJAX, Silverlight, LINQ, Smart Clients) fue este último justamente el qué más me llamó la atención, tema abordado por Marías Wolosky de manera impecable y muy amena. Matías mostró una aplicación que utilizaba WPF y funcionaba en el cliente pero se sincronizaba con un web service, bien, tuve la curiosidad de descargar el código de dicha aplicación y me encontré con las librerías de Smart Clientes de Patterns & Practices (dicho sea de paso grupo del cual Matías forma parte), este librería está pensada para ayudar al desarrollo de clientes inteligentes, y tiene un pequeño arsenal de utilidades, en esta oportunidad voy a explicar un poco el ConnectionMonitor.

 

ConnectionMonitor

 

Esta clase nos permite verificar el estado de una conexión remota o local configurando su comportamiento desde el archivo de configuración de la aplicación (siguiente la filosofía de WCF), vamos a ver un ejemplo Verificar el estado de un sitio web

Si necesitamos verificar el estado de, digamos, slashdot (para hacerlo bien geek) tenemos que configurar el archivo del siguiente modo:

 

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="ConnectionMonitor" type="Microsoft.Practices.SmartClient.ConnectionMonitor.Configuration.ConnectionSettingsSection, Microsoft.Practices.SmartClient.ConnectionMonitor" />
    </configSections>
    <ConnectionMonitor>
        <Connections>
            <add Type="DesktopConnection" Price="0"/>
        </Connections>
        <Networks StrategyType="Microsoft.Practices.SmartClient.ConnectionMonitor.HttpPingStatusStrategy, Microsoft.Practices.SmartClient.ConnectionMonitor">
            <add Name="Local" Address="http://slashdot.org"/>
        </Networks>
    </ConnectionMonitor>
</configuration>

 

 

Y el código sería este.:

 

    public class Class1
    {
        ConnectionMonitor monitor;
        Timer timer = new Timer(1000);
 
        static void Main(string[] args)
        {
            Class1 c = new Class1();            
            c.Test();
            Console.ReadLine();
        }
        private void Test()
        {
            monitor = ConnectionMonitorFactory.CreateFromConfiguration();
            timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
            timer.Enabled = true;
        }
 
        void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            timer.Enabled = false;
            monitor.Networks.UpdateStatus();
            Console.WriteLine("Conectado {0}", monitor.IsConnected);
            timer.Enabled = true;
        }
    }

 

 

Explicaciones obvias aparte, es todo, gracias a la comunidad y a la gente de P&P. Hasta la próxima.

lunes, 17 de septiembre de 2007

Autoversionar assemblies con una tarea de MSBuild

Luego de un tiempo sin posts a causa de falta de tiempo volvemos a la carga con algo bastante interesante. La historia es así, me encontraba trabajando en un proyecto el cual se encuentra formado por nueve proyectos individuales con sus correspondiente sub proyectos, entre ellos librerías comunes para otros proyectos, y con cada nueva característica o cada nuevo bug en una librería era necesario recompilar una cantidad de proyectos medio molesta con sus consecuentes cambios de versión, esto me llevó a investigar MSBuild, si bien ya conocía NAnt en esta empresa no son muy amigos de proyectos por fuera de lo que es el arsenal de Microsoft, pensé en ver cómo solucionar estos problemas con MSBuild y puse manos a la investigación.

Incrementar la versión de los assemlbies automáticamente

Lo primero que pensé es que es necesario contar con una forma sencilla de incrementar la versión de los assemblies, por supuesto que antes que nada es necesario decir cómo han de ser numeradas las versiones, teniendo en cuentra que para el control de código se utiliza Visual Source Safe queda claro que el modelo de revisiones de archivos que utiliza SVN no es el más adecuado, por lo tanto me volqué por el modelo de Microsoft, para quienes no lo conozcan s así. Version.Revision.yyMMdd.Build, bien, navegando por la web econtré muy interesante este post el cual me llevó a esto, una pequeña (y olvidada en el tiempo) utilidad que hace justamente esto, autoincrementar la versión de un assembly con el formato de Microsoft sin necesidad de nuestra intervención, perfecto, antes que demos saltos de alegría hay que tener en cuenta algo, tiene un hermoso bug que nunca ha sido solucionado (y a esto me refería con olvidada en el tiempo) y es el siguiente:

esta aplicación fue escrita en 2005, bien, por lo tanto en el momento que fue probada, digamos a mitad de año, generó este tipo de números

1.0.050701.20

Perfecto, si nos detenemos en la parte de la revisión, la que utiliza la fecha para generar el número, vemos 50701, nada raro, el único detalle es que internamente este número es un Int16 cuyo mayor valor puede ser......65535, por lo tanto deja de funcionar en 2007, caramba, la solución más elegante es discutible, algunas alternativas se pueden ver aquí, sin embargo, la solución sugerida por el grupo de desarrollo de MSBuild es esta, y es la que adopte, simplemente modificando a mano un archivo de configuración se desestima el año en la generación del número de revisión y en su lugar se coloca un sospechoso "01", en fin. Explicaciones a parte veamos cómo se usa.

Instalación

Para la instación sólo es necesario correr el setup y registrar la librería en el GAC.

Utilización

Antes que nada tenemos que hacer botón derecho sobre nuestro proyecto y seleccionar "Unload project", echo esto hacemos nuevamente botón derecho y vemos la opción "Edit....", la seleccionamos y nos aparece un xml con la información que toma el MSBuild para realizar la compilación, para utilizar la extesión es necesario agregar al final, la siguiente línea:

<import project="$(MSBuildExtensionsPath)\Microsoft\AssemblyInfoTask\Microsoft.VersionNumber.Targets">

Y Es todo, cada vez que hagamos un Build se incrementará la versíón del assembly. En otra entrada vamos a ver cómo solucionamos el problema de realizar Builds automáticos de todo.

Actualización: La solución es ir a buscar "yyMMdd".%program files%\MSBuild\Microsoft\AssemblyInfoTask editar el archivo Microsoft.VersionNumber.targets, buscar la siguiente cadena

yyMMdd

y reeemplazarla por

01MMdd

En definitiva fijamos la parte de año en 01 para que nunca alcance más de 65535