[VS2010] HowTo: Configurar WinMerge como herramienta por defecto para analizar diferencias y realizar merge entre archivos

image47dd1de4

Buenas,

hoy toca destapar un par de post de la lista de borradores, en este caso los pasos para utilizar WinMerge como la herramienta por defeto para analizar diferencias entre archivos en Visual Studio 2010.

Tutorial

1. Primero lo más obvio; descargar la última versión disponible desde http://winmerge.org/

2. Abrir Visual Studio 2010

3. Acceder al menu [Tools // Options]

image

4. Presionar el botón [Configure User Tools]

5. Seleccionamos la opción [Add]

6. Agregamos la opción de Comparar, pero en este caso utilizando WinMerge utilizando los siguientes valores:

  • Extension: .*
  • Operation: Compare
  • Command: C:Program Files (x86)WinMergeWinMergeU.exe
  • Arguments: /e /x /s /wl /dl %6 /dr %7 %1 %2

image

7. Confirmamos la configuración con [OK]

8. Agregamos la opción de Merge, utilizando WinMerge utilizando los siguientes valores:

  • Extension: .*
  • Operation: Merge
  • Command: C:Program Files (x86)WinMergeWinMergeU.exe
  • Arguments: /e /s /x /ub /dl %6 /dr %7 %1 %2 %4

image

9. Confirmamos la configuración con [OK]

10. Deberíamos ver la configuarción completa similar a la siguiente:

image

11. Done !!!

 

Saludos @ Home

El Bruno

   

[TFS2010] HowTo: Averiguar el espacio ocupado por un Branch en Source Control ?

image47dd1de4

Buenas,

hace unos días me preguntaban como calcular el espacio que ocupa un Branch en Team Foundation Server. Cuando vienes de trabajar con herramientas donde la acción de Branch es una constante diaria, por ejemplo en GIT; tiendes a preocuparte por el tamaño de los branches y por el espacio en disco. Ojo, que la filosofía de como trabajar con estas herramientas es diferente, pero bueno, un bit es un bit, y hay que pagarlo en €uros.

Para responder a esta pregunta, hice un ping a los amigos de Redmond y este fué el post de referencia que me pasaron. Los valores son bastante claros:

image

 

Saludos @ Home

El Bruno

   

Fuente: http://blogs.msdn.com/b/chandrur/archive/2009/06/09/space-used-by-tfs-branches.aspx

[ALM] Tiene sentido habilitar la opcion para compilar siempre, inclusive si no hubo cambios, en una build de TFS?

image

Buenas,

una de las opciones que tenemos en las builds de Team Foundation Server define si la build se ejecutará inclusive si no hubo cambios en el código que compila la misma. La siguiente imagen muestra un ejemplo de la configuración de la Build, con la opción [Build even if nothing has changed since the previous build].

image

Nota: Si quieres ver los pasos necesarios para definir una Build, MSDN es tu amiga http://msdn.microsoft.com/en-us/library/ms181716.aspx.

Supongamos que tenemos 3 definiciones de Build para 3 aplicaciones diferentes, con nombres absolutamente descriptivos:

  • Build A [para la aplicación A]
  • Build B [para la aplicación B]
  • Build C [para la aplicación C]

y las 3 definiciones compilan las aplicaciones por la noche y tienen activada esta opción. Durante una semana normal de trabajo en la que diferentes equipos de trabajo desarrollan para las diferentes aplicaciones, el resultado y evolución de las builds puede ser similar al siguiente gráfico:

image

Es normal que en los primeros días, las compilaciones tengan poca calidad y que el último día (día 5), 2 de las 3 aplicaciones ya tengan un buen nivel de calidad en las mismas y las compilaciones sean exitosas.

Durante la siguiente semana, los equipos de trabajo siguen trabajando y al final de la semana podemos ver un histórico similar al siguiente:

image

La lectura rápida de estos resultados de las builds nos indican que el desarrollo en la Aplicación A y en la Aplicación B, no ha introducido cambios que desestabilicen el código, pero sin embargo la Aplicación C, ha tenido cambios mucho más significativos ya que durante varios días la build nocturna no fué exitosa.

Esta visión que a primera vista puede ser alentadora para la Aplicación A y en la Aplicación B, es completamente diferente si analizamos los cambios en cada aplicación y pudiésemos ver que el último cambio para la  Aplicación A se introdujo el día 6; y en el caso de la Aplicación B, el último cambio se introdujo el día 7. El gráfico general sería similar al siguiente:

image

Si bien es cierto que cuando utilizamos Team Foundation Server y Team Build, los informes nos pueden ayudar a ver este tipo de escenarios, por ejemplo con el informe Build Quality Indicators, donde veremos la información cruzada del resultado de las últimas Builds, junto con las métricas de Code Churn, Cobertura de Código, resultado de ejecución de tests, etc.; personalmente prefiero dejar desactivada la opción [Build even if nothing has changed since the previous build], así en mi histórico de Builds puedo ver información como en el siguiente gráfico; y de un primer vistazo sé en que aplicación se han introducido cambios y “cuando”.

image

image

Disclaimer: ojo, que esta es una opinión personal y estoy seguro que existirá algún escenario donde dejar activa la opción de compilación sea una alternativa válida Risa, mientras tanto este check quedará desactivado.

 

Saludos @ Here

El Bruno

   

[VS2010] Primeras pruebas con VS2010 y Kinect

image47dd1de4

Buenas,

pues hoy un video de las primeras pruebas con el Kinect, gracias al driver opensource disponible en https://github.com/OpenKinect/libfreenect; por ahora solo mover el motor vertical del Kinect, pero ya llegará el procesamiento de imágenes gracias a Kinect + Microsoft Robotics.

 

Obviamente una chorrada que em da verguenza comparada con los que muestran aquí  -> http://www.engadget.com/2010/11/25/kinect-hack-lets-you-control-a-web-browser-using-only-the-force/

 

Saludos @ Home

El Bruno

   

[EVENTO] Migración de aplicaciones de VB 6 a .NET, ¿mito o realidad?, ¿huevo o gallina?

image

Buenas,

el próximo 24 de diciembre toca una mesa redonda, evento, charla o como se nos ocurra llamarlo para hablar de la migración de aplicaciones de Visual Basic 6 a .Net. Tema de por sí interesante y más aún si lo  lidera Jorge Serrano, que nos ilustrará un poco con sus experiencias al respecto.

Pueden encontrar más información en la nueva y super rediseñada página de MadridDotNet –> http://madriddotnet.wordpress.com/2010/11/09/evento-migracin-de-aplicaciones-de-vb-6-a-net-mito-o-realidad-huevo-o-gallina/

Saludos @ Here

El Bruno

   

[VS2010] Agregando puntos de interrupción de depuración en el panel Call Stack (extreme debugging !)

image47dd1de4

Buenas,

hoy toca un tip muiy rápido sobre una funcionalidad que poca gente conoce:

La capacidad de agregar puntos de interrupción de depuración (breakpoints) en el panel Call Stack.

Para agregar un punto de interrupución, simplemente accedemos al panel Call Stack y agregamos el punto de interrupción.

image

A partir de este momento, el mismo ya está configurado y disponible para las depuraciones de nuestro proyecto y podemos ver la diferencia entre un punto de interrupción “normal”, que está asociado a una clase de código, a una línea y a una posición; y el punto de interrupción asociado a la ejecución de un ensamblado (.dll) y a una función dentro del mismo.

image

A disfrutarlo !!!

 

Saludos @ Home

El Bruno

   

[VS2010] Importando archivos XMI 2.1 en diagramas UML gracias al Feature Pack 2 para Visual Studio 2010

image47dd1de4

Buenas,

hace unos días se hacía oficial la disponibilidad del Feature Pack 2 para Visual Studio 2010. Jorge se hacía eco de la noticia aquí y además nos dejaba los links a la descarga y al hotfix necesario para el Feature Pack 2. Esta release trae muchas novedades interesantes; a la funcionalidad que más se le ha hecho mucha publicidad  es a la capacidad de realizar pruebas con Coded UI Tests para aplicaciones Silverlight (date una vuelta por el WebCast de Tony al respecto).

Pero como siempre en un Feature Pack hay muchas más cosas y una de ellas es realmente interesante: la capacidad de importar elementos UML basados en el estándard XMI 2.1 a nuestros diagramas de UML de Visual Studio 2010. Los que conocen y trabajan con UML conocen este formato de ficheros, ya que si bien es de carácter general para el intercambio de archivos (xmi= xml metadata interchange), muchas de las herramientas de modelado soportan este formato, un ejemplo: Microsoft Visio.

La prueba para Visual Studio 2010 + Feature Pack 2 hubiese sido demasiado “microsoft world” si hubiese creado un archivo en Visio y lo hubiese importado en Visual Studio, asi que mejor decidí realizar una búsqueda con google bing y descargar un ejemplo desde aquí http://www.isounifi.com/ws-cdl/example.xmi.

En Visual Studio 2010, tenemos una opción en el menú [Architecture // Import XMI …] para importar este tipo de archivos.

image

 

Una vez importado el archivo podremos ver en log de proceso el resultado del proceso de importación, así como la cantidad de elementos que se han importado.

image

 

En el panel [UML Model Explorer]  podremos acceder a los elementos que se han agregado a nuestro modelo:

image

 

Y ahora solo queda acomodar los mismos en nuestros propios diagramas, por ejemplo un diagrama de clases:

image

 

o en un diagrama de secuencia:

image

 

Ahora bien, es necesario recordar que:

  • La funcionalidad de importar, solo importa los elementos, no los diagramas ni las estructuras ya creadas
  • Solo es compatible con la versión 2.1 (y superiores asumo)
  • Es imprescindible realizar sincronizaciones periódicas si trabajamos con modelos muy cambiantes

bueno lo último depende de la forma de trabajo … y para esto mejor date una vuelta por aquí.

 

Saludos @ Here

El Bruno

   

Fuentes:

[OPINION] Porque Facebook puede tener exito donde ha fallado Google: Facebook Messaging

imageBuenas,

ayer Faceboook hizo un anuncio sobre un nuevo sistema de mensajería que si bien hizo un poco de eco en la red, no creo que haya tenido la suficiente repercusion. En GenBeta, por ejemplo, se encargaron de traducir literalmente lo que comunicaron en Techcrunch, pero tampoco le dieron muchas vueltas. Si quieres conocer cual es el nuevo modelo de mensajes que presenta Facebook, pues alguno de los links anteriores es útil, pero la cosa va más allá.

Antes de comentar mi opinión, hay que dejar en claro una cosa: Facebook se centra en las personas. A fb no le interesan los medios, ni los canales, pero si las personas y las relaciones peer-to-peer entre las mismas. Hace un tiempo comenté que ahora las personas pasan más tiempo frente al ordenador que frente a la televisión, y en estos tiempos también la necesidad de tener abierto Facebook ha pasado a ser una realidad constante. Para aportar un dato más relacionado con la importancia de Facebook en nuestro día a día, desde la salida de Windows Live Essentials 2011 hace un mes y su capacidad de integración con Facebook: Windows Live Messenger ha dado sopote a más de 1.5 billiones de minutos de chat en el chat de Facebook, lo que se dice poco.

Cuando abro mi ordenador necesito entrar en el flujo de información, esto suele ser revisar el correo, ver Facebook, actualizar mi Twitter, etc. Ahora bien, si facebook plantea una opción donde el correo y la mensajería se integren en un único canal, y a través de Facebook, pues me ahorraré bastante tiempo. Yo creo que por eso, Mark Zuckerberg ha decidido que esta será una killer feature para FB. Si bien Facebook está más orientado a las personas que a los profesionales, el alcance de los más de 500 millones de usuarios, mas la capacidad de integrarse con los correos más populares (gmail, hotmail, etc), será uno de los factores claves para que este mecanismo se convierta en una herramienta más de facebook. Volviendo al ejemplo anterior, yo al chat de facebook no lo utilizaba nunca, ahora la mitad del chat que recibo, suele venir de FB a través de Live Essentials.

La contrapartida a esta apuesta de FB, fué Google Wave. Pero el gran problema de GW fué que estaba enfocada hacia los diferentes tipos de comunicación, es decir, una apuesta tecnológica excelente, altamente extensible; pero que carecía de lo que a Facebook le sobra: enfoque personal. Es por eso que yo creo que esta apuesta de Facebook, puede ser un nuevo punto de inflexión en la forma en la que nos comunicamos, y que después de que se implante en FB, podamos comenzar a ver aplicaciones como Tweetdeck o Live Essentials que integren este modelo de comunicación para que lo utilicemos de forma dinámica.

Por ahora solo queda esperar …

 

Saludos @ Here

El Bruno

   

Fuentes

[VS2010] Utilizando Generics en nuestras pruebas unitarias

image47dd1de4

Buenas,

voy a seguir con el tabarrón de las pruebas unitarias, después de un fin de semana de descanso. Hoy le toca un poco a Generics, esa gran incorporación al Framework 2.0, que venimos disfrutando y sufriendo desde hace más de 5 años.  Supongamos la siguiente clase GenericSample, que demuestra toda la capacidad inventiva que posee mi cabezota un lunes, y en la que se utilizan Generics con un fin más que tonto:

   1: using System;

   2: namespace DemoUnittesting

   3: {

   4:     public class GenericSample

   5:     {

   6:         public string ObtenerDescripcion<T>(T value)

   7:         {

   8:             string ret;

   9:             if (value is int)

  10:                 ret = "es un int";

  11:             else if (value is long)

  12:                 ret = "es un long";

  13:             else

  14:                 throw new NotImplementedException("hay q implementar esto che !!!");

  15:             return ret;

  16:         }

  17:     }

  18: }

Pues cuando Visual Studio 2010, crea una prueba unitaria de la función ObtenerDescripcion<T>(), veremos que en realidad en la clase de tests se crean 2 funciones para poder emular el comportamiento utilizando Generics. En el siguiente ejemplo, vemos como se crea un test llamado ObtenerDescripcionTest() (línea 20) y que internamente llama a la función ObtenerDescripcionTestHelper() (línea 10) utilizando como tipo genérico un GenericParameterHelper, incluido dentro de la suite de testing de Microsoft.VisualStudio.TestTools.UnitTesting.

 
   1: using DemoUnittesting;

   2: using Microsoft.VisualStudio.TestTools.UnitTesting;

   3: namespace ElBruno.DemoUnitTesting

   4: {

   5:     [TestClass]

   6:     public class GenericSampleTest

   7:     {

   8:         public TestContext TestContext { get; set; }

   9:  

  10:         public void ObtenerDescripcionTestHelper<T>()

  11:         {

  12:             var target = new GenericSample(); 

  13:             T value = default(T); 

  14:             var expected = string.Empty; 

  15:             var actual = target.ObtenerDescripcion<T>(value);

  16:             Assert.AreEqual(expected, actual);

  17:         }

  18:  

  19:         [TestMethod]

  20:         public void ObtenerDescripcionTest()

  21:         {

  22:             ObtenerDescripcionTestHelper<GenericParameterHelper>();

  23:         }

  24:     }

  25: }

 

Hasta este momento es todo muy bonito, pero claro, el test no funciona ya que al trabajar con un tipo no reconocido se dispara la excepción de la clase GenericSample.

image

 

Si nos sentamos a pensar un poco y organizamos las pruebas unitarias, teniendo en cuenta los diferentes casos, pues deberiamos llegar a tener algo parecido a lo siguiente:

   1: using System;

   2: using DemoUnittesting;

   3: using Microsoft.VisualStudio.TestTools.UnitTesting;

   4: namespace ElBruno.DemoUnitTesting

   5: {

   6:     [TestClass]

   7:     public class GenericSampleTest

   8:     {

   9:         public TestContext TestContext { get; set; }

  10:  

  11:         public void ObtenerDescripcionTestHelper<T>(string expected = "")

  12:         {

  13:             var target = new GenericSample(); 

  14:             T value = default(T); 

  15:             var actual = target.ObtenerDescripcion<T>(value);

  16:             Assert.AreEqual(expected, actual);

  17:         }

  18:  

  19:         [TestMethod, ExpectedException(typeof(NotImplementedException))]

  20:         public void ObtenerDescripcionUtilizaTipoInvalidoEsperaExcepcion()

  21:         {

  22:             ObtenerDescripcionTestHelper<GenericParameterHelper>();

  23:         }

  24:  

  25:         [TestMethod]

  26:         public void ObtenerDescripcionUtilizaTipoInt()

  27:         {

  28:             ObtenerDescripcionTestHelper<int>("es un int");

  29:         }

  30:  

  31:         [TestMethod]

  32:         public void ObtenerDescripcionUtilizaTipoLong()

  33:         {

  34:             ObtenerDescripcionTestHelper<long>("es un long");

  35:         }

  36:     }

  37: }

 

Donde ya implementamos un mínimo de pruebas coherentes y podemos tener cubierta la funcionalidad de nuestra aplicación.

image

 

Pues aquí lo dejo Risa, y si alguno lo prueba me cuenta como ve el caso del String.

 

Saludos @ Here

El Bruno

   

[OPINION] El lento desangramiento de Java por parte de Oracle (desde el punto de vista de un newbie)

Buenas,

primero lo primero, aclarar que no soy un aficionado a Java y hace más de 5 años que no hago nada serio en Java. Pero es una plataforma de la que he aprendido mucho, cuando salió .Net, ý uno comenzaba a buscar fuentes de información, pues lo más rápido solía ser ver si el problema se había presentado en Java, e "inspirarse" en copiar la solución al mundo .Net. Después tuve la oportunidad de hacer algo medianamente grande en Java y me quedé asombrado de la cantidad de recursos que existían. Pero bueno, hasta ahí llegó mi camino en Java, y hoy lo sigo de cerca ya que mi chica trabaja en este entorno en aplicaciones realmente grandes y tengo varios amigotes que se encargan de llevar adelante estas aplicaciones.

Es por eso que cuando hace un tiempo, Oracle se "encargó de Java"; pues supuse que el camino de Java se complicaría un poco. Hoy por ejemplo, veo que la Apache Software Foundation (ASF) ha pedido a la comunidad de desarrolladores que voten en contra de la próxima versión de Java (Jave 7, hasta donde entiendo). Esto es ya que la nueva versión, además de las mejoras propias de una nueva versión, incorpora un nuevo modelo de licencias que no es a la que está acostumbrada la comunidad Javera.

Pero hago un poco de memoria, y claro, esto no es nuevo. Hace un par de semanas Doug Lea abandono el Java Community Process (JCP), como lo muestra la lista de correos de Java. Según lo que he entendido, el equipo del JCP es el encargado de definir los estándares para Java, en lo relacionado al lenguaje, a las licencias, a los mecanismos de distribución, etc.; vamos que en pocas palabras definen el futuro del lenguaje. Lo interesante del modelo propuesto en el JCP, es que cualquiera puede registrarse y participar; aunque después de leer un poco, parece que todo el mundo tiene voz, pero pocos tienen voto (normal en algo tan grande). Pero bueno, volviendo al bueno de Doug Lea que tiene un nombre de tío simpaticón, el tío abandona el comité y lo hace con las siguientes palabras:

I believe that the JCP is no longer a credible specification and standards body

Sun initially placed in the JSPA and Process documents enough rules to ensure that the JCP could foster innovation, quality, and diversity, independent of that from Sun, with few enough (albeit annoying) exceptions to allow JCP to drive consensual progress more successfully than seen in most standards bodies. However, some of these rules, and violations of rules, have been found to be the source of stalemates and lost technical ground. Rather than fixing rules or ceasing violations, Oracle now promises to simply disregard them. If they indeed act as they have promised, then the JCP can never again become more than an approval body for Oracle-backed initiatives.

For the core Java platform … the only existing vehicle for which I can foresee a useful role for the academic and research community is OpenJDK. OpenJDK is a shared-source, not shared-spec body, so is superficially not an alternative at all. But at this point, a Linux-style model for collaboratively developed common source is likely to be more effective in meeting upcoming challenges than is the JCP.

Donde la primera frase, ya de por sí es demoledora: "Creo que JCP no es una especificación creíble". Luego remata con frases como "en la época de SUN, existían diferencias con JCP; pero ahora ORACLE parece que directamente destruirá las bases de JCP". Además parece que los cracks de ORACLE intentan meter en el comité de JCP a "amiguetes", como la empresa Hologic , que seguramente será para poder llevar los intereses "to home". Si comienzas a buscar en internet relacionada, parece una novela/culebrón caribeño la cantidad de idas y vueltas, peleas y amiguismos que hay alrededor de este tema.

Cuando armamos la charla con Pablo de JAVA vs NET, empecé a echarle un vistazo a las noticias relacionadas con Java y fué por enero, donde los analistas de ZDNet definían el futuro de Java como "Business as Usual". Es decir, Oracle trataría de sacar el mayor provecho en €uros posible a partir de esta plataforma y otros productos como MySQL, OpenSolaris, etc. Yo personalmente, no creo que esté mal lo que está haciendo ORACLE, por una parte está cambiando del modelo de negocio de Java para que sea más rentable, pero por otra parte no se ha olvidado que la base de Java son las comunidades y por eso quiere establecer contacto con las mismas.

Yo creo que en el camino perderá mucha gente, se desangrará de a poco; pero como la base de ORACLE sigue siendo eso de los SELECT, INSERT, UPDATE y DELETE, además de un Oracle Application Server simplemente bestial; a la larga las personas que se queden en la dupla ORACLE/JAVA (lo siento a partir de ahora ORACLE va delante), serán principalmente los desarrolladores de negocio y aquellos proyectos que puedan sobrevivir en base a contribuciones externas. El golpe/palo será muy fuerte, porque claro esto afecta  productos como la castaña de OpenOffice (en realidad el fork de LibreOffice), la base de desarrollo de Android, etc.; y por ahora ORACLE está teniendo disputas con todos. La mentalidad es clara:

¿si podemos aprovechar la plataforma armada para sacar unos €uros, porqué no hacerlo?

Y para cerrar un comic genial, porque claro a los que trabamos en el mundo Microsoft esto no nos toma por sorpresa Demonio

image

Comic: http://www.linuxhispano.net/2010/08/17/oracle-vs-android/

 

Saludos @ Home

El Bruno

   

PD: prometo no escribir más un post sobre temas que no conozco, pero es que gracias a Java aprendí conceptos ágiles, conocí herramientas para las pruebas unitarias, inyección de código, etc. Vamos que mucho de lo que vemos hoy en .Net y que se nos presenta como "una novedad" existe y desde hace mucho en Java; bajo otras premisas pero existe, por eso el camino para Java lo veo incierto Confundido

Fuentes