[#KINECTSDK] HowTo: Utilizar Kinect como una pantalla verde (I) (tocando con los Stones !)

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

[#TFS] HowTo: NuGet y TFS

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

[…NuGetsrcClassLibrary2packagesEnterpriseLibrary.Common.5.0.505.0libNET35Microsoft.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

[#VS11] Microsoft Feedback Client (II)

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:windowscalc.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:WindowsSystem32calc.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

[#VS11] Microsoft Feedback Client (I)

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

[#VS2010] Error con ASP.Net MVC y el IIS en Windows 8

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

[#KINECTSDK] Kinect SDK 1.5 and Developer Toolkit Released !!!

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

[#VS11] Puedo trabajar en un mismo proyecto con Visual Studio 2010 y Visual Studio 11?

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_Net4AspNetMvc2WebApplication1_Net4.csproj: The project file ‘E:srcElBrunoTestsProjectCompatibilityTestForVs11AspNetMvc2WebApplication1_Net4AspNetMvc2WebApplication1_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_Net4PhoneApp1_Net4.csproj: The project file ‘E:srcElBrunoTestsProjectCompatibilityTestForVs11PhoneApp1_Net4PhoneApp1_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

[#VS11] Excelente set de bibliotecas para desarrollos sobre WinRT (es decir para #Windows8)

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

[#VS11] HowTo: Incluir y des serializar un archivo XML en una aplicación #METRO

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

[#WP] HowTo: Install Microsoft.Xna.Framework reference for Windows Phone development in #Windows8

 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