sábado, junio 28, 2008

Más de Silverlight Unit Testing - Asynchronous Tests

Ya había mencionado un post a la introducción de Jeff Wilcox a la herramienta escrita por el mismo y la actualización a SL Beta 2 y los templates tanto de proyecto como para las Clases de Prueba. Después de usarlo me he topado con varios know issues, que esperamos se arreglen para cuando liberen Silverlight 2.0, pero ningún showstopper. Todo correo muy bien y las pruebas hechas con TFS, escritas para los objetos de negocio o para WPF son fáciles de migrar.

Dada la frecuencia en que tenemos tareas Asincronas en SL, necesitamos también soporte para poder probar estas. Un ejemplo tipíco es un WebRequest. En este caso lo veremos para un Servicio Web para el cual ya previamente agregamos la referencia. Este es el code snippet que les servirá para darse una idea de como crear este tipo de pruebas.

[TestClass]
public class ServiceClientTest:SilverlightTest{
   [TestMethod]
   [Asynchronous]
   public void GetTest()
   {
      ServiceClient client = new ServiceClient();
      client.GetCompleted += client_GetCompleted;
      client.GetAsync();
   }

   void client_GetCompleted(object sender, GetCompletedEventArgs e)
   {
      // Do something with e.Result;
      // Call this when done
      this.TestComplete();
   }
}

Decoramos con TestClass y TestMethod como en todas nuestras pruebas, pero agregamos el atributo Asynchronous a nuestro TestMethod. Esto hará que el framework se quede esperando a que otros threads terminen su chamba. Así que no tendremos que detener nuestro TestMethod y esperar a que nuestro webService obtenga una respuesta y lidiar con la sincronización. En algún momento se deberá mandar llamar a nuestro metodo client_GetCompleted y ahí haremos los asserts necesarios con el resultado. Al final, para indicarle al Testing Harness que ya terminamos debemos de llamar el metodo TestComplete. Si no hacemos esto, nuestra prueba se colgara. En caso de que exista alguna excepción y nuestro handler nunca se mande llamar, el framework se dará cuenta y marcará la prueba como fallada. Justo como se espera, funciona bien y es realmente simple.

Espero y les resulte útil.

Algo adicional que quisieran tomar en cuenta es que si van a mandar llamar a un WS desde SL tendrán problemas por Cross Domain Calls. Por más que configuren su servidor correctamente con el ClienteAccessPolicy.xml correcto va a fallar ya que por default las pruebas corren directamente sobre un archivo y no sobre un WebSite. Lo recomendable es en su website agregar una referencia a su proyecto de pruebas para que corran en el mismo contexto o al menos dentro de un WebServer de tal forma que pueda hacer Cross Domain Calls.

miércoles, junio 25, 2008

Como ver el Código Generado de LINQ to SQL en el Output de Visual Studio

Justo lo que estaba buscando o pensando hacer para poder depurar fácilmente lo que está pasando detrás de LINQ ya lo escribio Kris Vandermotten. En una aplicación de consola haríamos algo como:

context.Log = Console.Out;

En una aplicación de otro tipo, no tenemos hacía donde escriba el Log de LINQ to SQL. Con el código de Kris, simplemente diríamos,

context.Log = new DebuggerWriter();

Así que vayan y bajen su clase de su blog

Por cierto, odio LINQ to SQL y no puedo esperar a LINQ to Entities para usar nuevamente un ORM de verdad. Aunque tampoco puedo usar el Beta 1 de SP1 en este proyecto, así que me quede con mi disen~o bizarro por un momento. Más de esto en un próximo post.

lunes, junio 23, 2008

Siliverlight 2.0 Beta 2

En mi último post olvide uno de los links seguramente más importantes, sobre todo si tienen ya una aplicación en Beta 1.Seguramente tendrán algunos problemas al compilar para el Beta 2. Les sugiero ver las página de las diferencias y buscar los cambios. Por ejemplo a mi me salía el error 'System.Windows.Media.Animation.Storyboard' does not contain a definition for 'GetClockState', simplemente busque en ese docucmento GetClockState y decía "Storyboard.GetClockState has been changed to GetCurrentState", cambie el metodo y listo, he seguido los mismos pasos por cada error y en cuestión de minutos tengo migrados proyectos de Beta 1 a Beta 2. Uno de los que no me aparecio es un cambio en el ResourceDictionary.Add que ahora espera un parametro más, fuera de ese todos los cambios necesarios para la migración los he podido hacer con apoyo de esa página.

Espero que la migración de Beta 2 al release sea al menos así de simple. Finalmente este producto ya tiene una licencia GoLive desde el Beta 1, lo que básicamente significa que podemos poner las aplicaciones de Beta 2 en producción y la migración para nuestros usuarios será sencilla. No necesariamente significa que no abrá cambios en el API, pero seguramente serán minímos y Microsoft proveerá un documento con guías de como migrar.

Algo de lo que se esperá para el release, entre otras tantas cosas, es un control dropdownlist/combobox. De momento no lo tenemos, pero puede ser indispensable para muchas aplicaciones que quisieramos poner en producción aprovechando el GoLive License. Yo hice un control, es algo muy básico, pero funciona bien. Posiblemente en un próximo post ponga el código. Si alguien lo necesita dejeme un mensaje.

domingo, junio 15, 2008

Silverlight 2 Beta 2, .NET 3.5 Beta SP1 y SQL Server RC0

Microsoft recien libero Silverlight 2 Beta 2, .NET 3.5 Beta SP1 y SQL Server RC 0. Aquí les dejo los links importantes para que descarguen todo y se pongan a probar el nuevo software.

Silverlight

Les sugiero visitar los links en el orden que los pongo, igual para la instalación.

  1. Anuncio de Scott Guthrie con detalles de la liberacion de SL2
  2. GetStarted con Silverlight 2
  3. SP1 Beta para VS 2008 y .NET 3.5 detalles aquí, (instalación opcional)
  4. Tools para VS 2008
  5. Blend 2.5 June 2008
  6. Deep Composer (opcional)
  7. Unit Testing para SL 2 Beta 2

Van a encontrar más en el post de Scott, pero les resumo lo que me parece más importante.

  • Integración de controles al download de SL2 (ayudando a reducir el tamaño de tus .xap).
  • Soporte en Blend para editar Templates de Controles. Esto es una gran ventaja para diseñadores, ya que antes tenían que codificar mucho XAML.
  • Visual State Manager (VSM), sirve para controlar y definir templates para los diferentes estados de los controles y realiza también transiciones entre estos estados por nosotros. Por ejemplo un botón presenta un cambio en su template entre el estado normal y mouseover o pressed. Se cuenta con gran soporte de parte de blend para diseñar o modificar cada state, similar a como hacen los objetos en flash :)
  • Incluye un nuevo Visual Tree Helper para buscar los elementos, navegar entre padres e hijos.
  • Los que tengan aplicaciones que usen video, se beneficiaran del Adaptive Streaming, que en base al hardware y bandwidth del cliente descargará un contenido distinto.
  • Diferentes mejoras en el área de red, harán de SL un ambiente de programación más flexible. Por ejemplo, Duplex Communication permitirá que el servidor envíe información al cliente. Por otro lado el soportte para crear Proxies, obtener recursos de REST URIs o consumir servicios de JSON nos darán aún mayores opciones para interactuar con servers de una manera simple.

SP1 Beta para VS 2008

Este release incluye bastantes mejoras al framework recientemente liberado. No hay que olvidar que es un beta, sin embargo, tengo que agregar que funciona muy bien y la tecnología que estan integrando en este SP1 tiene ya mucho tiempo desarrollandose, inclusive antes de liberar el .NET Framework 3.5 y ha llegado a un punto de madurez en el que ya vale la pena meterse más a fondo a lo que viene, especialmente el MVC (más de esto luego).

Para información detallada pueden leer el post de Scott Guthrie y descargarlo de aca. Algo de lo más sobresaliente a notar (al menos para mi) es:

  • C# ahora te muestra errores semanticos tan pronto como los escribas, en lugar de esperar a que compiles
  • El tan esperado EntityFramework, digamos LINQ to SQL para aplicaciones complejas, un ORM de verdad.
  • MVC Framework, el nuevo paradigma de desarrollo web para ASP.NET (más info luego).
  • ADO.NET Data Services (Astoria) es una librería que permite facilmente ofrecer y consumir servicios tipo REST, basandonos en un DataContext
  • Un Routing Engine, usado en el MVC framework y ADO.NET Data Services (Astoria) para tener links bonitos como miweb.com/products/categories/beverages en lugar de links feos como miweb.com/ListaProductos.aspx?listBy=category&category=beverages
  • Performance Improvements para VS 2008, que realmente ya estan cubiertos por este HotFix desde Febrero.
  • Client-only Framework subset, nos permite desarrollar una aplicación de escritorio que se enfoque a un subset del framework, de tal forma que nuestros usuarios no tengan que instalar el framework completo (sin ASP.NET y otras cosas que no necesitan). Las aplicaciones desarrolladas para este subset correran de la misma forma en el framework completo. Básicamente hicieron un installer más pequeño que te instala los assemblies más comunes para el escritorio y en VS 2008 restrigen tus referencias a sólo esos para garantizar que tu app pueda correr en la versión reducida.
  • Mejoras a WPF en performance, data, nuevos efectos e Interoperabilidad con Direct3d.
MVC

Es la manera en que Ruby on Rails y muchos otros frameworks trabajan actualmente. Sin caer en polemica respecto a cual será mejor, tengo que decir que a mi me gusta mucho el estilo MVC ya que creo que provee una importante separación de responsabilidades y nos deja con un diseño más limpio, sin embargo el estilo de ASP.NET de siempre, seguirá siendo una buena opción, sobre todo para aplicación más simples donde consideren que no valga el esfuerzo adicional (principalmente el capacitar a la gente). Espero en otro post poderme extender más en el tema de MVC.

SQL Server 2008 RC0

Ya liberaron el primer RC del nuevo motor de Base de Datos de Microsoft. Lo malo es que esta version (RC0) esta disponible solo para socios de Technet, puedes ver más info aquí o si eres socio ir a descargarlo, de lo contrario esperar al RC1.

martes, abril 08, 2008

Unit Testing Silverlight Applications

Jeff Wilcox publico un artículo respecto usar su Test Harness para Silverlight. Resulta bastante sencillo, pude migrar una serie de pruebas unitarias que corrían en el escritorio y correrlas desde un Silverlight Library sin problemas. Es bastante simple.

  1. Baja del código de los controles del MIX
  2. Buscar los siguientes dlls y copialos al folder del SDK  %Program Files%\Microsoft SDKs\Silverlight\v2.0\Libraries\Client
    • Microsoft.Silverlight.Testing
    • Microsoft.Silverlight.Testing.Framework
    • Microsoft.VisualStudio.QualityTools.UnitTesting.Silverlight
  3. Descarga los templates de proyecto y clase de pruebas y copialos los paths de templates de VS.
    • %userprofile%\Documents\Visual Studio 2008\Templates\ProjectTemplates
    • %userprofile%\Documents\Visual Studio 2008\Templates\ItemTemplates
  4. Agrega un Test Project a tu Silverlight Application o Library.
  5. Agrega una referencia de tu app o librería a tu proyecto de pruebas.
  6. Pon tu proyecto de pruebas como Startup Project y listo. F5 y estarás corriendo tus pruebas.

El hacer las pruebas es muy similar a las que ya conocen, mismos atributos como ExpectedException, TestMethod, etc. Hasta el momento yo sólo he probado presenters y cuestiones del modelo incluyendo conexiones a WebServices desde Silverlight, abstrayendo el uso de la interfaz de usuario, sin embargo, podemos crear pruebas para interfaz de usuario. Para más información vean el post de Jeff.

Algo que lamentamos no tener actualmente es la integración con Visual Studio y Team Foundation Server, para poder organizar nuestras pruebas en Test Lists y ver los resultados en nuestro Test Result Window y desde ahí levantar bugs o mejor aún el integrarlo con nuestro servidor de Builds. Jeff comento que pronto publicara respecto a esto ultimo.

lunes, abril 07, 2008

Zoom It para Presentaciones

Hace mucho en algun show Scott Hanselman recomendo Zoom It de SysInternals para hacer las presentaciones. Nunca la había usado, pero en la ultima platica realmente me ayudo bastante, pude mostrar cosas que antes solo mencionaba. Por más que tenía una resolución chica y VS con letra grande, había algunas áreas que no se alcanzaban a apreciar como los menús o barras de herramienta.

Con zoom-it corriendo en el background, simplemente presionas Ctrl-1, toma un screenshot y le hace zoom hacía donde tengas el mouse, luego puedes hacer zoom in/out con el scroll y te mueves con el mouse. Trae otras opciones como para dibujar, pero me parecieron medio extrañas de usar. Al principio se puede sentir medio raro, pero una vez que agarras algo de practica es muy útil. Les sugiero ensayar su uso antes de su presentación.

Links:

Zoom It

SysInternals

Les recomiendo bajar toda la Suite de SysInternals ya que trae muchas otras cosas utiles como el Process Explorer.

Hace poco Jaime Sanchez subio un articulo muy bueno respecto a como hacer Demos WOW.

domingo, marzo 09, 2008

Silverlight 1.0 for Mobile

Una gran noticia es que Silverligth estará disponible para Mobile Devices, hay un par de sesiones en MiX 08 que hablan de esto. Lamentablemente no tengo los links directos, pero los pueden buscar facilmente. Hay empresas que ya han desarrollado algunas aplicaciones con esta nueva tecnología. Una de ellas es Stimulant que desarrollaron una aplicación para redes sociales (más). La aplicación de WeatherBug es otro ejemplo.

Otra de las buenas noticias es que no esta limitado a Windows Mobile, sino que se agregará soporte para Nokia. Según algunas de las presentaciones de Mix 08 más adelante existirá soporte para otros dispositivos, posiblemente el IPhone dependiendo del esquema que Apple use para su SDK.

Para darle un espacio especial a esta versión, crearon una subsección espacial dentro del sitio de silverlight.net dedicada a Silverlight 1.0 for Mobile

Silverlight 2 Beta 1

Finalmente liberaron el Beta 1. Tal como se esperaba después del Mix 08. Aquí algunos recursos utiles:

  1. VS 2008 Tools (incluye el runtime, sdk y soporte para SL en VS)
  2. Tips de Instalacion para VS 2008 Tools, más tips
  3. Runtime
  4. Silverlight 2.0 Beta 1 SDK
  5. Expression Blend 2.5, descargalo aquí 
  6. Tutoriales de Scott Guthrie, paso a paso como hacer una aplicación.
  7. Tutorial de Scott Guthrie para Expression
  8. Sitio oficinal de Silverlight
  9. How Do I Videos
  10. Tutoriales
  11. Hands On Labs

viernes, marzo 07, 2008

Mix 2008

Para los que no pudimos ir al MIX08, parece que no nos perdimos de mucho. Tal como dice Ballmer en su entrevista con Guy Kawasaki, "este no es el mundo de conferencias de hace 15 años cuando cuanto tipos como Guy y yo empezabamos, estas importaban en el sentido de ser la única manera de obtener el contenido, hoy las conferencias son mucho de comunidad y los aspectos únicos de las relaciones, pero el contenido se propaga, se hace disponible para todos en la web"

Así que ve a http://visitmix.com/ y checate todos los eventos 24 horas después en http://sessions.visitmix.com/ o suscribete al RSS en http://sessions.visitmix.com/rss/mix08_rss.xml.

jueves, febrero 21, 2008

Queries Recursivos en SQL Server 2005

Hace poco estaba preparando una platica de Sql Server 2008 y me preguntaron que eran Common Table Expressions (CTEs), una característica recien introducida en Sql Server 2005. En su momento lo vi, pero no había tenido la necesidad de usarlos hasta ahora. Estos sirven para hacer queries sobre esquemas jerarquicos. Veamos este ejemplo real. Nosotros tenemos una lista de Nodos que representan categorías y pueden tener subcategorías y sub-subcategorias con N niveles de profundidad.

Si supieramos que sólo vamos a mezclar marcas con categorías y estas últimas con líneas, podríamos resolver todo en un par de joins, el problema viene cuando el nivel de profundidad es "ilimitado".

Este es el código con CTE en Sql Server 2005. 

WITH TreeView(NodeId, Name, Description, Level, Father, Selectable, Enabled)--Definimos nuestro CTE
AS
(
    -- Definimos la raíz o miembro anclar
    SELECT NodeId, Name, Description, 0 as Level, Father, Selectable, Enabled
    FROM Nodes
    WHERE NodeId = @NodeId
    UNION ALL
    -- Definimos el miembro recursivo haciendo referencia a nuestro CTE
    SELECT n.NodeId, n.Name, n.Description, tv.Level+1 as Level, n.Father, n.Selectable, n.Enabled
    FROM Nodes n
    INNER JOIN TreeView tv on n.Father = tv.NodeId
)

-- Ahora simplemente consultamos nuestro CTE

SELECT * from TreeView
Order by Level

Al final terminaremos con algo como esto.

image

Lo más importante a notar es como al definir nuestro miembro recursivo hacemos referencia a TreeView.NodeId para poder encontrar la relación padre-hijo. Esa es la clave de todo.

Como funciona, se obtiene el miembro ancla y se une por cada uno de estos el resultado de ejecutar el query para los miembros recursivos, una vez que este último no regresa filas en automático termina la recursión para continuar con una siguiente fila así hasta acabar con todos.

Lamentablemente en este proyecto aún estamos usando Sql Server 2000, así que esto no sirvio más que para que me diera coraje seguir batalalndo con Cursores, aquí esta la solución que ya tenía para 2000, no la voy a describir mucho, sólo dire que nos obliga a tener un procedure, cursores y tablas temporales con la limitante de sólo 32 niveles de anidación (por las llamadas a Sprocs):

ALTER procedure [dbo].[GetChildsForNode]
    @father integer,
    @level integer
as
begin
/*
* Obtiene de manera recursiva todos los nodos hijos y los guarda en una tabla temporal #nodes
*
* Autor: Miguel Madero
* Fecha de creación: 02/05/2008
* Fecha de última modificación: 02/05/2008
*
*/
    -- Insert current level nodes
    insert into #nodes
    select * from Nodes
    where father = @father and [level] = @level and [Enabled] = 1

    -- Each insertedNode will now be the father
    declare @newFather integer
    declare @newLevel integer
    -- We wanna go down 1 level 
    set @newLevel = @level + 1
    declare cursorNodesByLevel cursor for
        select Father from #nodes where [level] = @level and [Enabled] = 1
    open cursorNodesByLevel
    -- Each insertedNode will now be the father
    Fetch Next from cursorNodesByLevel into @newFather
    WHILE (@@FETCH_STATUS<>-1)
    BEGIN
        IF(@@FETCH_STATUS<>-2)
        BEGIN
            -- We call ourselves with the new father and newLevel
            exec GetChildsForNode @newFather, @newLevel
        END
        -- Each insertedNode will now be the father
        Fetch Next from cursorNodesByLevel into @newFather
    END
    -- Cleanup
    Close cursorNodesByLevel
    Deallocate cursorNodesByLevel
end

Lo usarías de la siguiente forma:

CREATE TABLE #nodes
    (
        NodeId int NOT NULL,
        [Name] varchar(50) NOT NULL,
        [Description] varchar(500) NULL,
        [Level] int NOT NULL,
        Father int NULL,
        Selectable bit NOT NULL,
        [Enabled] bit NOT NULL
    )
        -- We fill the ChildNodes which will be left in the temp table
        exec GetNodeWithChilds @nodeId
       

        -- Now we do something with that like get the products on any node

        select p.ProductId, p.NodeId, ad.descr, ad.precioUsuario, ad.disponiblesUsuario
        from Products p
        join ProductsAspel pa on p.ProductId = pa.ProductId
        join ArticulosDisponibles ad on ad.clv_art = pa.AspelKey
        where usId = @usId and NodeId in (Select NodeId from #nodes)
        order by descr, clv_art,marcnombre, desc_lin
    -- Cleanup
    Drop Table #nodes

Por cierto Sql Server 2008 tiene un nuevo Hierarchy Type del que les platicaremos en los eventos de presentación del producto que estaremos haciendo por todo México.

Más información de CTE

domingo, febrero 03, 2008

Instalar Northwind en SqlExpress

Es muy fácil, vayan e instalen esto.

En c:\Sql Server 2000 Sample Databases hay un script, corranlo y listo.

Para más info vean este post Smart Client Data : Installing Northwind on SqlExpress

Technorati Tags: ,

jueves, enero 31, 2008

Code Coverage para Identificar Casos de Pruebas Importantes

Esta herramienta es muy útil. Nos ayuda a ver que porcentaje de nuestro código esta realmente siendo ejecutado. Hay código que nunca se toca y esto nos puede indicar tres cosas.

1. Es código que realmente no se usa y sólo estorba y perjudica a la mantenibilidad de nuestro proyecto. Solución: Borralo.

2. Es código que no se está probando. Solución: Crea una nueva prueba.

3. El código es tan simple que no hace falta probarlo. Esto pudiera ser real, sin embargo, si en todo el set de pruebas no se pasa nunca por ahí nos hace pensar que tal vez nunca se usa en toda la aplicación.

El punto uno es simple, solo no le agarren cariño al código que no sirve y presionen delete sin llorar por las horas que invirtieron en algo que nadie usara. El punto dos se puede cumplir de muchas formas, la ideal es una prueba unitaria que podamos repetir constantemente, sin embargo, podríamos hacer un WebTest o Manual Test, lo importante es que se pruebe.

Podemos ver un ejmplo reciente.

image

En este caso vemos que nuestro metodo Borrar Artículo siempre se esta probando cuando el baseNode no tiene un artículo. Esto pudiera no ser muy critíco porque los otros tres metodos si estan cubiertos por otras pruebas, sin embargo, es una prueba básica que debería estar considerada.

No es necesario llevar esta practica a un extremo y querer tener 100% Code Coverage, en muchos proyectos no vale la pena, sobre todo con código heredado o si no se inicio con buenas prácitcas. Lo que si debemos tener bien presente es que no baje nuestro code coverage, es decir, iteración tras iteración o mejor aún (Si usan Integración Continua) check-in tras check-in  nuestro porcentaje de cobertura aumente, esta es una buena metrica para el equipo completo. 

Links

Como Configurar Code Coverage en Team System (MSDN)
Configurar Integración Continua en Team System 2005
Configurar Integración Continua en Team System 2008
Code Coverage para NCover (Si pruebas con NUnit)

miércoles, enero 30, 2008

Updated MEDC 2006 Hands On Labs for Mobile Client Software Factroy

Here's the update.

The original HOL was designed for drop 12 of the MCSF and there were some namespace chages by the final version. All projects should be working by now, we have used them several times.

This version targets VS05, if you open it on VS08 consider the following:

  • You wont be able to use the guidance and do HOL 4 for Orientation Aware.
  • When prompted to update just leave the projects in .NET 2.0 (there is no easy way to change that back if you upgrade them to 3.5).
  • You will need to replace the dlls in dlls/MobileSoftwareFactory with the ones in dlls/MobileSoftwareFactory08. The main difference is now Mobile.DataAccess.dll uses SqlServer CE 3.5 instead of 3.0.3600.0. This is important, even tough it compiles you will have troubles at runtime.
  • Sometimes you might need to upgrade the sdf file manually.

Next month we will be releasing on CodePlex an updated version of MCSF that works with VS08, except for OrientationAwareControl. Clarious Consulting is planning an update for their OAC which you could use instead.

I didn't write the HOLs, I'm just making the update we used internally available, anyway, if you have some trouble it might be something we already ran into, so please leave a post on the Mobile Blocks at Codeplex or leave me a message here.

martes, enero 29, 2008

Web Development Helper y Otras Herramientas para Desarrollo Web

El Web Development Helper es una herramienta muy útil cuando se desarrolla en ASP.NET. En este caso nos muestra con el Http Logging habilitado todos los requests que esta haciendo Interent Explorer, esto nos puede ser muy útil como por ejemplo en este caso para saber porque no estaba cargando el Xaml de una aplicación de Silverlight. Un error muy menso obviamente, pero detactado rápidamente con la herramienta, pudieron haber sido muchas otras cosas, un script que cargaba no cargaba bien el Xaml.

image

Adicional al HttpLogging, se integra bastante bien con ASP.NET de tal forma que desde ahí pudieramos ver el ViewState, Cache, Trace, tiene una consola de Script para escribir, un DOM Inspector entre otras cosillas interesantes. Puedes descargarlo desde aquí.

Otras herramientas básicas para el desarrollo en Web son:

Fiddler: monitorea el puerto 80.
IE Developer Toolbar: nos permite ver como Internet Explorer esta rendereando nuestra página seleccionando elementos en ella y explorando el DOM.
BugZilla: add-in para Firebird con excelentes características para depuración.
ScriptSharp: compilador de C# a JavaScript, el logging para JavaScript es muy útil.
Visual Studio 2008: con soporte mejorado para manejo de hojas de estilo y depuración e intellisense para JavaScript.
Aptana: IDE basado en Eclipse que con mejor soporte para depuración e intellisense para JavaScript (también sirve para Ruby).

Seguramente se me pasan algunas que no utilizo tan frecuentemente. Lo importante de estas herramientas es saber que hacen y tenerlas presentes para saber cuando usaralas.

martes, enero 22, 2008

Aspect Oriented Programming Aplicado - PostSharp, Logging y HttpSimulator

Siempre me había intrigado por AOP y es que la idea de programar basado en aspectos en lugar de funciones o metodos o código secuencial es bastante atractiva. Obviamente no es para todo código, pero hay muchos "aspectos" que quisieramos poder tener encapsuladas y no sólo en un objeto, sino, despreocuparnos y no tener que invocarlas nosotros mismos.

Ejemplo Simple - Logging.

Pensemos que queremos loggear excepciones.

image

Ok, ese el código feo de novato. Ahora refactoricemos un poco. Podría estar en una clase y para cuestiones de la prueba hagamosla estática.

image

Ahora apliquen eso a todos los metodos de la clase. ¿Qué? Bueno supongan que nos interese enterarnos en nuestro archivo de Log de todos los lugares donde lleguue a ocurrir una excepción. Vamos a convertir esto en un aspecto. Refactoricemos de nuevo.

image

Simplemente hicimos nuestra clase serializable (necesario por PostSharp), hereda de OnExceptionAspect, overrideamos el Metodo OnException y listo, Logueamos tal como antes.

image

Ahora simplemente decoramos nuesto metodo con nuestro nuevo atributo, corremos la app y listo. El atributo también podría ir en una clase y aplicarle algunos filtros. Estas son sólo algunas de las posibilidades.

Puedes descargar el código aquí

Por mantener breve el ejemplo, la clase loggin es muy simple, en una aplicación real sugeriría usar el Loggin Application Block que es parte del Enterprise Library o Log4Net, ambos son open source y podrían integrarse con PostSharp.

Para un ejemplo aún más simple que este, vean el Video de Intro de PostSharp. El ejemplo me parecio poco práctico, sin embargo, es muy ilustrativo respecto a como usar la herramienta y sólo dura 5 minutos. Pueden bajar el código del video aquí.

Otro Ejemplo Simple - HttpSimulator

Hace algún tiempo escribi respecto al HttpSimulator, desde entonces lo hemos tenido que usar muchas veces para simular el contexto de Http en clases que dependen de algun objeto de ASP.NET y queremos probarla sin necesidad de que tenga dependencias a los objetos reales del framework, es decir, no queremos tener que usar realmente sesión y pasar por todo el pipeline de un request web, sólo para probar un simple metodo.

En el código a descargar viene todo el HttpContext, ahorita nos enfocaremos a las pruebas unitarias, estilo TDD para el HttpContext y como usarlo con PostSharp, en la prueba usaremos un WebDependentClass

image

Eso esperamos que arroje una excepcion, ya que WebDependentClass se debería ejecutar en un contexto web para que pueda usar HttpContext.Current tal como se muestra.

image

Ahora veamos como se haría esto con el HttpSimulator para lo que creamos otra prueba.

image

Es simple, se obtiene el path, se crea la instancia, se empieza a simular el request, se hace lo que se tenga que hacer y al salir del using se ejecuta el dispose y termina la simulación. Nuestra prueba pasa y todos contentos. Sólo que es mucha talacha. Puede haber 126 pruebas más que usen el Simulator. Aunque se podría simplificar un poco la creación, terminaríamos aún así con código repetido y el using no tenemos manera de evitarlo.

Con AOP, tenemos algo como lo siguiente:

image

El atributo se encarga de todo, inclusive si todas las pruebas de nuestro TestClass o nuestro Assembly de pruebas necesitaran del simulador podríamos definir el atributo a nivel de clase o assembly para aplicarles el mismo aspecto.

La implementación del atributo es de lo más simple. Tal como hicimos con el Logging, tenemos la clase serializable y hereda de un atributo predefinido en PostSharp.

image

Parece un Surround with snippet no? Es similar sólo que para tiempo de compilación.

Si quieres usarlo en tus pruebas, simplemente agrega el Assembly HttpSimulator y el atributo a las que dependan de un contexto Http. Puedes bajar el código de aquí.

Links

Downloads

SuperSimpleSample
LoggingSample
Attribute para el HttpContextSimulator
Todos los samples de este post
PostSharp Installer

PostSharp

PostSharp en .NET Rocks
PostSharp
Video de Intro de PostSharp

HttpSimulator

Post viejo mio
HttpSimulator

Miguel Madero

jueves, enero 17, 2008

Net CF Loader Log nos ayuda a depurar aplicaciones.

Tenemos todo bien configurado, nuestros ambientes de prueba, servidor de integración continua, pruebas unitarias, hacemos pruebas de usabilidad, integración, etc, pero siempre estamos expuestos a que se nos escape algún bug. Escribi hace algún tiempo respecto a como tratar los bugs, a veces hay que tomar medidas alternas.

Los bugs más difíciles son aquellos que tienen que ver con cuestiones externas a tu aplicación, el sistema operativo, el explorador que usa tu cliente, cuestiones externas difíciles de reproducir como tipos de conexión (celular, wi-fi, etc), etc. Todo esto la mayoría de las veces termina siendo alguna babosada.

Esta es la historía. Como siempre, todo funciona bien en nuestro entorno de pruebas, se crea el installer, se distribuye usando UpdaterAgent (como ClickOnce para Mobile) y en algunas agendas funciona la app y en otras no.

Primer paso revisamos el log de errores.

----------------------
Version: 3.0.2933.38083
17/01/08 11:33:57 a.m.
Cerrando la aplicación. Error inesperado: InvalidProgramException
-----------------------
-----------------------
Version: 3.0.2933.38083
17/01/08 11:33:58 a.m.
System.InvalidProgramException: InvalidProgramException
en System.RuntimeType.InternalGetConstructors()
en System.RuntimeType.GetConstructors()
en Microsoft.Practices.Mobile.ObjectBuilder.ConstructorReflectionStrategy.GetMembers()
en Microsoft.Practices.Mobile.ObjectBuilder.ReflectionStrategy`1.BuildUp()
en Microsoft.Practices.Mobile.ObjectBuilder.BuilderStrategy.BuildUp()
en Microsoft.Practices.Mobile.ObjectBuilder.PolicyProviderStrategy.BuildUp()
en Microsoft.Practices.Mobile.ObjectBuilder.BuilderStrategy.BuildUp()
en Microsoft.Practices.Mobile.ObjectBuilder.SingletonStrategy.BuildUp()
en Microsoft.Practices.Mobile.ObjectBuilder.BuilderStrategy.BuildUp()
en Microsoft.Practices.Mobile.ObjectBuilder.TypeMappingStrategy.BuildUp()
en Microsoft.Practices.Mobile.ObjectBuilder.BuilderBase`1.DoBuildUp()
en Microsoft.Practices.Mobile.ObjectBuilder.BuilderBase`1.BuildUp()
en Microsoft.Practices.Mobile.CompositeUI.Collections.ManagedObjectCollection`1.BuildFirstTimeItem()
en Microsoft.Practices.Mobile.CompositeUI.Collections.ManagedObjectCollection`1.Build()
en Microsoft.Practices.Mobile.CompositeUI.Collections.ManagedObjectCollection`1.AddNew()
en Microsoft.Practices.Mobile.CompositeUI.Common.ControlledWorkItem`1.OnBuiltUp()
(más y más llamadas)

Nuestro stack es tan grande que ni sentido tiene reproducirlo. Pero hasta ahí es la parte importante. Tenemos un InvalidProgramException que no nos dice mucho. Lo más cerca que podemos llegar es hasta el Código de ConstructorReflectionStrategy.GetMembers, el resto es el framework. Vamos a depurar y encontramos que el error esta al querer obtener los constructores de una de nuestras clases, vamos y revisamos que ahí no este el problema. Tiene un constructor publico que no recibe parametros al igual que las clases de las que hereda, tal como sospechabamos el problema no es esa clase.

Vamos a ver que hay de partícular en las agendas que fallan. Empezamos por crear una prueba unitaria que no haga más que usar directamente reflecto para obtener los constructores de esa misma clase. Se prueba en el emulador y todo funciona, se prueba en una de las agendas que falla y falla. Excelente, ya aislamos el problema. ¿Y ahora? Seguimos sin saber el porque del error, sólo que truena al tratar de obtener los constructores. Seguramente es un problema en como se cargan los objetos y ahí entra el Loader Log.

Se empieza por activar usando el Net CF Logging Configuration que es parte de los .NET Compact Framework Powertoys para 3.5.

image

Siguiente paso, correr nuestra aplicación en un dispositivo que si funciona y copiar a nuestra maquina el archivo de log "netcf_Loader.log". Luego hay que hacer lo mismo en una agenda que no funcione. El log es muy fácil de interpretar y Steve Prtachner ya lo describio a detalle, así que no lo haré ahora, pero para lo que queríamos encontrar de diferencia ni siquiera necesitamos tanta información.

Con los dos archivos en nuestra máquina usamos Beyond Compare o alguna herramienta similar y vemos las diferencias.

image

Al principio todo es igual, salvo cosas no importantes como el ProcessID. La secuencia y que busca y resuelve cada referencia es identica hasta que llegamos al punto donde truena.

image

Vemos que después de cargar el Modulo ConnectionMonitor, trata de cargar el de SqlServerCE 3.5 en el log de la agenda que si funciona, sin embargo, la secuencia es muy distinta en las otras y trata de cargar aún la versión anterior del SqlCE.

Listo, problema resuelto, resulta que el GetConstructors, para obtener los members de esa clase carga los modulos hacía los que tiene dependencias, uno de esos es SqlServerCE 3.5 y no estaba bien instalado en la agenda.

En este momento podrías estar pensando, porque diablos no revisandon la instalación de todo antes de continuar, claramente era un problema de instalación. Claro que podríamos haber hecho un checklist y revisar que todo estuviera bien, sin embargo, no hicimos eso y tuvimos que darnos cuenta de una manera distinta, pero esa es otra lección aprendida y no la del tema de este blog. Por eso les decía que este tipo de problemas muchas veces termina siendo una babosada.

El Loader Log nunca me había resuelto nada, aunque lo había usado un par de veces sin ningún éxito. Lo importante de esta y tantas herramientas, de las que escribire más adelante es el conocerlas y saber que estan ahí instaladas en la máquina para que algún día, tal vez después de algunos años la uses y te saquen de algún problema. Esa es la lección del día.

martes, enero 08, 2008

Siempre he considerado a prodigy como la única alternativa de Internet para negocios y esto ha sido especialmente porque otros proveedores tienen puertos bloqueados y el tipo de red que ellos utilizan no permite muchas de las actividades necesarias para una empresa. Por otro lado, considero que han tenido un buen soporte al cliente y una buena comunicación.

Todo esto ha cambiado recientemente, con “La protección del puerto 25”. Entiendo que es una medida necesaria debido al SPAM, sin embargo, para todo negocio es indispensable el envío de e-mails utilizando las cuentas de la compañía. Obviamente la situación no es tan crítica como para no poder mandar correos jamás, hay varias alternativas (desde usar Webmail, hasta solicitar que eliminen la protección para tu cuenta. Más información). El problema radica realmente en la falta de comunicación de esta empresa hacía sus clientes.

Mes a mes mandan publicidad y todo tipo de información junto con el recibo, tienen nuestros e-mails alternos al momento de que creamos una cuenta para pagarles el recibo y, vamos, se trata de una empresa de comunicación que no debería tener problema en contactarnos para avisarnos de sus nuevas políticas que van a afectarnos.

Su respuesta es, les avisamos enviando un correo a un cuenta de prodigy. ¿Saben lo ridículo que es esto? Si esto sólo nos va a afectar a los que usamos una cuenta distinta como nos escriben a esa dirección, ellos mismos dicen: “La protección del puerto 25 no afectará a aquellos usuarios que estén utilizando los servidores SMTP de TELMEX, es decir, esto no afectará a usuarios TELMEX con cuentas @prodigy.net.mx”. Así cuando cambien mi mis políticas de venta para mis clientes de Alemanía le voy a mandar una carta a todos mis clientes en Italia a ver si aquellos de Alemania se enteran y para que les de más coraje les voy a comentar, “su sucursal de Italia debería haber recibido una notificación”, “ahhh no tiene sucursal en Italia?, debería tener una”. Todavía me dicen, debería checar su cuenta de prodigy.

Bueno en si la forma de resolverlo a rápida y sencilla, la medida es buena, pero para un negocio durar un día o más sin poder enviar mails es algo critico y parece que a Telmex no le importa mucho esto.

Aún cuando le digo a la persona de soporte, “me parece absurdo que el medio de avisarme sea mandándome un mail a prodigy, sólo se lo digo como retroalimentación y me gustaría que lo tomaran en cuenta para futuros avisos”, su respuesta fue, “no me parece absurdo y es el primer cliente que me lo dice”. Así que por favor compartan y expresen su odio.

Les dejo el link de un post de alguien que parece odiarlos más que yo en este momento.

http://www.malditoweekend.com/telmex-bloquea-puerto-25-smtp/

Y un link de gente medio desorientada.

http://www.matuk.com/forosmatuk/?forum=3&topic=212&page=2

Esta es la liga para desbloquear el puerto, úsenla.

https://www.beneficios.telmex.com/puerto25Prod/iniciaPuerto25Internet.do

Por cierto, si no han pasado por esto aún es porque no reinician aún su modem, ayer se fue la luz por la noche y al día siguiente no más SMTP. Llenen el formulario de una vez ya que al parecer toma un tiempo para que lo desbloqueen. Si este post se publica significa que ya lo hicieron ya que estoy publicándolo desde Outlook. Llene el formulario a las 8:40 pm del día 7 de Enero y tomo hasta la hora de publicación de este post.

Miguel A. Madero Reyes
Integradores Tecnológicos S.C.
www.integradorestecnologicos.com
www.miguelmadero.com (blog)

viernes, diciembre 28, 2007

Instalando Enterprise Library en Visual Studio 2008

El proceso es realmente simple. La idea original reamente se la vole a Ezequiel así que en su post verás más información detallada. Como no encontre información de como hacer esto en la Web decidí publicarlo.

Basicamente haces lo mismo que al instalar WCSF, pero sobre el MSI de Mayo de Enterprise Library. Al estar cambiando las entradas en el RegLocator usando Orca modifica donde diga 8.0 y ponle 9.0, lo guardas y listo para instalarse.

Editare este post con Issues y soluciones conforme las vaya encontrando.

Installing Enterprise Library in Visual Studio 2008

The process is really simple. I actually took the idea on how to do this from Ezequiel so you will need to see his post for detailed information.

Basically you do the same than when installing WCSF, but do it with the EntLib May MSI and in the RegLocator change the entries that reference 8.0 for 9.0 and that's it. Save and install and have fun.

I will edit this post with issues and workarounds as I find them.

martes, diciembre 04, 2007

Undo Pending Changes de Otros Usuarios

Hay veces que alguien sale de vacaciones o se va de la empresa o simplemente necesitamos trabajar con algún archivo que alguien dejo check-out en nuestro server y lo peor es cuando es un Check-Out exclusivo.

Aún siendo administrador no se puede dar click derecho y deshacer los cambios de alguien más, pero lo podemos hacer desde consola. Bueno al grano.

Supongamos que alguien dejo la empresa y algunos check-outs detrás. Primero necesitamos saber los Workspaces que manejaba y deshacer sus cambios. Desde consola de VS corremos lo siguiente

tf workspaces /owner:lizet.garcia /server:http://itmTFS:8080

Luego para cada uno de sus Workspaces hacemos un undo.

tf undo /workspace:lizet.garcia;itmLiz /server:http://itmtfs:8080 /recursive "$/"
tf undo /workspace:lizet.garcia;officePC /server:http://itmtfs:e8080 /recursive "$/"

Si quisieran simplemente hacer el undo de un solo archivo, quiten lo de recursive y especifiquen el path completo en lugar de "$/"

Para más info e imagenes chidas vean el blog de Alex Thissen