Streaming de audio bajo HTML5 en Windows Phone

Este post lo escribí originalmente en mi blog personal el día 04/08/2011

Todos sabemos, y si no ya estoy yo aquí para contarlo, que Windows Phone 7 en su versión 7.5 “Mango” incorpora IE9 como navegador, lo que significa que puede reproducir contenido bajo la nueva revisión del lenguaje básico de la red HTML, lo que es lo mismo puede leer contenido en HTML5.

Hasta ahí casi nada nuevo, pero una de las características que incorporará en su versión definitiva y que aun no incorporaba en la primera beta de “Mango” es la posibilidad de escuchar streaming de audio en background. Es decir podemos entrar en una pagina que contenga un reproductor de medios, el cual reproduzca un archivo de audio y dejar esa pagina en background, (simplemente pulsando el botón home de nuestro teléfono), o incluso con el teléfono bloqueado, para continuar escuchando el sonido.

Pero lo mas atractivo del asunto es que disponemos de un control típico de reproducción de audio, al pulsa por ejemplo el botón del volumen, con lo que podremos parar, avanzar o continuar reproduciendo este archivo o archivos sin necesidad de volver a entrar en la web que lo está reproduciendo.

Pensando, pensando se abren muchas posibilidades con esto, ¿traerá la versión definitiva de Mango el streaming por Skydrive?, con esto se puede pensar que si no lo trae, es porque no han querido, ya que lo tienen a mano. Y si no es así el crearse un reproductor de nuestra propia biblioteca, no debería ser muy complicado. Ummmm.

Es mas, se rumorea que Pandora, con su servicio de Internet Music, en breve incorporaría toda su web bajo el estándar HTML5, con lo que la reproducción estaría servida.

Y como las imágenes (en este caso los videos de Youtube) valen mas que mil palabras, aquí os dejo un video con un ejemplo de lo que acabo de contar a partir del minuto 1.

Creación visual de tablas para el uso con SQL CE y “Mango”.

Este post lo escribí originalmente en mi blog personal el día 03/08/2011.

¿Pero como que creación visual de tablas?, si se nos ha dicho que no, que debemos de picarnos todo el mapeo de nuestras bases de datos para trabajar con el DataContext a mano. Quizás alguna que otra herramienta podría ayudarnos pero poca cosa mas, siempre dependiendo de una base de datos ya existente. ¿No es así?

Pues no, os engañaron, bueno vale: nos engañaron.

Vamos a darles a los chicos de desarrollo de Windows Phone, el margen de la duda y pongamos que simplemente no nos lo han contado así para no liarnos y para no pensar que las cosas están un poquito a medias. Si en el fondo son chicos majos.

Pues SI, si que se puede y además de la manera mas tonta, quizás es que nadie lo ha probado, pero bueno yo creo que es un pequeño truco o apaño, pero mejor que picarnos a mano todo nuestro mapeo, para mi es mas que suficiente. MapeoDbml1

Para ello simplemente creare una aplicación mínima, y mostrare como se tiene que hacer: Creamos nuestra solución en la cual estará incluido obviamente nuestro proyecto de “Windows Phone Application”, a parte de esto crearemos simplemente para apoyarnos en la herramienta, dentro de nuestra solución (no es esto obligatorio) una biblioteca de clases.

Una vez que tenemos este esquema montado, procedemos a crear un nuevo elemento del tipo “Clases de LINQ to SQL”, fichero del tipo “.dbml” en nuestro proyecto de biblioteca de clases. Una vez creado este elemento procedemos a crear las clases de forma visual en nuestro “Object Relational Designer”.

En este ejemplo crearemos dos clases (Tablas) con una serie de propiedades (Columnas o campos) cada una de ellas. Así mismo también crearemos una asociación entre ambas y una clave secundaria en una de ellas para comprobar que mas o menos toda la funcionalidad que nos permite LINQ to SQL en nuestro Windows Phone, la podemos mapear de forma visual desde aquí. El esquema o mapeo de datos quedaría de la siguiente manera:

MapeoDbml2

Una vez realizado el mapeo de forma visual, debemos de fijarnos que junto a nuestro fichero original “.dbml”, existen 2 ficheros mas, el que define el layout del diseñador y el que nos interesa, el fichero con extensión “.designer.cs”. Este es el fichero que contiene todo el mapeo de datos que hemos creado anteriormente de forma visual y es el fichero que vamos a agregar a nuestro proyecto de “Windows Phone”.

Una vez añadido a nuestro proyecto “principal”, simplemente quitaremos un par de constructores que crea por defecto Visual Studio en el DataContext, que por otra parte son los dos mismos constructores que deberemos de quitar si utilizamos la herramienta SQLMetal para crear nuestro mapeo de datos. Estos constructores son los que nos solicita como parámetros de entrada los objetos del tipo “System.Data.IDbConnection”. MapeoDbml3 No deberemos de olvidarnos de agregar la referencia al ensamblado “System.Data.LINQ”, si queremos que todo esto nos funcione.

Punto y final, ya tenemos nuestro mapeo de datos terminado. Ahora a crear la base de datos y trabajar con ella. La única pega, pues que cada vez que queramos modificar nuestra base de datos deberemos de volver a importar nuestro fichero “.designer.cs” y volver a quitar los dos constructores comentados. Que es eso comparado con el trabajo que llevaría mapear a mano una base de datos nueva que sea un poco compleja.

Y para muestra un botón, aquí os dejo una captura de la estructura de base de datos que nos crea nuestro nuevo DataContext y un ejemplo completo de como hacerlo. MapeoDbml4 Ejemplo de como poder hacerlo:

¿ Donde están ahora los datos y las herramientas de terceros ?

Este post, le escribí originalmente en mi blog personal el día 31/07/2011.

Una vez que hemos creado nuestra base de datos mediante SQL CE y LINQ to SQL, según las indicaciones del anterior post, estaría bien acceder a ella y poder verla editarla y manejarla de forma indirecta. Para ello existen diferentes formas de acceder a los datos almacenados en el Isolated Storage de nuestro dispositivo. Así mismo existen también otra serie de herramientas ya encaminadas a SQL CE que también pueden ser de utilidad en nuestros desarrollos.

Acceso al Isolated Storage:

Estas herramientas que voy a describir a continuación nos van a ayudar en el acceso al Isolated Storage de nuestro Windows Phone, no son especificas para SQL CE, sino que se pueden usar siempre y cuando necesitemos acceder, ver y copiar contenido del o al Isolated Storage.

Isolated Storage Explorer Tool

Es una herramienta que viene con el SDK de Windows Phone, aparece con la beta de las herramientas de desarrollo para “Mango”. Esta herramienta interna de Microsoft nos va a ayudar a listar, copiar y reemplazar ficheros y directorios del Isolated Storage se puede usar tanto para visualizar el contenido de nuestro emulador, como para visualizar el contenido de un dispositivo físico.

Como toda aplicación de línea de comandos es un tanto liosa, pero bueno, lo mejor es comenzar a saber como utilizar este tipo de herramientas antes de usar herramientas mas visuales de terceros que nos puedan facilitar mas la vida. Simplemente debemos de dirigirnos desde el prompt al directorio en donde esta el ejecutable “ISETool.exe”, que normalmente será: «c:Program FilesMicrosoft SDKsWindows PhoneV7.1ToolsIsolateStorageExplorerTool”, casi nada. Una vez allí simplemente deberemos de lanzar dicho ejecutable con la siguiente estructura:

ISETool.exe <ts|rs|dir[device-folder]> <xd|de> <GUID> [<desktop-path>]

Y esta es la explicación de los opciones posibles.

Parámetro Descripción
ts Copia de ficheros y directorios en el Isolated Storage al ordenador.
rs Reemplaza los ficheros y directorios del Isolated Storage desde el ordenador.
dir Listado de ficheros y directorios del directorio especificado del Isolated Storage
device-folder Directorio del Isolated Storage a manejar.
xd Indicamos que las funciones serán sobre el emulador.
de Indicamos que las funciones las realizaremos sobre un dispositivo físico.
GUID Especifica el ProductID de la aplicación. Este dato esta contenido en el fichero WPAppManifest.xml
desktop-path Especifica el directorio del ordenador, en donde copiaremos o de donde reemplazaremos los ficheros del Isolated Storage

En nuestro caso anterior, copiaremos el contenido del Isolated Storage de nuestro emulador, al ordenador para ver si nos ha generado correctamente el fichero .sdf de nuestra base de datos. Para ello bastaría con ejecutar la sentencia:

ISETool.exe ts xd 0368a47f-5c90-4363-9194-b5c1da3f6218 “C:WP7”

Con esta “sencilla” instrucción ya tenemos en nuestro directorio WP7 de nuestro disco C, todo el contenido del Isolated Storage del emulador.

 ISETool1

Debemos de tener en cuenta dos cosas mas; Esta herramienta nunca nos copiara las “application settings” guardadas en nuestra aplicación, y lo mas importante es que debemos de ejecutar la línea de comandos con los mismos privilegios que hayamos ejecutado el emulador, en nuestro caso, ya que si no lo hacemos así no nos funcionara.

Una vez hecho esto ya tenemos todos los datos contenidos en el Isolated Storage en nuestra carpeta indicada. La utilidad nos guarda todos estos datos dentro de una carpeta llamada “IsolatedStore” dentro de la ruta especificada que le hayamos dado para guardarlo.

ISETool2

En la esta pagina de MSDN podemos ver un poco mas en profundidad la forma de utilizar esta herramienta.

Windows Phone 7 Isolated Storage Explorer

Una vez que nos hemos pegado con la línea de comandos, siempre es bueno volver a recordar nuestra época de MS-DOS, podemos instalar esta pequeña aplicación, que es a la vez una aplicación y un plugin para Visual Studio.

Es una herramienta de terceros hospedada en Codeplex.

Su utilización es muy sencilla, y realmente son de estas aplicaciones que le hacen a uno la vida bastante mas sencilla, tanto por su fácil e intuitivo manejo como por todo lo que nos aporta. Simplemente debemos de descargarnos el fichero de instalación de Codeplex y realizar la típica instalación de la triple N (Next, Next, Next). Una vez instalado lo único que debemos de cambiar es una serie de líneas en aquellas aplicaciones en las que queramos utilizar dicho complemento.

Para ello basta con referenciar el ensamblado que viene con la instalación “IsolatedStorageExplorer.dll” y añadir dos sencillas llamadas en nuestro App.xaml.cs. La primera en el procedimiento launching

private void Application_Launching(object sender, LaunchingEventArgs e)

{     IsolatedStorageExplorer.Explorer.Start(“Localhost”);

}

y la segunda en el procedimiento de Activated

private void Application_Activated(object sender, ActivatedEventArgs e)

{     IsolatedStorageExplorer.Explorer.RestoreFromTombstone();

}

Lo único que tenemos que tener en cuenta es que en el primer caso, el procedimiento del “Launching” es en el que debemos de indicarle la IP de la maquina en donde estará corriendo la aplicación a “visualizar”, en este caso como vamos a ver directamente el emulador, este se encuentra en la misma maquina que al Explorer con lo que con poner “Localhost” es suficiente. Tras esto tanto en la aplicación de escritorio (ojo abrirla después de arrancar la aplicación), como en el plugin de Visual Studio tendremos acceso al Isolated Storage de nuestra aplicación. Podremos copiar archivos desde y hasta el Isolated Storage, crear carpetas, borrar ficheros, etc… IsolatedStorageExplorer Un herramienta sencilla pero bastante productiva.

Manejo de SQL Server CE.

Estas otras herramientas están mas enfocadas al manejo de SQL Server CE y a sus bases de datos, no son de carácter general como las anteriores, pero nos ayudaran en la gestión y administración de las bases de datos sdf.

SQL Metal.

Herramienta de línea de comandos que viene con el SDK de .NET. En este caso dicha utilidad se encuentra en el directorio “Program FilesMicrosoft SDKsWindowsv7.0Abin”, (esta dirección depende de la versión del framework y de Visual Studio que tengamos instalado) y nos ayudara a generar nuestras entidades de mapeo, para nuestros objetos en .NET. SQL Metal no es una herramienta especifica para Windows Phone, sino que genera a partir (y esto es muy importante) de un fichero de base de datos las clases necesarias para poder utilizar LINQ to SQL.

Como comento anteriormente genera dichas clases a partir de un fichero dado, es decir debemos de disponer de un fichero para poder generar las clases de entidad de dicho fichero. Así mismo como he comentado también, no es especifico de un motor de base de datos sino que funciona tanto para BBDD de SQL Server, como SQL Server Compact Edition.

Pongamos un ejemplo; A partir de la base de datos de ejemplo “Northwind”, típica base de datos de ejemplo proporcionada por Microsoft, la cual en su versión para SQL Compact podemos encontrar en “Program FilesMicrosoft SQL Server Compact Editionv3.5Samples”, generaremos las clases necesarias para poder utilizar LINQ to SQL en nuestro Windows Phone.

No es mi intención en este Post adentrarme muy de lleno en esta herramienta, ya que es bastante densa, simplemente generaremos un fichero con las entidades correspondientes a la base de datos anterior. Para ello lanzaremos la siguiente instrucción en la línea de comandos:

Sqlmetal.exe “C:Program FilesMicrosoft SQL Server Compact Editionv3.5SamplesNorthwind.sdf” /code:”C:MiProyectoMapeo.cs” /language:csharp /namespace:NortwindNS /context:NortwindContext

Con esto ejecutamos la utilidad y nos va a generar un fichero en CSharp, denominado Mapeo.cs, en el directorio C:MiProyecto de la base de datos Nortwind.sdf, creando dichas clases bajo el espacio de nombres NortwindNS y nos creara además una clase para el contexto de datos denominada NortwindContext. SqlMetal1

 

Solo existe una pequeña pega, y es que el código generado por SQLMetal no es 100% compatible con un proyecto para Windows Phone, pero es bastante fácil de solucionar, basta con eliminar dos de los constructores de la clase del contexto de datos, en donde se indica un objeto del tipo System.Data.IDbConnection. Quedándonos con los constructores que nos solicitan un objeto del tipo string para la conexión.

SqlMetal2 Para un mayor control de esta utilidad basta con acudir a la pagina de MSDN que trata sobre el tema.

SQL Server Compact Toolbox:

Esta herramienta que está hospedada en Codeplex, es obra del danés Erik EJ, MVP de SQL Server Compact, y nos va a permitir manejar nuestra base de datos de SQL Server Compact, desde un plugin de Visual Studio o desde una aplicación independiente.

Nos permitirá realizar sentencias T-SQL sobre nuestra base de datos, grabar los scripts de creación de la base de datos y del volcado de datos, generación de las clases y del contexto de datos al igual que SQL Metal, pero enfocado completamente a Windows Phone, etc….

SqlServerTool Es bastante recomendable así mismo seguir el Blog de Erik EJ, para enterarnos de alguna que otra cosa con respecto a la gestión y utilización de SQL Server Compact tanto para entornos de escritorio como para entornos móviles Windows Phone 6.x y Windows Phone 7.

Existe en la web muchas otras herramientas para la gestión y el manejo de Sql Server Compact, pero a mi modo de ver estas dos son las mas importantes, una porque viene con Visual Studio y la otra porque para ser gratuita es una herramienta muy eficaz y de gran utilidad.

Nota: «¿Dónde están ahora el caballo y el caballero? ¿Dónde está el cuerno que sonaba? ¿Dónde están el yelmo y la coraza, y los luminosos cabellos flotantes? ¿Dónde están la mano en las cuerdas del arpa y el fuego rojo encendido?…. “: Extracto del poema sobre Eorl, fundador de Rohan, recitado por Aragorn a Legolas en su camino hacia Edoras.

SQL CE – Un “DataContext” para gobernarlos a todos.

Este Post, originalmente lo escribí para mi blog personal, el día 15/07/2011

Lo primero que debemos de conocer es como se va a organizar la estructura de los datos en nuestras BBDD, gestionadas por “Mango”, para ello lo primero que debemos de conocer es el funcionamiento en profundidad de LINQ to SQL. ¿Porque LINQ to SQL?, por que será la única forma de interactuar con SQL CE, ya que no existirán las conexiones directas contra las bases de datos.

Según MSDN en sus librerías para Windows Phone “LINQ to SQL proporciona un enfoque orientado a objetos para trabajar con datos y contar con un modelo de objetos en tiempo de ejecución.” o dicho de otra manera “el modelo de datos de una base de datos relacional se asigna a un modelo de objetos expresado en el lenguaje del programador”.

Para realizar toda esta magia de poder manejar los datos como objetos, se utiliza un objeto principal denominado DataContext, que, otra vez según MSDN “actúa como un proxy para la base de datos local”. Este objeto esta recogido en el espacio de nombres System.Data.Linq.DataContext.

Para aproximarnos a su funcionamiento en los entornos de Windows Phone “Mango”, podremos seguir la siente imagen: ImagenDataContext

Una vez que conocemos que todo gira en torno al DataContext, deberíamos de tener en cuenta las diferencias entre el DataContext utilizado en nuestros entornos móviles y el DataContext utilizado en entornos de escritorio.

  • Lo primero que debemos saber es que no están soportados todos los tipos y clases soportados en el namespace System.Data.Linq y que los que están soportados lo están de forma parcial.
  • Como ya comente en la entrada preliminar, no esta soportado la utilización del lenguaje Transact-SQL.
  • Los objetos de datos de ADO.NET, tampoco están soportados, como por ejemplo el objeto DataReader. Todo, absolutamente todo se utiliza como una colección de objetos del tipo especificado por el DataContext.
  • Los formatos binary de datos tampoco están soportados. Mejor dicho si lo están pero no de forma directa, se deberán de crear tipos propios y parsearlos contra los tipos binarios de nuestra base de datos.
  • En este caso LINQ to SQL solo funciona con SQL CE.

Para conocer mas en profundidad que o que no esta soportado en LINQ to SQL para Windows Phone, debéis visitar como no MSDN.

Creación del DataContext.

Como he comentado lo primero es la creación del DataContext, para ello lo primero que debemos de hacer es añadir la referencia del ensamblado System.Data.Linq. AddReferenceLinq Ahora creamos la clase del tipo DataContext.

   1: public class ContextodeDatos : DataContext

   2: {

   3:     public ContextodeDatos(string CadenaConexion) : base(CadenaConexion)

   4:     {

   5:     }

   6: }

El DataContext es como venimos diciendo todo el tiempo, el que se encarga de manejar los datos en si, para ello debemos de tener la referencia a los objetos (datos), que vamos a utilizar. Con lo que previamente al paso de crear el contexto de datos, deberíamos de haber creado la clase que mapea los datos, es decir el objeto puente entre los datos reales contenidos en la BBDD y LINQ to SQL. Estos objetos se denominan comúnmente objetos POCO (Plain Old CLR Object)

En este ejemplo vamos a tener una base de datos con 2 tablas, Autores y Libros, y obviamente estas dos tablas tendrán sus correspondientes campos. El esquema de ambas es el que se detalla a continuación. Tablas1

Como hemos comentado deberemos de crear una serie de clases que mapeen a cada una de las tablas “físicas” de la BBDD, comenzaremos por crear la primera de ellas sobre la tabla “Autores”. Para guiarnos de una forma sencilla las denominaremos como las tablas a las que mapean.

No debemos de olvidarnos de añadir en el uses de nuestro fichero la referencia al namespace System.Data.Linq.Mapping.

   1: [Table(Name="Autores")]

   2: public class Autor

   3: {

   4:     [Column(IsPrimaryKey=true, IsDbGenerated=true)]

   5:     public int ID { get; set; }

   6:  

   7:     [Column]

   8:     public string Nombre { get; set; }

   9:  

  10:     [Column]

  11:     public string Apellidos { get; set; }

  12:  

  13:     [Column]

  14:     public string Pais { get; set; }

  15: }

Tras crear la clase Autores, crearemos la clase Libros.

   1: [Table(Name="Libros")]

   2: public class Libro

   3: {

   4:     [Column(IsPrimaryKey=true)]

   5:     public string ISBN { get; set; }

   6:  

   7:     [Column]

   8:     public string Titulo { get; set; }

   9:  

  10:     [Column]

  11:     public decimal Precio { get; set; }

  12:  

  13:     [Column]

  14:     public string Editorial { get; set; }

  15:  

  16:     [Column]

  17:     public string Autor { get; set; }

  18:  

  19:     [Column]

  20:     public string Idioma { get; set; }

  21: }

Lo primero de lo que nos damos cuenta es de los atributos utilizados en la creación de ambas clases. Podemos ver aquí la lista completa de los atributos que se pueden utilizar a la hora de mapear los datos en LINQ to SQL. Tenemos que tener en cuenta que no todos los atributos son soportados. En nuestro caso solo hemos utilizados dos de forma muy sencilla:

[Table]: Atributo para indicar que la clase mapea una tabla de datos. Además hemos utilizado una propiedad de este atributo (la única posible así mismo), denominada “Name”, por la que indicamos el nombre de la tabla dentro de la BBDD.

[Column]: Atributo para indicar que el miembro de la clase se mapea a una columna de la tabla, a un campo de la tabla. En este caso hemos utilizado dos propiedades de este atributo:

  • IsPrimaryKey: Por la que indicamos que columna o columnas forman parte de la clave primaria de la tabla.
  • IsDbGenerated: Con esta otra propiedad indicamos que columna es auto-generada por la base de datos. En este caso que la columna es auto incremental.

Como podemos observar el mapeo de las bases de datos es algo bastante latoso, en este caso tenemos simplemente dos tablas muy sencillas dentro de una base de datos bastante normalita, este tema en un entorno real puede convertirse en algo bastante lioso. No existen aun herramientas de modelado o de mapeo automático para este tipo de clases, de forma nativa con Visual Studio pero si que existen herramientas de terceros que pueden ayudarnos a realizar estas tareas de una manera mas visual y mas cómoda. En posteriores post hablare de ellas.

Bueno pues seguimos con nuestro contexto. Anteriormente creamos la clase del tipo DataContext, ahora lo único que debemos de hacer es referenciar nuestros mapeos de las tablas creadas dentro de ese contexto de datos.

   1: public class ContextoDeDatos : DataContext

   2: {

   3:     public ContextoDeDatos(string CadenaConexion) : base(CadenaConexion)

   4:     {

   5:     }

   6:  

   7:     public Table Autores

   8:     {

   9:         get { return this.GetTable(); }

  10:     }

  11:  

  12:     public Table Libros

  13:     {

  14:         get { return this.GetTable(); }

  15:     }

  16: }

Bien, una vez con todo esto lo unico que nos queda es interactuar con nuestra base de datos, para ello lo que haremos es comprobar a la hora de inicializar nuestra aplicacion, si la base de datos existe y si esta no existe, la crearemos.

   1: // Constructor

   2: public MainPage()

   3: {

   4:     InitializeComponent();

   5:  

   6:     string ConnectionString = "Data Source='isostore:/Pruebas.sdf'";

   7:  

   8:     using (ContextoDeDatos Contexto = new ContextoDeDatos(ConnectionString))

   9:     {

  10:         if (Contexto.DatabaseExists() == false)

  11:         {

  12:             Contexto.CreateDatabase();

  13:         }

  14:     }

  15: }

Lo primero que nos debe de resultar un tanto extraño es el formato de la cadena de conexión utilizada, a grandes rasgos le estamos diciendo a nuestra aplicación que la base de datos se encuentra dentro del Isolated Storage de la propia aplicación y que en la ruta raíz de ese Isolated Storage el fichero se llama Pruebas, con la extensión común a SQL Server Ce “.sdf”.

De momento lo dejamos aquí, en el próximo post, hablare de donde exactamente se encuentra nuestra base de datos, como podemos acceder a ella de forma remota, para comprobarla y demás, así como un repaso de las herramientas de terceros que nos pueden facilitarnos un poco la vida en la creación del mapeo de nuestras bases de datos.

En el fichero superior podéis encontrar el código fuente de la pequeña aplicación de ejemplo en donde se utiliza todo lo explicado anteriormente.

Nota: “Ash nazg durbatulûk, ash nazg gimbatul… Ash nazg thrakatulûk agh burzum-ishi krimpatul” es el texto completo escrito en la lengua de Mordor, el cual estaba inscrito en el Anillo que portó, primero, Bilbo Bolsón y luego Frodo Bolsón, propiedad de Sauron, cuya traducción es “Un anillo para gobernarlos a todos, un Anillo para encontrarlos, un Anillo para atraerlos a todos y atarlos en las Tinieblas”.

Gracias y adelante……

Pues eso, que muchas gracias primero a Josué Yeray por creer que yo y mis entradas podrían aportar algo a una comunidad tan extensa y profesional como es Geeks.ms y gracias a Rodrigo Corral por crearme la cuenta y darme la oportunidad de escribir junto a tanta gente interesante.

También como no agradecer a Juan Carlos González, la oportunidad de conocer mas en profundidad a toda esta comunidad y darme la oportunidad de compartir escenario con alguno de ellos y sobre todo a toda la gente que ha hecho y hace Geeks.ms, fuente de conocimiento para mucha gente entre la que me incluyo, por supuesto.

Lo primero es ser agradecido que no cuesta nada y lo segundo es ponerse manos a la obra. Como bien indica el titulo de mi Blog tratare principalmente sobre el desarrollo en Windows Phone, así como la relación con Azure, pero eso si “mezclado, pero no revuelto”.

Como da la casualidad que la próxima semana cojo unas pequeñas vacaciones, lo que haré y como presentación es publicar aquí las ultimas entradas que he realizado en mi blog personal, para ir abriendo un poco de apetito y no parar ahora que acabo de comenzar.

Pues lo dicho, manos a la obra y al tajo.