May 2012 - Artículos

image

Buenas,

la siguiente imagen ya te deja claro de que va este post

image

El Bruno con los Rollings!!! Awesome … las cosas que nos permite hacer KinectSdk. En este caso he tomado como punto de partida el ejemplo que trae el Developer Toolkit Browser 1.5 que se incluye con el KinectSDK y después de unas modificaciones he llegado a crear mi propia green screen.

Pero bueno vamos al código que es realmente lo que nos interesa y antes que leerme a mi, mejor leer un poco de código. En este caso trabajo con una aplicación WPF en la que el formulario principal posee el siguiente código

   1: <Window x:Class="ElBruno.KinectGreenScreen.MainWindow"
   2:         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   3:         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   4:         Title="MainWindow" Height="768" Width="1024">
   5:     <Grid>
   6:         <Grid.RowDefinitions>
   7:             <RowDefinition Height="245"></RowDefinition>
   8:             <RowDefinition Height="*"></RowDefinition>
   9:         </Grid.RowDefinitions>
  10:         <Image x:Name="imgHeader" Source="ElBrunoKinect.png" Stretch="Fill"></Image>
  11:         <Grid Grid.Row="1">
  12:             <Image x:Name="imgBackground" Source="Fondo3.png" Stretch="UniformToFill"></Image>
  13:             <Image x:Name="imgMask"></Image>
  14:         </Grid>
  15:     </Grid>
  16: </Window>
Como se puede ver en el código anterior, no es nada del otro mundo. Un formulario WPF con una imagen superior a modo de cabecera y 2 imágenes en la zona inferior. La primera imagen “imgBackground” se utiliza como la base del background con el que trabajaremos y sobre la que procesaremos los datos del Depth y Camera de Kinect. La segunda imagen “imgMask” es la que se utiliza para pintar el resultado final de la pantalla verde.

El código del formulario tampoco es muy complicado, como se puede ver a continuación:

   1: using System;
   2: using System.Linq;
   3: using System.Windows;
   4: using System.Windows.Media;
   5: using System.Windows.Media.Imaging;
   6: using Microsoft.Kinect;
   7:  
   8: namespace ElBruno.KinectGreenScreen
   9: {
  10:     public partial class MainWindow
  11:     {
  12:         private KinectSensor _sensor;
  13:         private int _depthWidth;
  14:         private int _depthHeight;
  15:         private int _colorWidth;
  16:         private int _colorHeight;
  17:         private int _colorToDepthDivisor;
  18:         private short[] _depthPixels;
  19:         private byte[] _colorPixels;
  20:         private int[] _greenScreenPixelData;
  21:         private ColorImagePoint[] _colorCoordinates;
  22:         private WriteableBitmap _colorBitmap;
  23:         private const int OpaquePixelValue = -1;
  24:         private WriteableBitmap _playerOpacityMaskImage;
  25:  
  26:         public MainWindow()
  27:         {
  28:             InitializeComponent();
  29:             Loaded += MainWindowLoaded;
  30:             Closed += MainWindowClosed;
  31:         }
  32:  
  33:         void MainWindowClosed(object sender, EventArgs e)
  34:         {
  35:             if (_sensor != null)
  36:             {
  37:                 _sensor.Stop();
  38:                 _sensor = null;
  39:             }
  40:         }
  41:  
  42:         void MainWindowLoaded(object sender, RoutedEventArgs e)
  43:         {
  44:             foreach (var potentialSensor in KinectSensor.KinectSensors.Where(potentialSensor => potentialSensor.Status == KinectStatus.Connected))
  45:             {
  46:                 _sensor = potentialSensor;
  47:                 break;
  48:             }
  49:             if (_sensor == null) return;
  50:  
  51:             _sensor.DepthStream.Enable(DepthImageFormat.Resolution320x240Fps30);
  52:             _depthWidth = _sensor.DepthStream.FrameWidth;
  53:             _depthHeight = _sensor.DepthStream.FrameHeight;
  54:             _sensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);
  55:             _colorWidth = _sensor.ColorStream.FrameWidth;
  56:             _colorHeight = _sensor.ColorStream.FrameHeight;
  57:             _colorToDepthDivisor = _colorWidth / _depthWidth;
  58:             _sensor.SkeletonStream.Enable();
  59:             _depthPixels = new short[_sensor.DepthStream.FramePixelDataLength];
  60:             _colorPixels = new byte[_sensor.ColorStream.FramePixelDataLength];
  61:             _greenScreenPixelData = new int[_sensor.DepthStream.FramePixelDataLength];
  62:             _colorCoordinates = new ColorImagePoint[_sensor.DepthStream.FramePixelDataLength];
  63:             _colorBitmap = new WriteableBitmap(_colorWidth, _colorHeight, 96.0, 96.0, PixelFormats.Bgr32, null);
  64:             imgMask.Source = _colorBitmap;
  65:  
  66:             _sensor.AllFramesReady += SensorAllFramesReady;
  67:             _sensor.Start();
  68:         }
  69:  
  70:         void SensorAllFramesReady(object sender, AllFramesReadyEventArgs e)
  71:         {
  72:             if (_sensor == null) return;
  73:             var hasDepth = false;
  74:             var hasColor = false;
  75:             hasDepth = GetDepthFrame(e);
  76:             hasColor = GetColorFrame(e);
  77:             ProcessDepthFrame(hasDepth);
  78:             ProcessColorFrame(hasColor);
  79:         }
  80:  
  81:         // more code goes here
  82:  
  83:     }
  84: }

En realidad el proceso es bastante simple:

  • Se inicializa el sensor para que trabaje con el skeleton, la cámara y el sensor de profundidad
  • Se almacenan los valores de trabajo de estos Streams para el posterior procesamiento de datos
  • Se tabaja sobre el evento AllFramesReady del sensor Kinect
  • En este evento se procesan los frames de depth y de color
  • Con el resultado de estos frames, se genera una nueva image que hace un merge entre el background y el cuerpo de la persona detectada

Como el código interesante es el que se llama en las líneas 70 a 79, a ese me lo reservo para mañana y para además poder explicarlo mejor.

Saludos @ Home

El Bruno

image image image

image

Buenas,

hoy el amigo Juan ha escrito un post donde nos presenta un poco a NuGet. Como deja la pelota en el aire y además se presta un poco a una charla que tuvimos con @EduDelPozo, hoy toca hablar un poco sobre como trabajar con NuGet y Team Foundation Server.

Primero lo primero, en mi caso partimos de una estructura de directorios donde separamos por un lado el código fuente en la carpeta SRC y luego las bibliotecas compartidas en la carpeta LIB.

image

En la imagen anterior podemos ver en este proyecto hay 2 bibliotecas de clases. Para complicar un poco más el escenario vamos a agregar un par de referencias de Enterprise Library desde NuGet. En este caso logging desde http://nuget.org/packages/EnterpriseLibrary.Logging.

Una vez instalado ya tenemos nuestras dlls agregadas como referencia y en el proyecto se ha agregado el archivo package.config.

   1: Each package is licensed to you by its owner. Microsoft is not responsible for, 
   2: nor does it grant any licenses to, third-party packages. Some packages may 
   3: include dependencies which are governed by additional licenses. Follow the 
   4: package source (feed) URL to determine any dependencies.
   5:  
   6: Package Manager Console Host Version 1.8.30524.9000
   7:  
   8: Type 'get-help NuGet' to see all available NuGet commands.
   9:  
  10: PM>; Install-Package EnterpriseLibrary.Logging
  11: Attempting to resolve dependency 'EnterpriseLibrary.Common (≥ 5.0)'.
  12: Attempting to resolve dependency 'Unity.Interception (≥ 2.1)'.
  13: Attempting to resolve dependency 'Unity (≥ 2.1)'.
  14: Attempting to resolve dependency 'CommonServiceLocator (≥ 1.0)'.
  15: Successfully installed 'CommonServiceLocator 1.0'.
  16: You are downloading Unity from Microsoft patterns &; practices, the license 
  17: agreement to which is available at http://www.opensource.org/licenses/ms-pl. 
  18: Check the package for additional dependencies, which may come with their own 
  19: license agreement(s). Your use of the package and dependencies constitutes 
  20: your acceptance of their license agreements. If you do not accept the 
  21: license agreement(s), then delete the relevant components from your device.

Ahora bien, en nuestro caso habíamos definido que las referencias externas debían ir a la carpeta LIB. Como NuGet es inteligente pero no tanto, tenemos que indicarle que tiene que cambiar el comportamiento por defecto. Que consiste en dejar los ensamblados en una carpeta packages, por ejemplo

[…\NuGet\src\ClassLibrary2\packages\EnterpriseLibrary.Common.5.0.505.0\lib\NET35\Microsoft.Practices.EnterpriseLibrary.Common.dll]

Pues bien, para cambiar esta funcionalidad seleccionamos la solución, desplegamos el menú contextual y seleccionamos la opción [Enable NuGet Package Restore]

image

Esta acción nos agrega un nuevo solution folder llamado .nuget y dentro del mismo agrega el ejecutable de NuGet y un archivo de MSBuild con diferentes targets para la descarga de los paquetes.

image

Si vamos al directorio veremos que también se crea un archivo llamado NuGet.Config. Pero para nuestro ejemplo no será este archivo de configuración el que defina el directorio de descarga de los paquetes. Lo que haremos será lo siguiente:

1. Agregar un archivo llamado nuget.config en el directorio de la solución

2. Dentro del mismo definir el path de descarga de los paquetes con el siguiente código

<?xml version="1.0" encoding="utf-8"?>
<settings>
  <repositoryPath>..\..\..\Lib</repositoryPath>
</settings>

3. Done !!!

Si vemos la carpeta lib, veremos que dentro de la misma tenemos los paquetes con los que estamos trabajando

image

Ahh y gracias al @Edudelpozo que me dió una mano con esta última parte Risa.

Si subimos los paquetes a la carpeta lib de nuestro TFS ya tendremos todo listo para trabajar on the fly !!!

 

Saludos @ Home

El Bruno

image image image

image

Buenas,

en el post de ayer presenté los 2 modos en los que se puede lanzar Microsoft Feedback Client

  • voluntary feedback mode
  • requested mode

A partir del segundo escenario hoy veremos que capacidades nos entrega esta herramienta. Una vez lanzada la herramienta, podremos ver que la misma nos presenta 3 fases de trabajo en orden secuencial:

  • Start
  • Provide
  • Submit

image

En la primera de ella tendremos una serie de indicaciones sobre la prueba que tenemos que hacer y los puntos que se nos pide tener en cuenta.

En mi caso, al intentar lanzar la aplicación de la calculadora desde la ruta [c:\windows\calc.exe] veo que la misma no existe (está en otro sitio, para la prueba esto me viene genial!). Así que pasamos a la fase de completar el feedback (PROVIDE) y aquí podemos ver que tenemos varias opciones para adjuntar un archivo, realizar una grabación y detallar algún aspecto, etc.

image

Luego de revisar las opciones de validación, en mi caso he comentado que la ruta estaba mal, y que tal vez la ruta correcta sea [c:\Windows\System32\calc.exe] y he agregado un pantallazo del error.

image

Y cuando hemos terminado de dar nuestro feedback ya podemos pasar al paso final [SUBMIT] para enviar la información.

image

Ahora ya la información está en nuestro servidor TFS (en este caso in the cloud!) y en el próximo post podremos ver como procesar esta información para incorporarla en nuestro ciclo de vida de desarrollo.

Saludos @ Home

El Bruno

image image image

image

Buenas,

como hace mucho que no escribía nada nuevo sobre Visual Studio 11, hoy le doy un repaso a

Microsoft Feedback Client

Me parece que contará con uno o dos posts al respecto así que le crearé su TAG correspondiente en el blog.

Pero primero lo primero, ¿qué es esto? Pues bien se trata de una herramienta para gestionar el feedback de los integrantes de un equipo a nivel aplicación sobre la usabilidad o funcionalidad de la misma (algo así como los stakeholders). Por lo general suelen ser los usuarios finales los que desarrollan este papel, pero también se puede abrir a nuevos horizontes. Lo bueno de este enfoque es que podemos validar rápidamente que la aplicación que estamos desarrollando no es muy diferente a la idea que tienen en mente nuestros stakeholders, etc. etc. etc. Vamos que te cuento el rollo de la ventaja de iteraciones cortas y cercanas al Customer si quieres, pero supongo que ya lo conoces.

MFC (Microsoft Feedback Client, no el otro MFC) permite que estos usuarios aporten su opinión al respecto. Esta herramienta se puede utilizar de dos modos: de forma voluntaria, es decir sin que nadie nos solicite opinión podemos opinar sobre una aplicación; o a partir de una solicitud, que es cuando se nos solicita que opinemos sobre una aplicación.

El primer escenario es muy simple, buscamos y lanzamos la aplicación y lo primero que veremos es que no solicita conectarnos a Team Foundation Server 11.

image

Una vez seleccionado el Team Project, veremos que la aplicación se abre en modo SideBar para permitirnos interactuar con otras aplicaciones sin interferir en las mismas. También es posible poner la aplicación en modo “flotante” de manera que no esté dockeada al escritorio.

Como hemos lanzado la aplicación sin una petición, podremos ver en la misma el “voluntary feedback mode” o modo voluntario.

image

Si lo que deseamos es solicitar el feedback de una aplicación de uno o más stakeholders específicos, podremos hacerlo a partir del portal del Team Project. En el mismo seleccionamos la opción “Request Feedback” y podremos dar comienzo a este proceso.

image

En la siguiente imagen es posible ver el formulario donde se da comienzo al proceso de solicitud de feedback

image

Una vez finalizado este proceso de petición, se envía un correo a la persona o grupo de personas con la información necesaria para lanzar una sesión de MFC. El correo que llega es similar al siguiente:

image

Como el link para lanzar la aplicación requiere permisos especiales, pues lo primero que veremos será un Warning de seguridad.

image

Si el stakeholder no posee la herramienta, puede descargar la misma desde http://www.microsoft.com/en-us/download/details.aspx?id=28984

Una vez lanzada la aplicación, ya podremos ver como se incorpora la información que se solicito al stakeholder

image

Bueno, mañana más sobre el uso de la aplicación propiamente dicha. Hoy solo quedarnos con

Saludos @ Home

El Bruno

image image image

image

Buenas,

hoy estaba por comenzar a trabajar en un flamante proyecto de ASP.Net MVC en mi Visual Studio 2010 sobre Windows 8, cuando me encontré con lo siguiente:

image

---------------------------
Microsoft Visual Studio
---------------------------
ASP.NET 4.0 has not been registered on the Web server. You need to manually configure your Web server for ASP.NET 4.0 in order for your site to run correctly.
---------------------------
OK   Help  
---------------------------

Chan! de nuevo Windows 8 haciendo de las suyas, pero claro en realidad fui yo que probando unos scripts eliminé unas features de Windows. Así que desde la opción “Turn Windows features on or off”, simplemente elegimos las que son necesarias para ASP.Net 3.5 y ASP.Net 4.5 y listo!

image

si es que, estos días arreglo una cosa y rompo 2 !!!

Saludos @ Home

El Bruno

image image image

image

Buenas,

pues una de las buenas noticias del día:

El SDK de Kinect 1.5 y el developer Toolkit han sido liberados.

En este caso la descarga se separa en estos dos componentes donde ya no es necesario instalar el SDK con todos los samples, sino que si somos developers, pues tendremos nuestro propio set de herramientas.

Ahora que ya podemos comprar Kinect en varios países (incluido España), nos encontramos con que a la lista se añaden otros 15 países. Pero en realidad lo que más nos importa son las new features que se incluyen en esta versión. Vamos con las más importantes

  • Kinect Studio. Una herramienta que te permite grabar y reproducir una secuencia de acciones frente al sensor. Fundamental para evitar tener que pararte y realizar una prueba unitaria humana cada vez que cambias algo en una aplicación.
  • La Guía de desarrollo de aplicaciones para aplicaciones con Kinect. Imprescindibles 70 páginas con muchos detalles a tener en cuenta para desarrollos con Kinect.
  • Face Tracking, capacidades de reconocimiento facial. Ojo, esto no es identificar rostros, sino identificar los puntos de un rostro. Con un poco de trabajo podremos reconocer sonrisas, sorpresas, sustos, etc.
  • Detección de puntos de skeleton en personas sentadas. Esto es asombroso, la capacidad de detectar los joints superiores de un skeleton pero en personas sentadas, realmente abre otro abanico de posibilidades de aplicaciones.
  • La cámara ahora soporta una resolución de 640 x 480 a 30FPS, con mejoras en ambientes con poca luz.
  • Cool! Joint orientation !! no solo tenemos la posición de un Joint, sino que además tenemos la capacidad de ver la “orientación” del mismo.
  • Nuevos lenguajes para el reconocimiento de voz: Francés, Español, Italiano y Japonés.

Bueno ahora toca probar aquellas cosas a las que no teníamos acceso sin las betas del SDK y a postear detalles sobre el mismo Risa

Fuente: http://blogs.msdn.com/b/kinectforwindows/archive/2012/05/21/kinect-for-windows-runtime-and-sdk-version-1-5-released.aspx

Saludos @ Home

El Bruno

image image image
Publicado 21/5/2012 19:53 por El Bruno | con no comments
Archivado en: ,

image

Buenas,

en primer lugar vamos con la respuesta a la pregunta:

SI. Es posible trabajar en un mismo proyecto con Visual Studio 2010 y Visual Studio 11.

Ahora un poco más de detalles basados en la experiencia de este último medio año. Con la llegada de Visual Studio 11, de nuevo vemos en el manual que hay “project compatibility” entre proyectos de Visual Studio 2010 y Visual Studio 11. A esta historia la conocemos de VS2005, VS2008 y VS2010; y sabemos que no es tan simple.

Cuando se migraba un proyecto a VS2010 se actualizaba el archivo de proyecto (.csproj) y si trabajabas con informes de Crystal Reports, o proyectos de setup, pues por lo general tenías uno o más problemas para que puedan convivir fácilmente VS2005 y VS2010.

Visual Studio 11 toma un enfoque diferente y promete no cambiar los archivos de proyecto. Pero teniendo en cuenta varios cambios que tenemos en Visual Studio 11, más vale que veamos que escenarios soporta.

Por ejemplo, he creado una solución con 17 proyectos representativos de lo que encontramos casi “out of the box” en Visual Studio 2010. Desde proyectos de ASP.Net MVC 2 hasta extensiones de Office. He incluido, solo a modo de ejemplo un proyecto para Windows Phone, aunque sé que Visual Studio 11 no lo abrirá.

image

Ahora bien, cuando abrimos esta solución con Visual Studio 11, lo primero que vemos es que el tipo de proyecto de Visual Studio Installer está deprecado. Esto no es novedad, ya que lo sabíamos desde hace un tiempo, pero a tenerlo en cuenta.

image

Otro error, pero esta de vez de configuración:

image

Hay que tocar un poco las tripas de Visual Studio 11 para que funcione con una versión anterior de SQL Express.

Pero después de un segundo de migración ya tenemos listo el proyecto en Visual Studio 11

image

Ahora bien, si estabas trabajando con proyectos de ASP.Net MVC 2.0, no te quedará otra más que actualizarte a la ultima versión. Los proyectos de ASP.Net MVC 2.0 no se soportar y te sugieren amablemente que los actualices a la versión ASP.Net MVC 3.

AspNetMvc2WebApplication1_Net4\AspNetMvc2WebApplication1_Net4.csproj: The project file 'E:\srcElBruno\Tests\ProjectCompatibility\TestForVs11\AspNetMvc2WebApplication1_Net4\AspNetMvc2WebApplication1_Net4.csproj' cannot be opened. There is a missing project subtype. Subtype: '{F85E285D-A4E0-4152-9332-AB1D724D3325}' is unsupported by this installation. http://go.microsoft.com/fwlink/?prd=12395&pver=11&sbp=ProjectTypeDeprecated&plcid=0x409&clcid=0x409&ar=MSDN&sar=ProjectCompatibility&o1={F85E285D-A4E0-4152-9332-AB1D724D3325}

Obviamente, los proyectos de Windows Phone no están soportados todavía en Visual Studio 11.

PhoneApp1_Net4\PhoneApp1_Net4.csproj: The project file 'E:\srcElBruno\Tests\ProjectCompatibility\TestForVs11\PhoneApp1_Net4\PhoneApp1_Net4.csproj' cannot be opened. There is a missing project subtype. Subtype: '{C089C8C0-30E0-4E22-80C0-CE093F111A43}' is unsupported by this installation. http://go.microsoft.com/fwlink/?prd=12395&pver=11&sbp=ProjectTypeDeprecated&plcid=0x409&clcid=0x409&ar=MSDN&sar=ProjectCompatibility&o1={C089C8C0-30E0-4E22-80C0-CE093F111A43}

Ahora bien, el panel del Solution Explorer nos deja muy en claro, qué tipos de proyectos están soportados, cuales no se pudieron cargar y cuales son incompatibles.

image

Si intentamos compilar los proyectos, veremos que los mismos compilan correctamente. Pero ahora viene la prueba de fuego:

¿podrá Visual Studio 2010 abrir la nueva solución y compilar los proyectos modificados?

Y la respuesta es …. NO !!! Lo primero que vemos es el asistente para conversiones y curiosamente apunta al proyecto de ASP.Net MVC 2.

image

La pregunta en este momento, estimado lector, es ¿cómo demonios se modifica este archivo si el crack de Visual Studio 11 me ha dicho que no lo puede cargar?. Pues si, lo modifica y mucho al archivo csproj, y es por esto que en este punto Visual Studio 2010 entiende que tiene que actualizarlo.

Así que si lo actualizas con VS2010, pues ya no hay más problemas, salvo que quieras trabajar en modo mixto en tu equipo con VS2010 y VS11.

Así que los puntos finales a tener en cuenta son los siguientes:

  • Hasta el día de hoy Visual Studio 11 no se puede utilizar para desarrollar para Windows Phone.
  • Con desarrollos para AZURE, Visual Studio 11 todavía no soporta un upgrade limpio desde VS2010, pero ese es motivo de un post completo
  • No hay soporte para proyectos de Visual Studio Installer en VS11
  • Cuidado con los proyectos de ASP.Net MVC 2.0 si piensas trabajar con Visual Studio 11

Lo bueno de todo este jardín, es que luego realmente el trabajo es “side by side” entre ambos Visual Studios sin complicaciones, algo que antes entre VS2005 y VS2010 por ejemplo no era tan fácil.

Saludos @ Home

El Bruno

image image image

image

Buenas,

estas semanas nos hemos estado pegando con el desarrollo de una aplicación para Windows 8. Como yo andaba flojo de estado físico; me he entrenado como Rocky en Siberia con 30 minutos de CodeKatas por día, los videos del Build (que a decir verdad no me han servido mucho) y otras técnicas de mi entrenados personal que no me permite difundir.

Pero como la base de todos los desarrollos sigue siendo

- 20% código

- 80% comprender la plataforma sobre la que trabajas

me he encontrado con este excelente recurso que me ha dado horas y horas de lectura de código:

WinRT XAML Toolkit

Mi proceso de aprendizaje era similar al siguiente:

1, elegir una problemática a solucionar (para la app que creamos hay bastantes en el backlog)

2. ver la forma de solucionarlo sobre WinRT

3. investigar como funcionan los componentes de WinRT que están por debajo para la solución que hemos implementado

4. un poco de TDD

5. volver al paso 1

6. refactorizar el código y el proceso de trabajo

 

Es por eso que este conjunto de clases, controles, etc. me ha venido muy bien, ya que cumplen con reglas básicas como clases con nombres coherentes, código limpio (bueno casi todo, etc.), en algunas partes se utiliza var (lo siento @J0rgeSerran0 @_PedroHurtado @eiximenis, menuda han montado ehh??), etc.

Si estas por empezar con Windows 8 y METRO, pues te recomiendo que revises algunas de las implementaciones que han hecho, ya que realmente están muy bien.

Proyecto: http://winrtxamltoolkit.codeplex.com/

Source: http://winrtxamltoolkit.codeplex.com/SourceControl/changeset/changes/13755

 

Saludos @ Home

El Bruno

image image image

image

Buenas,

hoy toca poner un ejemplo de código bastante simple, pero que puede traerte un par de dolores de cabeza si no sabes por donde empezar. La idea es simple:

Incluir un archivo XML en una aplicación METRO y des serializar el mismo para trabajar en una aplicación.

Esto que parece tan simple, se complica un poco en METRO ya que los tan namespaces tan populares como System.IO y otros con los que estamos acostumbrados a trabajar ya no están disponibles.

Si a eso le sumamos, que la mayoría de las acciones son en modo asíncrono, pues la programación cambia bastante. Pero claro, Visual Studio 11 llega a nuestro rescate con las nuevas sentencias ASYNC y AWAIT que realmente nos ayudan a programar en modo asíncrono.

Vamos por partes, en el proyecto de ejemplo tenemos una clase sample data con 2 propiedades definidas como el siguiente ejemplo:

   1: namespace Application1
   2: {
   3:     public class SampleData
   4:     {
   5:         public string Id { get; set; }
   6:         public string Name { get; set; }
   7:     }
   8: }

Luego incluimos un archivo XML dentro de una carpeta XML, con la siguiente información dentro del mismo

   1: <?xml version="1.0"?>
   2: <ArrayOfSampleData 
   3:    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   4:    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   5:   <SampleData>
   6:     <Id>El</Id>
   7:     <Name>Bruno</Name>
   8:   </SampleData>
   9: </ArrayOfSampleData>

Así a simple vista, podemos ver que este XML es una serialización de un Array de elementos de tipo SampleData.

Luego queda la parte interesante, que es leer de este archivo. El siguiente código muestra un ejemplo donde la función LoadSampleData() retorna una colección de elementos del tipo SampleData leyendo un archivo llamado “data.xml” de un directorio de la aplicación llamado “XML“.

   1: private async void BtnGetClick(object sender, RoutedEventArgs e)
   2: {
   3:     var collection = LoadSampleData();
   4:     await collection;
   5:     var item = collection.Result[0];
   6:     txtId.Text = item.Id;
   7:     txtName.Text = item.Name;
   8: }
   9:  
  10: public async Task<ObservableCollection<SampleData>> LoadSampleData()
  11: {
  12:     var storageFolder = await Package.Current.InstalledLocation.GetFolderAsync("XML");
  13:     var sampleDataItems = await LoadFromXmlFile<ObservableCollection<SampleData>>("data.xml", storageFolder);
  14:     return sampleDataItems;
  15: }

Un par de detalles a tener en cuenta es que la función LoadSampleData() está definida con un prefijo async, que denota que la misma se puede ejecutar de modo asíncrono. Esto es posible ya que la lectura del directorio de trabajo (línea 12) se realiza en modo asíncrono.

En este punto merecen un especial detalle las sentencias donde para la ejecución de la función asíncrona se utiliza await. La forma más simple de definir a await es pensar en que con esta sentencia podremos llamar a funciones asíncronas y cuando se terminen las mismas, await retornará al flujo de trabajo indicado.

Ahora vamos a la parte interesante que es la desserialización del archivo XML. Para esto utilizamos la función LoadFromXmlFile que internamente, una vez que ha leido el contenido del archivo, des serializa el mismo en memoria (líneas 3 a 6). El siguiente código muestra un ejemplo de este funcionamiento:

   1: public static async Task<T> LoadFromXmlFile<T>(string fileName, StorageFolder folder = null)
   2: {
   3:     var xmlString = await ReadFromFile(fileName, folder);
   4:     var ms = new MemoryStream(UTF8Encoding.UTF8.GetBytes(xmlString));
   5:     var ser = new XmlSerializer(typeof(T));
   6:     T result = (T)ser.Deserialize(ms);
   7:     return result;
   8: }
   9:  
  10: public static async Task<string> ReadFromFile(string fileName, StorageFolder folder = null)
  11: {
  12:     folder = folder ?? ApplicationData.Current.LocalFolder;
  13:     var file = await folder.GetFileAsync(fileName);
  14:     using (var accessStream = await file.OpenAsync(FileAccessMode.Read))
  15:     {
  16:         using (var inStream = accessStream.GetInputStreamAt(0))
  17:         {
  18:             using (var reader = new DataReader(inStream))
  19:             {
  20:                 await reader.LoadAsync((uint)accessStream.Size);
  21:                 var data = reader.ReadString((uint)accessStream.Size);
  22:                 reader.DetachStream();
  23:                 return data;
  24:             }
  25:         }
  26:     }
  27: }
 

Voy a intentar separar el código del pedazo de POC que estoy construyendo y después de un poco de refactoring subiré un ejemplo más completo.

 

Saludos @ Home

El Bruno

image image image

 image

Buenas,

no soy un desarrollador de aplicaciones de Windows Phone, para eso están los cracks (@RafaSermed o @JosueYeray por ejemplo), pero desde que tengo Windows 8 instalado como plataforma principal de trabajo, pues echaba en cara poder terminar de dar unos toques a una aplicación de WP.

Ahora que tenemos el Windows Phone SDK 7.1.1 Update que ya nos permite instalar las herramientas de desarrollo de WP sobre Windows 8, pues pensé que tenía todo solucionado. Pero … zas! la primera en la cara, al momento de querer compilar el proyecto, pues me doy cuenta de que ando falto de XNA.

image

Así que ignorante de mí, pienso que instalando Microsoft XNA Game Studio 4.0 solucionaría mis problemas, pero claro

intentar instalar XNA en Windows 8 es igual de fácil que rascarse la espalda con la rodilla

Así que toca leer un poco los logs de instalación, y después de un rato me doy cuenta de que el problema de fondo parece que está relacionado con un producto que no conocía hasta el día de hoy: Game for Windows Client.

Y claro, el problema es el siguiente:

  • El instalador de Windows Phone intenta instalar una versión de XNA, aunque no puede
  • En realidad no puede, porque el instalador de XNA intenta instalar una versión de Game for Windows Client y Windows 8 dice NOT IN MY WATCH !!!

Así que de a poco y con cariño, los pasos para lograr que todo funcione son los siguientes:

Eso sí, la tarde interesante de Logs que me he dado hoy no me la quita nadie Risa

 

Descargas:

 

Saludos @ Home

El Bruno

image image image

image

Buenas,

hoy me encontraba mirando/actualizando un poco de código viejuno donde utilizaba NUnit como framework para mis pruebas unitarias y claro, como ahora estamos utilizando 100% Visual Studio 11 para el desarrollo, pues me decidí a utilizar el plugin para NUnit.

Lo bueno de VS11 es que permite utilizar diferentes plugins para pruebas unitarias (algo de lo que ya hablé aquí), pero fue mejor mi sorpresa cuando me encontré con una nueva versión del adaptador para NUnit.

Como en la página del PlugIn de Visual Studio Gallery no hay mucha información al respecto, pues me apunto los siguientes enlaces para ver las novedades, porque entre otras cosas ver que no hay ningún Bug activo me alegra como developer Risa

Saludos

 

Saludos @ Home

El Bruno

image image image

image

Buenas,

hoy toca compartir una experiencia de las que te pasan los viernes. Casi al final del desarrollo de una aplicación METRO (a que mola no?), y haciendo un par de pruebas en entornos no portátiles, tablets, touch, en el momento de probar algunas configuraciones en el emulador me encuentro con el siguiente error:

image

Nota: si te estás preguntando porqué tuve que utilizar el emulador de Windows 8, te animo a que intentes mover de landscape a portrait un HP Touch de 5 kilos.

Pues bien, el emulador no se puede lanzar si tienes activado el Microsoft Speech y en caso de que necesites ambos, te puedes llevar un buen disgusto.

Pero claro, es viernes mejor rebuscar entre frases alentadoras de viernes y salir adelante con un

Los problemas nunca se acaban, pero las soluciones tampoco.

La solución más objetiva consiste en convertirse al creacionismo e intentar crear una extensión para el emulador que soporte dispositivo de audio. La opción más realista, es probar la aplicación en el emulador sin las features de audio y acordarse de la madre de Sinofsky (o como se escriba el nombre del jefazo de W8).

Eso sí, con cualquiera de las 2 opciones ya podremos tener la aplicación en funcionamiento con todas las features que necesitamos.

image

Saludos @ Home

El Bruno

image image image
Publicado 11/5/2012 18:47 por El Bruno | con no comments

image

Buenas,

si se te ha vencido el trial del EAP de ReSharper 7 para Visual Studio 11 y cuando abres Visual Studio te encuentras con

image

Verás que el link que propone para actualizar a una nueva versión no funciona. Así que lo mejor es desinstalar Resharper 7 a mano desde “add and remove programs”

image

Y una vez desinstalado, vamos nuevamente al listado de compilaciones nocturnas de ReSharper 7 que se puede acceder desde http://confluence.jetbrains.net/display/ReSharper/ReSharper+7+EAP+for+VS11+Beta, descargamos la versión que nos ponga más felices y listo a instalar nuevamente Risa

En 10 minutos ya tenemos la ayuda de ReSharper embebida dentro del IDE.

 

Saludos @ Home

El Bruno

image image image

image

Buenas,

y es que lo de VS11 Beta era un poco intolerable. Un poco más soso y era como masticar cartón mojado. Ahora parece que para el próximo RC tendremos un carnaval de colores que nos ayudará a pensar seriamente si tanto trabajar con azules remarcados no nos quemará la vista.

En el post del equipo de producto de Visual Studio están todos los ejemplos, pero algunos no me terminan de gustar.

Por ejemplo, el definir un color de fondo más claro que el gris actual y marcar los elementos seleccionados en Azul, es muy Metro, pero no sé si para un IDE esa idea es correcta.

image

image

Ni hablar si encima comenzamos a utilizar colores como indicadores de estado o de progreso. La película Rio será una peli en blanco y negro al lado del nuevo Visual Studio.

image

Eso sí, hay algunas cosas interesantes como los nuevos colores del Solution Explorer o una barra de herramientas más amigable

image

image

Aunque, después de un par de meses me terminé acostumbrando al nuevo IDE y entiendo que con este haré lo mismo.

Eso sí, en mi próxima vida quiero ser experto en experiencia de usuario Risa

 

Fuente: http://blogs.msdn.com/b/visualstudio/archive/2012/05/08/visual-studio-11-user-interface-updates-coming-in-rc.aspx

Saludos @ Home

El Bruno

image image image
Publicado 8/5/2012 22:10 por El Bruno | con no comments
Archivado en:

image

Buenas,

me lo apunto para no olvidarme:

Test Scribe. esa extensión que te permite generar documentación a partir de información de Microsoft Test Manager, ahora soporta trabajar con Visual Studio 11.

image

Por cierto y por si no lo sabías, la herramienta es creada y soportada por el equipo de QA de Visual Studio Risa

Descarga: http://visualstudiogallery.msdn.microsoft.com/85b8215f-263f-4d1f-822b-307de339af38

Saludos @ Home

El Bruno

image image image

ALM 03

Buenas,

hoy le pego un empujón y termino el post que entre tanto AVE, viaje y showrooms de Innovación, no tengo mucho tiempo.

Hace un par de días Juan Quijano (@jc_quijano) y Álvaro Roca publicaron una serie de artículos donde comentaban los pros y contras de seguir el camino “de Programador a Manager”.

Yo os voy a comentar mi opinión personal, donde hoy no soy un Programador al 100% pero tampoco soy una persona que se dedica al Management en la forma que lo conocemos. Lo primero que me ha llamado la atención en los comentarios de ambos posts es LA COMPLETA REPUGNANCIA que demuestra más de un programador por cambiar a una posición de Management, y claro, estoy un 99,9999% seguro que esto es porque han tenido malas experiencias con jefes de equipo (desde ahora no más managers) que no saben hacer su trabajo.

En mi caso en particular, me he pasado años programando. No soy de esos que comentan que a los 4 años ya programaban en una Commodore 64 y desde allí tiran líneas, sino que descubrí a la informática más de grande y me apasionó desde el primer día. Me pasé años aprendiendo a programar y creo que lo que más me llamó la atención es que en este mundillo, siempre tenemos que estar aprendiendo constantemente.

Cuando estaba en mi primer trabajo tuve la suerte de participar en la creación de un producto que comenzó a comercializarse a nivel internacional y claro, lo que comenzó siendo un equipo de 3 personas, comenzó a crecer hasta que no me alcanzaban los dedos de una mano para contar el equipo. En ese punto, lo que había sido años de autoformación sobre nuevas tecnologías, programación, etc.; tuvo que convertirse en comenzar a aprender sobre elementos para garantizar que el trabajo que hacíamos todos como equipo era coherente, que todos entendíamos hacia donde queríamos llegar, etc.

En esa misma época llegué a España y como coincidía con el lanzamiento de Visual Studio 2005, pues empecé a leer libros que iban más allá de las técnicas de programación. Conocí AGILE, descubrí el negocio detrás de CMMI, pero principalmente comprendí que salvo proyectos concretos, en mi carrera profesional iba a tener que trabajar mucho en equipo. Es por este motivo que comencé a intentar mejorar la calidad de los entregables de mi equipo, intenté que todo el mundo sea mejor que yo (Germán me enseñó que la calidad de un equipo se mide por el peor de sus integrantes), etc.

Por el camino, me cayeron un par de premios MVPs, donde en los últimos años han sido de la categoría MVP ALM. Básicamente es reconocer y aprender como utilizar correctamente las herramientas de Visual Studio ALM para trabajar en equipo.

Así que bien, no soy un “manager de esos” que comentan en los posts de Juan Quijano y Álvaro Roca, pero si me considero una de las personas que intenta llevar adelante un equipo hasta obtener un cliente satisfecho y un equipo productivo. ¿Parece una incoherencia , no?

 

Por cierto, hace 2 días me encontré frente a un problema lógico que me costó casi una noche de construir. Como me di cuenta de que estoy “medio oxidado” me he puesto como objetivo hacer 30 minutos de Code Kata diariamente durante el mes de mayo.

¿A cuántos jefes de proyecto / gestores / managers conoces que hagan este tipo de cosas?

 

Referencias:

Saludos @ Home

El Bruno

image image image
Publicado 6/5/2012 17:24 por El Bruno | 5 comment(s)
Archivado en: ,

image

Buenas.

Si yo fuese un ratón o mouse estaría bastante cabreado / enfadado / enojado o como se diga en tu tierra. Resulta que ahora llega un dispositivo de más o menos €100 llamado Microsoft Kinect que apunta a reemplazarme y destronarme en el mundo de los ordenadores. Pero claro, el cabreo / enfado / enojo ya comienza hace un tiempo, cuando unos tíos de una empresa con una manzanita, reinventan un teléfono móvil un poco grande, le ponen de nombre iPad y todo el mundo se acostumbra a

Tocar y arrastrar en lugar de mover y clicar

Pues por eso, si fuese un ratón estaría muy cabreado. Pero como dice el gran Groucho Marx

Es mejor permanecer callado y parecer tonto que hablar y despejar las dudas definitivamente.

Es por eso que el ratón sigue calladito acompañado a más de uno y creo que tardará bastante tiempo para que nos abandone definitivamente.

Especialmente cuando hay muchas personas que, al momento de crear una nueva interfaz de usuario, lo que intentan es reemplazar el ratón, por ejemplo con gestos y acciones de Kinect. Estos proyectos están orientados y destinados al fracaso en un 99,99% de los casos.

La clave de estos casos está en la palabra “crear”. Lo que debemos hacer es dejar en paz al ratón, agradecerle los servicios prestados y comenzar a pensar cuáles son las formas más efectivas de trabajo con los nuevos sensores que poseemos.

Ahora la interacción entre dispositivos cada vez más móviles, superficies táctiles, detectores de gestos como Kinect, pico proyectores, etc.; hace que podamos pensar en nuevos escenarios para aplicaciones que realmente pueden ser grandiosos o desastrosos.

Alguno se preguntará, ¿le ha afectado el poco sueño al Bruno o qué le pasa que escribe esto?, es muy simple. Como algunos se han dado cuenta que me gusta jugar con Kinect y con este tipo de dispositivos, muchas veces me llegan preguntas del tipo

  • ¿Cómo puedo hacer para reemplazar el ratón con Kinect?
  • No se cómo hacer un doble clic con Kinect, cuando intento reemplazar al ratón.

Y si bien es cierto que intento responder todo lo que me preguntan, para esas preguntas la respuesta será este post. Donde no respondo nada en concreto pero … bueno ya sabes.

Yo por suerte, no solo tengo la oportunidad de “jugar” con estos dispositivos sino que además son parte de mi trabajo en Avanade, con lo que puedo ver las buenas y malas experiencias en el mundo de las NUI (término molón para describir formas naturales de trabajo frente a dispositivos electrónicos). Muchas personas no se dan cuenta que Kinect, por ejemplo, necesita un espacio considerable para ser efectivo, o que en un dispositivo táctil pues la sensibilidad del touch no es la misma que un ratón.

Finalmente, un dato a tener en cuenta:

Durante el año 2008 la cantidad de dispositivos conectados a internet superó a la cantidad de personas en la tierra. Para el año 2020 se espera que haya más de 50 billones de dispositivos conectados a internet. (Fuente)

Esto qué significa?, que además de tener un Mustang 100% conectado a internet, ahora tendremos que interactuar con muchos tipos de dispositivos nuevos y claro, nuestro amigo el mouse no estará allí para ayudarnos y tampoco es cuestión de que emulemos el funcionamiento del mouse en todas partes.

Así que, yo no guardaré mi mouse ya mismo, pero ya comenzaré a ver de que forma puedo trabajar en diferentes espacios sin un mouse … luego veré que dispositivo me brinda la mejor ayuda en ese escenario Risa

Por cierto

1. Como el Lego me ha quedado chico,  espera a ver lo que estoy haciendo con mi RX8, un Kinect, una tableta con Windows 8, etc. 230CV en manos de una porción de código C#. Mi chica está un poco asustada pero el Valentino súper feliz de poder jugar con el coche desde una tableta … Risa

.2 El ratonazo cabreado / enfadado / enojado lo saqué de http://abstract.desktopnexus.com/get/134212?t=08tt07vgrel6eo8knisme46jh34fa00c9fcba2b

Saludos @ Home

El Bruno

image image image