December 2010 - Artículos

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 Sense\NITE\Wrappers\C#\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

   

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%\OpenNI\Driver]

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:

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

Publicado 29/12/2010 13:43 por El Bruno | con no comments

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

   

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

   

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

   

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

   

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

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

Publicado 19/12/2010 22:13 por El Bruno | 1 comment(s)
Archivado en: ,

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 :D 

 

 

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

image47dd1de4

Buenas,

hace un tiempo en amigo Juan me preguntó como podía configurar Visual Studio 2010 para que cuando editemos ficheros XAML los mismos no se abran en modo DISEÑO/XAML, sino directamente en modo XAML. Esto nos ahorra bastantes recursos gráficos y si utilizas Expression Blend para el diseño, pues tampoco tiene sentido que el mismo se cargue en Visual Studio 2010.

Pues bien, la opción está un poco escondida pero se puede acceder desde el menú [Tools // Options] y dentro del árbol de opciones en [Text Editor // XAML // Miscelaneous], marcando la opción [Always open documentos in full XAML view]

image

Pequeño post que me sirve más de ayuda memoria que otra cosa Risa

 

Saludos @ Home

El Bruno

   

Publicado 16/12/2010 22:12 por El Bruno | con no comments

imageBuenas,

estos días he estado sin ordenador, así que le he dado mucho a la cocorota y poco al teclado, pero eso sí: han pasado unos libros por mis manos que son una maravilla. Además de tener la oportunidad de montar lo que se ve en la foto, un pequeño cine en casa, que es el regalo adelantado de navidades.

Pero si bien he estado desconectado, no he podido dejar de envidiar a algunos compañeros que hace un tiempo se juntaron en Redmond para participar del ALM Summit 2010.

Lo bueno es que, unas semanas después, ya podemos descargar todas las sesiones del evento directamente desde:

http://www.alm-summit.com/almsummit/schedule.aspx

y claro, como este es mi primer post desde hace un tiempo y todavía no tengo mi Windows Live Writer, tuneado, pues esperaré un poco para empezar a postear ejemplos de código y demás …

Vuelvo al ruedo light light light …

 

Saludos @ Home

El Bruno

Publicado 15/12/2010 22:31 por El Bruno | con no comments
Archivado en: ,,

image47dd1de4

Buenas,

vamos a poner un poco de orden en los posts, que en estos días que etuve sin laptop, solo he podido montar esto. Uno que estaba preparando para cuando sea oficial, y que ahora veo que también lo ha posteado Juan Carlos, es sobre las nuevas máquinas virtuales de Visual Studio 2010 y de Team Foundation Server 2010 que se han liberado para que puedas probar el producto (¡¡¡ pedazo de producto !!!)

Las máquinas virtuales poseen todos los parches actualizados hasta el 8 de diciembre y dejan de funcionar el 1 de Junio de 2011. Además, obviamente tienen instalado todo el software necesario para probar Visual Studio 2010 y de Team Foundation Server 2010.

Descargas:

 

Saludos @ Home

El Bruno

   

Fuentes: http://coolthingoftheday.blogspot.com/2010/12/vs2010tfs2010-vm-refresh-downloads-now.html, http://geeks.ms/blogs/ciin/archive/2010/12/10/visual-studio-2010-disponibles-nuevas-m-225-quinas-virtuales-para-descarga.aspx

image47dd1de4

Buenas,

hoy veía una herramienta de Jose Manuel para analizar el tráfico en Twitter colgado en CodePlex, y recordé que tenía pendiente un post sobre una capacidad que tiene CodePlex  desde hace un tiempo que nos permite publicar y distribuir nuestras aplicaciones con ClickOnce directamente desde CodePlex.

El siguiente tutorial muestra un ejemplo sobre como crear y publicar un proyecto en CodePlex, como para que sirva de referencia.

Tutorial

1. Pues lo primero es acceder al site de Codeplex: www.codeplex.com, para esto tienes que tener una cuenta de acceso y si bien es posible utilizar Windows Live Id, luego necesitarás una cuenta de CodePlex para poder utilizar el Source Control.

2. A continuación creamos un proyecto, en este caso llamado El Bruno ClickOnce Demo. La url de este proyecto será http://elbrunoclickoncedemo.codeplex.com y utilizaré las opciones por defecto: Team Foundation Server y Team Explorer.

image

3. Una vez creado el proyecto, ya podemos comenzar a trabajar con el mismo. Debemos actualizar información de proyecto, actualizarlo, etc. CodePlex nos guía bastante bien en el paso a paso necesario para ponerlo en marcha.

image

4. Lo siguiente es subir un proyecto al Source Control de CodePlex. Para conectarme desde Visual Studio 2010 a CodePlex, utilizo los siguientes datos:

image

El paso a paso para conectarse utilizando Team Explorer 2010 puede accederse desde aquí.

5. El proyecto de ejemplo que he elegido es bastante simple. Se trata de una aplicación WPF que muestra el número de versión en el título de la ventana, con las simples líneas que escribí hace un par de años y otro par de datos de publicación utilizando las capacidades de System.Deployment.Application.

El siguiente código muestra como se actualiza el título con el número de versión y en un TextBlock se muestra un poco más de información.

   1: private void DisplayPublishData()
   2: {
   3:     if (!ApplicationDeployment.IsNetworkDeployed) return;
   4:     var ad = ApplicationDeployment.CurrentDeployment;
   5:     var data = string.Format(@"ActivationUri: {0}
   6: stUpdateCheck: {1}
   7: cation: {2}", ad.ActivationUri, ad.TimeOfLastUpdateCheck, ad.UpdateLocation);
   8:     lblData.Text = data;
   9: }
  10:  
  11: private void DisplayCurrentPublishVersion()
  12: {
  13:     Title = "El Bruno - ClickOnce Demo [N/A]";
  14:     if (!ApplicationDeployment.IsNetworkDeployed) return;
  15:     var ad = ApplicationDeployment.CurrentDeployment;
  16:     Title = string.Format(@"El Bruno - ClickOnce Demo [{0}]", ad.CurrentVersion);
  17: }

6. El siguiente paso, es configurar la aplicación para que pueda ser distribuida y actualizada con ClickOnce desde CodePlex. Este punto es muy importante, ya que la publicación no es un proceso automático, sino que debemos hacerla manualmente.

Para este post, he configurado el directorio de publicación en local en un directorio llamado “publish”, y la url de actualización es la de codeplex: http://elbrunoclickoncedemo.codeplex.com/releases/clickonce/, que se habilita cuando se crea el proyecto en CodePlex.

image

7. Una vez creada una versión de la aplicación, debemos acceder al directorio de publicación y comprimir el mismo para crear un nuevo Release en CodePlex. Es importante respetar la estructura que crea ClickOnce ya que será la defina la actualización.

image

8. Si vemos el zip creado para la distribución, el mismo debe poseer en la raíz el archivo *.application que define las actualizaciones con ClickOnce.

image

8. Una vez creada la publicación de ClickOnce en un directorio local, ya podemos crear un nuevo Release en CodePlex. En el mismo, tenemos la capacidad de marcar esta publicación como una distribución de ClickOnce, y en este caso, debemos seleccionar el zip que hemos creado en el paso anterior.

image

9. cuando se crea el release correctamente, ya podemos conectarnos y acceder al mismo desde la página de distribuciones de codeplex. En este caso http://elbrunoclickoncedemo.codeplex.com/releases/view/57041

image

10. Cuando lanzamos la aplicación, veremos que la misma sigue los pasos usuales de una aplicación publicadad en ClickOnce.

image

image

image

11. La aplicación en ejecución nos muestra el número de versión correspondiente a la publicación, y como soy un poco lento de neuronas, la información de publicación, no está alineada correctamente. Esto es la excusa perfecta para crear y publicar una nueva versión con esta información en el formato correcto.

image

12. Ajusto un poco el layout de la aplicación, publico una nueva versión en local, creo un zip con los archivos de la publicación y creo un nuevo release en CodePlex, asociado a los cambios de la ultima versión y a la publicación en ClickOnce.

image

13. Cuando lanzo la aplicación, veo que existe una nueva versión para actualizar mi aplicación.

image

14. Y cuando actualizo la misma, ya puedo ver los cambios y la información de despliegue

image

15. Finalmente, como estamos trabajando de forma organizada, podemos ver como cada release de clickonce se asocia a un changeset del Source Control.

image

Espero que les sea de utilidad Risa

 

Saludos @ Home

El Bruno

   

Referencias: http://codeplex.codeplex.com/wikipage?title=ClickOnce

image47dd1de4

Buenas,

la noticia es viejuna, pero me la apunto ya que siempre ando buscando el KB981741 para darle un poco más de vida a mi Visual Studio 2010 y nunca me acuerdo el número del KB.  Este hotfix instala una actualización para Windows Automation API 3.0, que permite mejorar el rendimiento de varias aplicaciones, entre ellas el intellisense de Visual Studio 2010.

 

Saludos @ Home

El Bruno

   

Descarga: http://support.microsoft.com/kb/981741/es

Fuente: http://blogs.msdn.com/b/deva/archive/2010/12/05/vs-2010-increase-intellisense-performance-using-windows-automation-api.aspx

image47dd1de4

Buenas,

hace unos días, mientras analizaba las posibles soluciones para mostrar información de un sistema XYZ; se me ocurrió que era posible utilizar Directed Graph Markup Language (DGML), para crear un gráfico de relaciones entre los elementos del sistema XYZ. Si bien la idea era atrayente, la prueba de concepto fué algo completamente diferente:

Crear un diagrama con Tweets de Twitter, y mostrar la relación de los mismos con los usuarios utilizando DGML.

Lo bueno de la prueba de concepto, es que la codificación fueron 10 minutos, ya que el modelo de objetos es muy natural (see Microsoft.VisualStudio.Progression.GraphModel). No voy a explicar el proyecto completo, ya que lo puedes descargar desde aquí, pero si un par de líneas de código que son las que dan vida al proyecto.

En primer lugar, la búsqueda de ínformación en Twitter. Ya sé, debería ser asíncrono, pero … no me dieron ganas Risa.

   1: public static IEnumerable<TweetElement> Search(string criteria = @"@elbruno")
   2: {
   3:     // search criteria
   4:     var uriString = @"http://search.twitter.com/search.atom?rpp=5&q=" + criteria;
   5:     var searchUri = new Uri(uriString);
   6:     var twitter = new WebClient();
   7:     var res = twitter.DownloadString(searchUri);
   8:     return ConvertXDocumentToTweetCollection(res);
   9: }

En segundo lugar, la creación de un Nodo para DGML, como pueden ver, es bastante simple

   1: static Node CreateTweetNode(TweetElement tweetElement)
   2: {
   3:     if (_graph.Nodes[tweetElement.Id] == null)
   4:     {
   5:         var id = tweetElement.Id;
   6:         var node = new Node(id);
   7:         node.SetValue(_gpLabel, tweetElement.Message);
   8:         node.SetValue(_gpUser, tweetElement.User);
   9:         _graph.Nodes.Add(node);
  10:         return node;
  11:     }
  12:     return null;
  13: }

El resultado en el xml del DGML es similar al siguiente:

   1: <Node Id="@elbruno" Background="#FFFFA500" Label="@elbruno" />

Y finalmente, la capacidad de agregar relaciones entre nodos

   1: var link = new Link(_graph, node, userNode);
   2: _graph.Links.Add(link);

Esto nos brinda la capacida de crear un gráfico DGML, como el de la siguiente imagen.

image

Aquí el código de ejemplo, obviamente se aceptan sugerencias Risa

http://cid-bef06dffdb192125.office.live.com/self.aspx/Code%20Samples/2010%2012%2001%20DGMLTwitter.zip

 

Saludos @ Home

El Bruno