enero 2008 - Posts

Buenas,
si te has peleado con los builds de Team Foundation Server sabrás que esta tarea es interesante, pero que al no poseer todavía las herramientas adecuadas puede un poco tediosa. No hay mucha información al respecto, y algunas acciones que pueden parecer muy simples, se complican más de lo necesario.
Es por esto, que una iniciativa como www.tfsbuild.com me parece excelente. Este site propone abordar el mundo de los builds de Team Foundation Server con un formato Wiki (que está de moda, pero que además es muy práctico).
Pues bien será cuestión de ver como evoluciona, ya veo que han tratado algunos temas tan dispares como la compilación de soluciones para el .Net framework 1.1 y para Java !!!
Saludos @ Home
El Bruno
Buenas
Después de los recientes estrenos de los grupos de usuarios .NET de Valencia y Tarragona, le toca el turno de empezar a rodar Second Nug con su evento inaugural "Primeros pasos con CSLA.NET", con Marçal Serrate como ponente de lujo.
Second Nug te invitra a conocer de forma fácil y accesible como crear objetos de negocio profesionales y a crear infraestructuras distribuidas para que tu aplicación jamás se quede pequeña. Ya seas desarrollador de escritorio, de dispositivos móviles o de web, CSLA.NET te puede ser de gran ayuda.
El evento se retransmitirá vía Microsoft Live Meeting de forma totalmente interactiva, con lo que todos podremos participar e interactuar los unos con los otros.
Vente el próximo día 5 de Febrero de 2008, desde las 19:00h hasta las 21:00h (GMT+1), a conocer las posibilidades que te ofrece el Framework CSLA.NET, y si te quedas con ganas de más pásate después del evento por la sala de actos de Microsoft en Second Life para charlar un poco y conocernos entre todos.
Podéis descargar Microsoft Live Meeting 2007 desde el siguiente enlace.
Para el encuentro de después del evento en Second Life tan solo teneis que crearos un avatar y descargar el software gratuito en: http://secondlife.com/
El enlace del registro del evento es:
http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032367020&EventCategory=4&culture=es-ES&CountryCode=ES
Saludos @ La Finca
El Bruno

Buenas
otro pequeño post para completar el post que inicialmente mostraba cómo crear menus personalizados para nuestros diagramas creados con las Domain Specific Language Tools.
Un detalle que no comenté en su día es que, en el archivo de creación de menús (.ctc), una de las opciones que podemos especificar son una serie de FLAGS que determinarán el comportamiento del menú. Por ejemplo, en la siguiente definición, la línea 9 determina que este menú por defecto aparecerá en modo no visible y que será posible cambiar la propiedad Visible del mismo.
1 // Add additional button definitions here.
2 // Command, Parent Group, Priority, Image, Type, Visibility, Text;
3 //guidCmdSet:duplicate, guidCmdSet:grpidContextMain, 0x0100, OI_NOID, BUTTON, DIS_DEF, "&Display Selected Item Information";
4 guidCmdSet:duplicate, // Command ID
5 guidCmdSet:grpidContextMain, // Group ID
6 0x0100, // Priority
7 IconDuplicate, // Icon ID
8 BUTTON, // Button Type
9 DEFAULTINVISIBLE | DYNAMICVISIBILITY, // Flags
10 "&Duplicate", // Command Text
11 "&Duplicate", // Menu Text
12 "Duplicate", // ToolTip Text
13 "Duplicate", // Command Well Text
14 "Duplicate", // English Command Name
15 "Duplicate"; // Localized Command Name
El listado completo de opciones con las que podemos los componentes de un menú lo podemos encontrar en http://msdn2.microsoft.com/en-us/library/bb166581(VS.80).aspx.
Luego en la implementación de la función que se encarga de evaluar si se debe mostrar o no, un elemento del menú; implemento una pequeña función que por defecto deja invisible el elemento del menú, a menos que el elemento selecccionado sea un Shape del tipo UserShape.
1 /// <summary>
2 /// Called when [duplicate menu display action].
3 /// </summary>
4 /// <param name="sender">The sender.</param>
5 /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
6 internal void OnDuplicateMenuDisplayAction(object sender, EventArgs e)
7 {
8 MenuCommand command = sender as MenuCommand;
9
10 // The popmenu command is by default disabled
11 command.Visible = false;
12 command.Enabled = false;
13
14 foreach (object selectedObject in this.CurrentSelection)
15 {
16 // validate if the selected element is a User Shape
17 if (selectedObject is ElBruno.Dsl15.UserShape)
18 {
19 command.Visible = true;
20 command.Enabled = true;
21 break;
22 }
23 }
24 }
De esta forma logramos que en el menú contextual que tenemos disponible sobre nuestro diagrama; la opción Duplicate sólo este visible cuando despleguemos el menú contextual sobre un Usuario. En el siguiente video la demo:
Video: DSL Tools - Menu
Descarga de codigo fuente: http://geeks.ms/files/folders/elbruno/entry67773.aspx
Saludos @ La Finca
El Bruno
Buenas,
periódicamente alguien me pregunta qué software utilizó para grabar los videos/demos que luego incrusto en mis post. La respuesta es simple: Windows Media Encoder.
Personalmente, me gusta WME porque utilizarlo es tan simple como en este pequeño video de 50 segundos. Simplemente seguimos el asistente inicial y listo, tendremos nuestro video (wmv) disponible para subir a cualquier sitio para alojar videos.
Video: Windows Media Encoder Demo
Podemos seleccionar la grabación de un video sobre una ventana, sobre una selección de coordenadas o directamente en modo full screen. Además, tenemos la opción de seleccionar la calidad del video a grabar y otras cosillas más. El asistente es muy simple, pero si quieres cambiar alguna opción a un detalle más bajo, puedes modificar estos valores en la configuración de la sesión de grabación.
Sin embargo, si necesitas opciones, existen otras herramientas que también sirven para grabar demos. Sobre algunas de éstas herramientas han comentado en los foros de Avanade y realmente algunas me han tentado para probarlas (como al clásico y popular Camtasia)
Por ahora seguiré con Windows Media Encoder y probaré algún trial (Camtasia Studio por ej.). Y, si me decido a cambiar (porque no creo que me decida a desembolsar unos €€€) postearé sobre la nueva herramienta.
Saludos @ Valentino's Home
El Bruno

Buenas
una pregunta recursiva que suelo escuchar de proyecto en proyecto, es cómo se pueden gestionar los requerimientos con Visual Studio Team System. Es cierto que este tipo de tarea depende mucho del esquema de trabajo que se quiera utilizar, y sobre esa base trato de explicar las posibilidades que brinda Visual Studio Team System y cómo podemos adaptarnos a ellas.
Hoy me he encontrado con una serie de 4 posts de Steve Lange donde explica un poco más en detalle el tema y según mi punto de vista lo aborda de una forma muy natural.
Part 1: RM in TFS - Overview Part 2: RM in TFS - Out of the Box Part 3: RM in TFS - Partner Integrations Part 4: RM in TFS - Summary
Les recomiendo echarle un vistazo y thanks Steve !!!
Saludos @ Home
El Bruno
Volvió Led Zeppelin, y si te gusta la música, seguramente admirarás a Jimmy Page como guitarrista. Cuando era pequeño y llegaron a mis manos los primeros vinilos de Led Zeppelin, comprendí donde había nacido toda la música que escuchaba. Fue por esos días donde comencé a aprender a tocar la guitarra.
Esta habilidad, profesión, o hobby en mi caso requiere una serie de capacidades mínimas, como son la capacidad de comprender los conceptos de básicos de una estructura musical, una cierta habilidad en ambas manos y cierta coordinación entre los componentes previos que nos permitan arrancar una melodia a una guitarra. Personalmente creo que cualquier persona con un poco de práctica es capaz de disfrutar con una guitarra en sus manos.
Sin embargo existen algunas personas que nacen con un "don" particular que los distingue de las demás. Estas personas se diferencias de las demás cuando tocan la guitarra a través de su swing particular.
Tengo la suerte de tener muchos amigos, que son excelentes músicos, poseen una destreza manual que les permite interpretar riffs imposibles, pero carecen de ese don que los llevaría a un nivel superior. Es por eso que, no importa dónde lo escuche, siempre identificaré el estilo especial de Carlos Santana, o las tristes melodías de Jimmy Hendrix seres superiores.
En la informática pasa algo similar; existen personas con una gran capacidad analítica, con grandes conocimientos y que son excelentes profesionales; pero también existe un grupo reducido de personas que además de tener estas características, despiertan una pasión sana por el trabajo que realizan. Cuando trabajas, asistes a un evento o compartes una cerveza con el 2do grupo de personas, usualmente te sientes motivado a enfrentar nuevos retos, a probar nuevas tecnologías.
He estado viendo parte de la agenda del evento para el lanzamiento de Microsoft Visual Studio 2008, SQL Server 2008 y Windows Server 2008, ahora conocido como Microsoft TechDays y estoy seguro que saldré de allí con más ganas que nunca de acercarme a un teclado. Si a esto le sumo, otro evento interno de Avanade (en una línea muy parecida al anterior) y el desembarco de Joe Satriani en Barcelona, los próximos meses serán moviditos e interesantes.
Saludos @ Home (con la Gibson en la mano)
El Bruno

Buenas,
más sobre escenarios especiales cuando trabajamos con las Domain Specific Language Tools; en este caso cómo hacer para que en un Shape gráfico, se cambie el aspecto del mismo dependiendo del valor de una propiedad.
Sobre el ejemplo que trabajo diariamente, en el elemento UserElement he agregado una nueva propiedad booleana llamada UserState. La idea es que dentro del diagrama visual, se cambie la apariencia del mismo, cuando el valor cambie de True -> False -> True.
Para representar el estado, he modificado el Shape que representa al usuario y le he agregado un nuevo "decorator" llamado IconState que mostrará el estado de la propiedad UserState. Cuando la propiedad sea True, se visualizará una imagen y en caso contrario no se visualizará nada.
Para lograr el efecto de mostrar/ocultar la imagen, podemos realizar la siguiente configuración dentro del panel DSL Details. En primer lugar debemos seleccionar la relación entre el elemento UserElement y UserShape. A continuación dentro de la pestaña Decorator Tabs, seleccionamos el decorator IconState y lo asociamos como muestra la siguiente imagen, asociamos su visibilidad a la propiedad UserState.
Internamente la definición del DSL ha generado el siguiente código, donde asocia la visualización del decorator IconState al valor de la propiedad UserState utilizando la función ShapeField.AssociateVisibilityWith(), como podemos ver en las líneas 20 y 21.
1 /// <summary>
2 /// Class containing decorator path traversal methods for UserShape.
3 /// </summary>
4 internal static partial class UserShapeDecoratorMap
5 {
6 /// <summary>
7 /// Event handler called when decorator initialization is complete for UserShape. Adds decorator mappings for this shape or connector.
8 /// </summary>
9 public static void OnDecoratorsInitialized(object sender, global::System.EventArgs e)
10 {
11 DslDiagrams::ShapeElement shape = (DslDiagrams::ShapeElement)sender;
12 DslDiagrams::AssociatedPropertyInfo propertyInfo;
13
14 propertyInfo = new DslDiagrams::AssociatedPropertyInfo(global::ElBruno.Dsl15.UserElement.NameDomainPropertyId);
15 DslDiagrams::ShapeElement.FindDecorator(shape.Decorators, "NameDecorator").AssociateValueWith(shape.Store, propertyInfo);
16
17 propertyInfo = new DslDiagrams::AssociatedPropertyInfo(global::ElBruno.Dsl15.UserElement.EMailDomainPropertyId);
18 DslDiagrams::ShapeElement.FindDecorator(shape.Decorators, "EMail").AssociateValueWith(shape.Store, propertyInfo);
19
20 propertyInfo = new DslDiagrams::AssociatedPropertyInfo(global::ElBruno.Dsl15.UserElement.UserStateDomainPropertyId);
21 DslDiagrams::ShapeElement.FindDecorator(shape.Decorators, "IconState").AssociateVisibilityWith(shape.Store, propertyInfo);
22 }
23 }
24
Luego en ejecución nuestro diagrama mostrará u ocultará la imagen, para completar un poco más el ejemplo he agregado una nueva opción a través de un menú contextual que cambia el valor de UserState desde otra ubicación. Y un video vale más que mil imágenes:
Video: DSL Tools - Custom Visibility Demo
Descarga:
Saludos @ Home
El Bruno
n

Buenas,
una de las grandes ventajas del modelado se basa en las capacidades gráficas del mismo; es por eso que de la personalización que le brindemos a nuestros modelos dependerá el exito de los mismos. Existen pequeños detalles que hacen que una aplicación sea de fácil utilización, uno de ellos es la correcta utilización de los Tooltips.
Nota: Antes de mostrar como se pueden personalizar los Tooltips, me gustaría comentar que el contenido de los mismos, es algo que también tenemos que evaluar. A nadie le gustan esos Tooltips que tienen 1287 caracteres y que nunca podemos terminar de leer; cómo dijo el Negro Fontanarrosa "Una palabra puede herir. Pero un martillazo es feroz"
Utilizando las Domain Specific Language Tools, tenemos la capacidad de personalizar el contenido de los Tooltips de los shapes de una forma muy simple. Por ejemplo, si en un GeometryShape cambiamos la propiedad ToolTip a Variable, como muestro en la figura siguiente, nos obliga a implementar la funcion GetVariableTooltipText.
A esta función la he implementado en una clase parcial y dentro de la misma, he creado una cadena que incluye el nombre y la dirección de mail del usuario seleccionado y a partir de este contenido, arma el tooltip (string) para retornar.
1 public partial class UserShapeBase
2 {
3 /// <summary>
4 /// Gets the variable tooltip text.
5 /// Creates a tooltip with the name and the email of the user
6 /// </summary>
7 /// <param name="item">The item.</param>
8 /// <returns></returns>
9 private string GetVariableTooltipText(DiagramItem item)
10 {
11 UserShape ueS = item.Shape as UserShape;
12 UserElement ue = ueS.ModelElement as UserElement;
13 string