septiembre 2008 - Posts

Buenas,
si migras código desde VSS a TFS, o cambias la asociación de algún proyecto entre servidores Team Foundation Server 2008, es muy probable que te encuentres con el siguiente error:
There appears to be a discrepancy between the solution's source control information about some project(s) and the information in the project file(s).
Este error por lo general viene dado por errores en la configuración de uno o más proyectos dentro de una solución.
La solución consiste en desde el menu File // Source Control // Change Source Control realizar un UnBind y luego un Bind del proyecto al servidor correspondiente. Sin embargo, cuando esta solución no surge efecto tenemos acceso al plan B.
Aclaración: el plan B no está soportado oficialmente por la gente de Seattle, pero si a alguien lo saca de un apuro considérese en deuda conmigo, una deuda barata, sólo una caña.
Estos son los pasos para eliminar la información manualmente:
1. Editar el proyecto, para esto desplegar el menú contextual y seleccionar la opcion Edit Project File. (para esto son necesarias las Power Commands de Visual Studio 2008, nos permiten ahorrarnos un click)
2. Revisar si dentro del archivo de proyecto los valores de los nodos <SccProjectName>, <SccLocalPath>, <SccAuxPath> y <SccProvider>. Por ejemplo, en el siguiente archivo de proyecto, el mismo ha arrastrado un poco de información basura desde Source Safe:
1 <?xml version="1.0" encoding="utf-8"?>
2 <Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3 <PropertyGroup>
4 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
5 <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
6 <ProductVersion>9.0.30729</ProductVersion>
7 <SchemaVersion>2.0</SchemaVersion>
8 <ProjectGuid>{138F05E7-0B40-4607-A668-7EFE1573E3FB}</ProjectGuid>
9 <OutputType>Library</OutputType>
10 <AppDesignerFolder>Properties</AppDesignerFolder>
11 <RootNamespace>TfsBuildEventProcessor</RootNamespace>
12 <AssemblyName>TfsBuildEventProcessor</AssemblyName>
13 <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
14 <FileAlignment>512</FileAlignment>
15 <SccProjectName>%24/Root/Services/MyService</SccProjectName>
16 <SccLocalPath>..</SccLocalPath>
17 <SccAuxPath>http://TFSRTM08:8080</SccAuxPath>
18 <SccProvider>{4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}</SccProvider>
19 </PropertyGroup>
20 ...
21 </Project>
3. En este punto existen 2 alternativas para solucionar el problema, cambiar el valor de los los nodos <SccProjectName>, <SccLocalPath>, <SccAuxPath> y <SccProvider> por SAK; o eliminar los mismos; y nuevamente realizar una tarea de UnBind y Bind.
4. Una vez reconectado el proyecto nuevamente al Source Control correspondiente, la definición del proyecto debe quedar como el siguiente ejemplo:
1 <?xml version="1.0" encoding="utf-8"?>
2 <Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3 <PropertyGroup>
4 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
5 <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
6 <ProductVersion>9.0.30729</ProductVersion>
7 <SchemaVersion>2.0</SchemaVersion>
8 <ProjectGuid>{138F05E7-0B40-4607-A668-7EFE1573E3FB}</ProjectGuid>
9 <OutputType>Library</OutputType>
10 <AppDesignerFolder>Properties</AppDesignerFolder>
11 <RootNamespace>TfsBuildEventProcessor</RootNamespace>
12 <AssemblyName>TfsBuildEventProcessor</AssemblyName>
13 <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
14 <FileAlignment>512</FileAlignment>
15 <SccProjectName>SAK</SccProjectName>
16 <SccLocalPath>SAK</SccLocalPath>
17 <SccAuxPath>SAK</SccAuxPath>
18 <SccProvider>SAK</SccProvider>
19 </PropertyGroup>
20 ...
21 </Project>
Saludos @ Home
El Bruno
Buenas,
después de unos meses en los que he abandonado algunos de mis hobbies, estuve pensando en como aprovechar los mismos en mi trabajo diario y llegué a la conclusión de que necesitaba un
Lanzador de misiles inalámbrico USB disparado por eventos de un servidor Team Foundation Server 2008.
Estar al tanto del resultado de las compilaciones en un servidor TFS es imprescindible para asegurar la calidad del código. Esta información puede llegarnos por varios medios, usualmente por mail; pero mucha gente pasa de esta información por lo que hay que tener otra alternativa para estos casos.
Es por eso que tuve una pequeña idea y he aquí un pequeño diagrama de la misma:
- Supongamos que Darren (un desarrollador) realiza un CheckIn de código con errores.
- La configuración dispara un proceso de Build, en el servidor de compilación.
- El Build no puede compilar el código, por lo que se marca como Failed.
- Se dispara un evento con el resultado de este Build.
- Uno de los subscriptores de los eventos, determina que para este tipo de Build y para el estado Failed, debe informar al servicio de Lanza Misiles de la persona que disparó este Build (Darren)
- El servicio de lanzamisiles, obtiene de su configuración la ubicación de Darren y procede a lanzarle un misil.
- Darren aprender la lección y verifica el código antes de subirlo.
Muchas personas piensan que un buen equipo de desarrollo funciona en base a la motivación y al respeto. Yo comparto estos pensamientos, pero una vez que patente el TFSBuild Missile Launcher, les propongo utilizarlo y me comentan sus resultados.
Suscripción a eventos de TFS
Volvamos un poco a la tecnología, que es lo trato de escribir mayormente en este blog, y lo primero con lo que tuve que lidiar fue con la suscripción a los eventos de Team Foundation Server 2008.
El sistema de eventos de TFS es un sistema bastante extensible ya que permite varios canales de suscripción y uno de ellos puede ser SOAP, con lo que la suscripción a los eventos se torna en un simple proyecto WCF.
Para esta tarea me basé principalmente en este artículo donde explican paso a paso como crear un proyecto WCF para interpretar eventos TFS. Una vez creado un nuevo proyecto VB.Net de WCF, al que he llamado TfsEventListenerService, lo siguiente ha sido renombrar la interfaz que define los contratos de mi servicio por ITfsEventSuscriber y la clase que los implementa TfsEventSuscriber.
El código de la interfaz y de la clase ha quedado muy simple:
1 ''' <summary>
2 ''' Interface to interact with Team Foundation Server event notificacion service
3 ''' </summary>
4 <ServiceContract(Namespace:="http://schemas.microsoft.com/TeamFoundation/2005/06/Services/Notification/03")> _
5 Public Interface ITfsEventSubscriber
6
7 ''' <summary>
8 ''' Notifies the specified event XML.
9 ''' </summary>
10 ''' <param name="eventXml">The event XML.</param>
11 ''' <param name="tfsIdentityXml">The TFS identity XML.</param>
12 <OperationContract(Action:="http://schemas.microsoft.com/TeamFoundation/2005/06/Services/Notification/03/Notify")> _
13 Sub Notify(ByVal eventXml As String, ByVal tfsIdentityXml As String)
14
15 End Interface
16
17 ''' <summary>
18 ''' Implements a custom event listener for Team Foundation Server events
19 ''' </summary>
20 Public Class TfsEventSubscriber
21 Implements ITfsEventSubscriber
22
23 ''' <summary>
24 ''' Notifies the specified event XML.
25 ''' </summary>
26 ''' <param name="eventXml">The event XML.</param>
27 ''' <param name="tfsIdentityXml">The TFS identity XML.</param>
28 Public Sub Notify(ByVal eventXml As String, ByVal tfsIdentityXml As String) Implements ITfsEventSubscriber.Notify
29
30 ' send information to debug window
31 Dim infoIdentity As String = String.Format("TFS Identity: {0}", tfsIdentityXml)
32 Dim infoEvent As String = String.Format("Event Xml: {0}", eventXml)
33
34 Debug.Print(infoIdentity)
35 Debug.Print(infoEvent)
36
37 ' process tfs event
38 'TfsBuildEventProcessor.BuildEvent.ProcessEvent(eventXml)
39
40 End Sub
41
42 End Class
43
Nota: Es importante remarcar las líneas 37 y 38 que es donde se realiza la interfaz de llamada al proyecto que evalúa el resultado de los builds recibidos por este canal.
Para suscribir este servicio, existe la opción más conocida que es utilizar la herramienta de línea de comandos BISSuscribe, pero en mi caso y como soy un poco más práctico, me he aprovechado de las ventajas del último Service Pack para Microsoft Visual Studio 2008 y he creado la suscripción con los siguientes pasos:
1. En el panel Team Explorer, selecciono la opción Alerts del Team Project sobre el que quiero trabajar.
2. En el formulario Alerts Editor, selecciono New y en el tipo de alerta selecciono Build Alerts
3. En la definición de la nueva alerta defino
De esta manera, nuestro servidor TFS informará con un formato SOAP a la url definida cada vez que se realice un build para el proyecto Calculator Build.
Interpretando la información de los Builds de TFS
Una vez creado un servicio WCF que recibirá las notificaciones del servidor TFS, lo siguiente que necesitaba era crear un pequeño intérprete que me permita evaluar el contenido de un build para tomar acciones sobre el mismo. Para esto, cree un nuevo proyecto de librería de clases en C# y dentro del mismo, sobre un XML de un build cree el siguiente schema con su clase asociada. Este es el Xsd con el que interpreto el resultado de los builds.
Adicionalmente en una clase llamada BuildEvent, he creado una función que permite evaluar el resultado de un build.
1 namespace TfsBuildEventProcessor
2 {
3 public class BuildEvent
4 {
5 const string Status_Failed = "Failed";
6 const string Status_Successfully_Completed = "Successfully Completed";
7 const string Status_Partially_Succeeded = "Partially Succeeded";
8
9 /// <summary>
10 /// Processes the event.
11 /// </summary>
12 /// <param name="eventXml">The event XML.</param>
13 public static bool ProcessEvent(string eventXml)
14 {
15 // load xml and deserialize
16 XmlDocument doc = new XmlDocument();
17 doc.LoadXml(eventXml);
18 BuildCompletionEvent2 bce =(BuildCompletionEvent2) XMLHelper.Deserialize(doc, typeof(BuildCompletionEvent2));
19
20 // define build status
21 if (bce.CompilationStatus == Status_Successfully_Completed)
22 {
23 // Build sucess, don't do anything
24 Debug.WriteLine("Build Successfully Completed");
25 }
26 else if (bce.CompilationStatus == Status_Partially_Succeeded)
27 {
28 // Build partially succeeded, don't do anything or maybe yes :D
29 Debug.WriteLine("Build Partially Succeeded");
30 }
31 else if (bce.CompilationStatus == Status_Failed)
32 {
33 // build failed, find requested by
34 Debug.WriteLine("Build Failed, requested by: {0}", bce.RequestedBy);
35
36 // FIRE TO DEVELOPER !!!
37 }
38
39 // return process result
40 return true;
41 }
42 }
43 }
El código es bastante straighfoward, pero vale la pena remarcar que una vez serializado a un objeto el XML con el resultado del build (línea 16), a continuación realizo una serie de validaciones para conocer el estado del mismo y tomar la acción correspondiente (líneas 21 hasta 35).
Este proyecto es el que servirá de enlace con el lanza misiles USB para indicar que es necesario lanzar un misil a una persona en concreto.
Lansa Misiles Inalámbrico

Hace unos días me llegó por correo, uno de los últimos juguetes al que le tenía ganas desde hace tiempo. Se trata de un lanza misiles inalámbrico USB.
A nivel software el mismo no instala ningún driver, ya que Windows lo reconoce como un dispositivo Human Device Interface (HDI), pero si instala una única aplicación que nos permite controlar el lanza misiles: WirelessLauncher.exe
Esta aplicación nos permite direccionar los misiles utilizando 4 ejes, disparar los mismos, y resetear la posición del lanza misiles a un setup inicial.
La única queja que tengo con la aplicación es que muchas veces no se cierra correctamente y queda una instancia en ejecución. Esto ocasiona que si abrimos nuevas instancias de la aplicación, la misma no puede conectar con el HDI ya que lo “tiene tomado” la instancia que no se ha cerrado correctamente.
Conclusión y próximos pasos
En este primer post quería comentar además de la idea general del TFS Build Missile Launcher, las excelentes oportunidades que poseemos para suscribirnos y trabajar con eventos de Team Foundation Server; y un poco sobre la pieza de hardware con la que integraremos el servicio de Builds.
En la 2da parte, comentaré cómo trabajar con este HDI, y como ensamblar todas las partes para lograr tener todo el diagrama en funcionamiento, además de todo el código fuente y un vídeo de ejemplo.
Saludos @ Home
El Bruno
Referencias
Buenas,
pues si, no nos ibámos a quedar afuera de la gira del Guille, y el próximo 2 de Octubre lo podrás ver en las oficinas de Microsoft hablando un poco de lo que más sabe.
Puedes encontrar más informacion en http://madriddotnet.spaces.live.com/blog/cns!6453107D41F04C68!159.entry
Saludos @ Home
El Bruno

Buenas,
los que me conocen saben que una de mis grandes habilidades es la de no tener memoria, en este sentido soy casi como un cactus (si alguno conoce un cactus con memoria le invito una pizza).
Es por eso que cada tanto posteo cosillas que siempre se me olvidan como por ejemplo esta:
¿Cómo creo una clase que me permita trabajar con un archivo xml a partir del mismo?
Ya sé que es una pregunta un tanto borrica, pero tuve que recurrir a la ayuda de mi amigo Javi (aka PYC), para recordarlo y he aquí los pasos:
1. Tenemos un archivo SampleXml.xml con el siguiente contenido
<?xml version="1.0" encoding="utf-8"?>
<Cliente>
<Nombre>Jose</Nombre>
<EMail>jose@elbruno.com</EMail>
<Edad>32</Edad>
</Cliente>
2. Para crear un xsd a partir del mismo tenemos 2 opciones, lo editamos en Visual Studio y seleccionamos la opción del menu Xml // Create Schema
o desde la linea de comandos utilizamos la herramienta Xsd.
C:\Program Files\Microsoft Visual Studio 9.0\VC>xsd "c:\Temp\samplexml.xml" /out:c:\temp
3. El Xsd resultante es similar al siguiente
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Cliente">
<xs:complexType>
<xs:sequence>
<xs:element name="Nombre" type="xs:string" />
<xs:element name="EMail" type="xs:string" />
<xs:element name="Edad" type="xs:unsignedByte" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
4. Para crear luego una clase que nos permita trabajar con el xml inicial, desde la línea de comandos ejecutaremos la siguiente opción
C:\Program Files\Microsoft Visual Studio 9.0\VC>xsd "c:\Temp\samplexml.xsd" /out:c:\temp /classes
Esta opcion “/classes” permite generar clases tanto C# como VB.Net.
5. Finalmente, podemos agregar los archivos generados a un proyecto y trabajar con el mismo utilizando las clases que hemos creado. Por ejemplo:
static void Main(string[] args)
{
// cargamos un xml a partir de un fichero
XmlDocument document = new XmlDocument();
document.Load(@"C:\Temp\SampleXml.xml");
// creamos el objeto correspondiente
Cliente cliente = (Cliente)Deserialize(document, typeof(Cliente));
// mostramos parte de la informacion del xml
Console.WriteLine("Nombre: {0}", cliente.Nombre);
Console.WriteLine("Edad: {0}", cliente.Edad);
Console.WriteLine("EMail: {0}", cliente.EMail);
Console.ReadKey();
}
Es posible descargar el proyecto de ejemplo desde http://geeks.ms/files/folders/elbruno/entry101271.aspx (gracias Geeks.ms)
Saludos @ Here
El Bruno
Buenas,
una de las preguntas que casi siempre se leen en los foros de Team System o que recibimos en los eventos, está relacionada con la gestión de los proyectos de desarrollo Sharepoint/MOSS con Visual Studio Team System.
En este punto hago un ejercicio de humildad, ya que mucho al conocer muy poquito sobre MOSS 2007 no puedo opinar mucho al respecto.
Sin embargo, acabo de dedicarle unos minutos de lectura al siguiente artículo y me ha dejado las cosas un poco más claras:
Using Team Foundation Server to Develop Custom SharePoint Products and Technologies Applications
Obviamente, hasta que no tenga una buena referencia (un caso real) o una experiencia propia, me guardaré mi opinión; pero mientras ¿tu que opinas sobre MOSS / VSTS?
Saludos @ Home
El Bruno

Buenas,
si bien el amigo Luis me ha tentado para desvelar la última frikada que estoy haciendo; he logrado contenerme mientras sigo averiguando cual es la cadena correcta de bytes para disparar el HID y mejor trato de resumir un post MUY INTERESANTE de Brian Harry sobre algunos detalles de Rosario (la nueva versión de Visual Studio Team System)
En primer lugar, nobleza obliga y a leer el post completo aquí, y ahora un resumen de lo que más me ha llamado la atención:
- Sistemas Operativos
Rosario soportará Windows Server 2003, Windows Server 2008 y el futuros sistemas operativos de Windows Server. Se planteó la posibilidad de no incluir WS2003, pero después el sentido común llamó a la puerta de los chicos de Redmond y tomaron la decisión correcta.
- 64-bit
Rosario soportará servidores 64 bits. :D
- Virtualización
Si bien siguen las pruebas la recomendación seguirá siendo que se ejecuta el SQL Server en un server nativo/host OS pero que otros componentes TFS se pueden ejecutar en un entorno Virtualizado.
- SQL Server
Punto muy importante: en Rosario no se puede utilizar SQL Server 2005, sólo se admite SQL Server 2008. Era una decisión controvertida, pero es una decisión final. El principal motivo es Reporting Services 2008 que es muchoooo mejor que en versiones anteriores. Existen otras razones mejoras en la indexación, en la compresión de índices, etc.
- SharePoint
Rosario no soportará SharePoint 2.0, se requiere como mínimo SharePoint 3.0 (2007) para los portales de proyecto.
- Project Server
Rosario incluye la integración con Project Server, pero no es necesario instalar y trabajar con el mismo.
- Servidores de Compilación
La versión de servidor de compilación de TFS debe coincidir con la versión del servidor TFS. Es por esto que se debe actualizar todos los servidores de compilación de TFS al mismo tiempo que el servidor de TFS al que están asociados.
- Versiones de Cliente
Una de las grandes preocupaciones que existen es la compatibilidad con versiones anteriores de Visual Studio, y debido a los grandes cambios que se incluyen en Rosario, este punto es muy delicado, porque mantener una compatibilidad 100% entre versiones anteriores es imposible. El plan propuesto es crear actualizaciones (parches, SP, etc.) para las versiones anteriores (Team Explorer 2005, Team Explorer 2008 y el proveedor de MSSCCI) que permitirles conectarse e interactuar eficazmente con un servidor de TFS Rosario. Por otra parte el cliente Rosario funcionará bien con un servidor TFS 2005 o TFS 2008.
- Oficina
Rosario soportará Office 2007 o posterior. Esto significa que nos se se quitando soporte para clientes de Office 2003.
Brian deja muchos más detalles en su post original, por lo que recomiendo leerlo detenidamente.
Saludos @ Home
El Bruno

Buenas,
hoy me preguntaron si tenía algún ejemplo simple de utilización de las tecnologías de TextToSpeech incluidas en Vista o WS2008. Hace un tiempo hablé un poco de esto en una charla en Córdoba, pero si de memoria tengo que escribir algo, me sale lo siguiente (basado en SpeechSynthesizer):
1 using System;
2 using System.Speech.Synthesis;
3
4 namespace tts1
5 {
6 class Program
7 {
8 static void Main(string[] args)
9 {
10 SpeechSynthesizer ttsSynth = new SpeechSynthesizer();
11 ttsSynth.SelectVoice("Microsoft Anna");
12 string line = "Hi ... my name is Valentino";
13 while (line.Length > 0)
14 {
15 ttsSynth.Speak(line);
16 line = Console.ReadLine();
17 }
18 }
19 }
20 }
Proyecto de consola, con referencias a System.Speech, F5 y listo !!!
Saludos @ Here
El Bruno
PD: si lo que queremos es reconocer la voz … hace más tiempo aún escribí algo al respecto System.Speech, Hello World pero al reves
Buenas,
en primer lugar quiero agradecer a Fernando por invitarme a dar una charla virtual en Live Meeting como parte del programa Student to Business
. En los siempre escasos 120 minutos del evento traté de dar un repaso por algunas de las capacidades mínimas de Visual Studio Team System, desde el punto de vista de varios perfiles en un “mini proyecto” de ejemplo.
Si bien 2da parte es el próximo sábado, y después de ese evento subiré el código y la presentación; Fernando me pidió si podía publicar algunos de los recursos con los que trabajé para que sirvan de referencia a la gente que quiera comenzar a probarlos. Asi que aquí están:
Herramientas
Máquinas Virtuales y service packs
Herramientas de desarrollo y Frameworks de referencia
Saludos @ Here
El Bruno

Buenas,
ayer en la charla de Jesus sobre gestión de código fuente después de que le reventará su portátil con un bluetooth de procedencia dudosa, se trataron bastantes temas interesantes y sobre los cuales, creo que no hay una respuesta correcta para los mismos. Uno de ellos era el dichoso
¿Cuál es la mejor organización que puedo darle a mis directorios dentro del Source Control?
El amigo Jesus propuso lo que se describe en la guía de desarrollo de Visual Studio Team System, y nuestro amigo Luis aka el 2do follonero le dijo que tal vez ese modelo no es muy óptimo para las compilaciones automáticas.
El esquema de directorios era parecido al de la siguiente imagen, donde podemos ver varias soluciones que se corresponden con diferentes directorios, donde estan los proyectos de las mismas:
y la cuestión radicaba en que para compilar una solución, por ejemplo la solución web: WebApp, era necesario incluir un WorkingFolder apuntando a $/SampleDemo/Main/Src y esto suponía descargar además del directorio Web, descargar los directorios Win y WinService (esto supone más tiempo en un build y eso no es recomendable)
Esto se puede realizar jugando un poquito con la configuración del build, y por suerte en Team Foundation Server 2008 se ha incluido dentro del asistente. En el paso de definición de Workspaces, podemos definir que en los directorios Win y WinService no se descargue el contenido de los mismos, definiéndolos como Cloaked.
La siguiente imagen muestra un ejemplo de la configuración de este build
Asi que bien, si hay directorios que molestan a la hora de definir un Build, tal vez la opción Cloaked sea de ayuda :D
Saludos @ Here
El Bruno

Buenas,
si bien cada tanto comentó alguna novedad de algún producto, hoy no diré nada sobre la nueva versión de XNA Game Studio 3.0, ni sobre la nueva versión del Open XML Format SDK 2.0; pero si me gustaría hablar sobre el nuevo TFS Migration Toolkit y sobre su “hijo” la TFS to TFS Migration Tool.
En primer lugar comentar que se solucionan algunos bugs y se incluyen, entre otras, las siguientes novedades:
- nuevos índices en las bases de datos de migración para mejorar la performance
- soporte para la migración de elementos de VC y WI entre servidores TFS de diferentes versiones
- warnings frente a problemas de sincronización (por ejemplo la no utilización de la cuenta de servicio)
- nuevas opciones de configuración, como por ejemplo setear el intervalo de tiempo de refresco entre sesiones
Y, los que hemos utilizado alguna vez esta herramienta, sabemos que si bien tiene sus limitaciones estas novedades y la solución de los bugs son bienvenidas.
Saludos @ Here
El Bruno

Buenas,
desde hace unos días algunos compañeros de trabajo se quejaban porque:
siempre que abrían una solución, que estaba bajo el control de código fuente de un Team Foundation Server 2008, la misma automáticamente proponía la opción de desproteger la misma y modificarla en local.
Como yo soy una persona que se basa en “ver para creer”, me sonaba imposible que TFS en un mismo archivo de texto sin modificaciones propusiera la opción de desbloquearlo (vamos que muy normal no suena el escenario). Así que decidí darle una vuelta y ver cual podía ser el problema.
Después de un par de minutos, y como no podía ser de otra manera, resultó que todo funcionaba correctamente. Y el gran problema estaba dado en que uno de los developers, había registrado el Team Foundation Server 2008 utilizando la dirección IP del mismo, en lugar del nombre.
Por este motivo, cuando se descargaba la última versión y actualizaba los datos de conexión el Source Control Provider, era necesario modificar el archivo para cambiar http://myTFS por http://10.10.10.10.
Con un simple vistazo al historico del archivo y comparando el mismo, pude ver como muestro en la siguiente imagen censurada por motivos personales que el problema estaba en la IP.
Asi que, el developer que había registrado el server utilizando una IP por inspiracion divina o exceso de cerveza ya supo como seguir adelante y el resto de compañeros de equipo tenemos material para reirnos durante unos días.
Saludos @ Here
El Bruno
Buenas,
todos los días se encuentra un error nuevo y por suerte una o más soluciones al mismo. En el día de hoy toca el siguiente error relacionado con la configuración del servidor de compilación:
TF215085: An error occurred while connecting to agent \Valentino\BuildServer: TF42053: The build machine is not configured to build for server http://NewServer:8080/. The build machine is configured for one Team Foundation Server only. To change the Team Foundation Server for the build machine, update the AllowedTeamServer key in the file TFSBuildService.exe.config and restart the service.
La solución, como se indica en la propia descripción del error, es modificar el archivo de configuración asociado al servicio de Build, usualmente ubicado en:
"..\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies\TFSBuildService.exe"
y dentro de las settings del mismo, modificar la clave @AllowedTeamServer como muestro en el siguiente ejemplo:
<appSettings>
...
<!-- AllowedTeamServer
This is the Team Foundation Server Application Tier that can connect
to this build machine. This value should be the URL for the AT,
such as http://myserver:8080.
This value overrides the setting in HKCU.
-->
<add key="AllowedTeamServer" value="http://ValentinoBuildServer:8080" />
...
</appSettings>
Una vez modificado, simplemente hay que reiniciar el servicio y listo … a seguir con las compilaciones automáticas.
Saludos @ Here
El Bruno

Buenas,
interesante error para empezar el lunes con un Team Foundation Server 2008. En este caso es un problema de seteo de horas en el servidor TFS, esto ocasiona que en determinadas acciones como el CheckIn o al intentar salvar un WorkItem nos encontremos con el siguiente error:
---------------------------
Microsoft Visual Studio
---------------------------
TF54000: Cannot update data because the server clock may have been set incorrectly. Contact your Team Foundation Server Administrator.
---------------------------
OK
---------------------------
Este error está ocasionado ya que algunos elementos se han salvado con una hora inválida en el TFS (que novedad !!!).
En realidad el server TFS ha trabajado con una “hora futura” durante un período de tiempo y luego se ha actualizado a la hora actual. El problema viene dado con los elementos que se han grabado con esa “hora futura” y que al momento de ser modificados, quieren incluir en su historial una hora no válida.
Lo mejor es esperar hasta que los relojes se sincronicen y ya podremos volver a trabajar con los elementos que posean esa “hora futura”.
Saludos @ Here
El Bruno
Buenas,
sigo desempolvando drafts para los posts, y una de las cosillas que tenía pendiente es hablar un poco sobre una novedad que no es tan novedad: MSDN Code Search Preview. Este site, repite un concepto similar al Google Code Search, aunque aquellos que trabajamos con tecnologías Microsoft, encontraremos algunas características que nos resultarán atractivas.
Una de ellas, es que principalmente busca dentro del código de ejemplo que posee MSDN. Esto significa que si alguna vez, te acordaste de esas 5 líneas de código que te ayudarían muchísimo, pero después perdiste 2 días buscándolas, ahora con MSDN Code Search Preview las cosas serán mucho más fáciles.
Por ejemplo, si querés ser como Mister Anderson Neo y ver parte del código de Matrix, podes realizar una búsqueda por SetIdentity en VB.Net y verás el siguiente resultado:
Estas son algunas de las características que posee el site:
- Búsqueda avanzada, como en todos los buscadores.
- Búsqueda por lenguaje, opción un tanto inútil, ya que seguramente la mayoría de la gente busca siempre los ejemplos en VB.Net.
- Búsqueda por identificadores, por nombres de funciones, de clases, etc.
Saludos @ Home
El Bruno