Migrando el tres en raya: Azure SDK 2.4, SignalR 2.1.1, Windows 8.1

El año pasado escribí una serie de tres artículos donde explicaba cómo crear un juego de tres en raya para jugar online en tiempo real, desde el navegador y también desde una app Windows 8. Como la tecnología avanza muy rápido, al cabo de un mes de escribir el artículo el código ya no compilaba con los últimos SDK. Así que, ahora que estoy de vacaciones me he dedicado a procrastinar y a actualizar alguno de mis proyectos personales para no tener que hacer lo que me había propuesto :). Aquí os dejo los pasos a realizar para migrar, aunque podéis descargar directamente el nuevo paquete aquí.

Como primer paso, conviene tener Visual Studio 2013.3 instalado y actualizar el SDK de Windows Azure al último disponible (2.4 por ahora).

Una vez con nuestro entorno listo, al abrir el proyecto nos va a pedir que actualicemos el proyecto a la versión 2.4:

migrateto2_4

Tras compilar toda la solución, necesitaremos actualizar SignalR. En la versión inicial de este proyecto teníamos la versión 1.1.2 y ahora queremos actualizar a 2.1.1. Para abreviar vamos a utilizar la consola del Package Manager y vamos a actualizar todo el proyecto con esta complicada línea de comando:


Update-Package

Una vez actualizadas las referencias, ya estamos usando la última versión de SignalR y sus correspondientes dependencias como jQuery y OWin, pero para que funcione tendremos que realizar algunos cambios. Ahora SignalR utiliza el stack de OWin, así que tendremos que quitar el código de inicialización del Global.asax.cs:

protected void Application_Start(object sender, EventArgs e)
{
var hubConfiguration = new HubConfiguration();
hubConfiguration.EnableCrossDomain = true;
// Register the default hubs route: ~/signalr
RouteTable.Routes.MapHubs(hubConfiguration);

var sbConnectionString = CloudConfigurationManager.GetSetting(“ServiceBusConnectionString”);
GlobalHost.DependencyResolver.UseServiceBus(sbConnectionString, “TresEnRaya”);
}

El código de inicialización ahora va en una clase especial de Owin llamada Startup.cs:

startup_cs

using System;
using System.Threading.Tasks;
using Microsoft.Owin;
using Owin;

[assembly: OwinStartup(typeof(TresEnRaya.Startup))]
namespace TresEnRaya
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();
        }
    }
}

Si os fijáis bien, no hemos configurado la aplicación con CORS para que pueda funcionar la app de Windows 8. Para hacer esto mismo en Owin tenemos que descargar el módulo de CORS:

Install-Package -ProjectName TresEnRaya Microsoft.Owin.Cors

Y en la inicialización añadimos el soporte para CORS a SignalR:

app.MapSignalR().UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

Casi todo el código está listo, vamos a realizar un último cambio para facilitarnos un poco el desarrollo. Ahora el SDK de Azure trae un “Emulator Express” que no necesita elevación de privilegios, lo configuramos en las propiedades del proyecto TresEnRaya.Azure y establecemos ese mismo proyecto como proyecto de arranque:
emulator express

También tendremos que actualizar un poco el código de la página default.html, pues las referencias a los scripts han cambiado de versión:

<script src="Scripts/jquery-2.1.1.min.js"></script>
<script src="Scripts/jquery.signalR-2.1.1.min.js"></script>
<!--Reference the autogenerated SignalR hub script. -->
<script src="/signalr/hubs"></script>
<script src="Scripts/tresenraya.js"></script>

Y ya podemos ejecutar la aplicación, no hace falta cambiar el código del hub ni nuestro código JavaScript, todo seguirá funcionando!

Windows 8.1

Para actualizar la aplicación Windows primero tenemos que actualizar a Windows 8.1, desde Visual Studio basta pulsar botón derecho y actualizar de versión:
retarget8_1

Como también hemos actualizado SignalR y jQuery en este proyecto, actualizamos default.html para que utilice las librerías correctas:

<script src="Scripts/jquery-2.1.1.min.js"></script>
<script src="Scripts/jquery.signalR-2.1.1.min.js"></script>
<!--Reference the autogenerated SignalR hub script. -->
<script src="/js/hubs.js"></script>
<script src="js/tresenraya.js"></script>
<script src="/js/default.js"></script>

El hub que utilizamos en la aplicación de Windows 8.1 no se puede descargar dinámicamente, lo tenemos que descargar de nuestro localhost/signalr/hubs y luego actualizar la url de conexión del hub para poder probar nuestra app en local (más adelante, si subimos la aplicación al cloud hay que cambiar esta url):

signalR.hub = $.hubConnection("http://localhost:11562/signalr", { useDefaultPath: false });

Y con estos pequeños cambios ya tenemos la aplicación actualizada. Tenéis el código fuente en CodePlex.

Acerca de estos anuncios

Kinect For Windows v2 ahora trae caras

facerecog

El nuevo SDK de Kinect trae unas cuantas cosas muy interesantes, como un editor de gestos (un gran ejemplo de para qué sirve el machine learning) y vuelve el reconocimiento de caras, una por cada usuario :).

No os esperéis que el SDK os reconozca a vosotros y os distinga de los demás, eso, por lo menos por ahora, lo tendréis que desarrollar (o adaptar) vosotros, o comprar alguna de esas librerías que funcionan tan bien. Trae 94 puntos de identificación para hasta 5 usuarios simultáneos. Lo que tendréis, en la versión simple, es la posición de ojos, nariz y boca del usuario.
Sigue leyendo

Tareas de fondo en aplicaciones universales

Hace unos días @johnnyjosep me preguntó cómo podía hacer en una aplicación universal para descargar nuevo contenido cada cierto tiempo sin tener la aplicación abierta.

Sí, os debo la serie de artículos sobre el caché de HTTP, aunque si os fijáis bien en este hay un pequeño ejemplo de uso de la cabecera If-Modified-Since.

La forma más eficiente de notificar a la aplicación que algo remoto ha cambiado, es utilizar un sistema de notificaciones push, estilo Azure Notification Hubs, pero como esa opción tiene un coste, también tenemos otra posibilidad más económica (para nosotros): crear una Background Task con un temporizador, que compruebe desde el cliente si el archivo ha cambiado.

Sigue leyendo

Caché HTTP de cliente en C# (1 de 4): aplicaciones de escritorio

Hoy en día es muy habitual utilizar contenido web en nuestras aplicaciones y eso penaliza el rendimiento. Para mejorarlo vamos a tener que almacenar en caché dicho contenido. Hacerlo bien no es difícil, pero es necesario conocer cómo funcionan los mecanismos de caché en la web y buscar dentro de la documentación de .Net cómo podemos aprovechar estos.

Upload / Download
Upload / Download por johntrainor, en Flickr

Como no soy el primero en tener la necesidad, existen algunas entradas en StackOverflow sobre el tema. Parece que la solución propuesta funciona bien, pero todas los que he visto se olvidan de algunos puntos importantes, como por ejemplo pedir al servidor si hay una versión actualizada del archivo, añadir técnicas de scavenging para que el contenido descargado caduque, etc. Además se olvidan de que el sistema operativo ya sabe cachear y es un poco raro que tengamos que volver a programar el caché que tan bien hacen los navegadores.

Te recomiendo leer el artículo hasta el final, pero si tienes mucha prisa puedes descargar el código de ejemplo en GitHub.

Sigue leyendo

Indice secuencial con Table Storage en Azure

Azure Table Storage es un sistema NoSQL de almacenamiento de tipo clave/valor. Es un sistema pensado para grandes volúmenes de datos distribuidos en alta disponibilidad y algunas cosas que son triviales hoy en día en un motor SQL estándar, en un NoSQL es muy posible que ni siquiera estén contempladas. Esto nos obliga a pensar en otras técnicas o incluso otras formas de almacenar los datos y sus relaciones.
Numbers

Hace unos días necesité un contador secuencial para almacenar en tablas del Table Storage. Ya se que muchos me diréis que no es lo más adecuado para el Storage, pero la secuencia es para mostrar por pantalla y resulta que los humanos llevamos muy mal el retener números de más de seis cifras.
Sigue leyendo

Roslyn en el Gusenet

El pasado sábado 26 de abril estuve en Torrevieja en el mayor evento de comunidad que se hace en España: Gusenet, con un nivel y número enorme de ponentes y no ponentes.
Tengo que agradecer a Pedro por convencerme la invitación a participar y a él, a Eladio y a Oscar por el currazo que se han pegado organizando y acompañando a tanta gente de un lado a otro.
Había un montón de charlas y todos los que ya han escrito sobre el Gusenet han comentado las que más les han gustado. El resumen es que todas eran muy buenas así que yo os voy a contar las que me perdí y me gustaría haber visto: llegué tarde a la charla de Luis Ruiz Pavón que al final fue sobre Clean Code y también a la de Isa y Toni sobre optimización de JavaScript, aunque vi algún teaser-tocino antes, espero poder ver esa charla algún día.

Isa, Toni y algunos más :) (Foto de @g_perales)


Sigue leyendo

Editar y continuar cuando modificamos el ViewBag en MVC

Hace años que podemos editar y continuar en Visual Studio cuando desarrollamos en ASP.Net con el IISExpress y cada día mejoran esta funcionalidad. En Visual Studio 2013 nos simplificaron la tarea habilitando la opción por defecto:
Edit and continue en Web
Aunque nada es perfecto y hay algunas ocasiones en las que editar y continuar no nos va a funcionar: si es async, si hay un lambda, etc. Uno de esos casos lo encontraremos al modificar el objeto ViewBag, pues es un objeto marcado como dynamic y por ahora no se puede modificar y continuar con este tipo de objetos mientras estamos en ejecución:
Edit and continue with viewbag
En este caso, aunque no nos servirá para todos los escenarios, podemos cambiar el objeto desde la Immediate Window e incluso añadir propiedades si es necesario:
Immediate Window dynamic properties

Deshabilitar el compilador Roslyn temporalmente

El nuevo compilador de .Net todavía está en CTP y no tiene licencia para desplegar aplicaciones en producción. Si instalas Roslyn en la máquina que utilizas para desarrollar cada día, vas a tener que desinstalarlo antes de compilar código para producción, pues sustituye completamente al compilador de .Net, incluso el de línea de comando.

La instalación y desinstalación de Roslyn es bastante rápida, pero tenemos otra forma de deshabilitar el compilador que nos ahorrará algo de tiempo. Será tan fácil como definir el valor true en la variable DisableRoslyn. Podemos indicar este valor de dos formas: como parámetro de msbuild o como variable de entorno.

Desde Visual Studio podemos definir una propiedad a nivel de proyecto que pasará a msbuild y deshabilitará Roslyn, así:

<PropertyGroup>
  <DisableRoslyn>true</DisableRoslyn>
</PropertyGroup>

Pero tendremos que hacerlo a nivel de cada proyecto y si queremos volver a habilitar Roslyn tendremos que volver a editar todos los proyectos. En realidad es mucho más fácil establecer una variable de entorno llamada DisableRoslyn y asignar un true o un false según nos convenga en cada momento:

Disable Roslyn

Yo me he hecho un .bat y lo he añadido a mi barra de tareas como un botón de activar/desactivar:

@echo off
IF "%DisableRoslyn%"=="true" (
setx DisableRoslyn false
echo Roslyn compilation enabled
) ELSE (
setx DisableRoslyn true
echo Roslyn compilation disabled
)
pause 0

Ahora ya no tenéis excusa para probar Roslyn.

Aunque yo me enteré de esto directamente, ahora es más fácil saber estas cosas: basta mirar el código fuente de http://roslyn.codeplex.com, en este caso veréis la explicación en el archivo CompilerPachage.cs:
CompilerPackage.cs
 

Build 2014

Los nuevos SDKs: Roslyn, SIMD, Windows Phone 8.1, .Net Native…

Build 2014El evento Build de estos días está trayendo una cantidad de novedades en desarrollo que no tenemos tiempo de digerir, hay incluso algunas sorpresas que tenían muy escondidas en el roadmap como la apertura open source del compilador Roslyn.
Sigue leyendo

Ver y depurar el código original del .Net Framework ahora es más fácil que nunca

Acaban de anunciar la nueva fuente de referencias del código del .Net Framework que nos permitirá dos cosas principalmente: ver fácilmente cómo están hechas las clases del .Net Framework y además depurar paso a paso el código original.

Aunque Microsoft ya distribuía los archivos .pdb y código fuente desde .Net 4.0, con la nueva filosofía de entregas se hacía bastante difícil de mantener. Ahora gracias al proyecto Roslyn generan todos esos archivos.

Para empezar, tenemos todo el código fuente disponible en la web http://referencesource-beta.microsoft.com, en un formato completamente interactivo, podemos buscar, encontrar todas las referencias a una clase, navegar entre referencias y ver el código fuente, el manejo es realmente espectacular como podréis ver en el vídeo de Channel 9: How to use the net source browser.

vs_httpwebrequest

Además de todo esto podemos depurar directamente desde Visual Studio configurando el entorno, sin necesidad de descargar nada, el propio VS.Net se encargará de descargar los .pdb y código fuente que le haga falta.

vs_debuglist

Tened en cuenta que todavía es una beta y puede dar problemas. Si pasa algo raro siempre podéis borrar el caché de símbolos:
vs_delete_cache

También me ha pasado que el archivo .cs de la clase estaba vacío, supongo que algún error de descarga. Al borrar el archivo de disco Visual Studio ha vuelto a descargarlo y he podido utilizarlo correctamente. Para localizarlo basta pulsar con botón derecho sobre la pestaña con el nombre del archivo.

¡A depurar!