[KINECT] HowTo: “Hola Mundo” con C# y Kinect

image

Buenas,

ayer mostré como instalar los drivers para poder acceder al Kinect en un ordenador con Windows, pues hoy toca mostrar como podemos hacer el “hola mundo” con las bibliotecas de OpenNI y NITE de PrimeSense. Antes de comenzar a tirar una línea, asumo que todos se leerán los contratos de licencia y distribución para estas bibliotecas, así que … al tutorial.

Tutorial

1. En primer lugar, conseguite un #Kinect. Yo te presto el mío, pero viene con el Valentino de regalo.

2. Asegurate que dentro del Device Manager se reconoce correctamente los drivers para la cámara y el motor. Dale un vistazo a mi post de ayer.

image

 

3. Para este ejemplo crearemos una nueva aplicación de Consola. Yo me he jugado con el nombre y le he puesto “ConsoleApplication01”.

4. Agregamos una referencia a [ManagedNite.dll], que es la biblioteca que nos permitirá interactuar con el Kinect. Este ensamblado se encuentra el directorio de instalación de NITE, usualmente en [Prime SenseNITEWrappersC#Bin]

5. Agregamos un archivo de configuración de aplicación [App.Config] para poder utilizar el ensamblado [ManagedNite.dll], con la siguiente configuración dentro:

   1: <?xml version="1.0" encoding="utf-8"?>

   2: <configuration>

   3:   <startup useLegacyV2RuntimeActivationPolicy="true">

   4:     <supportedRuntime version="v4.0" />

   5:   </startup>

   6: </configuration>

 

6. Agregamos un directorio llamado [Data] y dentro del mismo un archivo xml llamado [openni.xml]. Este archivo contiene la información de configuración para acceder a los servicios del Kinect. Como tiene bastante texto, mejor lo miras en el archivo adjunto.

7. Modificamos la aplicación con el siguiente código:

   1: using System;

   2: using System.Threading;

   3: using ManagedNite;

   4:  

   5: namespace ConsoleApplication1

   6: {

   7:     class Program

   8:     {

   9:         private static XnMOpenNIContext _context;

  10:         private static Thread _readerThread;

  11:         private static XnMSessionManager _sessionManager;

  12:         private static bool _shouldRun;

  13:         private static bool _waveDetected;

  14:  

  15:         static void Main()

  16:         {

  17:             Console.WriteLine("Iniciando acceso a Kinect ...");

  18:             _shouldRun = true;

  19:             _context = new XnMOpenNIContext();

  20:             _context.Init();

  21:  

  22:             _sessionManager = new XnMSessionManager(_context, "Wave", "RaiseHand");

  23:             _sessionManager.FocusStartDetected += SessionManagerFocusStartDetected;

  24:  

  25:             _readerThread = new Thread(ReaderThread);

  26:             _readerThread.Start();

  27:  

  28:             Console.WriteLine("Kinect online. Saluda para comenzar");

  29:             Console.WriteLine();

  30:             Console.ReadLine();

  31:         }

  32:  

  33:         static void SessionManagerFocusStartDetected(object sender, FocusStartEventArgs e)

  34:         {

  35:             if (!_waveDetected)

  36:             {

  37:                 Console.WriteLine("Saludo detectado :D");

  38:                 Console.WriteLine("Saluda de nuevo para cerrar la aplicación");

  39:                 Console.WriteLine();

  40:                 _waveDetected = true;

  41:             }

  42:             else

  43:             {

  44:                 Console.WriteLine("Kinect offline. Puedes cerrar la consola");

  45:                 _shouldRun = false;

  46:                 _context.Close();

  47:                 _readerThread.Abort();

  48:                 Thread.CurrentThread.Abort();

  49:             }

  50:         }

  51:  

  52:         private static void ReaderThread()

  53:         {

  54:             while (_shouldRun)

  55:             {

  56:                 var rc = _context.Update();

  57:                 if (rc == 0)

  58:                     _sessionManager.Update(_context);

  59:             }

  60:         }

  61:     }

  62: }

 

8. Ejecutamos la aplicación, y podremos ver como la misma, se conecta al Kinect; y cuando saludamos al Kinect, se muestra un mensaje y luego con otro saludo se cierra la aplicación.

image

 

9. Los puntos interesantes a tener en cuenta en la aplicación son los siguientes:

  • Las líneas 19 y 20, inician un contexto de trabajo con Kinect. Para esto se utiliza la clase XnMOpenNIContext. En el método Init() es donde se accede al fichero de configuración [data/openni.xml] para ver la configuración de acceso a Kinect.
  • Las líneas 22 y 23, crean una nueva sesión que responderá a la acción [WAVE], es decir cuando se salude al Kinect.
  • En las líneas 25 y 26, utilizamos un Thread para reestablecer el acceso al contexto del Kinect y refrescarlo periódicamente.
  • En la línea 33 se trabaja el evento [FocusStart]  de la sesión. Es en esta sección donde se controla el saludo y se cierra la aplicación.

El código se puede descargar desde http://cid-bef06dffdb192125.office.live.com/self.aspx/Code%20Samples/2010%2012%2031%20Kinect%20Hola%20mundo.zip

 

Saludos @ Home

El Bruno

   

[KINECT] Instalando los drivers de OpenNI para Kinect

image

Buenas,

como hay bastante Kinects dando vueltas por allí y yo ya he pasado de la fase de programar en C++ porque ya somos C# compliant (no verán never un post mío en C++ !!!), pues creo que es momento de compartir un poco mis experiencias y dar un poco de guidance para aquellos que quieran hacer alguna pruebita.

Primero lo primero –> los Drivers

Hasta el día de hoy hay varias opciones para instalar drivers no oficiales para Kinect. Yo el que he probado y me va muy bien es el que liberan los amigos de OpenNI (http://www.openni.org/). Cuando en algún tiempo Microsoft libere un driver oficial para Kinect para Windows, pues veremos que tal va.

Ahora bien, si tienes un Kinect sabrás que el mismo tiene la posibilidad de utilizarlo como un dispositivo USB. Oficialmente esto es para dar soporte a las XBox360 viejunas, pero yo creo que lo han hecho para que podamos enchufarlo a un portátil, y jugar con el aparatejo. Cuando lo conectas a un puerto USB, es muy probable que te encuentres con un mensaje como el siguiente:

image

 

El gestor de drivers ha detectado el dispositivo, pero claro en Windows Update, no existe ningún driver para poder instalar las features que posee el Kinect. Yo para este post y las demos estoy utilizando la versión

OpenNI 1.0 Alpha build 23 binaries for Win32

En el proceso de instalación de la versión, aparecerá un Warning relacionado con los drivers

image

 

Personalmente, yo recomiendo nunca instalar un driver que no conozcas, en este caso este post sirve como prueba de que la demo funciona. Esto no quiere decir que el driver sea 100% compatible con Windows. Si igualmente tienes ganas de ver el código que hay por detrás del driver y de pelearte un rato con la mierda de GIT, puedes acceder al mismo desde http://openni.org/sites/default/files/OPENNI-Win32-1.0.0.23.exe.

Ok volvamos a los drivers, cuando vuelves a conectar el Kinect, todavía está la referencia al driver inválido. En este momento puedes actualizar el driver para Kinect desde el path de instalación en [%Program Files%OpenNIDriver]

Ahora bien, una vez instalados los drivers ya puedes ver las diferentes capacidades que nos brinda Kinect en el gestor de dispositivos de Windows

image

 

Inicialmente solo reconoce al motor vertical del Kinect, pero luego también detecta el micrófono para la detección de audio y obviamente “la cámara”. Actualmente el driver para el micrófono no está disponible, pero con que puedas ver detectados los siguientes drivers correctamente ya estás “ready to test”.

image

 

Si por algún motivo extraño, no puedes actualizar los drivers desde el Device Manager, puedes lanzar manualmente los instaladores que están en el mismo path:

  • dpinst-amd64.exe
  • dpinst-x86.exe

y al finalizar la instalación verás un formulario similar al siguiente

image

 

Resumen

Los pasos para instalar serían los siguientes

1. Instalar OpenNI 1.0 Alpha build 23 binaries for Win32 http://openni.org/sites/default/files/OPENNI-Win32-1.0.0.23.exe)
2) Instalar los drivers desde https://github.com/avin2/SensorKinect (si no los detecta el paso anterior)
3) Conectar el Kinect a un puerto USB
4) Instalar NITE desde el link ofrecido en www.openni.org, además ofrecen una clave de prueba para el NiteLite Risa

 

 

En el próximo post … una introducción a la programación con Kinect.

Igualmente para preguntas sobre el driver y para la programación con el mismo, recomiendo los foros oficiales de OpenNI en Google Groups: http://groups.google.com/group/openni-dev

 

Saludos @ Home

El Bruno

   

Referencias:

[ALM] Microsoft Lider en ALM y en gestión de portfolios

image47dd1de4

Buenas,

como me está entrando la referencia por todos lados, y parece que los chicos de IDC son muy majos porque en un informe que han publicado hace poco, señalan a Microsoft como uno de los líderes en PPM (Project Portfolio Management) y ALM (gestión del ciclo de vida de aplicaciones). Según el estudio, la integración entre un buen software de PPM y una buena gestión de ALM, incrementa las posibilidades de éxito de los proyectos.  Y como los productos con los que podemos trabajar de Microsoft para éstos 2 sectores son muy potentes, pues la evaluación gráfica posiciona muy bien a MS.

Este también es un buen momento para recordar que el producto no lo es todo. Por ejemplo; si bien Visual Studio 2010 ALM, es una excelente herramienta para gestionar proyectos de desarrollo de software, la suite es completamente inútil si no hay unas buenas bases definidas sobre las que trabajar y un método de trabajo acorde a la problemática que se quiere abordar.

 

Saludos @ Here

El Bruno

   

Fuentes:

http://www.idc.com/research/viewdocsynopsis.jsp?containerId=225802

http://blogs.msdn.com/b/vstsbrasil/archive/2010/12/27/microsoft_5f00_lider_5f00_alm_5f00_ppm.aspx?CommentPosted=true#commentmessage

[REGALO] Claves Windows 7 y Office 2010, entre otros sin registro

image

Buenas,

estaba revisando correos y me di cuenta que entre los pendientes de este año todavía tengo un par de claves de productos Microsoft para regalar desde la MSDN y que se tienen que activar antes del 1 de junio del 2011.

Como no se pueden poner públicas (tampoco hay tantas), para acceder a las mismas, simplemente hay que enviar un correo a elbrunotraining@gmail.com, con el subject [MICROSOFT KEY].

Saludos @Here a todos y felices fiestas Risa

 

El Bruno

   

[TFS2010] HowTo: Consultar permisos de seguridad utilizando TFSWebServices

image47dd1de4

Buenas,

hoy toca darle un vistazo a una de las operaciones del WebService que gestiona la Seguridad en Team Foundation Server 2010, usualmente ubicado en

http://server:8080/tfs/TeamFoundation/Administration/v3.0/SecurityService.asmx

La operación [QuerySecurityNamespaces] nos permite enumerar los diferentes permisos que existen a nivel servidor para TFS2010. El siguiente código muestra un ejemplo, en el que se enumeran los servicios y las acciones disponibles para cada uno:

   1: static void Main(string[] args)

   2: {

   3:     var securityWebServiceSoapClient = new SecurityWebServiceSoapClient();

   4:     var request = new QuerySecurityNamespacesRequest();

   5:     var response = securityWebServiceSoapClient.QuerySecurityNamespaces(request);

   6:                 Console.WriteLine("Security Namespaces"); 

   7:     Console.WriteLine();

   8:     foreach (var securityNamespaceDescription in response.QuerySecurityNamespacesResult)

   9:     {

  10:         Console.WriteLine(" Database Category: {0}", securityNamespaceDescription.databaseCategory);

  11:         Console.WriteLine(" Display Name: {0}", securityNamespaceDescription.displayName);

  12:         Console.WriteLine(" ReadPermission: {0}", securityNamespaceDescription.readPermission);

  13:         Console.WriteLine(" WritePermission: {0}", securityNamespaceDescription.writePermission);

  14:         Console.WriteLine(" Actions");

  15:         foreach (var action in securityNamespaceDescription.Actions)

  16:         {

  17:             Console.WriteLine("   DisplayName: " + action.displayName);

  18:             Console.WriteLine("   Name: " + action.name);

  19:             Console.WriteLine("   Bit: " + action.bit);

  20:         }

  21:         Console.WriteLine(); 

  22:     }

  23:     Console.ReadLine();

  24: }

 

El resultado de la ejecución es similar al siguiente:

   1: Security Namespaces

   2:  

   3:  Database Category: Framework

   4:  Display Name: Registry

   5:  ReadPermission: 1

   6:  WritePermission: 2

   7:  Actions

   8:    DisplayName: Read registry entries

   9:    Name: Read

  10:    Bit: 1

  11:    DisplayName: Write registry entries

  12:    Name: Write

  13:    Bit: 2

  14:  

  15:  Database Category: Framework

  16:  Display Name: WebAccess

  17:  ReadPermission: 0

  18:  WritePermission: 3

  19:  Actions

  20:    DisplayName: Use full Web Access features

  21:    Name: FullAccess

  22:    Bit: 1

  23:    DisplayName: Modify full Web Access users

  24:    Name: Modify

  25:    Bit: 2

  26:  

  27:  Database Category: Framework

  28:  Display Name: Identity

  29:  ReadPermission: 1

  30:  WritePermission: 2

  31:  Actions

  32:    DisplayName: View identity information for this scope

  33:    Name: GenericRead

  34:    Bit: 1

  35:    DisplayName: Edit identity information for this scope

  36:    Name: GenericWrite

  37:    Bit: 2

  38:  

  39:  Database Category: Framework

  40:  Display Name: Job

  41:  ReadPermission: 1

  42:  WritePermission: 6

  43:  Actions

  44:    DisplayName: View background job information

  45:    Name: Read

  46:    Bit: 1

  47:    DisplayName: Queue background jobs

  48:    Name: Queue

  49:    Bit: 2

  50:    DisplayName: Manage background jobs

  51:    Name: Update

  52:    Bit: 4

  53:  

  54:  Database Category: Framework

  55:  Display Name: Server

  56:  ReadPermission: 1

  57:  WritePermission: 2

  58:  Actions

  59:    DisplayName: View instance-level information

  60:    Name: GenericRead

  61:    Bit: 1

  62:    DisplayName: Edit instance-level information

  63:    Name: GenericWrite

  64:    Bit: 2

  65:    DisplayName: Make requests on behalf of others

  66:    Name: Impersonate

  67:    Bit: 4

  68:    DisplayName: Trigger events

  69:    Name: TriggerEvent

  70:    Bit: 16

  71:  

  72:  Database Category: Framework

  73:  Display Name: CollectionManagement

  74:  ReadPermission: 0

  75:  WritePermission: 3

  76:  Actions

  77:    DisplayName: Create team project collection

  78:    Name: CreateCollection

  79:    Bit: 1

  80:    DisplayName: Delete team project collection

  81:    Name: DeleteCollection

  82:    Bit: 2

  83:  

  84:  Database Category: Framework

  85:  Display Name: Warehouse

  86:  ReadPermission: 0

  87:  WritePermission: 1

  88:  Actions

  89:    DisplayName: Administer Warehouse

  90:    Name: Administer

  91:    Bit: 1

  92:  

  93:  Database Category: Framework

  94:  Display Name: Catalog

  95:  ReadPermission: 1

  96:  WritePermission: 4

  97:  Actions

  98:    DisplayName: View catalog information for this node

  99:    Name: Read

 100:    Bit: 1

 101:    DisplayName: Create children catalog nodes

 102:    Name: Create

 103:    Bit: 2

 104:    DisplayName: Modify catalog node properties

 105:    Name: Modify

 106:    Bit: 4

 107:    DisplayName: Delete this catalog node and its children

 108:    Name: Delete

 109:    Bit: 8

 110:  

 111:  Database Category: Framework

 112:  Display Name: EventSubscription

 113:  ReadPermission: 1

 114:  WritePermission: 2

 115:  Actions

 116:    DisplayName: View

 117:    Name: GenericRead

 118:    Bit: 1

 119:    DisplayName: Edit

 120:    Name: GenericWrite

 121:    Bit: 2

 122:    DisplayName: Unsubscribe

 123:    Name: Unsubscribe

 124:    Bit: 4

 125:    DisplayName: Create a SOAP subscription

 126:    Name: CreateSoapSubscription

 127:    Bit: 8

 128:  

 129:  Database Category: Framework

 130:  Display Name: Lab

 131:  ReadPermission: 1

 132:  WritePermission: 1

 133:  Actions

 134:    DisplayName: View/Edit instance-level Lab information

 135:    Name: ReadWrite

 136:    Bit: 1

 137:  

 

Y finalmente el código de ejemplo, lo pueden descargar desde http://cid-bef06dffdb192125.office.live.com/self.aspx/Code%20Samples/2010%2012%2027%20TFS2010.03Security.zip

 

Saludos @ Home

El Bruno

   

[TFS2010] Utilizando WebServices de Team Foundation Server 2010: Localization WebService (II)

image47dd1de4

Buenas,

después de un primer post donde comenté como configurar un binding de cliente en WCF para poder conectarnos a Team Foundation Server 2010, hoy toca hablar sobre un ejemplo un poco más detallado son un WebService en particular: Localization WebService.

Este WebService se encuentra en la siguiente ruta:

http://servername:8080/tfs/TeamFoundation/Administration/v3.0/LocationService.asmx

Y el mismo permite realizar diferentes operaciones propias de la administración de Team Foundation Server 2010. El siguiente ejemplo muestra la información relevante para TFS del usaurio conectado y el Id del catálogo principal de TFS.

   1: static void Main(string[] args)

   2: {

   3:     var client = new LocationWebServiceSoapClient();

   4:     var connectRequest = new ConnectRequest();

   5:     var connectResponse = client.Connect(connectRequest);

   6:  

   7:     DisplayUserInformation("AuthenticatedUser", connectResponse.ConnectResult.AuthenticatedUser);

   8:     DisplayUserInformation("AuthorizedUser", connectResponse.ConnectResult.AuthorizedUser);

   9:  

  10:     Console.WriteLine("CatalogResourceId: {0}", connectResponse.ConnectResult.CatalogResourceId);

  11:     Console.WriteLine("InstanceId: {0}", connectResponse.ConnectResult.InstanceId);

  12:     Console.WriteLine();

  13:  

  14:     Console.ReadLine();

  15: }

  16: private static void DisplayUserInformation(string prefix, TeamFoundationIdentity teamFoundationIdentity)

  17: {

  18:     Console.WriteLine("{0}.DisplayName: {1}", prefix, teamFoundationIdentity.DisplayName);

  19:     Console.WriteLine("{0}.TeamFoundationId: {1}", prefix, teamFoundationIdentity.TeamFoundationId);

  20:     Console.WriteLine("{0}.UniqueUserId: {1}", prefix, teamFoundationIdentity.UniqueUserId);

  21:     Console.WriteLine();

  22: }

El resultado de la ejecución de este WebService es el siguiente:

image

Display Team Foundation Server Access Mappings

Este servicio además nos permite consultar otra información importante de nuestro servidor TFS, como por ejemplo los puntos de entrada definidos que soporta el mismo.  La siguiente función utiliza el servicio de localización y muestra esta información.

   1: private static void DisplayAccessMappings(LocationWebServiceSoapClient client)

   2: {

   3:   var request = new QueryServicesRequest

   4:      {

   5:        serviceTypeFilters = new ServiceTypeFilter[] {}

   6:      };

   7:   var response = client.QueryServices(request);

   8:  

   9:   // display TFS Access Mapping

  10:   Console.WriteLine("Access Mappings for TFS Server");

  11:   Console.WriteLine();

  12:   foreach (var accessMapping in response.QueryServicesResult.AccessMappings)

  13:   {

  14:     Console.WriteLine(" AccessPoint: {0}", accessMapping.AccessPoint);

  15:     Console.WriteLine(" DisplayName: {0}", accessMapping.DisplayName);

  16:     Console.WriteLine(" Moniker: {0}", accessMapping.Moniker);

  17:     Console.WriteLine();

  18:   }

  19: }

El resultado de la ejecución es el siguiente:

image

Display Team Foundation Server Service Definitions

Como ejemplo final, el siguiente código permite visualizar todos los servicios que están registrados en el servidor Team Foundation Server, y como están catalogados los mismos:

   1: private static void DisplayTfsServicesDefinition(LocationWebServiceSoapClient client)

   2: {

   3:     var request = new QueryServicesRequest

   4:                       {

   5:                           serviceTypeFilters = new ServiceTypeFilter[] { }

   6:                       };

   7:     var response = client.QueryServices(request);

   8:     

   9:     // display TFS Service Definition

  10:     Console.WriteLine("TFS Services Definition ");

  11:     Console.WriteLine();

  12:     foreach (var serviceDefinition in response.QueryServicesResult.ServiceDefinitions)

  13:     {

  14:         Console.WriteLine(" Description: {0}", serviceDefinition.description);

  15:         Console.WriteLine(" DisplayName: {0}", serviceDefinition.displayName);

  16:         Console.WriteLine(" RelativePath: {0}", serviceDefinition.relativePath);

  17:         Console.WriteLine(" RelativeToSetting: {0}", serviceDefinition.relativeToSetting);

  18:         Console.WriteLine(" ServiceType: {0}", serviceDefinition.serviceType);

  19:         Console.WriteLine(" ToolId: {0}", serviceDefinition.toolId);

  20:         Console.WriteLine();

  21:     }

  22: }

 

En el resultado de la respuesta del servicio, podemos diferentes tipos de servicios: los propios de Team Foundation Server, y los de Team System Web Access, por ejemplo.

image

 

El código fuente de los ejemplos se puede descargar desde http://cid-bef06dffdb192125.office.live.com/self.aspx/Code%20Samples/2010%2012%2026%20TFS2010.02.Localization.zip

 

Saludos @ Home

El Bruno

   

[TFS2010] HowTo: Acceder a los WebServices de TFS2010 utilizando WCF (I)

image47dd1de4

Buenas,

si bien no es la práctica más recomendada, existen escenarios donde para interactuar con Team Foundation Server 2010 es necesario utilizar los WebServices que se publican bajo el IIS. Los mismos se alojan en un servidor IIS, y respetan la estructura por defecto que podemos ver en la siguiente imagen.

image

Si por ejemplo, creamos una aplicación de consola y agregamos una referencia al servicio de administración, ubicado localmente en

http://localhost:8080/tfs/TeamFoundation/Administration/v3.0/AdministrationService.asmx

veremos una estructura similar a la siguiente:

image

 

Una vez agregada la referencia, ya podríamos escribir un poco de código para ver el estado de las operaciones que está procesando el servidor TFS, por ejemplo:

   1: using System;

   2: using ConsoleApplication1.TfsAdministration;

   3:  

   4: namespace ConsoleApplication1

   5: {

   6:     class Program

   7:     {

   8:         static void Main()

   9:         {

  10:             var client = new AdministrationWebServiceSoapClient();

  11:             var requests = client.QueryActiveRequests(null, true);

  12:             Console.WriteLine("Active request count:{0}", requests.Length);

  13:             Console.ReadLine();

  14:         }

  15:     }

  16: }

Asumiendo que el usuario que ejecuta la aplicación, tiene permiso para acceder a la URL de los servicios (los mismos son locales en mi caso con TFS Basic), pero cuando ejecutamos el proyecto nos encontramos con el siguiente error en la invocación del servicio:

image

 

Obviamente el problema está en la configuración del servicio WCF, si analizamos el app.config veremos que al momento de crear el proxy para el cliente, la configuración de WCF ha agregado bastante basura:

   1: <?xml version="1.0" encoding="utf-8" ?>

   2: <configuration>

   3:     <system.serviceModel>

   4:         <bindings>

   5:             <basicHttpBinding>

   6:                 <binding name="AdministrationWebServiceSoap" closeTimeout="00:01:00"

   7:                     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"

   8:                     allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"

   9:                     maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"

  10:                     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"

  11:                     useDefaultWebProxy="true">

  12:                     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"

  13:                         maxBytesPerRead="4096" maxNameTableCharCount="16384" />

  14:                     <security mode="None">

  15:                         <transport clientCredentialType="None" proxyCredentialType="None"

  16:                             realm="" />

  17:                         <message clientCredentialType="UserName" algorithmSuite="Default" />

  18:                     </security>

  19:                 </binding>

  20:             </basicHttpBinding>

  21:         </bindings>

  22:         <client>

  23:             <endpoint address="http://localhost:8080/tfs/TeamFoundation/Administration/v3.0/AdministrationService.asmx"

  24:                 binding="basicHttpBinding" bindingConfiguration="AdministrationWebServiceSoap"

  25:                 contract="TfsAdministration.AdministrationWebServiceSoap"

  26:                 name="AdministrationWebServiceSoap" />

  27:         </client>

  28:     </system.serviceModel>

  29: </configuration>

 

Voy a ahorrarme escribir un par de líneas que puedes leer en MSDN sobre la configuración de WCF, pero simplificando un poco la definición del binding (líneas 4 a 12), ya tenemos una configuración correcta, por ejemplo:

   1: <?xml version="1.0" encoding="utf-8" ?>

   2: <configuration>

   3:     <system.serviceModel>

   4:         <bindings>

   5:             <basicHttpBinding>

   6:                 <binding name="AdministrationWebServiceSoap" >

   7:                     <security mode="TransportCredentialOnly">

   8:                         <transport clientCredentialType="Ntlm" proxyCredentialType="None" />

   9:                     </security>

  10:                 </binding>

  11:             </basicHttpBinding>

  12:         </bindings>

  13:         <client>

  14:             <endpoint 

  15:               address="http://localhost:8080/tfs/TeamFoundation/Administration/v3.0/AdministrationService.asmx"

  16:               binding="basicHttpBinding" bindingConfiguration="AdministrationWebServiceSoap"

  17:               contract="TfsAdministration.AdministrationWebServiceSoap"

  18:               name="AdministrationWebServiceSoap" />

  19:         </client>

  20:     </system.serviceModel>

  21: </configuration>

Con este binding ya podemos acceder a los diferentes servicios de TFS.

En el próximo post, un poco de análisis sobre el WebService de Administración.

 

Saludos @ Here

El Bruno

   

[TFS2010] TFS Administration Tool 2.1 is available

image47dd1de4

Buenas,

una nueva versión de la herramienta de administración para Team Foundation Server 2010 ha sido liberada, Team Foundation Server Administration Tool. Esta versión es la primera versión construida completamente para Team Foundation Server 2010 y que además soporta las ediciones “especiales” de Team Foundation Server 2010, como por ejemplo la versión BASIC, sin SQL Server Reporting Services ni Microsoft SharePoint.

Cuando lanzamos la herramienta de administración conectando con un server sin estos servicios podremos ver un mensaje como el siguiente:

image

 

Y luego podremos dedicarnos a gestionar los usuarios de cada Team Project de la forma habitual con la herramienta.

image

 

Una muy buena versión, a tener en cuenta para la administración de Team Foundation Server 2010.

Saludos @ Here

El Bruno

   

Descarga: http://tfsadmin.codeplex.com/releases/view/57795

PD: Sé que hay muchas personas a las que no les gusta la herramienta y proponen muchas cosas a mejorar. Lo bueno de estas personas es que además de proponer cambios, se toman el tiempo de ir a CodePlex y trabajar sobre el código de la TFSAdminTool. Así que ya sabes … Risa

[HYPER-V] Cambiar el tamaño de un disco virtual (actualización :)

Buenas,

Hace un par de años escribí un post donde comenté los pasos que podíamos seguir para incrementar el tamaño de un disco virtual para Virtual PC, Hyper-V, etc. En el mismo utilizaba en primer lugar una herramienta para aumentar el tamaño del disco (VHD Resizer) y luego utilizando DiskPart expandía el tamaño del disco. Ahora desde Windows Vista y con Windows 7 y Windows Server 2008, ya podemos hacer este último paso evitando utilizar un command prompt.

En primer lugar accedemos al gestor de discos de Windows.

image

Una vez dentro, adjuntamos el VHD al que hemos cambiado el tamaño con VHD Resizer, utilizando la opción [Action // Attach VHD]

image

 

Cuando el disco está listo para ser utilizado, podemos ver que en el mismo, se puede ver el espacio utilizado. Si desplegamos el menú contextual sobre el disco, podemos ver la opción para extender el disco [Extend Volume …]

image

 

El asistente nos muestra en el segundo paso el espacio disponible para extender, en este caso, un disco que originalmente era de 30Gb, lo he expandido a 60GB.

image

 

Dos clics después, ya tenemos un disco de 60GB listo para utilizar.

image

 

Lo desconectamos del Disk Management y ya lo podemos utilizar el Virtual PC o Hyper-V.

 

Saludos @ Home

El Bruno

   

Referencia: http://geeks.ms/blogs/elbruno/archive/2008/01/17/vpc-incrementando-el-tama-241-o-de-los-discos-virtuales.aspx

[VS2010] Extensiones para Visual Studio 2010 y otras Herramientas recomendadas (II)

image47dd1de4

Buenas,

hace un tiempo hice un listado con las actualizaciones que poseo instaladas en Visual Studio 2010. Hoy toca actualizar las mismas, ya que entre otras cosas, algunas han cambiado/madurado bastante y he descartado a otras. Aquí va el listado que espero actualizar cada un par de meses:

 

Extensiones

ReSharper

ReSharper

ReSharper es simplemente el mejor complemento para desarrolladores integrado en el IDE de Visual Studio 2010. Desde hace varias versiones, te permite no solo acelerar el tiempo de desarrollo, sino que además brinda una calidad de código muy buena, ya que implementa best practices a cholón (entre otras cosas).

Algunas personas ponen excusas para no utilizarlo, como por ejemplo: que consume mucha memoria, que es de pago, que pone lento el IDE, etc.; pero yo personalmente no tengo esta opinión. Una vez que te acostumbras a utilizarlo, es la extension IDEAL para trabajar en Visual Studio. A Must Have.

Me van a perdonar por no escribir las características de ReSharper, pero es que son tantas que debería dedicarle una semana de posts solo a R#. Van desde características para desarrolladores Web, donde si desarrollas ASP.Net MVC es impresionante (palabra de web developers), incoporación de análisis de código extendidos, etc. Lo dicho, date una vuelta por la página oficial y prueba el trial http://www.jetbrains.com/resharper/index.html.

 

Descarga: http://visualstudiogallery.msdn.microsoft.com/en-us/EA4AC039-1B5C-4D11-804E-9BEDE2E63ECF

Nota: las versiones 4.x para Visual Studio 2008, también son imprescindibles.

 

Team Foundation Server Power Tools

¿Trabajas con Team Foundation Server 2010 y no tienes las TFS Power Tools?, pues entonces lamento comunicarte que no trabajas con Team Foundation Server 2010. Este paquete , incluye varias herramientas indispensables para trabajar con TFS, como por ejemplo:

  • Explorador de alertas: un formulario integrado en el IDE donde podemos la gestionar de una forma muy simple las suscripciones a eventos de TFS2010.
  • TFS 2010 BPA (Best Practices Analyzer): una herramienta de análisis y diagnóstico para nuestros servidores TFS2010.
  • Paquete de políticas de CheckIn: pues nuevas políticas por si queremos ser más agresivos con el control del código fuente.
  • Editor de Procesos: la herramienta más peligrosa del paquete. Nos permite editar las plantillas de los procesos de TFS, desde las definiciones de los WorkItems hasta la plantilla completa. Muy potente, y en malas manos, muy peligrosa !!!
  • Team Members: es una extensión incoroporada dentro del panel del Team Explorere que permiten interactuar con otros integrantes del equipo de desarrollo, por ejemplo con algún sistema de mensajería instantanea, o para conocer el estado del trabajo de los mismos.
  • Windows Shell Extensions: Junto con el Editor de Procesos es la mejor novedad, la capacidad de interactuar con elementos de TFS2010 desde Windows Explorer. Por ejemplo, agregar elementos al Source Control, CheckIn, CheckOut, etc.

 

Descarga: http://visualstudiogallery.msdn.microsoft.com/en-us/3e8c9b68-6e39-4577-b9b7-78489b5cb1da 

Nota: También deberías descargar las TFS Power Tools para TFS2008 si las necesitas

 

Productivity Power Tools, solo si no utilizas ReSharper

Screenshot

imageOtro gran conjunto de herramientas que se integran en el IDE para hacernos la vida más fácil. Entre todas las que posee, yo destaco las siguientes:

  • Solution Navigator: un excelente reemplazo para el Solution Explorer, donde no solo veremos las clases y elementos de nuestros proyectos, sino que además podremos ver funciones y propiedades, podremos realizar búsquedas avanzadas, previsualizacion de recursos como por ejemplo imágenes, etc.
  • Quick Access: esta funcionalidad presenta un panel (al que accedemos con Ctrl+3), donde se registran todas las acciones del IDE, opciones de configuración del IDE, plantillas, etc.; y podemos acceder a las mismas con un filtro de búsqueda al estilo Windows Search. Imprescindible.
  • Add References: la ventana de agregar referencias en Visual Studio no ha sufridos cambios desde sus inicios. En VS2010 le han dado un pequeño empujon, pero el cambio radical que proponen las VSPro Power Tools es muy bueno: filtros, capacidad de agregar y eliminar directamente desde el form, etc.

 

Descarga: http://visualstudiogallery.msdn.microsoft.com/en-us/d0d33361-18e2-46c0-8ff2-4adea1e34fef

Nota: No lo niego, muchas de las funcionalidades de VSPro Power Tools, “están inspiradas en R#”, pero bueno, sigue siendo un complemento genial.

 

Italic Comments

ScreenshotEl nombre de la extension ya te dice que hace: cambia el formato de los comentarios a Cursiva (Italic). Parece una tontería pero estéticamente, a mi me parece muy agradable y el código queda “más bonito). Además de cambiar el texto a cursiva, cambia el tamaño un punto más pequeño.

Aplica tanto a los comentarios inline dentro del código, como a las secciones de comentarios para la generación de documentación. y soporta los editores de C#, Visual Basic y C++ en el IDE de Visual Studio 2010.

 

Descarga: http://visualstudiogallery.msdn.microsoft.com/en-us/0b439a8a-e21a-4e26-b82b-054fbf0acab7

 

Highlight all occurrences of a selected word

image Visual Studio 2010 ya trae incorporada la capacidad de resaltar dentro de una clase, todas las ocurrencias del elemento seleccionado, ya sea una función, una variable, etc. Esta herramienta, brinda un comportamiento similar, pero además de resaltar el texto seleccionado (no trabaja a nivel de miembros), muestra un marcador en el margen izquierdo con lo que la navegación es más rápida.

 

Descarga: http://visualstudiogallery.msdn.microsoft.com/en-us/4b92b6ad-f563-4705-8f7b-7f85ba3cc6bb

Nota: Ojo, que si tienes que recurrir a esta funcionalidad muy seguido, seguramente tu código es un espaguethi de los lindos 😀 

 

 

imageHide Main Menu

Esta extensión oculta automáticamente el menú de Visual Studio 2010, hasta que presionas la tecla ALT o alguna combinación como [ALT + F] para acceder al menú [File]. 

Parece algo muy tonto, pero ganar esos píxeles ayuda mucho cuando no tienes una buena resolución con la que trabajar.

Descarga: http://visualstudiogallery.msdn.microsoft.com/en-us/bdbcffca-32a6-4034-8e89-c31b86ad4813

 

Go to Definition

Esta extensión permite utilizar el atajo [CTRL + Click] para ir a la definición de un objeto en Visual Studio 2010. Lo que hacemos usualmente con F12, ahora tiene una opción más natural para aquellos que utilizan mucho el ratón.

Descarga: http://visualstudiogallery.msdn.microsoft.com/en-us/4b286b9c-4dd5-416b-b143-e31d36dc622b

 

Herramientas

WinMerge: herramienta alternativa para analizar diferencias y comparar archivos

En este post explico como configurar Visual Studio 2010 para utilizar WinMerge como herramienta para analizar diferencias y realizar merge de archivos. Si no conoces WinMerge, te recomiendo que le des un vistazo ya que es una herramienta mucho más potente que la que viene por defecto en Visual Studio 2010.

Descarga: http://winmerge.org/

 

Saludos @ Home

El Bruno