August 2011 - Artículos

image47dd1de4

Buenas,

yo no soy muy amigo de las expressiones regulares, seguramente es porque salvo las más simples, suelen ser un infierno de caractéres en una single line que pueden ahorrarte trabajo pero darte más de un dolor de cabeza. Además sumado a la cantidad de ejemplos que hay en internet de diferentes expresiones regulares para todo tipo de escenarios, pues la cosa puede ir muy mal casi sin darte cuenta.

¿Por qué puede ir mal?, pues porque por más que no lo parezca, para resolver una RegExp, hay que procesar la misma y este proceso, dependiendo del dato de entrada puede dar lugar a tiempos de proceso muy largos o inclisve memory leaks.

¿A qué ahora no te parece tan bonito eso de copiar de internet una línea y ponerla en tu código?

El artículo de la MSDN Magazine: “Regular Expression Denial of Service Attacks and Defenses” trata este tema y además nos muestra como la mala implementación de RegExp puede llevar a ataques DoS.

Además, a partir del resultado de una evaluación de una RegExp podemos crear un bug directamente en Team Foundation Server 2010. Esta herramienta es parte de SDL (Security Development Lifecycle) y si bien la integración con TFS es mínima, nos pemite crear Bugs en Team Foundation Server.

Por ejemplo si analizamos la RegExp “^(\d|\d?)+$”, con uno de los formularios más feos que he visto en mucho tiempo:

image

A partir de la misma podremos crear un Bug en nuestro Team Project

image

con los campos:

Title: Exponential execution time in regular expression pattern ^(\d|\d?)+$

Description: The regular expression pattern ^(\d|\d?)+$ can operate in a worst-case exponential execution time, potentially causing a denial of service to the application.

y dejarlo como un punto a solucionar sin que se nos escape Open-mouthed smile

Asi que ya sabes, antes de utlizar una RegExp, darle un repaso con esta herramienta para analizar vulnerabilidades.

 

Saludos @ Here

El Bruno

   

Descarga: http://www.microsoft.com/download/en/details.aspx?id=20095

Referencia: http://msdn.microsoft.com/en-us/site/ff646973

Security Development LifeCycle: http://blogs.msdn.com/b/sdl/archive/2010/10/12/new-tool-sdl-regex-fuzzer.aspx

Buenas,

hace una pila de años, gracias a mi amiga la flaca cayó en mis manos El Hobbit de JRR Tolkien. Como era un tipo de lectura nueva para mí, pues en un par de días las 324 páginas del libro habían sido deboradas, y en ese momento la flaca me prestó la trilogía del Señor de los Anillos, pero aquí la cosa no fue tan bien.

En primer lugar por la cantidad de páginas que tienen los librakos. A ver, que yo entiendo que contar tantas historias paralelas al mismo tiempo requiere espacio, pero tantos kilogramos de peso para un anillo que se puede conseguir a €20 en internet sin gastos de envío me parece una locura.

En segundo lugar: los bosques. Ya sé que es un topicazo, pero juro que después de leer más de 40 páginas describiendo un *** bosque de arbolitos, pues me cansaba. He de admitir que hasta hace unos meses en un viaje a Cánada, mis conocimientos sobre árboles se reducían a saber diferenciarlos entre:

  • árbol
  • pino
  • palmera

En Cánada intentaron que aprenda conceptos como sauce llorón, eucalipto, etc.; pero estoy convencido que con árbol, pino y palmera puedo tirar otros 30 años sin ningún problema.

Finalmente, la mala planificación, especialmente el Gandalf ese. Es increíble que un inmortal, con la sabiduría que ha acumulado durante siglos, frente a una de las campañas más difíciles de todos los tiempos, ponga al frente a 4 hobbits. Que ojo, yo no tengo nada contra Frodo, Sam, Merry o Pippin; es más me caen muy bien este tipo de personas. Siempre dispuestas a tener una jarra de cerveza en sus manos, y cantando canciones de fiesta. Vamos que son unos tipos de lo más simpáticos. Pero de ahi, a poner en sus manos el destino de la tierra media, pues me parece una falla de planificación bestial. Si en lugar de 4 hobbits le das el anillo a un Navy Seal, o a algo similar en esa época, pues te queda un cuento de 40 páginas.

Si este hubiese sido un proyecto de informática, pues supongo que el Gandalf hubiese creado la siguiente historia de usuario y listo, a tirar millas:

Yo como un habitante de la tierra media

deseo destruir el anillo este de aquí

para no tener miedo al ojo de Sauron

¡Punto pelota! Con esto y un buen speech, el mago blanco/gris embauca a 4 o 5 razas diferentes para llevar un anillo hasta Mordor, cuando por internet en 4 o 5 días está listo.

image

Además, eso de que era gris, se pegó un baño y después fué blanco, tampoco cuadra demasiado. A simple vista parece que no había buen diálogo con los integrantes del equipo, o que los hobbits no eran muy avispados que digamos porque que hubiese pasado si se da el siguiente diálogo:

Frodo: Gandalf, ¿es cierto qué sos uno de los magos más poderosos?

Gandalf: bueno no es para tanto, pero sí, soy un mago de los buenos, buenos.

Frodo: y eso que hiciste el año pasado, de montar en un águila gigante, ¿lo podes hacer siempre?

Gandalf: en un águila, un halcón,  un buen dragón; depende del día.

Frodo: y por ejemplo un águila, ¿que autonomía tiene?, ¿podría llegar hasta Mordor? ¿hasta el monte del destino?

Gandalf: las águilas molan che, llegan hasta Mordor y más lejos aún.

Frodo: y no se te ha ocurrido agarrar el anillo, subirte al águila, volar hasta el monte del destino … ? bueno ya me entendes Open-mouthed smile

Nota: en este video podes resumir 9 horas de película en 2 minutos.

Así que ya sabés, como enseñanza de las más de 1200 páginas y las más de 9 horas de películas:

  • Siempre redacta bien tus historias de usuario.

Es importante que las mismas reflejen objetivos realizas que puedan ser llevamos a cabo en digamos una o 2 semanas y que además puedan ser testeados

  • Habla y comunicate con tu equipo.

No tengas miedo de hacer preguntas difíciles o poco agradables. Por lo general, estas preguntas hechas al principio de un proyecto, son más fáciles de solucionar que al final del mismo.

 

Saludos @ Here

El Bruno

   

Publicado 30/8/2011 11:53 por El Bruno | 2 comment(s)
Archivado en:

image47dd1de4

Hi,

hace unos días, los amigos evangelistas de microsoft, lanzaron un nuevo training kit, esta vez dirigido a aquellas personas que quieren conocer desde cero Team Foundation Server. Digo desde cero, porque los contenidos son de un nivel muy básico; desde como proteger un archivo en el repositorio de código fuente, hasta como crear un elemento de trabajo o crear una consulta de WorkItems. Es por eso que el nombre es

Introduction to Team Foundation Server 2010 Training Kit

Lo que si me ha gustado es ver que para la creación del propio Training Kit, han utilizado Team Foundation Server. Eso viene bien para desmentir eso de que en casa de herrero cuchillo de palo.

Picture1

 

Saludos @ Here

El Bruno

   

Descarga: http://www.microsoft.com/download/en/details.aspx?id=27152

image47dd1de4

 

Team Foundation Server 2010

WorkItem Tracking

 

Source Control

 

Team Build

 

Reports

 

Testing

 

Collaboration

 

Client Object Model

 

Office

 

Team Web Access

 

Administración

 

Herramientas

 

TFS Integration

 

Visual Studio 2010

 

Visual Studio Gallery

 

Varios

 

Team Foundation Server 2008 y 2005

How To

Herramientas

Team System Web Access

TFS Errors

TFS Build

TFS WareHouse e Informes

Metodologías y Process Templates

Administración y mantenimiento

Varios

 

Saludos @ Here

El Bruno

   

image47dd1de4

Buenas,

cuando utilizas las power tools desde la línea de comandos es muy probable que te encuentres con el siguiente error:

   1: C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>;tfpt builddefinition /diff 
   2: "AgileLabs\Team Build.Java Maven 15" "AgileLabs\Team Build.Java Maven 15.2"
   3: Unable to determine the source control server.
   4:  
   5: C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>

image

Esto sucede porque las Power Tools intentan ejecutar el comando desde un directorio que no pertenece a ningún workspace.

La solución consiste en cambiar a un directorio, que esté mapeado en un Workspace y lanzar el comando nuevamente desde el mismo. El siguiente ejemplo, cambia a mi disco de 4 TB en mi notebook E: y lanza nuevamente el comando desde el mismo:

   1:  
   2: C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>;tfpt builddefinition /diff 
   3: "AgileLabs\Team Build.Java Maven 15" "AgileLabs\Team Build.Java Maven 15.2"
   4: Unable to determine the source control server.
   5:  
   6: C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>;e:
   7:  
   8: E:\srcBcapuano\AgileLabs>;tfpt builddefinition /diff 
   9: "AgileLabs\Team Build.Java Maven 15" "AgileLabs\Team Build.Java Maven 15.2"
  10: Querying Build Definitions...
  11: Examining Build Definition: Team Build.Java Maven 15...
  12: Loading Process Parameters...
  13: Loading Custom Assemblies...
  14: Examining Build Definition: Team Build.Java Maven 15.2...
  15: Loading Process Parameters...
  16: Loading Custom Assemblies...
  17:  
  18: E:\srcBcapuano\AgileLabs>

 

image

Una solución SOS >> simple, obvia y sencilla Open-mouthed smile

Saludos @ Here

El Bruno

   

image47dd1de4

Buenas,

hace 2 días comenté el lanzamiento de una nueva versión de Team Foundation Server Power Tools para Team Foundation Server 2010. Una de las opciones que menos se utilizan en esta herramienta es la capacidad de interactuar con nuestros contactos de Lync o Live Messenger directamente desde el panel Team Explorer en Visual Studio 2010.

Si no tenemos configurado nuestro sistema de mensajería en las Power Tools lo primero que veremos cuando nos conectamos a un Team Project será un listado de usuarios como el siguiente, donde podemos realizar tareas a nivel de Team Foundation, pero no a nivel de IM:

image

Para poder habilitar la integración con un sistema de mensajería instantánea, seleccionamos el nodo [Team Members], desplegamos el menú contextual y luego seleccionamos la pestaña [Instant Messaging]. En este punto debemos completar los datos con la dirección de correo que utilizamos.

image

Y listo, la próxima vez que abramos Visual Studio 2010 y tengamos en ejecución nuestro cliente de IM, ya podremos ver la lista de contactos con las acciones disponibles para Team Foundation y para IM

image

 

Saludos @ Home

El Bruno

   

image47dd1de4

Buenas,

hace unos días Brian Harry comentó que durante el mes de agosto veríamos una nueva versión de las Power Tools para Team Foundation Server 2010. Hoy mientras navegaba en los foros y los QA de las mismas, me encuentro que ya ha sido liberada esta versión.

Entre las novedades que me interesan en las mismas me dedicaré a probar las siguientes:

 

Mejoras en la integración con Windows explorer.

Especialmente en lo referido a poder trabajar utilizando creedenciales de otro dominio. En mi caso, que tengo mi ordenador en el dominio de Avanade, pero trabajo con otros clientes, en otros dominios, por ejemplo elbruno@mordor.com, elbruno@narnia.com, pues no podía trabajar directamente desde el explorador, ya que las credenciales que se le pasaban a estos dominios siempre eran las de Avanade. Punto bueno para las Power Tools Open-mouthed smile

WorkItem Search

Pues si bien es increíble que recién lo veamos ahora (después de casi 4 versiones oficiales de Team Foundation) ya está aquí > “Búsqueda de WorkItems”. Inicialmente viene como una caja de texto en la toolbar en el IDE, pero bueno algo es algo. Un ejemplo con búsqueda muy simple, pero que retorna resultados interesantes.

image

Mejoras en Builds

Pues simplemente teniendo la capacidad de comparar 2 definiciones de builds ya me siento feliz. La siguiente imagen muestra la línea de comandos que he lanzado para poder comparar 2 definiciones de build

image

y luego utilizando nuestro querido WinDiff podemos ver las diferencias en la definición de ambas builds, por ejemplo con el nombre (obvio, ¿no?), directorio de drops, etc.

image

Y además el soporte para MAVEN 3 es algo que también se agradece cuando trabajas con Java.

Test Attachments Clean Up

Sobre esta aplicación escribi hace algún tiempo, y si bien no es un “must have”, es un “must know”; porque cuando tu base de datos crezca hasta el infinito y más allá, y los de sistemas te recuerden lo que cuesta un bit y lo que cuesta un backup, pues esta herramienta te puede dar una mano para limpiar información inútil.

Y lo mejor …

Ya no es necesario desinstalar la versión anterior de las TFPT para instalar la nueva versión, Inplace Upgrade supported Open-mouthed smile

 

Saludos @ Home

El Bruno

   

Descarga: http://visualstudiogallery.msdn.microsoft.com/c255a1e4-04ba-4f68-8f4e-cd473d6b971f/view/Discussions/5

image47dd1de4

Buenas,

cuando escribes posts y tienes un ejemplo de código para compartir, por lo general tienes que eliminar a mano los directorios “bin”, “obj”, “test results”, etc para que el zip/rar no sea muy grande. Pues bien, en Visual Studio Gallery podemos descargar una extensión que se encarga de limpiar estos directorios (aunque la integración con Visual Studio es un poco manual) y nos ahorra los 3 minutos de trabajo.

Los fuentes además están compartidos en CodePlex, así que si tienes alguna modificación o sugerencia, pues lo puedes compartir y mejorar ahi mismo Open-mouthed smile

 

Saludos @ Home

El Bruno

   

Descarga: http://visualstudiogallery.msdn.microsoft.com/bca632e0-3948-43c8-b337-da47275717b6

Fuente: http://blogs.msdn.com/b/rjacobs/archive/2011/07/24/clean-project-cleans-visual-studio-solutions-for-uploading-or-email.aspx

image47dd1de4

Buenas,

tarde de viernes para promocionar 2 excelentes extensiones para Team Build 2010 publicadas en estos días en CodePlex: NuGetter y TfsVersioning.

La primera, NuGetter es una extensión para un proceso de Team Build 2010 que permite generar paquetes que luego pueden ser distribuidos con NuGet. Esto es algo que estaba por llegar en algún momento, y gracias a marknic lo tenemos disponible. Estás son algunas de sus características:

  • Permite trabajar con una o varias soluciones y con una o varias configuraciones
  • La administración de las versiones de los ensamblados se realiza independientemente (con TfsVersioning)
  • Permite crear un paquete y publicarlo en un repositorio de NuGet
  • Permite trabajar en un entorno de prueba utiilzando "Push/Deploy"
  • Los repositorios NuGet, pueden ser un directorio local, sitio web o recurso compartido de red
  • Y mucho más

El mismo se puede descargar desde http://nugetter.codeplex.com.

Por otra parte tenemos a TfsVersioning, también del mismo autor que nos brinda una nueva solución al eterno problema del versionado de los ensamblados y las compilaciones de Team Foundation. Por lo que he visto, es uno de los más completos, ya que si bien “solo modifica archivos AssemblyInfo”, tiene resueltos muchos aspectos como la integración con el SC, el modo de trabajo con un seed único por ensamblado, etc.

Además realiza una cosa muy interesante que es definir los atributos adicionales de un ensamblado como son Company, Copyright, etc.

El mismo se puede descargar desde http://tfsversioning.codeplex.com.

 

Saludos @ Home

El Bruno

   

Descargas:

http://nugetter.codeplex.com/

http://tfsversioning.codeplex.com/releases/view/70070

Publicado 12/8/2011 17:58 por El Bruno | con no comments

 

Buenas,

hoy toca una de dragones, pero sin mazmorras. Ahí va:


Había una vez, en un reino muy pero muy lejano, una princesa llamada Martina. Como casi todas las princesas en los cuentos, la princesa Martina era muy bonita y estaba esperando conocer a un principe azul para casarse, tener principitos y vivir felices como los conejitos de Pascua. Cuando la princesa estuvo en edad de poder casarse, su padre, un rey muy guapo e inteligente, el rey Bruno; decidió poner a prueba a los pretendientes para ver cual era el mejorcito.

El rey ya sabía como se las gastaban los principes de esa época, así que no tenía muchas esperanzas y puso el listón bastante bajo:

El primero que logre dar caza al dragón Andrés podría casarse con la princesa Martina en menos de 30 días.

Pues listo, a partir del 29 de Marzo se abrían las inscripciones durante 2 días para poder casarse con la princesa. La caza de dragones era algo común en esa época, y el dragón Andres solo se encontraba a 100 millas desde el castillo del rey, y era un dragón mas bien viejo y en decadencia. Es por el rey Bruno puso este límite de 30 días y obviamente una cuota de inscripción de 500 coronas por casa.

Cuando se finalizó el proceso de incripción, 3 casas reales se habían dado de alta para la caza del dragón, cada una con una estrategia diferente:

  • En primer lugar estaba la casa de Lannister, con el príncipe Edu a la cabeza. Los Lannister, como todo el mundo sabe, son famosos por tener mucho dinero. Así que habían contratado al mejor grupo de caballeros llamados “Caballeros Incorporated SA” (CISA), que aseguraban dar caza al dragón de la manera más rápida conocida y con los mejores recursos disponibles. Cuando comentaron en la taberna sus experiencias pasadas, resultó ser que entre las filas de CISA existían varios caballeros que habían sido instruidos en la Academia Real para la Caza del Dragon (ARCD), con las mejores calificaciones que existían.
  • En segundo lugar estaba la casa de Robles, con el príncipe José a la cabeza. Los Robles, que eran grandes ingenieros, presentaron el prototipo de un arma de guerra desconocida hasta el momento: la lanza caza-dragones LCD4000. Por lo que se comentaba en la calle, esta lanza permitía matar a un dragón a 200 pasos de distancia, con lo que el riesgo de morir en el intento era casi nulo. Además, los dibujos de la lanza, eran realmente espectaculares (era una lanza dorada !!!).
  • En tercer lugar estaba la casa de Foster, con el principe Dani a la cabeza. La casa de Foster era famosa por tener conexiones por todo el reino medio, y en este caso en particular, aseguraron tener a un destacamento mata dragones en la villa de Horseffer. Y como todo el mundo sabe, esta villa está a sólo 5 millas de la cueva del dragón Andrés. Solo era necesario soltar un cuervo con el mensaje y en pocos días el destacamento sería el primero llegar al dragón, y los Foster serían los primeros siendo los que menos habían trabajado.

Así que con las inscripciones cerradas el 31 de marzo, el rey Bruno dió comienzo a la casa del dragón el 1ro de Abril con una gran fiesta en la que invitó a todas las casas. Al finalizar la fiesta, casi 3 días después, volvió a convocar a todas las casas para el 1 de Mayo para ver el resultado y para ver quien había dado caza al dragón Andrés en primer lugar.

Así que, el 1 de mayo, con todo preparado para conocer al ganador el rey Bruno se encontró con una fiesta sin ningún invitado, ya que ninguna de las 3 casas se había presentado. Como estaba un poco intrigado, llamó al espía de la corte y el mismo le contó lo que había sucedido con las casas. Estas son las palabras del espía:

- Los Lannister se desentendieron del asunto, habiendo pagado por adelantado a “Caballeros Incorporated SA” el tema estaba resuelto. Parece que “Caballeros Incorporated SA” con sus caballeros dorados a la cabeza, se había comprometido a la caza de otros dragones en paralelo y algunos estaban ya de vacaciones con el dinero cobrado. Por lo que subcontrataron  a “Malhechores y Bandidos” (MB) para que se carguen al dragón. Por esos días, el líder de MB tenía pendiente pagar unas deudas con una salón de fiestas, con lo que destino parte del dinero a pagar esa deuda y con el resto se pegó una fiestorra con sus compañeros, de esas fiestas que hacen historia. Después de esto, el grupo de MB quedó reducido a muy poca gente, pero el líder de MB era una persona de honor, así que le pago 10 coronas al herrero del pueblo para que se encargue del dragón.

El herrero del pueblo era famoso por ser un ex-caballero, todas las noches con su copa de cerveza contaba historias pasadas sobre caza de dragones y sobre salvar a princesas en peligro. Pero lo que el pueblo no sabía, es que todas estas historias eran mentiras; y como ya había aceptado las 10 coronas, pues la única solución que se le ocurrió fue enviar a su aprendiz a la caza del dragón. Y poco más se sabe sobre esta historia, porque algunas fuentes aseguran que cuando el aprendiz asomó su cabeza en la cueva, el dragón Andrés se lo zampó de un bocado, y otros dicen que huyó para el mar para volverse marinero.

Por otra parte los Robles para asegurar la victoria, comenzaron a crear la lanza caza-dragones LCD4000. Pero el grupo de ingenieros que había diseñado los bocetos de la lanza, solo se había quedado en eso, en bocetos. Existían muchos problemas técnicos que todavía no tenían solución, como por ejemplo procesar eso que llegó de una tierra lejana llamado pólvora que era muy bueno para reventar muros y puertas, pero poco fiable para enviar una lanza en la dirección correcta. Después de procesar esta información con detalle, llegaron a la conclusión que podrían crear una versión mejorada de la lanza caza-dragones LCD4000, se trataba de la lanza caza-dragones LCD5800 Ultimate, pero para el año entrante. El príncipe José compró la idea d la LCD5800 Ultimate (si algo se llama Ultimate tiene ser lo mejor de lo mejor) y decidió esperar hasta el año entrante para conseguir pareja.

Finalmente los Foster, fueron los que más cerca estuvieron pero tampoco mataron al dragón Andrés. El problema fue algo muy simple. El cuervo con el mensaje para matar al dragón llegó correctamente a la villa de Horseffer. El encargado del destacamento entendió el mensaje, pero no se imaginó que era al dragón Andrés al que había que matar. Pensó que había que ser los mejores y se dirigió a la cueva del dragón Lucio, un dragón famoso por su mala leche y por el que más de una casa real ofrecía una recompensa. De esta forma, caso al principe y sumamos unas coronas para la villa.

Así que después de 15 días asediando al dragón y con sus filas mermadas, el encargado solicitó unas coronas más a la casa de Foster. Cuando llegaron estas coronas y con el tiempo un poco apretado, el encargado contrató con un caballero que aseguraba trabajar en “Caballeros Incorporated SA”, que tenía unas referencias increibles (incluso había sido adiestrado en la Academia Real para la Caza del Dragón), para que de caza al dragón.

Este caballero, tuvo un conflicto moral, ya que estaba también realizando el mismo trabajo (algo así) para otra casa, con lo que se quedó con el 80% del dinero y envió a su escudero para que se encargue del dragón. Aquí también hay teorías encontradas al respecto, unos dicen que sirvió de comida del dragón Andrés, otros comentan que también se piró de marinero para tierras lejanas.

Esto fué lo que le comentó el espía de la corte al rey Bruno, asegurando además que las 3 casas pedían perdón y se quedaban en deuda con el rey Bruno. Pero “esto no es todo, tome asiento mi rey; queda algo más que debe saber”, le dijo el espía. Esto es lo siguiente que le contó el espía:

- Parece que durante el mes de plazo que dió el rey Bruno, la princesa Martina se había engatusado 1000 coronas que se cobraron por la caza del dragón, se enamoró de un marinero y se escapó a tierras lejanas. Dicen que el marinero era muy parecido al aprendiz del herrero o al escudero del caballero, nunca se sabrá porque el barco ya ha zarpado y no se sabé su destino.

El rey Bruno, que era rey y no era tonto, después de darle una pensada al asunto le dijo al espía:

- Esto no ha salido tan mal. Por un lado tengo a 3 familias reales que me deben un favor y por otro, mi niña emprendió un viaje para conocerse a si misma con los gastos pagos, sin que yo ponga una corona. Martina es inteligente, seguro que sabrá arreglarselas con sus propios medios. Y además me ha dejado 500 coronas para que me de algún gusto con la reina.

Asi pues, todos quedaron felices; algunos con unas coronas más, otros con unas coronas menos, la princesa con un viaje pago por el mundo gratis, el rey con más tiempo para estar con la reina, y el dragón Andrés que pensaba que no se zamparía a un humano en mucho tiempo, pues tuvo una sorpresa y se embulló a uno que parecía ser un escudero o un aprendiz de herrero.

Fin.


Si tienes un poco de experiencia en el mundillo de la consultoría informática, seguramente habrás captado las similitudes:

  • Grandes consultoras que se dedican a subcontratar a otras empresas más pequeñas, que a su vez subcontratan a otras, etc.; y al final los proyectos los termina haciendo Paco, el becario en prácticas trabajando gratis de lunes a lunes.
  • Otras consultoras que poseen los mega-ultra-artefactos que permiten realizar el trabajo en mitad de tiempo. Por ejemplo: alguna vez me he encontrado con unos diseños excelentes de unos productos geniales, que finalmente resultaban ser puras interfaces de componentes, pero que luego debían ser implementadas y con un esfuerzo imposible.
  • Consultoras con “delegaciones” en Narnia o sitios desconocidos, de los que nadie nunca oyó hablar, y que seguramente son lo mejor de lo mejor, como el dragón Lucio.

Sobre ALM poco y nada, pero en el cuentito todos quedaron contentos, en la vida real esto no es tan así y hay que dar explicaciones. Asi que ya sabes, si alguna vez estas en un proyecto donde sientas que sos parte de alguna de las casas reales del cuentito … pues buen momento para proponer e impulsar un cambio Open-mouthed smile

 

Saludos @ Here

El Bruno

   

Publicado 11/8/2011 22:31 por El Bruno | 2 comment(s)
Archivado en: ,

image47dd1de4

Buenas,

hace ya un tiempo publiqué un parche no oficial para mejorar el rendimiento del diseñador de WorkFlow Foundation en el IDE de Visual Studio 2010. Yo lo utilizo bastante para editar definiciones de Team Build 2010, y es por esto que me tocaba bastante las narices tener un IDE tan lento.

Ayer los amigos de Redmond (después de quejas generalizadas de bastante gente) han liberado un HotFix que, entre otras cosas, promete solucionar este problema. Las lista completa de issues solucionados se puede leer en el KB 2468871 en la seccion More Information.

El parche para .Net se puede descargar desde  http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=3556

El HotFix para Visual Studio 2010 se puede descargar desde http://archive.msdn.microsoft.com/KB2484841

 

Saludos @ Home

El Bruno

   

Fuente: http://blogs.msdn.com/b/buckh/archive/2011/08/09/patch-to-improve-perf-and-reliability-of-the-workflow-designer.aspx

Descarga: http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=3556

Publicado 10/8/2011 9:56 por El Bruno | con no comments

image47dd1de4

Buenas,

como estoy a punto de irme de vacaciones y no pienso responder ningún correo con preguntas o quejas al respecto, aquí les dejo un comando que habilita a Visual Studio 2010 para que pueda utilizar más de 2 GB de RAM en Windows Vista o Windows 7.

1. Abrir la consola de comandos de Visual Studio 2010. [Start // All Programs // Visual Studio 2010 // Visual Studio Tools // Visual Studio Command Prompt 2010]

2. Ejecutar el siguiente comando

Editbin.exe / LargeAddressAware “%Program Files%\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe”

3. Cerrar la consola

4. Lanzar Visual Studio 2010

Bueno, más simple agua. Y si lo has hecho sin siquiera preguntarte que es el comando “Editbin.exe /LargeAdressAware” … pues eres un poco criminal. Lo primero que deberías haber realizado es un BACKUP de DevEnv.exe >> Animal de guano !!!

En primer lugar el comando anterior (cuya referencia en msdn puedes leer aquí) permite que una aplicación pueda manejar más de 2GBs de RAM en un entorno x86 o x64, basicamente reescribe el COFF de la aplicación o ensamblado para dar este soporte.

De acuerdo al tipo de compilación, al entorno y a la utilizacion de este flag, estos son los parámetros de memoria que podrá manejar una aplicación (fuente):

AnyCpu (default)
32 bit OS VAS = 2GB (default)
32 bit OS LAA VAS = 3GB
64 bit OS VAS = xTB (default)
x86
32 bit OS VAS = 2GB (default)
32 bit OS LAA VAS = 3GB
64 bit OS VAS = 2GB (default)
64 bit OS LAA VAS = 4GB
x64
64 bit OS VAS = xTB
LAA = LARGEADDRESSAWARE
x = 6 or 7 TB

Como podemos ver la opción LAA realmente significa un cambio importante en entornos x64, pero para entornos de 32 bits, pues se gana solo 1 GB.

¿Y esto es util para Visual Studio 2010? pues aunque parezca una exageración, en determinados escenarios ese extra de RAM puede significar la diferencia, especialmente si el IDE se encarga de crear ensamblados realmente grandes y el disco se frie en la compilación de esos ensamblados.

Finalmente recordar lo que dije al principio, esto no está soportado asi que no me envien correos con sus BSOD, ni se acuerden de mi santa madre.

Otro par de links interesantes donde explican como tunear un poco más a Visual Studio 20XX para que pueda trabajar con más de 2GB de RAM:

 

Saludos @ Here

El Bruno

   

Referencia: http://msdn.microsoft.com/en-us/library/xd3shwhf.aspx

Fuente: http://bytes.com/topic/c-sharp/answers/586209-editbin-largeaddressaware

Publicado 9/8/2011 12:08 por El Bruno | con no comments

image47dd1de4

Series

  1. HowTo: Agregar un estado en la definición de un WorkItem (I)
  2. HowTo: Agregar un estado en la definición de un WorkItem (II)

Buenas,

en el post anterior vimos como agregar un nuevo estado a la definición de estados de un WorkItem de tipo Task para MSF for Agile 5.0. En este post agregaremos una serie de condiciones que se deben cumplir en las acciones de cambio de estado.

Una condición de negocio puede ser la siguiente:

Una Task no puede pasar del estado [Proposed] a [Active] si no se ha completado la información de horas estimadas, completadas y pendientes definida en la misma.

Para lograr cumplir esta condición seguiremos los siguientes pasos, a partir de la definición de la Task que completamos en el post anterior.

Tutorial

1. Editamos la definición de una Task y accedemos a la pestaña [Workflow]

2. Seleccionamos la transición [Proposed >> Active], desplegamos el menú contextual y seleccionamos la opción [Open Details]

3. Seleccionamos la pestaña [Fields] para agregar los campos sobre los que queremos trabajar.

4. Agregamos un nuevo campo, seleccionando [Microsoft.VSTS.Scheduling.OriginalEstimate]

image

5. En la pestaña [Rules], agregamos una nueva regla. En este caso para definir que el campo es requerido

image

6. Agregamos también los campos [Microsoft.VSTS.Scheduling.RemainingWork] y [Microsoft.VSTS.Scheduling.CompletedWork] como campos requerido en la transición.

image

7. En el diagrama del Workflow podremos ver como estos campos, se marcan como fields de trabajo en la transición [Proposed >> Active]

image

8. Guardamos la definición de la Task en el servidor, refrescamos el Team Explorer y creamos una nueva tarea.

9. Cuando creamos la misma podemos ver que el estado inicial [Proposed] no presenta ninguna restricción al momento de crearla.

10. Cuando cambiamos el estado a [Active] vemos que los campos de esfuerzo (horas) se marcan como activos, con lo que se cumple la regla que definimos para la transición.

image

 

Saludos @ Here

El Bruno

   

image47dd1de4

Series

  1. HowTo: Agregar un estado en la definición de un WorkItem (I)

 

Buenas,

hoy con el software ya instalado comenzaremos a modificar la definición de un WorkItem. Para esto trabajeremos sobre un Team Project de prueba llamado [AgileBlog]. Los siguientes pasos demuestran como modificar la definició de un WorkItem

Tutorial

1. Abrir Visual Studio 2010 y acceder al menu [Tools // Process Editor // WorkItem Types // Open WIT from Server]

2. Seleccionar el TP correspondiente y dentro del mismo seleccionar el WIT Task.

3. En este punto veremos el formulario de edicion para la definición de un WI en Visual Studio 2010. La pestaña WorkFlow nos muestra el proceso actual con los estados por los que pasa el WorkItem. Como vemos en el mismo, el primer estado es el estado ACTIVE.

image

4. Activamos la ToolBox de Visual Studio 2010 y en la misma vemos que tenemos elementos de tipo Estado y Transition para trabajar sobre la definición del WorkFlow.

image

5. Agregamos un nuevo estado y modificamos el nombre del mismo a [Proposed].

image

6. Agregamos transiciones para poder cambiar de estado de [Proposed] a [Active] y de [Active] a [Proposed], pero no habilitamos el cambio de [Closed] a [Proposed]

image

7. Como la primer transición está asociada a [Active] y supongo que ya habrás intentado con el mouse asignarla a [Proposed], cambiaremos la misma para que el primer estado sea [Proposed]. Para esto seleccionamos la transición, desplegamos el menú contextual y seleccionamos la opción [Open Details]. Luego, en el formulario de edición, seleccionamos [Proposed] como el estado destino de la transición.

image

8. En este punto, los estados y transiciones deben ser similares a la siguiente imagen.

image

9. Si validamos el esquema que hemos definido, desplegando el menú conextual y seleccionado la opción [Validate All], veremos que para que la definición sea correcta, debemos agregar por lo menos una razon (Reason) a los cambios de estado en nuestro workflow.

image

10. Editamos la transíción [Proposed >> Active], seleccionamos la pestaña [Reasons] y editamos las Reasons para que existan una razón por defecto llamada [Accepted]

image

11. En la transición [Active >> Proposed] agregamos 2 posibles reasons: [Rejected] y [More Information is Required] como muestra la siguiente imagen.

image

12. Si expandimos el gráfico para ver el detalle de las transiciones, podremos ver los cambios que hemos aplicado en la tarea.

image

13. Guardamos la definición del WorkItem. Este cambio se aplica en el servidor TFS, por lo que puede tardar un poco. Seleccionamos el Team Project, en el panel del Team Explorer y refrescamos el contenido del mismo. Si creamos una nueva Task, veremos que el estado inicial es [Proposed] y que la Reason es [New]

image

14. Una vez creada la Task, vemos que es posible cambiar el estado a [Active] y que la Reason propuesta es [Accepted]

image

15. Finalmente vemos que si cambiamos el estado de [Active] a [Proposed], las Reason propuestas son las que definimos en los pasos anteriores.

image

 

Saludos @ Home

El Bruno

   

image47dd1de4

Buenas,

en primer lugar un disclaimer:

En el 99,999% de los casos, la definición por defecto de un WorkItem es suficiente para un equipo de trabajo. Que sea posible modificar la definición de un WorkItem no significa que debas hacerlo.

Ahora que has pensado si la definición de estados que posee por defecto un WorkItem es necesario y has llegado a la conclucsión de que necesitas modificarla, pues adelante. Para esto tenemos alguna de las plantillas que se pueden instalar en Team Foundation Server 2010, en este caso trabajaremos con la definición de una Task de MSF for Agile 5.0 (la definición formal de Agile en MSDN se pueden consultar desde aquí) .

Una Task posee los siguientes estados

Task state diagram

y para esta serie de posts, la idea inicial es agregar un nuevo estado inicial llamado “Proposed”.

Para esto trabajaremos con el siguiente software:

 

Saludos @ Home

El Bruno

   

Resources:

Task (Agile) http://msdn.microsoft.com/en-us/library/dd380700.aspx

image47dd1de4

Buenas,

si bien el modelo de objetos para Visual Studio 2010 para trabajar con Team Foundation Server 2010 no es muy complejo, hay algunas particularidades a tener en cuenta. Por ejemplo, cuando queremos crear un WorkItem al que le hemos modificado su estructura de campos.

Por ejemplo, para la definición de una tarea hemos agregado 2 campos de texto más a la misma, llamados “Version” y “Scope”, y luego los hemos agregado visualmente al formulario de edición (si quieres ver como es posible realizar este cambio, este post es para ti). En al siguiente imagen es posible ver como el campo “versión” es requerido para la creación de una tarea.

image

Si tomamos el ejemplo disponible desde MSDN para la creaciòn de un WorkItem utilizando el Client Object Model, veremos que en el mismo no se tiene en cuenta la utilización de campos personalizados. Modificamos el mismo para que guarde los datos de una tarea, como muestra el siguiente código:

   1: using System;
   2: using Microsoft.TeamFoundation.Client;
   3: using Microsoft.TeamFoundation.WorkItemTracking.Client;
   4:  
   5: namespace ElBruno.CreateWiFromCode
   6: {
   7:     class Program
   8:     {
   9:         static void Main(string[] args)
  10:         {
  11:             var collectionUri = new Uri("http://localhost:8080/tfs/tpb");
  12:             var tpc = new TfsTeamProjectCollection(collectionUri);
  13:             var workItemStore = tpc.GetService<WorkItemStore>();
  14:             var teamProject = workItemStore.Projects["AgileLabs"];
  15:             var workItemType = teamProject.WorkItemTypes["Task"];
  16:  
  17:             var task = new WorkItem(workItemType)
  18:             {
  19:                 Title = "Sample Title",
  20:                 Description = "Sample desc"
  21:             };
  22:             task.Save();
  23:  
  24:             Console.WriteLine(@"WorkItem id: " + task.Id);
  25:             Console.ReadLine();
  26:         }
  27:     }
  28: }

 

 

Cuando se quiere guardar el WI (línea 22), nos encontramos con la siguiente excepción:

image

   1: Microsoft.TeamFoundation.WorkItemTracking.Client.ValidationException was unhandled
   2:   Message=TF237124: Work Item is not ready to save
   3:   Source=Microsoft.TeamFoundation.WorkItemTracking.Client
   4:   IsRemoteException=false
   5:   ErrorId=0
   6:   LogException=false
   7:   StackTrace:
   8:        at Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem.Save(SaveFlags saveFlags)
   9:        at Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem.Save()
  10:        at ElBruno.CreateWiFromCode.Program.Main(String[] args) in 
  11:        at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
  12:        at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
  13:        at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
  14:        at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
  15:        at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
  16:        at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
  17:        at System.Threading.ThreadHelper.ThreadStart()
  18:   InnerException: 

La solución consiste en definir el valor del campo “version” para poder de esta forma cumplir con los campos requeridos para la tarea. Una de las formas posibles de ver el estado de un WI, es analizando el campo IsDirty del mismo. Para este caso podemos realizar la siguiente validación

   1: var task = new WorkItem(workItemType)
   2: {
   3:     Title = "Sample Title",
   4:     Description = "Sample desc"
   5: };
   6: if(task.IsDirty)
   7:     Console.WriteLine("Can't save WorkItem");
   8: else
   9:     task.Save();

 

El objetivo del post era explicar como agregar valores a los campos personalizados, en este caso la magia la realiza una vez más, la línea 22.

   1: using System;
   2: using Microsoft.TeamFoundation.Client;
   3: using Microsoft.TeamFoundation.WorkItemTracking.Client;
   4:  
   5: namespace ElBruno.CreateWiFromCode
   6: {
   7:     class Program
   8:     {
   9:         static void Main(string[] args)
  10:         {
  11:             var collectionUri = new Uri("http://localhost:8080/tfs/tpb");
  12:             var tpc = new TfsTeamProjectCollection(collectionUri);
  13:             var workItemStore = tpc.GetService<WorkItemStore>();
  14:             var teamProject = workItemStore.Projects["AgileLabs"];
  15:             var workItemType = teamProject.WorkItemTypes["Task"];
  16:  
  17:             var task = new WorkItem(workItemType)
  18:             {
  19:                 Title = "Sample Title",
  20:                 Description = "Sample desc"
  21:             };
  22:             task.Fields["ElBruno.Version"].Value = "version 01";
  23:             task.Save();
  24:  
  25:             Console.WriteLine(@"WorkItem id: " + task.Id);
  26:             Console.ReadLine();
  27:         }
  28:     }
  29: }

 

 

Saludos @ Here

El Bruno

   

Fuente: http://msdn.microsoft.com/en-us/library/bb130322.aspx#Y697

Buenas,

hoy me he encontrado con una interesante extensión para Microsoft Outlook: NoReplyAll AddIn. Este addin, no hace lo primero que estás pensando: deshabilitar el Reply To All, sino que se aprovecha de algunas funcionalidades propias de Exchange para que podamos indicar en un correo, si no queremos que el mismo pueda ser respondido con un “Reply To All”.

Para esto tenemos una serie de botones en la Ribbon de un correo, donde podemos configurar que no se pueda responder el correo o que no se pueda enviar el mismo.

image

Esto es mucho más simple que la utilización del DRM (que es lo recomendado) y puede ser de bastante utilidad en determinados escenarios.

Yo hoy ya lo he utilizado 2 veces Open-mouthed smile

Saludos @ Home

El Bruno

   

HomePage: http://research.microsoft.com/en-us/projects/researchdesktop/noreplyall.aspx

Download: http://research.microsoft.com/en-us/downloads/60860f41-88ab-4bb4-8104-765feca9cfed/

Publicado 3/8/2011 16:29 por El Bruno | con no comments
Archivado en:

image

Buenas,

pues lo has leído en el título del post y lo lees nuevamente aquí: hoy se ha liberado una actualización para la Beta del SDK para desarrollar con Kinect con algunas mejoras incluidas en el mismo. Hasta donde he visto se trata de actualización en la documentación (que siempre se agradece) y algunas cosillas que se me escapan en el driver. Pues a descargarlo y a seguir jugando !!!

Descarga: http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/download.aspx

 

Saludos @ Here

El Bruno

   

Fuente: http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/download.aspx