Reflector y sus amigos…

Que Reflector es una herramienta indispensable para todo desarrollador que quiera ir un poco más alla en la plaforma .Net y comprender como esta funciona es algo que nadie discute.


Si ha esto le añadimos que la herramienta es extensible y que existen numerosos plugins realmente espectaculares y útiles ¿Qué más se puede pedir?. Algunos de ellos son bastante espectaculares, a mi me gusta especialmente Reflector.Graph, si lo usais necesitareis un visor SVG.


Si alguien a estas alturas no conoce Reflector seguro que tampoco conoce a fondo .Net.


Otras herramientas que a mi me resultan de gran utilidad son:


Fiddler, que permite ver el trafico HTTP que genera tu máquina de una manera realmente comoda, ideal para ver que manda Asp.net realmente al navegador.


The Regulator, usar esta herramienta es la única manera que he encontrado de no volverme loco trabajando con expresiones regulares.


Por último, hay dos articulso muy interesantes en MSDN Magazine sobre herramientas de este estilo:


Visual Studio Add-Ins Every Developer Should Download Now
Ten Must-Have Tools Every Developer Should Download Now

Memory leaks en JavaScript

Despues de mucho tiempo desarrollando en C++, los memory leaks es algo que no me asustaba, aunque evidentemente una de las cosas que me encantaban de .Net era el no tener que consumir mi tiempo en largas sesiones de depuración y relectura de código buscando fugas de memoria.


Pero la vida es dura, y aunque ahora principalmente esté desarrollando aplicaciones web con Asp.net, los memory leaks están de vuelta. Y es que la Web 2.0 esta aquí, con millones de lineas de JavaScript en la mochila, y o sorpresa Internet Explorer puede fugar memoria cuando usas JavaScript de maneras que son perfectamente legales. Así que de nuevo me veo buscando memory leaks.


Si vuestra aplicación tienen código JavaScript, no os perdaís este articulo: Understanding and Solving Internet Explorer Leak Patterns


Además como en el caso de C++, si ya hemos cometido errores,hay algunas herramientas que nos puede ayudar:


IEMemoryLeaks


JavaScript Lint

Arquitectos y modistas

Mi abuela a cosido todo su vida. La recuerdo con sus gafas, su cesto de costura y sus patrones. Nunca la vi cortar una falda o un abrigo sin utilizar patrones. El otro dia la pregunte: Abuela, ¿Por qué siempre utilizas patrones? Llevas siglos cosiendo y sin embargo nunca cortas una falda sin usarlos (tarea realivamente facil para una modista experimentada). La respuesta, con una mirada de incredulidad y desconfianza (como si la tomase el pelo), fue clara: ¿Estas loco? Y que pasa si me equivoco y tengo que tirar todo el paño de tela, hasta el mejor escribano hecha un borrón!. Además tengo que hacer diferentes tallas.

Sin duda mi abuela es una mujer lista, ha descubierto lo mismo que yo, los patrones protegen de los errores, y los errores cuestan tela (o dinero, otra de sus acepciones, no creo que sea casualidad…). Solo que ella lo aplica a la costura, yo lo aplico al diseño y la arquitectura del software. Este sin duda es para mi el principal valor de los patrones, si haces algo siguiendo un patrón es mucho más probable que no te equivoques, hasta mi abuela lo tiene claro. El otro valor son las 'diferentes tallas', y es que un patrón se aplica en muchos contextos aportando, por lo tanto, una metasolución universal que nos ayuda a encontrar una buena solución en nuestro contexto particular.

Aprovecho para comentaros que mi amiguete Gorka Elexgaray, compañero mio en durante mi tiempo en Panda Software y ahora en Sisteplant (una pena que no lo sea tambien en [PC], pero es un tipo ocupado que le vamos a hacer…) me ha mandado un intersante link, que habla sobre el proyecto ET++. De por si no es especialmente interesante, otro de los mil frameworks que existen para interfaz de usuario en C++. No se si bueno o malo nunca lo he usado. Pero intuyo que malo del todo no será puesto que usa patrones intensivamente. El interés que tiene es que la gente que ha diseñado este framework se ha preocupado de documentar donde y por que a utilizado cada patrón que ha empleado. Hechadle un vistazo al link: http://research.microsoft.com/~minka/patterns/ET++/

Y si quereis saber más sobre patrónes (y otro montón de temas): [CMVP]

Buenas noticias para los madrugadores del unit testing…

Andaba buscando una herramienta para convertir mis ‘viejos’ test de NUnit en test de Visual Studio 2005, y es que depués de unos 2 años usandolos tengo unos cuantos en mis proyectos y la verdad los he cojido cariño…


Pues bueno, lo importante es que he encontrado esta herramienta, como no podía ser de otra forma a sido en Gotdotnet, que esta lleno de tesoros…


Para aquellos interesados en esta herramienta llamada NUnit Converter (de qué otro modo se podía llamar) aquí va el link: NUnit Converter

SQL Server 2005 Report Packs ya disponibles

La semana pasada salieron los SQL Server 2005 Report Packs, que son informes y bases de datos de ejemplo para diferentes aplicaciones y tecnologias de Microsoft.


Los diferentes packs son:


SQL Server 2005 Report Pack for SQL Server Integration Services
SQL Server 2005 Report Pack for Microsoft SharePoint Portal Server 2003
SQL Server 2005 Report Pack for Microsoft Dynamics Axapta 3.0
SQL Server 2005 Report Pack for Microsoft Dynamics Navision 4.0
SQL Server 2005 Report Pack for Microsoft Dynamics Great Plains 8.0
SQL Server 2005 Report Pack for Microsoft Dynamics Great Plains 9.0
SQL Server 2005 Report Pack for Microsoft Internet Information Services (IIS)
SQL Server 2005 Report Pack for Financial Reporting


Podeis descargarlos desde:


http://www.microsoft.com/downloads/details.aspx?familyid=d81722ce-408c-4fb6-a429-2a7ecd62f674&displaylang=en


Seguro que os serán de utilidad.

Activar una instancia anterior de una aplicación MFC basada en dialogos

Básicamente se trata de buscar la ventana con FindWindow y luego ponerla en primer plano llamando a SetForegroundWindow


Aqui va un poco de código…


BOOL COnlyOneApp::InitInstance()
{
   //#32770 es la clase de ventana que usan los cuadros de dialogo  MFC
   //OnlyOne es el titulo de la ventana
   HWND hwnd = ::FindWindow(«#32770», «OnlyOne»);
   if (hwnd != NULL)
   {
      SetForegroundWindow(hwnd);
   return FALSE; //Devolvemos FALSE para que acabe la ejecución.
   }
   //Resto de la función Instance…..
   .
   .
}

Lo habitual es registrar tu propia clase de ventana con nombre unico, y pasar NULL como segundo parametro a la función FindWindow.

Para saber como registrar tu propia clase de ventana en una aplicación basada en dialogos:
http://support.microsoft.com/kb/251059

Para ver un ejemplo de todo esto, existe un ejemplo que se llama ONETIME, en los ejemplo de Visual Studio.