October 2008 - Artículos

Buenas,

si bien es cierto que el tratamiento de WorkItems ha madurado mucho en Visual Studio Team System 2010, lamentablemente todavía no existe un SDK o un set de PowerTools para TFS que nos permita aprender de las novedades para la edición de información con en un WorkItem.

Es por eso que mientras sigo investigando la definición de un WorkItem a la vieja usanza, es decir, con un XML y el notepad; comentaré las 4 cosas que más llaman la atención.

Novedades para la Edición

- La nueva toolbar de edición de WorkItems incorpora los botones que ya comenté ayer agregar nuevos elementos relacionados, o relacionarlos con WorkItems existentes.

- Y, para remarcar una vez más la importancia de la guía de proceso, un acceso directo a la Process Guidance.

 

- Por fin, un editor de contenidos "rico" que permite ediciones con un poco de formato para los campos de texto en un WorkItem. En la siguiente imagen, una descripción de ejemplo:

 

- Obviamente, los comentarios que agregaremos en el histórico del WorkItem también soportan un formato enriquecido, y lo mismo para la visualización de cambios de un WorkItem.

 

- Finalmente mencionar que es posible agrupar las colecciones de WorkItems relacionados en diferentes grupos. Por ejemplo, para un WorkItem de tipo User Story, el mismo posee una para la implementación, otra para los Test Cases y otra para "otros". Cada panel permite editar el query para visualizar los WorkItems relacionados y además es posible configurar las columnas que se muestran en el formulario de edición. (dicho de otra forma, se ha "embebido un WorkItem Query Window" dentro de un WorkItem)

 

Definición de campos

Pero claro, hasta aquí solo podemos ver como se presenta un WorkItem; ¿pero que pasa dentro del mismo?. Pues después de ver un poco la definición, no han cambiado tanto (siguen siendo intuitivos). Tomemos como ejemplo el campo description, esta es la definición del mismo:

<FIELD name="Description" refname="Microsoft.VSTS.Shared.Description" type="HTML" > <HELPTEXT>Description or reference to the story that must work for this work to be considered complete.</HELPTEXT> </FIELD>

Como se puede apreciar, solo el tipo ha cambiado y poco más. Sin embargo la visualización del mismo tampoco ofrece muchas pistas:

<Column PercentWidth="100"> <Control FieldName="Microsoft.VSTS.Shared.Description" Type="HtmlFieldControl" Label="&amp;Description with Acceptance Criteria:" LabelPosition="Top" Dock="Fill" /> </Column>

con lo que comienzo a asumir que el editor de texto enriquecido viene por defecto para los campos de tipo HTML.

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com

Buenas,

el nuevo formulario para la visualización de consultas de WorkItems presenta algunas novedades muy interesantes. Se que algunos pensarán que la interfaz se ha sobrecargado, ya que pasamos de no tener opciones a tener demasiadas, pero creo que para la versión final se puede configurar este aspecto, este formulario será muy útil.

WorkItems List Toolbar

En primer lugar podemos ver que la toolbar superior ofrece algunas nuevas opciones muy interesantes.

 

  • Además de opciones de impresión, tenemos la capacidad de agregar a los WorkItems seleccionados nuevos elementos relacionados, o relacionarlos con WorkItems existentes.
  • Como comenté en el post anterior, si estamos analizando una vista con jerarquías, tenemos 2 nuevos botones que nos permiten expandir o colapsar el elemento seleccionado o todos los elementos de la lista.
  • Existe un nuevo botón que genera un informe en Microsoft Excel con el contenido de la lista
  • Y además existe una opción que nos permite exportar los WorkItems seleccionados a Microsoft Excel, MS Project o a un nuevo Query

Current WorkItem Toolbar

Existe además un panel que nos permite visualizar la información y el detalle del WorkItem seleccionado.

 

En la toolbar de este panel podemos encontrar las siguientes opciones:

  • El clásico Guardar, un botón refrescar, para cuando necesitamos refrescar el contenido del WorkItem y el botón de impresión.
  • Existen botones para agregar nuevos elementos relacionados, o relacionar el WorkItem seleccionado con WorkItems existentes.
  • Se ha agregado un botón de acceso directo a la Process Guidance (genial !!!)
  • Y el último dato interesante, son dos botones de navegación [Previous] y [Next]; que permiten navegar entre los WorkItems de la Query, como si del visor de eventos se tratara.

Extras ... aunque no tan extras

Finalmente quiero comentar 2 detalles, que mejoran notablemente la usabilidad de este formulario.

En primer lugar se ha aumentado el tamaño del Splitter entre paneles. Esto que parece algo trivial, si estas trabajando con muchos nervios y después de varios litros de cafeína, el pulso te falla, así que si el Splitter es mas grande te ahorras un par de problemas.

 

Y finalmente, a la derecha del Splitter, existen 4 nuevos botones que nos ayudan a organizar la vista actual de la consulta.

  • [|] Define un split vertical entre los paneles.
  • [-] Define un split horizontal entre los paneles, esta es la opción por defecto.
  • [˅] Colapsa el panel de detalle del WorkItem, dejando a la vista solo el listado.
  • [˄] Colapsa el panel de listado de WorkItems, dejando a la vista solo el WorkItem seleccionado.

Probando un poco estas opciones podemos cambiar la orientación del split, para ver el listado y el detalle en modo horizontal. La siguiente imagen muestra este ejemplo, y además hay que remarcar como cambia el texto de los botones de acción de esta botonera.

 

O colapsar el detalle del WorkItem y mostrar solo el listado. Una vez más cambian las opciones de la botonera.

 

Como comenté al principio, pasamos de tener poco a tener demasiado. Personalmente prefiero que sobre y no que falte, aunque hecho en falta algunas opciones de personalización para lograr un poco más de potencia.

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com

Buenas,

si alguna vez has tenido que explicarle a un Jefe de Proyecto como funciona la integración de MS Project y Team Foundation Server, seguramente en algún momento alguien te habrá preguntado si cuando se definen tareas en Project es posible respetar la relación que existe entre las mismas a nivel dependencia. La respuesta es que Project solo presenta una vista de las tareas de TFS, pero que además de modificar los valores de los WorkItems como fecha inicio, fecha fin, progreso, etc.; lo demás es solo organización y presentación de información de TFS.

Si bien en versiones previas de TFS teníamos la capacidad de relacionar diferentes tipos de WorkItems entre sí, no existían herramientas que nos permitan visualizar esta información para poder aprovecharla y explotarla (en realidad no existe dentro de VS, pero 3ras partes han creado AddIns muy buenos).

Utilizando Visual Studio Team System 2010 podemos aprovechar y explotar un poco más esta información ya que las en relaciones entre WorkItems se puede especificar el tipo de relación.

Los siguientes pasos demuestran como crear un User Story y relacionar al mismo dos Tasks con precedencia entre ambas. Y además como crear diferentes vistas para interpretar esta información.

 

Tutorial

1. Como se demuestra en la siguiente imagen, seleccionamos desde una lista un WorkItem de tipo User Story (267 - Sample User Story 01)

2. Si desplegamos el menú contextual sobre este elemento, veremos que la opción de agregar un elemento relacionado sigue existiendo: Add New Linked WorkItem.

 

3. Sin embargo, al momento de crear un nuevo elemento podremos ver que ahora tenemos la opción de definir el tipo de relación :

  • Child
  • Parent
  • Predecesor
  • Related
  • Successor
  • Tested By
  • Tests

y además un formulario bastante intuitivo donde se previsualizará una imagen con el tipo de relación.

 

4. Para este ejemplo creamos una tarea "Child" llamada "Create Sample Story Part 01", que se crea con el ID: 268

 

5. Posteriormente creamos una nueva tarea llamada "Create Sample Story Part 02". Y la relacionamos a la tarea anterior, pero en este caso definimos que la tarea "Create Sample Story Part 01" es anterior a la tarea "Create Sample Story Part 02".

 

6. En este punto tenemos 3 nuevos WorkItems creados y relacionados entre sí. Visual Studio Team System 2010 nos permite visualizar este tipo de relaciones de una manera más simple ya que incorpora nuevas características en la edición de Queries de Work Items.

7. Si creamos un nuevo Query, podremos ver que además del clásico editor de Queries; una de las nuevas opciones que disponemos es la forma en la que se presentarán los WorkItems en la ventana de resultados:

  • Flat List of Work Items
  • Work Items and Direct Links
  • Tree of Work Items

 

Vista en modo árbol

8. Si optamos por la opción de Tree of Work Items, podremos ver las relaciones entre el User Story y las Tasks en forma gráfica y jerárquica

9. En la toolbar existen nuevos botones para nuevas acciones (tema de otro post) pero en este caso, los botones [+] y [-] permiten colapsar y expandir todos los elementos de manera conjunta para poder tener una mejor vista de las relaciones entre los WorkItems.

 

Vista en Modo Relación

10. Si cambiamos la vista por Work Items and Direct Links, podremos ver para cada WorkItem los elementos relacionados al mismo.

11. En este modo, dentro del editor de Queries aparece una nueva sección donde podremos definir:

  • Un filtro para limitar los elementos relacionados que se visualizarán.
  • El nivel de elementos que queremos visualizar.
  • Los diferentes tipos de relación a visualizar.

 

12. En este modo, el listado mostrará los 3 WorkItems, con sus correspondientes relaciones y el tipo de relación de cada elemento.

 

Saludos @ Here

El Bruno

Crossposting from ElBruno.com

Buenas,

como bien comenta el amigo Luis en su blog, desde hoy esta disponible para descarga una VPC con una demo completa de Visual Studio Team System 2010. Desde hace algún tiempo esta VPC está en mis manos y la verdad es que me estaba comiendo los dedos hasta los codos estaba esperando que llegue el PDC para poder comenzar a postear sobre la misma.

No creo que haga falta apuntar las novedades pero me venía preparando desde hace unos días, estos son algunos de los temas de los próximos posts:

  • Por fin, un sistema orientado al Testing que evita errores comunes y elimina el clásico "en mi máquina funciona".
    • Este sistema permite la generación de vídeos u otro tipo de soporte para poder reproducir los errores
    • Además acompaña cada test con información de contexto, información de datos, gestión de estados, etc.
  • Análisis de Impacto (test impact Analysis), excelente feature que permite evaluar que prueba unitarias han sido afectadas por los cambios en el código y de esta forma minimizar el tiempo de ejecución de los tests.
  • Gated Checkins, un sistema "novedoso" de protección de archivos que realiza una compilación previa antes de dar por válido un archivo para una acción de CheckIn.
  • Diagramas de Arquitectura, permiten describir la arquitectura de una solución desde diferentes aspectos.
    • Descripción orientada a layers y clases
    • Sincronización online con los archivos de código
    • Diagrama de validación de dependencias en tiempo real, que permite evaluar las excepciones en la arquitectura.
    • Diagrama "interactivo" de dependencia entre clases.
    • Diagramas UML, me reservo la opinión, pero igualmente postearé al respecto.
  • Pruebas unitarias para la interfaz de usuario que permiten ser "grabadas" y luego reproducidas. Esto permite la automatización de pruebas de UI
  • Nuevo editor de Builds gráfico ... seguramente el amigo Rodrigo y muchos otros estarán muy contentos con este editor (el más feliz es el que escribe)
  • More ...

Y mucho más, así que a partir de mañana, un post al día de Visual Studio Team System 2010.

Antes que me olvide, algunos links de interés:

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com

Buenas,

si alguna vez has tenido que agregar capacidades para crear gráficos en alguna aplicación, seguramente habrás optado por pasarle el marrón a otra persona tenido que sufrir a MSChart. Por lo general, una de las opciones más comunes era comprar una biblioteca de clases de otras empresas, o agregar la clásica y popular funcionalidad de exportar a Excel;desde donde nuestros queridos y expertos usuarios podrán crear los gráficos que necesiten.

Desde hace un tiempo existe una biblioteca de clases para .Net que nos pueden ayudar en este tipo de escenarios: Microsoft Chart Controls. Estos links nos pueden ayudar a comenzar a utilizarla:

 

Como por lo general me gusta probar un poco algo antes de postearlo, me cree una pequeña aplicación con un Chart en un formulario; he aquí mis apuntes.

1. En primer lugar, he agregado un control del tipo DataVisualization.Charting.Chart, al formulario principal de la aplicación.

2. como no tengo ganas de agregar datos a mano, he creado la siguiente función que crea una serie con 5 datos en forma aleatoria.

1 ''' <summary> 2 ''' Gets the random series. 3 ''' </summary> 4 ''' <param name="name">The name.</param> 5 ''' <returns></returns> 6 Public Function GetRandomSeries(ByVal name As String) As Series 7 Dim returnSeries As New Series(name) 8 Dim rnd As New Random() 9 For index As Integer = 1 To 5 10 returnSeries.Points.Add(rnd.Next(0, 100)) 11 Next 12 Return returnSeries 13 End Function

2. A continuación, para crear un gráfico simple de barras con 2 series, en el evento Load() del form, agrego las siguientes líneas

1 ' crear y agregar el chart area 2 Dim chartArea1 As New ChartArea("ChartArea1") 3 chartViewer.ChartAreas.Add(chartArea1) 4 ' añadir datos 5 chartViewer.Series.Add(GetRandomSeries("serie 1")) 6 chartViewer.Series.Add(GetRandomSeries("serie 2"))

y podemos ver un gráfico como el de la siguiente imagen.

 

3. Si agrego 2 series más de datos, con el siguiente código

1 ' crear y agregar el chart area 2 Dim chartArea1 As New ChartArea("ChartArea1") 3 chartViewer.ChartAreas.Add(chartArea1) 4 ' añdir datos 5 chartViewer.Series.Add(GetRandomSeries("serie 1")) 6 chartViewer.Series.Add(GetRandomSeries("serie 2")) 7 chartViewer.Series.Add(GetRandomSeries("serie 3")) 8 chartViewer.Series.Add(GetRandomSeries("serie 4"))

el gráfico muestra un nuevo set de datos

4. Si por ejemplo, deseo organizar las series de datos en 2 áreas separadas, y agregar un titulo con formato al Chart, el siguiente código lo hace posible

1 ' crear y agregar el chart area 2 Dim chartArea1 As New ChartArea("ChartArea1") 3 Dim chartArea2 As New ChartArea("ChartArea2") 4 chartViewer.ChartAreas.Add(chartArea1) 5 chartViewer.ChartAreas.Add(chartArea2) 6 7 ' añadir datos 8 chartViewer.Series.Add(GetRandomSeries("serie 1")) 9 chartViewer.Series.Add(GetRandomSeries("serie 2")) 10 chartViewer.Series.Add(GetRandomSeries("serie 3")) 11 chartViewer.Series.Add(GetRandomSeries("serie 4")) 12 13 chartViewer.Series(0).ChartArea = "ChartArea1" 14 chartViewer.Series(1).ChartArea = "ChartArea1" 15 chartViewer.Series(2).ChartArea = "ChartArea2" 16 chartViewer.Series(3).ChartArea = "ChartArea2" 17 18 ' apariencia del char 19 Dim titleChart As Title = chartViewer.Titles.Add("Titulo del chart") 20 titleChart.ForeColor = Color.Blue 21 titleChart.Font = New Font(titleChart.Font, FontStyle.Bold) 22 titleChart.TextStyle = TextStyle.Shadow

y el gráfico se divide en "2 gráficos" con un título en la sección superior.

5. Finalmente si quiero mostrar una de las secciones del Chart, en barras 3D, debo modificar una de las ChartArea

1 ' 3D charts 2 chartArea1.Area3DStyle.Enable3D = True 3 chartArea2.Area3DStyle.Enable3D = False

y el gráfico queda como en la siguiente imagen.

 

En pocos pasos he creado un gráfico que se adapta a lo que estaba necesitando por estos días. Pero además de tener capacidades para graficar en aplicaciones Windows, las librerías también son para ASP.Net, con lo que realmente conviene echarles un vistazo, en el caso de que tengamos que crear Chart.

Descarga el ejemplo:

 http://cid-bef06dffdb192125.skydrive.live.com/self.aspx/Code%20Samples/2008%2010%2027%20-%20DemoChart.zip

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com
Publicado 26/10/2008 22:28 por El Bruno | 7 comment(s)
Archivado en:

Buenas,

si como yo estás esperando el final de Octubre para cobrar la nómina y probar las nuevas Team Foundation Server 2008 October Power Tools; tengo que darte una mala noticia: las Power Tools de Octubre se lanzarán en Noviembre

Después de una pequeña prueba interna con algunos MVPs, se han encontrado algunos errores bastante importantes que merecen la pena ser solucionados antes de la Release final y es por este motivo que deberemos esperar un par de semanas más.

Brian nos cuenta el detalle por aquí y realmente agradezco la decisión porque después de leer algunas experiencias, me parece que lanzarlo era un poco apresurado.

Pues bien, deberemos esperar un poco más, pero creo (y esta vez podría asegurarlo) que vale la pena.

 

Saludos @ Gear of Wars

El Bruno

Crossposting from ElBruno.com

Buenas,

cada tanto recuerdo mis primeros días en la informática allá por el 1999, cuando descubría el placer de Visual Basic 6, ASP, los componentes COM+, SQL Server, etc. En esos días, mi trabajo era 100% developer en un producto de Workflow, y recuerdo cuando con Suin y el Iteya, uno programaba las paginas ASP, otro los componentes COM+ y yo lo enganchaba al Workflow. Después de noches eternas tirando líneas y líneas (donde una coca cola con café era el alimento indispensable) muchas cosas me quedaron bastante claras, entre ellas que las fechas se deben tratar con tipos de dato DateTime y lo mismo aplica para los números.

Hoy 9 años después, a los 3 la vida nos llevó por diferentes caminos; uno es dueño de una empresa con un producto impresionante (pocas veces vi algo tan groso con WF), otro lidera un equipo de desarrollo en una empresa que no puedo nombrar (porque es muy grande) y yo ... bueno yo escribo en www.elBruno.com.

Sin embargo, creo que a los 3 las siguientes frases nos ponen de muy mal humor:

- se me dio vuelta la fecha

- el número no me toma la coma, solo funciona con puntos

Me parece increíble que actualmente (año 2008 para futuras referencias) todavía existan personas que no se tomen 30 minutos para leer como funcionan las Cultures de .Net o que piensen que la mejor forma de escribir una función para validar un número es la siguiente:

private bool IsNumeric(string text) { return System.Text.RegularExpressions.Regex.IsMatch(text, @"^\d+(\.\d+)?$"); }

Como sé que es una misión imposible, y que la gente seguirá por el mal camino; para todos aquellos que seguirán tratando a las fechas y a los números con strings, tengo 3 consejos:

1. En primer lugar informar/taladrar/advertir/notificar que la coma no es el único carácter para separar decimales, y que en algunos países, por cuestiones muy extrañas, la fecha puede tener un formato del tipo: mes/día/año (esto no se debe a cuestiones místicas relacionadas con la posición de los planetas, ni tampoco la solución consiste en degollar un gallo virgen y derramar su sangre un martes 13 sobre un ordenador amarillo; las cosas simplemente son así)

2. Por favor, no complicarse la vida con funciones extrañas para averiguar cuál es el carácter para separar decimales.

A esa excelente idea que consiste en dividir un número por dos, guardarlo en un string y buscar el 2do carácter; se la puede reemplazar por el uso de la biblioteca NumberFormat y averiguar muchas cosas más con menos. Por ejemplo para averiguar el separador de decimales, o el signo para los número negativos es posible utilizar el siguiente código:

NumberFormatInfo numberFormatInfo = System.Globalization.CultureInfo.CurrentCulture.NumberFormat; string decimalSeparator = numberFormatInfo.NumberDecimalSeparator; string groupSeparator = numberFormatInfo.NumberGroupSeparator; string negativeSign = numberFormatInfo.NegativeSign;

3. Finalmente, si alguna vez nos cruzamos en un proyecto y tienes alguna "excusa" para utilizar strings, por favor dímelo. Después de 9 años, sigo escuchando las cosas más inverosímiles que me sorprenden y me alegran el día.

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com

Buenas

si ayer explicaba como realizar un mapeo de Workspaces en 2 Clicks, hoy trataré de explicar el proceso inverso que es eliminar un mapeo de un Team Project o un directorio del mismo, con un directorio local.

1. Seleccionar un Team Project o un directorio del mismo, y desplegar el menú contextual de Microsoft Visual Studio 2008; seleccionar la opción Remove Mapping.

 

2. En el formulario de eliminación del mapeo, verificar el Server Folder y el Local Folder y presionar el botón Remove Mapping.

 

3. El mapeo ha sido eliminado y ya podemos ver nuevamente el Link "not mapped"

 

Saludos @

El Bruno

Crossposting from ElBruno.com

Buenas,

si como a mi no te gusta mucho el tener que hacer 25 pasos para definir los mapeos de directorios en un Workspace en el Source Control Explorer de Team Foundation Server 2008, la llegada del Service Pack 1 de TFS 2008 te facilita bastante la vida.

Porque tan solo seleccionando el Team Project, o el folder dentro del Team Project sobre el que queremos trabajar debemos:

1. Hacer click en el Link "not mapped"

 

2. Definir la ubicación física del directorio de mapeo local

 

3. Listo, el mapeo del directorio se ha completado dentro del Workspace actual, y además el link ahora nos permite ir en un sólo click al directorio local (cosa que siempre se agradece)

 

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com

Buenas,

un poco tarde me llega la noticia, pero como la necesidad llega también a destiempo, recién ahora me entero que ya está disponible una nueva versión de la la ayuda de MSDN que incluye los cambios del Service Pack 1 para Microsoft Visual Studio 2008 y Team Foundation Server 2008.

Además en esta versión se han incluido varios lenguajes adicionales además del clásico y popular English que es el que viene por defecto. Por ejemplo la versión en Español se puede descargar desde:

http://www.microsoft.com/downloads/details.aspx?displaylang=es&FamilyID=7bbe5eda-5062-4ebb-83c7-d3c5ff92a373

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com

View space

Buenas,

se acerca el 23 de Octubre y no quiero dejar pasar la oportunidad de comentarles sobre un nuevo evento que organizamos en MadridDotNet a cargo de José Fco. Bonnin:

Descubriendo a LINQ

En esta sesión haremos un breve viaje en el tiempo para saber cómo LINQ ha conseguido introducirse en nuestro trabajo cotidiano. Conoceremos algunas de las técnicas que se han utilizado para hacer del language integrated query una realidad en los lenguajes de programación de .NET y, presentaremos sus distintos formatos haciendo especial hincapié en el más conocido, LINQ to SQL, para conocer varios trucos que nos permitan sacarle el máximo partido.

 

Link del evento:

http://madriddotnet.spaces.live.com/blog/cns!6453107D41F04C68!163.entry

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com
Publicado 19/10/2008 17:27 por El Bruno | 2 comment(s)
Archivado en:

Buenas,

en las últimas semanas he recibido varios correos con preguntas relacionadas con Microsoft Robotics Developer Studio. Muchas personas están interesadas en conocer donde encontrar material, ejemplos, etc. Como lo mío es de una calidad muy pobre y no me lo tomo muy en serio, y desde hace un tiempo en gran Angel "Java" López y Luis Guerrero están escribiendo al respecto, he aquí una lista de posts que pueden ayudar a comenzar a jugar con Robotics Studio.

Descargas Oficiales

Descargas CTPs

Información en Español

Varios

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com

Buenas,

después del pedazo de evento de ayer sobre Application Lifecycle Management (mejor conocido por ALM), puedo sacar bastantes conclusiones al respecto. Por un lado conocer que después de varios años de "divulgar" un poco la visión y herramientas de Microsoft para gestionar el ciclo de vida del desarrollo de aplicaciones, la idea está comenzando a ser incrustada en la mente de reconocida por bastante gente; y por otro que los problemas son comunes, en la mayoría de los casos, independientemente del contexto o tecnología con la que trabajemos.

Es por eso, que en los escasos 45 minutos que poseía, traté de comentar un poco sobre algunos productos internos de Avanade y sobre algunas de las tareas más comunes con las que nos encontramos en los proyectos de implantación de Visual Studio Team System para la gestión de Application Lifecycle Management.

Por suerte, dentro de poco tiempo tendremos la oportunidad de realizar un workshop mucho más completo para abordar el tema en detalle. Por ahora, la descarga de la presentación y en breve la grabación del evento (con Silverlight para que el streaming sea molón !!!)

Descarga:

http://cid-bef06dffdb192125.skydrive.live.com/self.aspx/ALM%2008/Avanade%20-%20ALM%2008|_v0.5.pptx

 

Saludos @ Here

El Bruno

Crossposting from ElBruno.com
Publicado 17/10/2008 18:58 por El Bruno | con no comments
Archivado en: ,

Buenas,

si utilizas Team Foundation Server 2008 y has instalado el Service Pack 1, seguramente te habrás encontrado con un error al momento de crear notificaciones de alertas para las acciones de CheckIn, cuando has configurado el mismo para que utilice los links del Team System Web Access para los id de WorkItems (detalle que nos gusta y mucho)

Por suerte existe un HotFix que se puede descargar desde HTTP://Code.msdn.microsoft.com/KB957196 y que soluciona este problema. Aunque recomiendo tener bastante cuidado al momento de instalarlo, porque nos podemos quedar con un ladrillo entre manos.

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com

Buenas,

en alguna ocasión he comentado el malestar que me produce la necesidad de crear informes de estado o de seguimiento de proyecto de manera manual. La correcta utilización de Visual Studio Team System permite explotar información de muchas formas diferentes pero por lo general siempre recomiendo basarnos en la Team Foundation Server DataWarehouse que es una base de datos especialmente diseñada para realizar acciones de Business Intelligence sobre la información que almacena TFS.

Desde hace ya bastante tiempo esta base de datos, llamada Team Foundation Server DataWarehouse, se encuentra documentada en MSDN y existen muchos tutoriales sobre cómo trabajar con la misma (he aquí algunos propios)

En el ejemplo que tengo pensado comentar a continuación, parto sobre la base de crear un reporte que permita visualizar el trabajo realizado por día por cada desarrollador utilizando Microsoft Excel como herramienta para conectar y mostrar información desde Analysis Services.

Tutorial

1. En primer lugar debemos conectarnos a la base de datos de TFS (en este post explico los pasos necesarios para esta acción)

2. Desde el panel de BI seleccionamos la measure Current WorkItem

3. En la sección Values agregamos:

  • Remaining Work
  • Completed Work

4. En la sección RowLabels agregamos los siguientes campos en el siguiente orden:

  • Date.Date
  • Assigned To.Person
  • WorkItem.Title

 

5. Después de aplicar un filtro por fecha (para no ver todo el contenido de los últimos años), podemos ver un informe como el de la siguiente imagen, donde se organizan por fecha y por desarrollador, las tareas a las que ha imputado horas utilizando el WorkItem de tipo Task de MSF for Agile:

 

6. Si en cambio queremos ver el progreso, en horas de cada tarea por día, lo que debemos hacer es mover Date.Date a la sección de Column Labels.

7. De esta forma podremos ver como los campos Remaining Work y Completed Work han ido cambiando en diferentes períodos de tiempo

 

 

 

Saludos @

El Bruno

Crossposting from ElBruno.com

Buenas,

hace unos días comenté como podemos gestionar el acceso a determinados WorkItems utilizando las opciones de seguridad que permiten las áreas en Team Foundation Server 2008. Mientras comentaba esta opción con un compañero, me preguntó si con las iteraciones es posible hacer lo mismo.

En realidad el concepto de iteración es otro, es por eso que las opciones de seguridad de las mismas son diferentes. Las posibles opciones son las siguientes y es posible permitir o denegar el acceso:

  • Crear y ordenar los nodos hijos de un nodo.
  • Eliminar un nodo
  • Editar un nodo
  • Visualizar el nodo

Siguiendo un poco el ejemplo del post anterior, en el siguiente tutorial, restringiremos los permisos para el usuario Art para un nodo de una iteración.

Tutorial

1. Acceder a la definición de áreas del Team Project, seleccionando el mismo en el Team Explorer.

2. Desplegar el menú contextual y seleccionar Team Project Settings // Áreas and Iterations


 

3. En la pestaña Iteration seleccionar la iteración Iteration 1.

4. Presionamos el botón Security para mostrar las opciones de seguridad de una iteración.

5. En el formulario de seguridad agregamos el usuario Art y en las opciones del mismo denegamos el acceso para los 4 permisos.

 

6. Las opciones de seguridad están completas. A continuación, si el usuario Art, intenta realizar alguna acción con la iteración Iteration 1, por ejemplo renombrar la misma se encontrará con un mensaje que le avisa que no posee los permisos necesarios.

--------------------------- Error --------------------------- TF50309: The following account does not have sufficient permissions to complete the operation: TFSRTM08\Art. Check the permissions for the account and grant the appropriate permissions to perform this operation. There was a failure on the server. There may have been other changes that conflict with the new node. --------------------------- OK ---------------------------

 

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com

Buenas,

estas son semanas complicadas, mayormente por la carga de trabajo (donde día a día sobrepasa mi capacidad de sorpresa la poca preparación que existe en el aire), la preparación para el ALM '09 Sessions y otros proyectos personales (de este tipo en su mayoría). Sin embargo, entre tantas cosas para tener en cuenta, trato de no dejar de lado uno de los mejores canales de información que conozco: los foros. Lo mejor que tienen los foros, es que las preguntas que se realizan en los mismos, vienen dados de problemas reales.

Es por esto, que hace unos días me llamó la atención una pregunta en un foro interno de Avanade donde un compañero de Canadá preguntaba como crear tareas en un Team Project en Team Foundation Server 2008 pero que las mismas no puedan ser visualizadas, ni modificadas por todo el equipo que podía acceder a ese Team Project.

Antes de soltarle una respuesta, traté de averiguar cómo estaban organizados sus equipos de trabajo (una de las ventajas de tener un OCS global, es que puedes comunicarte con cualquier compañero del mundo en cualquier momento). Para mi gozo, resultó que su problema residía en que un determinado equipo de personas no debían tener acceso a ciertos elementos del Team Project por cuestiones de seguridad.

La siguiente pregunta fue relacionada con el manejo de las áreas, y después de comentarlo un poco llegamos a la conclusión que adaptando un poco el esquema de áreas de su Team Project podía lograr su cometido. Ya que al asignar permisos específicos de seguridad a una o más áreas, con las mismas podía controlar los permiso de acceso, modificaciones, etc. a los WorkItems que se creen para estas áreas.

Para esto, y a modo de ejemplo, seguiremos el siguiente tutorial para satisfacer el siguiente requerimiento:

El usuario Art (arquitecto) no debe poder visualizar los WorkItems del área $/Áreas/Reports

 

Tutorial

1. Acceder a la definición de áreas del Team Project, seleccionando el mismo en el Team Explorer.

2. Desplegar el menú contextual y seleccionar Team Project Settings // Áreas and Iterations



3. Seleccionar el área Area / Reports.

4. Presionar el botón Security

5. En la sección de usuario y grupos, seleccionar la opción Windows User or Group y agregar el usuario Art.

6. Seleccionar el check Deny (denegar acceso) para las opciones

  • View this node
  • View work items in this node

 

7. De esta forma cuando otro usuario acceda al Team Project y ejecute un query para mostrar todos los WorkItems (All WorkItems por ejemplo) podrá ver la siguiente información, donde el WorkItem 528, pertenece al Area Reports.

 

 

8. Sin embargo, cuando Art ejecute esta query (en la siguiente imagen desde Team System Web Access), veremos que no puede ver el WorkItem 518.

 

Un detalle adicional a mencionar es que utilizando el esquema de seguridad de las áreas es posible configurar el acceso (o denegar el mismo) para las siguientes acciones:

  • Eliminar el nodo del área
  • Modificar el nodo del área
  • Modificar WorkItems asociados al nodo del área
  • Visualizar el nodo del área
  • Visualizar WorkItems asociados al nodo del área

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com

Buenas,

en mi post anterior comenté parte de mi proyecto para asegurar la calidad en los proyectos de software:

Lanzador de misiles inalámbrico USB disparado por eventos de un servidor Team Foundation Server 2008.

Una vez visto cómo interceptar eventos en Team Foundation Server 2008, y cómo procesar los mismos; en este post dejaré un poco de lado a TFS e intentaré comentar un poco sobre la tecnología necesaria para trabajar con dispositivos HID con mi humilde y escaso conocimiento al respecto.

Envío de Mensajes a un dispositivo HDI

El siguiente paso fue conocer un poco como funcionan los Human Interface Device (HID), que es el tipo de dispositivos que Windows reconoce usualmente cuando conectamos un ratón, un teclado, etc. a nuestro ordenador.

Debido a que mi flamante lanza misiles USB, no posee un SDK ni nada por el estilo, tuve que empezar desde cero con el método “prueba/error” a descubrir como interactuar con el mismo desde código manejado .Net. Por suerte, en The HID Page existe mucha información sobre como trabajar con HIDs.

Después de varios BSOD, llegué a descubrir que para mi modelo en particular de lanza misiles inalámbrico USB o dispositivo HID, esta información era la que necesitaba para identificar al mismo dentro de la lista de dispositivos en mi laptop:

1 #Region "USB Product Details" 2 3 ' define USB Product and Vendor Id 4 Private usbVendorID As Int16 = Convert.ToInt16(Val("&h4400")) 5 Private usbProductID As Int16 = Convert.ToInt16(Val("&h514")) 6 7 #End Region

Utilizando los valores anteriores, la conexión con el dispositivo se puede realizar iterando a través de los dispositivos locales del ordenador con la siguiente función, donde en la línea 13 obtengo la información del dispositivo y en la línea 18 verifico si corresponde a mi dispositivo:

1 memberIndex = 0 2 Do 3 4 ' Creates a handle to get and compare information for the search of the specified device 5 hidHandle = CreateFile(devicePathName(memberIndex), 0, FILE_SHARE_READ Or FILE_SHARE_WRITE, Nothing, OPEN_EXISTING, 0, 0) 6 7 If Not (hidHandle.IsInvalid) Then 8 9 ' The returned handle is valid, check for the product and vendor 10 MyHid.DeviceAttributes.Size = Marshal.SizeOf(MyHid.DeviceAttributes) 11 12 ' get device information to check for the Product and Vendor ID 13 success = HidD_GetAttributes(hidHandle, MyHid.DeviceAttributes) 14 15 deviceFound = False 16 If success Then 17 ' Find out if the device matches the one we're looking for. 18 If (MyHid.DeviceAttributes.VendorID = usbVendorID) And (MyHid.DeviceAttributes.ProductID = usbProductID) Then 19 deviceFound = True 20 ' Save the DevicePathName for OnDeviceChange(). 21 myDevicePathName = devicePathName(memberIndex) 22 Else 23 ' It's not a match, so close the handle. 24 hidHandle.Close() 25 End If 26 Else 27 ' There was a problem in retrieving the information. 28 hidHandle.Close() 29 End If 30 31 End If 32 33 ' Keep looking until we find the device or there are no devices left to examine. 34 memberIndex = memberIndex + 1 35 Loop Until (deviceFound Or (memberIndex = devicePathName.Length)) 36 37 ' The device was detected. Register to receive notifications if the device is removed or attached. 38 success = MyDeviceManagement.RegisterForDeviceNotifications(myDevicePathName, _parentForm.Handle, hidGuid, deviceNotificationHandle) 39 40 ' Learn the capabilities of the device. 41 MyHid.Capabilities = MyHid.GetDeviceCapabilities(hidHandle) 42 43 If success Then 44 ' Find out if the device is a system mouse or keyboard. 45 hidUsage = MyHid.GetHidUsage(MyHid.Capabilities) 46 47 ' Get the Input report buffer size. 48 _inputReportBufferSize = GetInputReportBufferSize() 49 50 ' Get handles to use in requesting Input and Output reports. 51 readHandle = CreateFile(myDevicePathName, GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, Nothing, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0) 52 53 If readHandle.IsInvalid Then 54 exclusiveAccess = True 55 Else 56 writeHandle = CreateFile(myDevicePathName, GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, Nothing, OPEN_EXISTING, 0, 0) 57 ' Flush any waiting reports in the input buffer. (optional) 58 MyHid.FlushQueue(readHandle) 59 End If 60 End If

Una vez finalizado el proceso de búsqueda del dispositivo, los Handles de lectura y escritura del mismo me servirán para posteriores acciones con el HDI (líneas 51 y 56).

Y fue en este punto donde me encontré con uno de los grandes problemas, averiguar que secuencia de información debía enviar a mi lanza misiles para que respondiera a mis órdenes y así comenzar el proyecto de la dominación mundial.

Una vez más el proceso de prueba/error me ayudó a encontrar los siguientes valores en Bytes necesarios para interactuar con el dispositivo:

1 #Region "Byte Action Constants" 2 3 ' byte actions 4 Public usbMissileStop() As Byte = {0, 0} 5 Public usbMissileMoveUp() As Byte = {0, 2} 6 Public usbMissileMoveDown() As Byte = {0, 1} 7 Public usbMissileMoveLeft() As Byte = {0, 4} 8 Public usbMissileMoveRight() As Byte = {0, 8} 9 Public usbMissileReset() As Byte = {0, 83} 10 Public usbMissileFire() As Byte = {0, 99} 11 12 #End Region 13

Una vez obtenidos los handles para trabajar con el HID, el envío de información es una tarea bastante simple esto es fácil decirlo ahora después de estar toda una tarde cruzando los dedos para no perder nada después de los BSOD. En el siguiente fragmento de código en la línea 9, escribo un buffer de Bytes al dispositivo:

1 ' Set the size of the Output report buffer (array begins at index 0) 2 ReDim outputReportBuffer(MyHid.Capabilities.OutputReportByteLength - 1) 3 4 ' Store the report ID in the first byte of the buffer: 5 outputReportBuffer = buffer 6 7 ' Use WriteFile to send the report. If the HID has an interrupt OUT endpoint, WriteFile uses an interrupt transfer to send the report. If not, WriteFile uses a control transfer. 8 Dim myOutputReport As New Hid.OutputReportViaInterruptTransfer 9 success = myOutputReport.Write(outputReportBuffer, writeHandle)

Con toda la información anterior y tirando de mis pocas dotes para el diseño de sistemas, pude diseñar una clase UsbManager para gestionar el lanza misiles USB con la siguiente interfaz, que me permite mover el lanzamisiles en todas direcciones, disparar el mismo y resetearlo a la posición inicial.

Con esta clase creada y después de un par de Clicks al estilo Visual Basic .Net, creé la siguiente aplicación con la que puedo reemplazar a la aplicación original para el lanzamisiles. Como se puede ver en la siguiente imagen en la misma, he incluido un control de dirección y de disparo; un par de botones para detener y resetear el lanzamisiles y finalmente, una opción para definir el período de tiempo de delay entre movimientos:

 

Como se puede apreciar en la  imagen, el formulario es bastante simple, pero cumple su cometido. Y si una imagen vale más de mil palabras, el siguiente vídeo vale 25 BSOD:

VB.Net USB Missile Launcher

En el próximo post, mostraré como organizar todos los componentes: el suscriptor de eventos de Team Foundation Server 2008, el UsbManager para el lanzamisiles, el proxy de intercepción de eventos, y el gestor de localización de desarrolladores, para tener el modelo completo y en funcionamiento.

Descarga del proyecto de ejemplo: USB%20Missile%20Launcher-05.zip

Referencias

Crossposting from ElBruno.com

Buenas,

un par de veces he comentado como verificar cuando se saltan las políticas definidas en Team Foundation Server 2008. Comenté como realizar un informe aprovechando la base de datos de Datawarehouse de TFS2008, pero sin embargo con las Power Tools para Microsoft Visual Studio 2008 las cosas se ponen mucho más fáciles.

Ya comenté anteriormente las ventajas que posee el nuevo editor de alertas, pero sin embargo la posibilidad de crear una nueva alerta basada en las Policy Overrides simplifica mucho el trabajo que comentaba anteriormente.

image

Así es que de esta forma, cuando creemos una nueva suscripción para este tipo de eventos, podremos recibir un mail (entre otras cosas) para alertar sobre la violación de esta política.

image

 

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com

Buenas,

mi anterior post comentaba como crear un campo personalizado para definir el entorno de un origen de un Bug. Este campo permite identificar si el Bug originó el el entorno de Desarrollo, PreProducción o Producción, analizando luego el origen de los bugs podemos identificar variables que determinen como funciona nuestro equipo de QA, cuantos Bugs se reportan en Produccion (por favor ninguno !!!), etc.

Pero un detalle interesante a tener en cuenta puede ser identificar los Bugs que ocasionan los Builds de Team Foundation Server 2008 en un entorno diferente. Para esto podemos personalizar la definición del Build para definir los valores que tendrá el WorkItem que se creará siguiendo los siguientes pasos:

1. En el panel Team Explorer, seleccionar el Build que queremos modificar

2. Desplegar el menú contextual y seleccionar la opción Check Out for Edit (requerimiento TFS SideKicks)

 

3. Dentro de la definición del proyecto, podremos ver un xml similar a:

1 <Project DefaultTargets="DesktopBuild" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5"> 2 <PropertyGroup> 3 ... 4 <!-- Additional Properties --> 5 <!-- WorkItemType 6 The type of the work item created on a build failure. 7 --> 8 <WorkItemType>Bug</WorkItemType> 9 10 <!-- WorkItemFieldValues 11 Fields and values of the work item created on a build failure. 12 13 Note: Use reference names for fields if you want the build to be resistant to field name 14 changes. Reference names are language independent while friendly names are changed depending 15 on the installed language. For example, "System.Reason" is the reference name for the "Reason" 16 field. 17 --> 18 <WorkItemFieldValues>System.Reason=Build Failure;System.Description=Start the build using Team Build.System;ElBruno.BugSource=Build</WorkItemFieldValues> 19 20 <!-- WorkItemTitle 21 Title of the work item created on build failure. 22 --> 23 <WorkItemTitle>Build failure in build:</WorkItemTitle> 24 25 <!-- DescriptionText 26 History comment of the work item created on a build failure. 27 --> 28 <DescriptionText>This work item was created by Team Build on a build failure.</DescriptionText> 29 ... 30 <PropertyGroup> 31 </Project> 32

Donde es importante tener en cuenta las líneas

  • Linea 08: define el tipo de WorkItem que se creará si falla la ejecución un proyecto de Build
  • Línea 18: define los valores por defecto para los campos del WorkItem a crear (separados por ;)
  • Línea 23: define el prefijo del Título del WorkItem a crear
  • Línea 28: define la descripción del WorkItem a crear

4. De esta forma, si lanzamos un Build y el mismo dispara una excepcion, se creará un nuevo Bug con los siguientes datos por defecto:

 

5. Podemos ver en el histórico del mismo, los datos con los que se creó el Bug

 

Opción de las que me gustan a mi –> bien simples

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com
Más artículos Página siguiente >