Materiales del evento: «Tres Tecnologías Microsoft que no se dan durante la carrera»

El pasado viernes a la hora de comer pasé una hora con los chicos de UAM.net en la Escuela Politécnica Superior de la UAM hablando sobre las tres tecnologías Microsoft que, a mi entender, no se impartían en la carrera cuando yo era estudiante.

IMG_8990

Concretamente, en esta charla estuvimos hablando de:

  • Windows Phone, Windows 8 y el resto de las plataformas móviles
  • ASP.net MVC, Web API, verbos HTTP, APIs REST y otros lenguajes como Ruby o PHP
  • Características disponibles en Azure y qué otros proveedores nos podemos encontrar en el mercado

El vídeo

Como novedad, esta vez hemos grabado la charla y está disponible en Youtube:

Las slides

Las slides, como siempre, están disponibles a continuación:

El código

El código de los ejemplos utilizados, y que en el caso de la web es el que se despliega directamente a Azure Websites está disponible también en un repositorio de Github: 201501-demo-uam

Finalmente, los enlaces recomendados que estaban al final de la presentación los dejo aquí:

Preparar la charla ha sido un reto muy interesante, ya que era la primera vez que volvía a dar una charla en la escuela después de haber terminado la carrera, así que espero que a los asistentes (y los que la hayáis visto en diferido) os haya gustado.

Desde aquí mi agradecimiento a la organización por la posibilidad de volver a la EPS y la enhorabuena por conseguir mantener a la gente interesada en las tecnologías .NET. Nos vemos en el próximo evento!

Materiales del evento: Sevilla Mobility Day Strikes Back

El pasado sábado 26 de octubre con motivo de la segunda edición del Sevilla Mobility Day tuve la ocasión de dar una pequeña charla sobre las diferentes opciones de comunicación que tienen nuestras apps con el exterior:

IMG_5474

Slides

Las slides están disponibles a continuación en slideshare:

Demos

Por otra parte, las demos están disponibles en el siguiente enlace de Github:

https://github.com/rlbisbe/demos_charla_conectividad_wp

Enlaces

Y finalmente, la lista de enlaces que usé (entre otros) para preparar la charla:

Gracias los chicos de @cartujadotnet por la invitación, a CampusMVP por el patrocinio, al servicio técnico de Pebble por intentar echarme una mano, a mi querida Patrica Vasco (Patu) por ayudarnos con las fotos y en general a todos los que hicieron el evento posible.

La Windows Phone Week vuelve por navidad, más días, más charlas, y online!

De los creadores de la Windows Phone Week desarrollada el pasado octubre llegan las Christmas Windows Phone Sessions. Debido al éxito de la sesión organizada en Madrid On Rails, queríamos repetirla para poner al día nuestros conocimientos de la plataforma de cara a navidades, y queríamos poder llegar a más gente, así que esta vez las sesiones serán online en la plataforma de eventos de Microsoft.

Christmas-Windows-Phone-Sessions-Poster

Continuar leyendo «La Windows Phone Week vuelve por navidad, más días, más charlas, y online!»

Viernes 22: Desarrollo para Windows Phone y Windows 8 en la Universidad de Salamanca

El próximo viernes 22 a partir de las 5 PM estaré en la Facultad de Ciencias de la Universidad de Salamanca con los chicos de @DotNetUSAL, hablando de desarrollo para aplicaciones Windows 8 y Windows Phone.

BZXb95zCcAI1UHD

Durante un buen tramo de la tarde estaremos viendo qué ventajas nos da la plataforma Windows Phone y Windows 8, y cómo aprovechar esas ventajas para que nuestras aplicaciones destaquen por encima del resto.

Las herramientas de desarrollo están disponibles en los siguientes enlaces:

Para hacer la charla más dinámica, usaremos VS Anywhere para que todos los asistentes que lo deseen puedan contribuir a la misma, y seguir las demos desde su ordenador. Si quieres aprender de una manera diferente, crea tu cuenta en http://vsanywhere.com y descarga el plugin:

VS Anywhere requiere Visual Studio Professional o superior, que puedes conseguir gratuitamente a través del programa Dreamspark. Si no lo tienes pregunta a los chicos de @DotNetUSAL cómo conseguirlo.

Por otra parte, tienes versiones de prueba de 90 días de cualquiera de las versiones de Visual Studio 2013 en este enlace: http://www.visualstudio.com/downloads/download-visual-studio-vs

Nos vemos en Salamanca!

Azure Mobile Services bajo el capó: Insertando elementos

Azure Mobile Services nos proporciona servicios de backend en la nube para Windows Phone, Windows 8, iOS, Android y plataformas basadas en web. Permite además agregar seguridad, autenticación y notificaciones de manera sencilla y rápida. Pero, cómo funciona realmente?

Para averiguarlo, podemos recurrir a la documentación que tenemos en MSDN, aunque también podemos ver directamente el código fuente.

La API que se nos ofrece es open source, con lo cual podemos no solamente ver el código fuente sino además poder realizar contribuciones al mismo.

En este artículo quiero hacer un breve recorrido por la API, para una operación muy concreta, insertar elementos. En otros artículos de esta serie veremos cómo hacer consultas, o qué pasa del lado de servidor.

Para este artículo usaremos los siguientes elementos:

Los ejemplos los veremos con el SDK de Windows Phone 8, pero podemos ver que existe un código similar para el resto de plataformas compatibles.

De un vistazo

La API de Azure Mobile Services está compuesto por objetos que nos ayudan a:

  • Convertir nuestros objetos a formato JSON para su envío y hacer la operación contraria a la recepción (Serialización)
  • Realizar solicitudes al servicio que hemos creado en Azure mediante comandos HTTP usando una arquitectura REST
  • Gestionar autentificación y seguridad para las mismas.

El código fuente del SDK para Windows Phone 8 contiene varios elementos

  • Tests que aseguran su integridad (a nivel de core como a nivel de cada cliente en particular).
  • Código manejado (es decir, código en .NET tradicional).
  • Código nativo, dentro de los espacios de nombres de WinMD (Recordemos que Windows Phone 8 tiene soporte para las API nativas de WinRT).

Para poder trabajar con Mobile Services necesitamos en primer lugar una referencia a la tabla:

private MobileServiceCollection<TodoItem, TodoItem> items;
private IMobileServiceTable<TodoItem> todoTable = 
    App.MobileService.GetTable<TodoItem>();

Este método está situado en la clase MobileServiceClient que contiene otros que veremos a lo largo del artículo:

Este método está situado en la siguiente ruta:

src/
  Microsoft.Azure.Zumo.WindowsPhone8.Managed/
    Core/
      MobileServiceClient.Managed.cs

El código es el siguiente:

public IMobileServiceTable GetTable()
{
    SerializableType type = SerializableType.Get(typeof(T));
    return new MobileServiceTable(type.TableName, this);
}

En primer lugar obtiene un tipo serializable específico, que es el que se usará para poder transformar el objeto en una tabla en el servidor. Luego generará una tabla de tipo MobileServiceTable con el nombre creado a partir de este tipo. Hasta aquí solamente hemos hecho trabajo en local, es decir, no ha habido conexión con el servicio.

Veamos qué pasa al insertar un elemento en la tabla:

await todoTable.InsertAsync(todoItem);

El código para esta función se encuentra en la siguiente ruta:

src/
  Microsoft.Azure.Zumo.WindowsPhone8.Managed/
    Core/
      MobileServiceTable.Generic.cs

En este código lo que vemos es lo siguiente:,

  • No podemos insertar elementos nulos,
  • Se obtiene un JObject (un objeto serializado en formato JSON) a partir de MobileServiceTableSerializer
  • Se envía una petición ya con el objeto serializado
  • Se recibe el resultado de la petición (en formato JSON)
  • Finalmente, se convierte el objeto recibido en el enviado, por si los datos hubiesen cambiado.
public async Task InsertAsync(T instance)
        {
            if (instance == null)
            {
                throw new ArgumentNullException("instance");
            }

            // Serialize the instance
            JObject value = MobileServiceTableSerializer.Serialize(instance).AsObject();

            // Send the request
            JToken response = await this.InsertAsync(value);

            // Deserialize the response back into the instance in case any
            // server scripts changed values of the instance.
            MobileServiceTableSerializer.Deserialize(response, instance);
        }

El envío de la petición se hace en dos fases, una fase manejada, y otra fase nativa, la fase manejada se hace en un fichero situado en:

src/
  Microsoft.Azure.Zumo.WindowsPhone8.Managed/
    Core/
      MobileServiceClient.Managed.cs

En el que se realiza la siguiente operación:

public Task<JToken> InsertAsync(JObject instance)
{
    return this.SendInsertAsync(instance);
}

Que nos lleva a este otro fichero (situado en la fase manejada):

internal async Task SendInsertAsync(JObject instance)
{
    if (instance == null)
    {
        throw new ArgumentNullException("instance");
    }

    // Make sure the instance doesn't have its ID set for an insertion
    if (instance.Get(IdPropertyName) != null)
    {
        throw new ArgumentException(
            string.Format(
                CultureInfo.InvariantCulture,
                Resources.CannotInsertWithExistingIdMessage,
                IdPropertyName),
            "instance");
    }

    string url = GetUriFragment(this.TableName);
    JToken response = await this.MobileServiceClient.RequestAsync("POST", url, instance);
    JToken patched = Patch(instance, response);
    return patched;
}

Aquí las operaciones realizadas son:

  • Comprobar que el elemento que estamos insertando no tenga ya un Id, al fin y al cabo es nuevo.
  • Obtener la url de la tabla a la que vamos a insertar el elemento.
  • Enviar una petición HTTP POST al servicio web, con la url que hemos especificado y los datos, y recuperar el resultado.
  • Actualizar el objeto enviado con la respuesta.
  • Devolver el objeto enviado.

Finalmente llegamos a RequestAsync, donde se realiza la petición, situada en este fichero:

src/
  Microsoft.Azure.Zumo.WindowsPhone8.Managed/
    Core/
      MobileServiceClient.cs

Este método genera una petición del tipo deseado, especifica que solamente queremos parámetros en formato JSON, especifica la autenticación a partir de las claves que hemos especificado en la configuración inicial, y finalmente envía la petición:


internal async Task<JToken> RequestAsync(string method, string uriFragment, JToken content)
        {
            Debug.Assert(!string.IsNullOrEmpty(method), "method cannot be null or empty!");
            Debug.Assert(!string.IsNullOrEmpty(uriFragment), "uriFragment cannot be null or empty!");

            // Create the web request
            IServiceFilterRequest request = new ServiceFilterRequest();
            request.Uri = new Uri(this.ApplicationUri, uriFragment);
            request.Method = method.ToUpper();
            request.Accept = RequestJsonContentType;

            // Set Mobile Services authentication, application, and telemetry
            // headers
            request.Headers[RequestInstallationIdHeader] = applicationInstallationId;
            if (!string.IsNullOrEmpty(this.ApplicationKey))
            {
                request.Headers[RequestApplicationKeyHeader] = this.ApplicationKey;
            }
            if (!string.IsNullOrEmpty(this.currentUserAuthenticationToken))
            {
                request.Headers[RequestAuthenticationHeader] = this.currentUserAuthenticationToken;
            }

            // Add any request as JSON
            if (content != null)
            {
                request.ContentType = RequestJsonContentType;
                request.Content = content.ToString();
            }

            // Send the request and get the response back as JSON
            IServiceFilterResponse response = await ServiceFilter.ApplyAsync(request, this.filter);
            JToken body = GetResponseJsonAsync(response);

            // Throw errors for any failing responses
            if (response.ResponseStatus != ServiceFilterResponseStatus.Success || response.StatusCode >= 400)
            {
                ThrowInvalidResponse(request, response, body);
            }

            return body;
        }

Es todo un conjunto de acciones que se llevan a cabo solamente para insertar un elemento. En el próximo artículo veremos cómo se ejecutan las consultas usando la API, y cómo funcionan métodos como este:

List<TodoItem> items = await todoTable
   .Where(todoItem => todoItem.Complete == false)
   .ToListAsync();

Happy Hacking!

Desarrollando para Windows Phone 8, muchos errores y algún acierto

Este fin de semana he tenido la ocasión de desarrollar una pequeña aplicación de tareas para Windows Phone 8 para el concurso de desarrollo IAppYou. Como todo desarrollo, no ha estado libre de errores, así como de algún acierto que me gustaría repetir en el futuro, así que más que hablar de características o de cómo pasar información entre dos páginas, me pareció interesante compartir los aciertos, pero sobre todo, los errores.

Continuar leyendo «Desarrollando para Windows Phone 8, muchos errores y algún acierto»

Configurando el APN de internet con Simyo en Windows Phone 7.5

Hace unos días tuve la suerte de conseguir un Nokia Lumia 800 desarrollando apps para Windows Phone, pero como mi tarifa actual de datos no era compatible y no quería comprometer la otra línea con una potabilidad o un cambio de contrato, decidí comprar una tarjeta con Simyo.

Al llegar la tarjeta e introducirla en el teléfono, no detectó los ajustes de conexión, con lo cual, tras un buen rato de búsqueda en la red, encontré la información que necesitaba.

Pasos para configurar Internet

  1. Introducir la SIM, encender el móvil, y activar la tarjeta (si has hecho alguna llamada y te han cogido el teléfono (es decir, se ha producido gasto), está activa).
  2. Navega hasta el menú de Configuración > Datos Móviles
  3. En él, has de asegurarte que están activadas las siguientes opciones:
    • Conexión de datos: Activada
    • Opciones de roaming de datos: Activar roaming
    • Conexión 3G: Activada
    • Selección de red: automático
  4. Pulsa en agregar apn (o editar apn si ya lo has intentado anteriormente), e introduce el siguiente dato:
    • APN: gprs-service.com

Es importante destacar que hemos activado la opción de activar roaming, con lo cual debemos recordar DESACTIVARLA cuando viajemos al extranjero ya que podemos incurrir en costes adicionales (y no precisamente pocos).

Actualización:

Al finalizar los pasos verás el icono de un triángulo en el área de notificación. Este icono indica que estás en Roaming (algo normal, ya que lo hemos habilitado en el paso 3).

Esto no indica que el operador te vaya a cobrar como si estuvieras en dicha zona, y lo puedes comprobar en tu zona de cliente de Simyo. Puedes ver el significado de los iconos del área de notificación aquí: ¿Qué significan los iconos del teléfono?

Crónica de la Keynote de Steve Ballmer en el CES

El CES ha comenzado con la keynote inaugural presentada por Steve Ballmer, CEO de Microsoft. (y yo he estado ahí!):

Durante poco más de una hora se han presentado ultrabooks con Windows 7, Características de la interfaz Metro con Windows 8, características y terminales con Windows Phone, televisión interactiva con XBOX y Kinect han sido los protagonistas de la jornada.

He realizado el seguimiento para Trecebits, y puedes leer la crónica completa en este enlace: Microsoft retransmite por Facebook las novedades que presenta en el CES