Google Earth logo

API Google Earth (I)

Esta va a ser la primera de una serie de entregas que nos servirán para adentrarnos en Google Earth API, la interfaz que nos proporciona Google  para juguetear con ese globo 3D que ya todos conocemos.

En este post, en el que se incluye el código utilizado, veremos cómo un sencillo formulario, algo de jQuery básico y menos de 100 líneas de código javascript bastan para tener en nuestra web el mapa 3D con un control total sobre las capas de información que Google nos proporciona y un buscador que nos permita redireccionar a cualquier punto de la Tierra.

Hello World

Lo primero que haremos será mostrar el mapa, para lo cual nos creamos un archivo HTML con un div donde se pintará el globo terrestre e incluiremos referencias al archivo donde definiremos toda la lógica de la aplicación, así como a las API de Google Earth y jQuery.


	Google Earth (Ejemplo 1)
<script type="text/javascript" src="https://www.google.com/jsapi"></script><script type="text/javascript" src="js/jquery-1.8.1.min.js"></script>
<script type="text/javascript" src="js/inicializacionExplicada.js"></script>

Ahora, creamos ese archivo (inicializacion.js), añadiendo el siguiente trozo de código.

google.load('earth', '1.x', { 'language': 'es' });
google.load('maps', '3', { other_params: 'sensor=false' });
google.setOnLoadCallback( function inicializarPlugin() {
google.earth.createInstance('mapa3d', inicializar, terminacion);
});

Así, cargamos los plugins de Google Earth y Google Maps (necesario para implementar el buscador) y la función setOnLoadCallback, que evita que se cree la instancia del plugin hasta que todo el DOM esté construido. De esta manera, la función createInstance recibe:

  • Identificador del div que va a contener el mapa terrestre.
  • Función a llamar en caso de que la instancia se cree correctamente.
  • Función para el caso de que haya problemas a la hora de crear la instancia.

Por lo tanto, con sólo poner visible el mapa en inicializarEventos con la sentencia necesaria “ge.getWindow().setVisibility(true)”, podríamos ver el mapa correctamente.

Parámetros configurables

Como el ejemplo incluye opciones de parametrización, en inicializarEventos también vamos a incluir los eventos que permitan activar/desactivar estos elementos configurables.

Si nos centramos en los diferentes elementos configurables (capas, opciones, etc.) que trae Google Earth, nos encontramos con capas tales como carreteras, edificios3D, terreno o datos informativos (aunque se llame borders…), las cuales pueden ser activadas/desactivadas a través de la función enableLayerById.

ge.getLayerRoot().enableLayerById(ge.LAYER_BORDERS, true);
ge.getLayerRoot().enableLayerById(ge.LAYER_BUILDINGS, true);
ge.getLayerRoot().enableLayerById(ge.LAYER_ROADS, true);
ge.getLayerRoot().enableLayerById(ge.LAYER_TERRAIN, true);

Por otra parte, hay otros 2 grupos de parámetros configurables que Google incorpora; el primero lo forman el Sol y la atmósfera, que al no tener influencia informativa directa sobre el mapa terrestre, no son consideradas capas en sí mismas, y el segundo son elementos informativos superpuestos como la leyenda del mapa, informaciones geográficas, etc.

ge.getSun().setVisibility(true);
ge.getOptions().setScaleLegendVisibility(true);
ge.getOptions().setStatusBarVisibility(true);
ge.getOptions().setOverviewMapVisibility(false);
ge.getOptions().setGridVisibility(true);
ge.getOptions().setAtmosphereVisibility(true);

BUSCADOR

La última sentencia de la función hace la redirección a la ciudad de Sevilla, lo cual se consigue mediante una llamada a un Web Service de Google pasándole la cadena de texto que hemos incluido en el buscador (para un caso genérico), devolviéndonos en el callback en formato JSON la latitud y longitud correspondientes a Sevilla, siempre que no haya habido problemas (status OK).

function buscarLocalizacion(direccion) {
	var geocoder = new google.maps.Geocoder();
	geocoder.geocode({ 'address': direccion }, function (destino, status) {
		if (status == google.maps.GeocoderStatus.OK) {
			modificarVista(destino[0].geometry.location.lat(), destino[0].geometry.location.lng());
		} else {
			alert("Wrong direction");
		}
	});
}

Una vez tenemos las coordenadas, la forma de indicarle a la API que deseamos realizar la redirección es creando un objeto LookAt (range indica el zoom que deseamos sobre Sevilla) y pasándoselo al mapa.

function modificarVista(latitud, longitud){
	var lookAt = globo.createLookAt('');
	lookAt.setLatitude(latitud);
	lookAt.setLongitude(longitud);
	lookAt.setRange(6000);
	globo.getView().setAbstractView(lookAt);
}

NOTA

Hay que tener en cuenta que, por motivos de brevedad, en el post se han obviado cosas como la creación del formulario y los eventos jQuery por considerarse sencillos de comprender.

Aquí puedes descargarte el código creado para realizar este ejemplo, donde puede verse el código completo para comprenderlo mejor.

Fuentes

https://developers.google.com/maps/documentation/javascript/geocoding

https://developers.google.com/loader/

https://developers.google.com/earth/

Autor: Antonio Manuel Acevedo

Windows Azure Logo

Windows Azure Mobile Services

Windows Azure Mobile Services hace realmente fácil conectarse a un backend escalable en la nube desde nuestras aplicaciones clientes y móviles. Nos permite guardar datos estructurados en la nube que podemos usar en dispositivos, integrarlos con la autenticación, y enviar actualizaciones a clientes a través de notificaciones push.

Estas características las podemos tener disponibles en sólo unos minutos para nuestras aplicaciones de Windows 8, ofreciendo una forma superproductiva de implementar vuestras ideas de apps. También soportamos escenarios para Windows Phone, iOS y Android que veremos en otro post próximamente.

Leed este tutorial para ver cómo (en menos de 5 minutos) podemos crear una aplicación típica de "Todo List" usando Windows Azure Mobile Services. O ved este video en el que enseño paso a paso cómo hacerlo.

Empezando

Si aún no tenéis una cuenta de Windows Azure, podéis obtener una Free trial. Una vez que os logáis, clicad en la sección "preview features" debajo  del tab "account" de la web www.windowsazure.com y activad que vuestra cuenta soporte "Mobile Services". Aquí podéis ver seguir las instrucciones para hacerlo.

Una vez que tengáis habilitado la sección de mobile services, logaos en el portal de Windows Azure, y clicad el botón "New" y elegid el icono "Mobile Services" para crear vuestro primer backend mobile. Una vez que lo tengáis creado, veréis una página de inicio rápido con instrucciones sobre cómo conectar vuestro servicio móvil a una aplicación Windows 8 en la que ya hayáis trabajado, o podréis incluso crear una aplicación nueva con la que empezarWindows Azure Mobile Services Portal

Leed este tutorial de iniciación para ver cómo podemos crear (en menos de 5 minutos) una aplicación de "To-do List" para Windows 8 que guarda los datos en Windows Azure.

Guardando datos en la nube

Guardar datos en la nube con Windows Azure Mobile Services es realmente sencillo. Cuando creamos un servicio móvil de Windows Azure, lo asociamos automáticamente a una base de datos SQL dentro de Windows Azure. El backend nos prepara todo lo necesario para poder guardar y obtener datos desde nuestras aplicaciones de manera segura (usando end-points REST que intercambian información en JSON) - sin tener que escribir ni desplegar ningún código en el servidor. También nos ofrece una interfaz de administración desde el que podemos crear tablas, ver los datos, establecer índices y controlar los permisos de acceso.

Diagrama Windows Azure Mobile Services

Esto hace que conectar nuestras aplicaciones con la nube sea realmente sencillo, y permite que los desarrolladores que no tengan un servidor con todo esto sean muy productivos desde el principio. Se pueden centrar en crear la experiencia de la aplicación, y dejar que Windows Azure Mobile Services ofrezca los servicios en la nube que necesiten.

Aquí tenéis un ejemplo de una aplicación cliente de Windows C#/XAML que obtiene datos de un Windows Azure Mobile Service. Los desarrolladores de aplicaciones C# pueden escribir consultas usando LINQ y objetos POCO, que se traducen a peticiones HTTP REST contra un Windows Azure Mobile Service. Los desarrolladores no tienen que escribir ni desplegar ningún código de servidor para poder ejecutar el código ni  obtener de manera asíncrona la información

Código de acceso a Windows Azure Mobile Services

Como Mobile Services es parte de Windows Azure, podemos ampliar más tarde la solución y añadir funcionalidad en el servidor para conseguir una lógica tan compleja como queramos. Esto no permite una flexibilidad máxima, y nos permite adaptar nuestras soluciones a cualquier necesidad que tengamos.

Autenticación de usuarios y notificaciones push.

Windows Azure Mobile Services hace que integrar la autenticación/autorización de usuarios y notificaciones push sea realmente sencillo. Podemos usar estas capacidades para permitir autenticar y tener un control muy fino del acceso a los datos que hemos guardado en la nube, así como lanzar notificaciones push a usuarios/dispositivos cuando cambian los datos. Windows Azure Mobile Services soporta el concepto de "scripts de servidor" (pequeños trozos de código script en el servidor que se ejecutan en respuesta a ciertas acciones) que hacen que estos escenarios sean super sencillos de habilitar.

Aquí tenéis unos tutoriales sobre autenticación/autorización/push que podemos hacer con Windows Azure Mobile Services en aplicaciones de Windows 8:

Administrando y monitorizando  nuestro Mobile Service

Como cualquier otro servicio en Windows Azure, podemos monitorizar el uso y las métricas del bakend de  nuestro servicio móvil usando el "Panel"  (Dashboard) desde el portal de Windows Azure:

Portal de Administración de Windows Azure Mobile Services

Este panel nos ofrece una vista de monitorización de las llamadas a la API, ancho de banda, y ciclos de CPU de nuestro servicio mobil. También podemos ver el tab de "Logs" para revisar los errores que se hayan podido producir. Esto hace muy sencillo monitorizar qué está haciendo nuestra aplicación.

Escala a medida que tu negocio crece

Windows Azure Mobile Services nos permite crear has 10 Mobile Services de manera gratuita, un entorno compartido  (en el que nuestro backend será una de las aplicaciones que se ejecutarán en una serie de servidores compartidos). Esto ofrece una forma fácil de comenzar proyectos sin coste alguno más allá que el de acceso a la base de datos (nota: cada cuenta trial de Windows Azure incluye 1GB de base de datos SQL que podemos usar con cualquier número de aplicaciones o servicio móvil)

Si tu aplicación se vuelve popular, podemos hacer clic en el tab "Scale" de nuestro servicio móvil y pasar de un modo "compartido" a uno "dedicado". Con esto podemos aislar las aplicaciones, de manera que seremos el único cliente en una máquina virtual. Esto nos permite escalar la cantidad de recursos que nuestra App usa - permitiéndonos aumentar o disminuir nuestra capacidad a medida que el trafico crece:

Sección de Scale de Windows Azure

Con Windows Azure pagamos por capacidad de computación por hora - esto nos permite aumentar o disminuir los recursos disponibles para que se ajusten a lo que necesitamos. Permitiendo así un modelo super flexible e ideal para escenarios de aplicaciones móviles nuevas, así como para startups que están comenzando.

Resumen

Sólo hemos visto por encima todo lo que ofrece Windows Azure Mobile Services - hay un montón de características más.

Con Windows Azure Mobile Services podremos crear experiencias para aplicaciones móviles más rápido que nunca, y ofrecer una experiencia de usuario mucho mejores - conectando nuestras apps a la nube.

Visitad el centro de desarrollo de Windows Azure Mobile Services para aprender más, y crea tu primera aplicación de Windows 8 conectada a Azure hoy. Leed este tutorial sobre cómo podemos crear (en menos de cinco minutos) una aplicación "Todo list" conectada a la nube con Windows Azure Mobile Services.

Espero que sirva.

Scott

Artículo original.

Traducido por: Juan María Laó Ramos.

SkyDrive

Usar la API de SkyDrive para Javascript en una página local

Hola a todos, hoy voy a hablaros sobre las API Live que tiene disponible Microsoft y que podemos usar desde nuestras aplicaciones c#, JavaScript, Objective-C y Java, pero además, también está disponible una versión Rest para todo lo que no entre en estos lenguajes.

Vamos a centrarnos en la API para SkyDrive y sobre cómo podemos configurarla para usarla en una web que estemos desarrollando en una máquina local.

El único requisito que necesitamos es definirnos una aplicación en el "Live Connect Developer Center". Es necesario crearnos una nueva App en la sección "My Apps" para obtener un client Id que vamos a necesitar para poder usar la API.

Panel Live Connect

Si accedemos a la sección "SDK Interactivo" podemos irnos al primer ejemplo de la API de Sky Drive del  SDK Interactivo  y ver el código. El código que vamos a ver es código JavaScript, ya que no hay otra forma de verlo de manera interactiva en la web, pero en la documentación sí podemos ver cómo usarla desde C#, Objective-C, Rest y Java.


WL.init({ client_id: clientId, redirect_uri: redirectUri });

WL.login({ "scope": "wl.skydrive" }).then(
    function(response) {
        openFromSkyDrive();
    },
    function(response) {
        log("Failed to authenticate.");
    }
);

function openFromSkyDrive() {
    WL.fileDialog({
        mode: 'open',
        select: 'single'
    }).then(
        function(response) {
            log("The following file is being downloaded:");
            log("");

            var files = response.data.files;
            for (var i = 0; i < files.length; i++) {
                var file = files[i];
                log(file.name);
                WL.download({ "path": file.id });
            }
        },
        function(errorResponse) {
            log("WL.fileDialog errorResponse = " + JSON.stringify(errorResponse));
        }
    );
}

function log(message) {
    var child = document.createTextNode(message);
    var parent = document.getElementById('JsOutputDiv') || document.body;
    parent.appendChild(child);
    parent.appendChild(document.createElement("br"));
}

Si ejecutamos este código se nos abrirá un selector de archivos que lo que nos va a permitir es seleccionar un archivo que tengamos en nuestro directorio de SkyDrive, logarnos si no lo estamos ya, y descargarlo. Este es sólo uno de los ejemplos que podemos probar, hay un montón en los que podemos ver cómo usarla para acceder al contenido, cómo recorrer los directorios, etc.

Sin embargo, y es el problema que quiero resolver y el motivo de este post, si usamos la librería JavaScript en una página web que estamos desarrollando, necesitamos hacer un "truco" para poder verlo funcionar en local.

Si os fijáis bien, en la primera línea de código:

WL.init({ client_id: clientId, redirect_uri: redirectUri });

Vemos, que primero tenemos que inicializar "algo" para poder usarla. Para configurarlo adecuadamente necesitaremos el "client id" que comentaba al principio del post y una "redirect_uri". Pues bien, esa uri es un dominio al que se van a redireccionar las peticiones de la API, que necesitamos configurar en el panel de Live Connect:

Configuración de la aplicación

Esa url debe ser de un dominio público y accesible por la api. Sin embargo, como estamos en desarrollo, nuestra web no está todavía disponible ni la tenemos desplegada en un servidor.

¿Qué podemos hacer?

La solución es bien sencilla, tan sólo tenemos que modificar nuestro etc\hosts para que el dominio que configuremos en el panel de control de Live Connect sea nuestra propia máquina. De esta manera la API funcionará perfectamente y podremos hacer nuestras pruebas en local antes de publicar nuestra aplicación en un servidor. Por ejemplo podemos definir en nuestro etc/host el dominio:  midominiodeprueba.com 127.0.0.1

Y en la página de configuración de la aplicación pondremos:

Confgurando el Dominio de redirección

A partir de este momento ya podemos usar la API sin tener que estar publicando en un servidor nuestra aplicación y haciendo pruebas en él.

Una vez que tengamos nuestra web lista para desplegar, sólo hay que modificar esos valores para que todo vaya como la seda :).

Juan María Laó Ramos

Windows 8

Mi opinión total y llanamente objetiva

Al principio se decía "¿Dónde está el botón de inicio?, ¿lo han quitado?, ¿pero esto que mierda es?" y muchas más cosas que, después de cuatro meses con Windows 8 como mi sistema operativo base, no puedo clasificar de otra manera como sandeces varias.

Logo Windows 8

El otro día hablábamos varios compañeros delante de una cerveza sobre este tema. Yo no soy persona que se le de bien pensar por sí sola, necesito diálogo, discusión y reflexión. No soy muy ducho en encerrarme en soledad y pensar. Con esto quiero decir que necesito esa interacción para poder crear un camino de pensamiento y encontrar conclusiones en el recorrido.

Y hablando el otro día, llegué a una conclusión que me resultó curiosa. Y es que, el parque informático va a cambiar y mucho. A partir de ahora los portátiles que hemos conocido van a dejar de existir. Todo fabricante que quiera seguir vendiendo, va a tener que pasar por el aro de Windows 8 y van a tener que estar compuestos de dos partes: una pantalla multitáctil y un teclado de quita y pon.

Pese a quien le pese, los tablets de hoy en día son juguetes con los que no se pueden hacer más cosas que leer el correo, mirar Facebook, twitter, jugar a algún juego y poco más. Pero con la nueva oleada de portátiles que está llegando, mucho me temo que Apple, Samsung y los fabricantes de tablets van a tener que reinventarse de nuevo o, claro está, cerrar.

De nuevo, pese a quien le pese, el mercado del pc y portátil tanto personal como profesional es territorio indiscutible de Microsoft. Y ojo, según hemos visto en las presentaciones de Windows 8, Surface y el Build, esto parece que va a seguir siendo así. No hay más que pasarse por los Fnac, Carrefours o MediaMarkt y ver el despliegue de medios y nuevos dispositivos que han preparado todos los fabricantes y contar cuántos portátiles hay en venta que no sean táctiles, y luego hay que contar aquellos a los que no se les puede quitar el teclado.

Sin duda, el que combine teclado y pantalla multitáctil separable, va a vender, el otro no. El razonamiento puede ser simple y bruto pero: ¿Quién va a comprarse un portátil táctil y luego un Tablet si puedo tener los beneficios de ambos? La respuesta a esa pregunta esta clara: Nadie.

Es por eso que me atrevo a decir que se va a producir una importante renovación de todo el parque informático mundial.

En el 2004 ya existían estos dispositivos, pero les faltaba una vuelta de tuerca más al sistema operativo de Redmond y al hardware. Esa vuelta de tuerca se ha dado con Windows 8 y de manera bastante usable. A mi me pasa con mi Samsung Galaxy Tab que intento cerrar una aplicación moviendo el dedo desde la parte de arriba de la pantalla hacia abajo al igual que a otro de los que estábamos en la mesa le pasa lo mismo con su iPad.

Con respecto al botón de inicio, sólo he de decir que ahora lo que hay es una pantalla de inicio (mucho más grande y "organizable" que un simple botón). La usabilidad de esa pantalla de inicio es simplemente genial, porque, ¿cuántas aplicaciones usamos regularmente al día, 4, 5, 6, 10? A mi me caben todas en la pantalla y sólo tengo que hacer un clic, ¡sólo un clic! Si eso no es usable, que alguien me diga cuál es la definición de usable.

Algunos dirán que les gustará más o menos, que se le podrá dar más cariño al diseño, pero en temas de gustos no se puede discutir, ni bajar del burro a nadie.

Con respecto a los pc's de sobremesa ya me explayaré más adelante, ahora me voy a retirar e intentar pensar en soledad ;)

¿Qué opinión tienes tu?

Juan María Laó Ramos.

Radarc

Radarc, el “Tanque” de Visual Studio

Seguro que todos tenéis en algún rincón de vuestra mente la gran escena de Triniti en Matrix: “Tanque, necesito un programa de pilotaje para un helicóptero B-212, ¡Date Prisa!”

¿Os imagináis que algo así fuese posible? Pues para sorpresa de todos, es posible gracias a Radarc y los chicos de Icinetic que lo hacen posible, por ahora en nuestro mundo del bit&byte.

Radarc

RadarC es un generador de código para .NET muy sencillo y realmente útil. Plantándonos unas reglas de diseño arquitecturales sólidas con las que cimentar nuestros proyectos. Y para muestra un botón, vamos a crear una pequeña aplicación en para MVC con RadarC, pero para ello tenemos que prepararnos el sistema.

Sólo tenemos que ir a la web de Radarc y seguir sus instrucciones de instalación, son muy sencillas. Acto seguido nos descargamos la Formula MVC, hay que hacer el proceso de compra pero es totalmente gratuito ;).

¿Qué es una Formula?

Una fórmula es una arquitectura empaquetada y configurada por defecto con todo lo necesario para centrarnos en nuestro negocio y preocuparnos de hacer lo que realmente aporta valor a nuestro proyecto. En el ejemplo que vamos a ha realizar se trata de una aplicación para ASP .NET MVC y la Formula MVC nos va a permitir crearla de forma muy sencilla y ordenada como veremos.

Manos al teclado.

Una vez preparado nuestro entorno, sólo tenemos que abrir Visual Studio 2010 e irnos al menú “Nuevo Proyecto”. Veremos que ha aparecido una nueva plantilla llamada Radarc:

Radarc Template

Cuando hagamos clic en “OK” nos preguntará qué fórmula queremos usar, en nuestro caso seleccionamos “MVC Formula”:

MVC Formula

En este momento nos pedirá cierta información que necesita para poder acceder a la base de datos, namespace por defecto, y el estilo básico (hemos seleccionado el Green) necesario para crear la estructura básica de toda la solución:

Deploy MVC Formula

Una vez hagamos clic en “Finish” Radarc comenzará a crear la arquitectura básica y necesaria para un proyecto MVC:

Estructura de la solución

Ahora podemos empezar a modelar nuestro negocio de forma muy sencilla. Fijaos que directamente nos deja abierto el diseñador de modelos de nuestro Entity Data Model para comenzar a modelar nuestro negocio. De esta manera vamos a añadir cuatro Entidades a este modelo directamente:

RadarC Modeling 1

Las cuatro entidades y las propiedades que necesitamos son :

  • Product:
    • Description (string)
    • UnitPrice (decimal)
  • Order Detail:
    • Ammount (Int16)
    • Discount (Single)
  • Order:
    • OrderDate (DateTime)
    • DeliveryDate (DateTime)
    • ShippingAddress (String)
  • Customer:
    • CustomerCode (Int16)
    • CompanyName (String)
    • ContactName(String)

Así quedaría nuestro modelo:

RadarC Modeling 2

Ahora toca establecer las relaciones entre nuestras entidades, tenemos que establecer las relaciones de

  •  Un Product está en varias OrderDetails
  • Una Order tiene varias OrderDetails
  • Un Customer tiene 0 o varias Order.

RadarC Modeling 3

Guardamos los cambios y ejecutamos la aplicación, aseguraros de que el proyecto por defecto es el  proyecto MVC, ya que si no lo hacéis, se puede establecer como proyecto de inicio otro y os dirá que no existe un punto de entrada.

Cuando ejecutamos la aplicación, RadarC comenzará a generar todo el código fuente, creando las entidades, test, vistas,  servicios que exponen la lógica de negocio para ser consumida desde otros clientes, View Models y lanzará la aplicación lista para ejecutar:

Demo App

Y ya, a partir de aquí tenemos una aplicación MVC lista para poder meterle datos y todo. Es una app totalmente funcional, id probando a añadir clientes, productos y todo lo demás.

Fijaos que incluso la aplicación ya está preparada para múltiples idiomas, si abrimos el Global.asax veremos este código y en el directorio App_GlobalResources tendremos los diferentes archivos de recursos:

Localization

Resumen

Los chicos de Icinetic han hecho un excelente trabajo con Radarc, un trabajo realmente envidiable.

Me ha sido posible acceder a una beta privada que tienen lista ya para VS 2012 y Windows 8 y el funcionamiento es exactamente igual.

Juan María Laó Ramos

HttpAntiForgeryException en ASP.NET MVC

Hola a todos, gracias a Jose María Aguilar hoy he resuelto un pequeño problema con ASP.NET MVC de esos de los que te pegas dos días loco.

La cosa se puede reproducir muy fácilmente creando un nuevo proyecto MVC tal cual nos lo genera Visual Studio 2012:

        MVC Default Project         

Si la ejecutamos directamente  nos aparecerá la web por defecto totalmente funcionando. Ahora, vamos a registrar un nuevo usuario, y nos mantendremos logados.

Para reproducir el error que me ha vuelto loco sólo tenemos que deslogarnos, hacer clic en login y logarnos. Una vez logamos le damos al botón del navegador para que vaya a la página anterior, y veremos que se mantiene el nombre de nuestro usuario:User Logged

Y la gracia está en que si escribimos nuestro password y nos logamos obtenemos un bonito error:

Server Error in '/' Application.


The provided anti-forgery token was meant for user "", but the current user is "juanma".

             Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Web.Mvc.HttpAntiForgeryException: The provided anti-forgery token was meant for user "", but the current user is "juanma".
Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[HttpAntiForgeryException (0x80004005): The provided anti-forgery token was meant for user "", but the current user is "juanma".]
   System.Web.Helpers.AntiXsrf.TokenValidator.ValidateTokens(HttpContextBase httpContext, IIdentity identity, AntiForgeryToken sessionToken, AntiForgeryToken fieldToken) +234369
   System.Web.Helpers.AntiXsrf.AntiForgeryWorker.Validate(HttpContextBase httpContext) +71
   System.Web.Helpers.AntiForgery.Validate() +80
   System.Web.Mvc.ValidateAntiForgeryTokenAttribute.OnAuthorization(AuthorizationContext filterContext) +22
   System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor) +96
   System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__1e(AsyncCallback asyncCallback, Object asyncState) +446
   System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130
   System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state) +302
   System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__17(AsyncCallback asyncCallback, Object asyncState) +30
   System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130
   System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback callback, Object state) +382
   System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130
   System.Web.Mvc.Controller.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +317
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +15
   System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__2(AsyncCallback asyncCallback, Object asyncState) +71
   System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +249
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +50
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +301
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.17929            

 Simplemente precioso.

Es un problema de la caché,  y es que el forgery-token se guarda información relativa a la sesión que hemos iniciado con el servidor, entre ellas el usuario logado. Al ser una petición GET el navegador intenta obtener ese token de la caché, pero el servidor se da cuenta de que ese token ha sido cargado de la caché del navegador y no ha sido generada en la petición actual, por lo que, para evitar ataques de Cross-Site Request Forgery, nuestro servidor (que es muy listo) dice: eh!, ¿a donde te crees que vas?

La solución para que el navegador no nos cargue ese token (y otras cosas) en las peticiones GET que hagamos cuando queremos logarnos es indicarlo en nuestro método de login. En un proyecto MVC4 por defecto, ese método está en la clase AccountController.cs

 [AllowAnonymous]
 public ActionResult Login(string returnUrl)
 {
    ViewBag.ReturnUrl = returnUrl;
    return View();
 }

¿Cómo se lo indicamos?, añadiendo el atributo OutputCache de la siguiente manera:

 [AllowAnonymous]
 [OutputCache(NoStore = true, Duration = 0)]
 public ActionResult Login(string returnUrl)
 {
    ViewBag.ReturnUrl = returnUrl;
    return View();
 }

Si recompilamos y ejecutamos repitiendo el proceso de logarnos, navegar a la página anterior con el botón del navegador y haciendo clic en Login, ya no nos aparece el nombre de nuestro usuario anterior, sino que aparece vacío y podemos logarnos sin ningún problema y sin excepciones

Espero que os haya gustado y de nuevo tengo que darle las gracias a Jose María Aguilar por su ayuda :)

El foreach puede causar problemas de memoria

Después de tener algo de tiempo he ido a mi lista de cosas por leer y me quedado a cuadros cuando lo he leído.

http://blogs.msdn.com/b/etayrien/archive/2007/03/17/foreach-garbage-and-the-clr-profiler.aspx

Sí es un enlace del 2007, lo sé, imaginaos la de cosas que tengo en esa lista :P.

En resumen, imaginemos este código:


class Program
{
    class GameEntity
    {
        public void Update()
        {
        }
    }

    static GameEntity[] entities = new GameEntity[100];
    static Program()
    {
        for (int i = 0; i < entities.Length; i++)
        {
            entities[i] = new GameEntity();
        }
    }

    static void Main(string[] args)
    {
        byte[] byteArray = new byte[1];
        for (int i = 0; i < entities.Length; i++)
        {
            entities[i].Update();
        }
    }
}

En el post original, después de pasar el CLR Profiler no se hace reserva de memoria para un enumerador para poder recorrer la colección, algo lógico. Después, para ver la diferencia con el foreach sustituye el código del for por este otro:

static void Main(string[] args)
{
   byte[] byteArray = new byte[1];
   foreach (GameEntity e in entities)
   {
      e.Update();
   }
}

En el caso del foreach se reserva memoria para un enumerador necesario para recorrer el foreach.

Y todo va perfecto, sin embargo, hay un escenario en el que se pueden producir fugas de memoria:

const int NumEntities = 100;

static List list = new List();
static Program()
{
   for (int i = 0; i < NumEntities; i++)
   {
         list.Add(new GameEntity());
     }
}
static void Main(string[] args)
 {
     UpdateIEnumerable(list);
 }
private static void UpdateIEnumerable(IEnumerable enumerable)
 {
     foreach (GameEntity e in enumerable)
     {
         e.Update();
     }
 }

En este caso sí se producen fugas de memoria. Y es que aunque estemos haciendo un foreach en una lista, cuando se le hace un casting a una interfaz, al tipo valor del enumerador se le hace un box, y se coloca en el heap.

La conclusión:

  • Cuando hacemos un foreach sobre un Collection<T> se reserva memoria para un enumerador.
  • Cuando hacemos un foreach sobre la mayoría de las colecciones, como arrays, listas, colas, listas enlazadas y otras:
    • Si se usan explícitamente, NO se reserva memoria para un enumerador.
    • Si se usan a través de interfaces, se reserva memoria para un enumerador.

Así que si el consumo de memoria es algo crítico en vuestra aplicación o juego , nunca, nunca, uséis interfaces para recorrer una colección.

 

[Update: Gracias a Bernardo por el comentario]

El problema aparece cuando el “foreach” recorre la colección como si fuera un “IEnumerable”. En este caso se utiliza la implementación explícita de “GetEnumerator()” y se realiza “boxing” del “struct” para devolver un tipo “IEnumerator”.

El “boxing” es una operación costosa y puede llegar a consumir mucha memoria.

P.D: el método “GetEnumerator()” de  “Collection” no devuelve un “struct”. Es de las pocas colecciones que son una excepción.

Espero que os haya gustado tanto como a mi. :)

Juan María Laó Ramos.

HTML Tour

Se nota que estamos volviendo de las vacaciones y hay que ponerse las pilas.

Si ya nos las recargamos algunos en el pasado Megathon de Windows 8, ahora llega el momento de la web con el :

Plain Concepts

HTML Tour

HTML Tour Plain Concepts

que Plain Concepts va a realizar a lo largo y ancho del territorio nacional con las siguientes fechas:

En este evento veremos el porqué de HTML5, lo que significa, lo que trae y todo lo que podemos hacer con el. La agenda consta de siete sesiones en las que veremos:

Introducción a los nuevos estándares web:

En los últimos años el trabajo de desarrollador y diseñador web se ha ido complicando cada vez más. Nuevos navegadores, nuevos dispositivos y miles de librerías y herramientas han llegado a las vidas de todos los profesionales del desarrollo web. Veremos los diferentes perfiles de equipo que han aparecido y nuevos modelos de negocio web. Actualmente los profesionales del web ya no sólo crean páginas web, también aplicaciones móviles y tablets y hasta SmartTVs. Un mundo de JavaScript que todavía no conoce límites.

Buenas prácticas en el desarrollo web:

El objetivo de esta sesión es mejorarle la vida al desarrollador. Mediante herramientas y buenas prácticas veremos cómo cometer menos errores y como testear javascript, como ser mucho más productivos con nuestras css’s y evitar el caos mediante OOCSS y less. Para finalizar veremos el proceso de subida a producción de nuestra aplicación.

Construyendo tu ecosistema de desarrollo Web

En esta sesión daremos un repaso a los distintos tipos de aplicaciones web que podemos desarrollar, decidiremos cual es más adecuado para cada situación y veremos de qué frameworks y herramientas disponemos para desarrollarlos. Utilizaremos Asp.net MVC4 para crear desde webs más “sencillas” hasta single page applications. Intentaremos perderle el miedo a javascript y veremos algunos frameworks como knockout, crearemos Apis Rest con Web Api, y veremos cómo consumir datos en tiempo real con signalR.

Aplicaciones móviles multiplataforma

En esta sesión conoceremos la plataforma de desarrollo Phonegap, cuando nos puede interesar utilizarla y cuando no, veremos cómo podemos aprovechar nuestros conocimientos de HTML5, CSS y javascript para crear aplicaciones nativas en múltiples plataformas móviles y cómo tenemos acceso a interacción con el dispositivo (camera, geolocation, contacts, …). Para todo esto nos apoyaremos en el framework web, optimizado para gestos, jquerymobile. Write less, do more.

Responsive Web Design

En esta charla veremos cómo conseguir que nuestra página web se vea correctamente tanto en nuestros móviles, como en nuestra pantalla de pc, sin tener que crear una versión diferente para cada uno de los dispositivos. Veremos además, las diferentes técnicas que podemos aplicar para conseguir el resultado deseado, centrándonos sobre todo en Progressive Enhacement.

Programación de Videojuegos HTML5

En la charla veremos características comunes de los juegos y su aplicación práctica en canvas HTML5. Analizaremos varios tipos de juegos, tanto 2D como 3D y estudiaremos las diferentes maneras implementarlos mientras comentamos las partes clave de su estructura. Para finalizar echaremos un vistazo al framework desarrollado por PlainConcepts para la creación de diferentes tipos de juegos 2D y 3D en HTML5.

De la web a Windows 8. 5 + 3 = 8

Los desarrolladores web tenemos con Windows 8 la oportunidad de crear aplicaciones nativas HTML5+CSS3+JS. En esta charla aprenderemos a seguir los patrones de “Windows 8 Style”, utilizar controles que nos proporciona WinJS, Live Tiles e integrar nuestra aplicación con Windows gracias a los contratos de búsqueda, compartir y configuración.

Esperamos veros allí :)

Juan María Laó Ramos

Hackaton Windows 8 Sevilla

No tengo palabras para definir los días 7,8 y 9 de Septiembre de 2012 acaecidos en Sevilla y España. 500 personas en varias ciudades a la vez se reunían para aprender y desarrollar las primeras apps para Windows 8 made in Spain.

Ante todo gracias a Icinetic por la organización, a MSDN España, al Club .NET de Sevilla, a Cartuja .NET,   y a todos los que han participado de una u otra manera en esto, que se me olvida un montón de gente.

Ideas brillantes y sobre todo ganas de aprender y mejorar, para que luego digan que en España no hay buenos desarrolladores ...

Pero especialmente, quiero agradecer a los únicos e inigualables Fran Díaz, David Rodriguez y Javier Fernández (a.k.a Mudi) con estas caras tan alegres:

Equipo!!!

Por haberme permitido participar con ellos en esta increíble experiencia con nuestra aplicación DJ 8. Nunca pensamos que iba a ser posible desarrollarla en tres días (sin sus tres noches, las reglas del concurso no lo permitían) comiendo pizzas y "cocacolas", sin ningún tipo de estimulante más allá de mi adicción al tabaco.

¿Que qué es Dj 8? pues imagina que tus amigos han organizado una fiesta, un cumpleaños, una boda o simplemente queréis pasar un buen rato. Pero llega la hora de poner música y a ti, que te gusta la música, no te convence el  modo aleatorio del reproductor. Además, se os viene a la cabeza ese programa que Carlos Jean sacaba en la tele para arrastrar vídeos y mezclarlos! Pues con DJ 8 dejarás boquiabiertos a tus amigos, haciendo mezclas con el contenido audiovisual de tu biblioteca, no como todo un profesional, sino como El profesional.

Una mesa de mezclas totalmente digitalizada sacándole el máximo partido al hardware y a la interfaz Windows Style, aprovechando gestos para hacer pitch-bend, tapping para conocer los BPM y deslizamientos para cambiar la velocidad o el volumen del vídeo.

Windows 8 y el hardware se unen para ofrecer una experiencia de mezcla única.

Una pequeña captura de pantalla:

Interfaz Dj8

¡En un tiempo estará disponible en el Windows Store para que podáis disfrutar pinchando allí donde estéis!

Todo esto ha salido después de una alimentación muy sana:

Comida Hackaton Windows 8

Y de pocos problemas que fuimos resolviendo en equipo

Dónde está el error?

No quiero dejar de nombrar tampoco a Javier Suarez, Jose María Aguilar, Pedro Molina, Jesús Sánchez ... vaya, se me olvida un montón de gente, todos los que estuvimos en Sevilla, ¿para cuando otro?.

 

Update: Javier Suarez ha hecho un resumen bastante amplio en su blog: Resumen del Hackathon Windows 8 en Sevilla.

[CartujaDotNet] Quedada informal este Jueves, Hackaton calentando motores

Este Jueves 23 sobre las 8 de la tarde estaremos en el bar Sacristía en  la Calle de Juan Antonio Cabestany, 15, 41003 Sevilla para charlar un ratillo sobre tecnologías Microsoft, herramientas, y otras cosas que salgan.

Entre otras cosas trataremos sobre el inminente hackaton de septiembre (¿aún no sabes lo que es?) para organizar grupos, ver que recursos disponemos y colaboraciones.

Además, iremos viendo las próximas charlas. Así es que allí te esperamos.

Un Saludo

Están locos estos de Redmond

Vaya sorpresa que me acabo de llevar, y es que en Redmond hacen las cosas a lo grande. Si ayer anunciaron el nuevo servicio Outlook.com, hoy, hace apenas unos minutos han anunciado:

  • Windows Store: Han abierto la Windows Store para poder empezar a mandar nuestras apps para Windows 8.
  • Windows 8: Han publicado la última release RTM de Windows 8.
  • Visual Studio 2012 y .NET 4.5: Ya han llegado a las últimas builds de Visual Studio y lo lanzarán en Septiembre, pero el 15 de agosto estará disponible para los suscriptores de MSDN.

¡Se nota que estamos en verano y la cosa está que arde!

Hackathon Windows 8

Megathon Windows 8, ¿te lo vas a perder?

Hackathon Windows 8

¿Megathon, qué es eso?

Fácil, si has asistido a algún Hackathon de Windows Phone que se estuvieron haciendo el año pasado por toda la geografía española en diferentes fechas, esta vez es ¡en un montón de ciudades en la misma fecha todos a la vez!

La idea surgió por twitter en un momento de locura sana de Jose Bonnin (@wasat)

Durante los días 7, 8 y 9 de Septiembre tendremos que crear una aplicación Metro para Windows 8. Durante esos días de poco sueño se darán charlas sobre cómo programar apps Metro para Windows 8 usando C#/XAML o HTML5/JavaScript/CSS3 y contaremos con mentores que nos ayudarán a completar su App.

Yo ya estoy apuntado, ¿te lo vas a perder?

http://megathonwindows8.azurewebsites.net/

Windows Azure y Office 365

La última Beta de Microsoft Office 365 y SharePoint han introducido un montón de mejoras, entre ellas un montón para desarrolladores. Ahora podremos extender SharePoint creando aplicaciones web con ASP.NET (tanto con Web Forms como con MVC), incluso podemos crear nuevos workflows usando el nuevo Workflow Framework en .NET4.5

Aún mejor, las apps web y workflow que creemos para extender SharePoint se pueden hostear en Windows Azure. Ya estamos ofreciendo soporte entre Office 365 y Windows Azure que hace super fácil desplegar estas soluciones.

Soporte de Office 365 y Windows Azure

 Desarrollando sitios web en Windows Azure integrados con Office 365

El mes pasado publicamos una actualización de Windows Azure. Uno de los nuevos servicios que incluimos en esa actualización fue la característica que llamamos Windows Azure Web Sites - que nos permitía rápida y fácilmente desplegar aplicaciones web en Windows Azure. Con el nuevo Office, SharePoint Server 2013 y Office 365 Preview de la semana pasada, ya podemos crear aplicaciones para Office y SharePoint y hostearlas en Windows Azure.

Podemos usar cualquier versión de ASP.NET (tanto Web Forms, MVC y Web Pages) para crear aplicaciones para SharePoint, y autenticarnos e integrarlas con Office 365 usando OAuth 2 y Windows Azure Active Directory. Esto nos permite crear/leer/actualizar de manera segura los datos almacenados en SharePoint, e integrarlos con los repositorios de rich data y de documentos en Office 365.

Además de permitir hostear estas aplicaciones en Windows Azure, la nueva versión de Office 365 y SharePoint también nos permiten subir aplicaciones web personalizadas a Office 365. Los usuarios finales podrán navegar entre esas aplicaciones en el nuevo Store de Office y SharePoint disponible con Office 365 e instalarlas en nuestras soluciones de SharePoint. Esto hará que Office 365 despliegue una copya de la aplicación como un sitio web de Windows Azure, y Office 365 la administrará para el cliente final. Esto ofrece una forma convincente para que los desarrolladores creen y distribuyan aplicaciones web personalizadas que extiendan SharePoint, y opcionalmente monetizarlas a través del Store.

Podéis aprender más sobre cómo crear estas soluciones y cómo el nuevo modelo de nube para Office y SharePoint aquí, y más sobre cómo crear aplicaciones para SharePoint aquí.

Desarrollando Workflows de Windows Azure integrados en Office 365

La nueva versión de SharePoint permite ejecutar Workflows de .NET 4.5 personalizados en respuesta a acciones de SharePoint (por ejemplo, un usuario sube un documento, o modifica elementos en la lista de SharePoint). Los Workflows de .NET 4.5 permiten workflows de SharePoint más:

  • expresivos: introduciendo etapas y bucles que aprovechan los diagramas de flujo de workflows de .NET 4.5
  • connectados: soportando las llamadas REST y OData a servicios web, y a endpoints de ASP.NET  Web API
  • ilimitados: ejecutando los workflows fuera de los servidores SharePoint en un host robusto, escalable y consistent

Con la preview de Office 365, podemos autorizar y subir workflow a nuestras soluciones de SharePoint. Office 365 usa un nuevo servicio de Windows Azure Workflow para ejectuarlos en Windows Azure. Los desarrolladore sy los clientes de Office 365 no tiene que instalar nada en sus Windows Azure para permitir esto (ni siquiera tener una cuenta de Windows Azure) - ya que la integración es automática entre Office 365 y Windows Azure.

Podemos autorizar estos workflows usando el propio diseñador de Office SharePoint o desde Visual Studio 2012. En el Office SharePoint Designer, podemos crear workflows .NET 4.5 tanto desde el diseñador visual:

Office Share Point Designer

O desde la vista de texto (similar al mago de reglas de Outlook):

Vista de texto de Workflow SharePoint

Los desarrolladores podemos usar el diseñador de Workflow y las herramientas para Office de Visual Studio 2012:

Diseñador Workflow Visual Studio 2012

El soporte de workflow ofrece una forma fácil de personalizar el comportamiento de las acciones de SharePoint, y ejecuta su lógica en Windows Azure. Todo esto se puede hacer sin que el desarrollador tenga que personalizar SharePoint ni desplegar las apps a mano (ni siquiera hace falta logarse con una cuenta de Windows Azure - Office 365 lo hace automáticamente). Como los workflows pueden realizar ahora llamadas asíncronas a través de REST o de OData, también es muy fácil autorizar a los workflows para que llamen a una funcionalidad personalizada o a servicios que se estén ejecutando en Windows Azure (por ejemplo: un servicio escrito con ASP.NET Web API) e integrar los datos o la lógica en nuestra solución de SharePoint.

Resumen

Las actualizaciones de este verano de Windows Azure y Office 365 traen un montón de nuevas características. Podemos usar cada uno de los servicios de manera independiente, o usarlos juntos para desarrollar soluciones más competitivas. Visitad el Office Developer Center para aprender más y empezar hoy.

Espero que sirva.

Scott.

Traducido por: Juan María Laó Ramos.

Artículo original.

 

 

Entity Framework y Open Source

El Entity Framework ha avanzado mucho en los últimos años. Hace poco más de un año que se publicó EF 4.1, que introdujo la nueva API DbContext y el soporte Code First. A principios de este año publicamos EF4.3, que incluyó Code First Migration que permite a los programadores evolucionar un esquema de base de datos en un código optimizado. Y ya estamos al final y a punto de lanzar la release EF 5, que añade soporte para enumeradores, tipos de datos spatia, soporte para funciones table-valued, mejoras de rendimiento y mejoras en las herramientas de Visual Studio.

Una de las cosas que ha hecho el equipo entre las versiones 4 y 5 ha sido la de involucrar a la comunidad desde muy al principio y a medida que tomábamos decisiones de diseño y pedíamos feedback. Para la versión 6 buscamos llevar esto al siguiente nivel optando por un modelo abierto de desarrollo.

El código fuente del Entity Framework se ha publicado bajo una licencia open source (Apache 2.0), y el repositorio está hosteado en CodePlex (usando Git) para incrementar la transparencia del desarrollo. Esto permitirá que cualquiera pueda ofrecer feedback en los checkings de código, correcciones de bugs, desarrollo de nuevas características y construir y testear el producto usando siempre la última versión del código y los tests. Las contribuciones de la comunidad también son bienvenidas, así que podéis convertir al Entity Framework en un producto mucho mejor. Podéis encontrar todos los detalles en el sitio de CodePlex del Entity Framework.

El pasado Diciembre las SDKs de Windows Azure adoptó este modelo abierto de desarrollo, y en marzo vimos que ASP.NET MVC, ASP.NET Web API y ASP .NET Razor también pasaron a este modelo. Estos productos han mostrado que este modelo abierto es una forma genial de conseguir un gran feedback de la comunidad, y al final del día tenemos mejores productos.

Mismo soporte, mismos desarrolladores, más inversión.

Muy importante - Microsoft continuará publicando builds oficiales del Entity Framework como un producto soportado de Microsoft tanto como producto aparte como producto integrado con Visual Studio (al igual que hoy). Continuará siendo atendido por el mismo equipo de desarrolladores de Microsoft y será soportado por los mismos mecanismos de soporte de Microsoft. La meta con este anuncio es incrementar el feedback más aún, permitiéndonos conseguir un producto mejor.

El equipo está muy contento con este movimiento. Veréis nuevas características en las versiones que se suban muy pronto.

Aprende más

Ojead el sitio en CodePlex del Entity Framework para aprender e involucraros. Mirad también la página con el roadmap de EF6 en el sitio de CodePlex para enteraros de lo que va a venir en la próxima versión. Y leed sobre el nuevo Microsoft Open Tech Hub y algunos cambios en los procesos que estamos haciendo con la comunidad open source.

Espero que sirva,

Scott.

Traducido por: Juan María Laó Ramos.

Cartuja .NET working

En Sevilla, a estos maravillosos 40 grados, nos vamos a juntar unos cuantos en el primer evento del grupo de usuarios de .NET de Sevilla, Cartuja.NET, de este año.

Así que si te gustan las tecnologías, especialmente las de Microsoft, trabajas con ellas, o te gustaría hacerlo pero no sabes cómo, nos vamos a reunir para hablar sobre MS, las tecnologías que están o van salir, conocernos y hacer networking.
¿Quieres saber más? Vente el Dia: 4 de Julio
Lugar: En la Calle Presidente Cárdenas, 41013 Sevilla (SE)   Hora:  8 de la tarde (con la fresquita)

No hace falta que os regitréis ni nada.

Nos tomaremos unas cervezas en el bar Qcross mientras charlamos sobre todo esto y más.

Updated:

Y si queréis estar al tanto de lo que se cuece en CartujaDotNet, noticias, eventos, o contactar con otros participantes, podéis uniros al grupo CartujaDotNet en Facebook, LinkedIn, o seguirlo a través de Twitter.

Más artículos hablando sobre este tema:

Os esperamos!

Zombeee

Imagina …

... que te despiertas en tu granja una mañana, como todas las mañanas, y una manada de ovejas zombies han invadido tus tierras.

Mientras llega ese día (ten por seguro que llegará) puedes entrenar con estos juegos en tu móvil. Hemos hecho estos juegos con  Cell·SDK lo que nos ha permitido hacer los juegos una sola vez y publicarlos en los markets de iOS, Windows Phone y Android. El mismo zombie-código en las tres plataformas :).

Zombeee

Descárgatelos y pruébalos :).

Juan María Laó Ramos.

Segundo camino para alcanzar el Nirvana del Garbage Colector y cuál elegir

En este segundo post sobre la serie de optimizaciones en juegos en el que vamos a ver la segunda forma de optimizar el proceso de recolección de basura, evitando caídas de rendimiento en nuestros juegos.

Latencia adecuada.

El tiempo que consume el proceso de recolección de basura es directamente proporcional a lo complejo que sea nuestro heap. Si el heap está vacío, el recolector no tendrá nada que hacer.

Fijaos que hemos dicho "lo complejo que sea nuestro heap". La complejidad del heap es una combinación del número de objetos vivos y el número de referencias a objetos que tengamos. En realidad no importa nada el tamaño en bytes que los objetos del heap tengan: lo que realmente importa es el número total de objetos (ya que el recolector debe examinar cada uno de ellos) y el número de referencias a objetos (el recolector debe seguir cada referencia para ver a qué está apuntando cada una).

Cuando medimos la complejidad del heap, un array de 100.000 enteros es poco costosa. Aunque ocupe mucha memoria, el recolector de basura sólo tiene que examinar el objeto una vez, y no tiene que mirar dentro.

100.000 arrays, cada una con un entero dentro será más costoso, ya que el recolector tiene más objetos que examinar.

Un array de 100.000 referencias a objetos es también más costoso, ya que aunque el array es sólo un objeto, el recolector tiene que recorrer todas las referencias para ver si cada objeto que contenga el array tiene que seguir vivo. Aunque el array sólo contenga nulls, el recolector los tiene que recorrer todos para asegurarse.

Aquí tenéis unos consejos para reducir la complejidad del heap:

  • Es mejor algunos objetos grandes antes que muchos objetos pequeños.
  • Mejor tener en el heap  tipos por valor que  referencias.
  • Cuantas menos referencias a objetos mejor.
  • Los arrays de tipos por valor son tus amigos!
  • Considera reemplazar referencias a objetos por manejadores enteros, es decir, en lugar de guardar una referencia la nave que creó la bala, podrías guardar el "fui creado por la nave 23" como un entero directamente.
  • Es prefeible un T[] o List<T> antes que un LinkedList<T> o un Dictionary<K,V>

Los discípulos del camino de la latencia no se preocupan de reservar memoria durante el juego. Pueden llamar a news, causar boxings, y usar delegados anónimos y métodos generadores. No les importa que pase el recolector de basura, ya que su heap es tan simple que el proceso termina muy rápido.

¿Cuál de los dos caminos elijo?

Podemos obtener un mejor rendimiento evitando las reservas de memoria, de manera que el recolector nunca pasará. Esto funciona sin importar lo complejo que sea nuestro heap.

También obtendremos un mejor rendimiento manteniendo nuestro heap simple, el recolector tardará muy rápidamente. Esto funciona aunque reservemos memoria durante el juego.

¡¡Lo que no podemos hacer es mejorar el rendimiento mezclando ambas soluciones!! Se consigue muy poco reservando memoria sólo para la mitad de memoria necesaria y tener un heap de complejidad media. Eso producirá un juego con un tamaño medio cada pocos segundos.

Si tu objetivo es evitar la recolección de basura, debes elegir sólo uno de los caminos y seguirlos hasta el final.

Reinicia tu cabeza

Los programadores nuevos en el mundo de evitar la recolección de basura piensan que pueden mejorar el rendimiento llamando a GC.Collect en momentos específicos.

Casi siempre se equivocan. Forzar la recolección de basura es una receta para confundir al recolector y dañar su rendimiento.

Pero...

En Xbox, el .NET Compact Framework realiza una recolección de basura cada vez que se ha reservado un megabyte.

Supongamos que estamos optimizando nuestro juego para evitar reservar de memoria. Después de un estudio cuidadoso con el CLR Profiler hemos conseguido reducir a 50 bytes por frame las reservas de memoria que hacemos, pero no conseguimos reducirlo más, no hay manera.

Además, digamos que nuestro juego se ejecuta a 60 frames por segundo, y que un nivel típico tarda 2 minutos en completarse. Al final del nivel tendremos reservados sólo 352k, no es suficiente para que el recolector se ejecute. En realidad, nuestro juego puede estar hasta 5 minutos sin tener que recolectar nada, el único momento en el que el jugador notará que está pasando el recolector de basura es si él mismo se dedica a recorrer el universo "perdiendo el tiempo".

Suena razonable no? Seguramente podríamos vivir con ello.

Pero...

Estaremos reservando mucha memoria mientras se carga el nivel, y esto causará muchas recolecciones. En realidad no es un problema: no está mal que el recolector pase en este momento, ya que a la pantalla de carga no le importa el framerate.

Pero ¿qué pasa si durante la carga se reserva algo menos de un número de megabytes, por ejemplo 24,452k? Después de la última recolección en el mega 23, esta operación de carga reserva muy poco como para lanzar otra recolección, pero lo suficiente como para dejarnos sin espacio. Ahora nuestro juego sólo puede reservar 124k antes de lanzar otra recolección, así que el jugador notará esto sólo cuando lleve 42 segundos en el nivel.

La solución es llamar a GC.Collect al final de cada método de carga. Esto limpiará cualquier recolección que hiciese falta, reseteando el reloj para que tarde más en pasar el recolector.

Juan María Laó Ramos.

Artículo original.

Logo de Winphone Metro

Difoosion

Me llena de orgullo y satisfacción que me hayan acogido en Difoosion como editor en su blog sobre noticias de Windows Phone: Winphone metro.

Logo de Winphone Metro

Tienen una red de blogs bastante interesante sobre el mundo móvil, no sólo de Windows Phone:

Logo Andro4all

Andro4All: Noticias sobre la plataforma Android.

Logo Applesencia

Applesencia: Noticias sobre Apple.

Logo Xombit

Xombit: Noticias sobre ciencia, tecnología, cultura, gadgets, series y juegos.

Logo XombitGamesXombit Games: Noticias sobre videojuegos de todas las plataformas

Uyuyuy, una sorpresa de última hora y es que ayer se lanzó:

Logo SportAdictosUn blog sobre deporte, salud y nutrición.

La verdad es que es una red de blogs muy recomendable para estar al tanto de lo que se cuece sobre estos temas y es que se actualizan bastante a menudo y creo que a los que me leéis os puede interesar.

Espero que os gusten.

Windows Azure Media Services

Windows Azure Media Services

Hace un mes que se anunció la salida de Windows Azure Media Services.

Es el servicio en la nube que nos permite construir y publicar soluciones multi-media a nuestros clientes. Ofrece un montón de servicios listos para codificar, almacenar, proteger y lanzar por streaming (tanto live como bajo demanda) de video. También integra y expone servicios de nuestros partners - permitiendo una pila de funcionalidad increíble.

Podéis usar Windows Azure Media Services para entregar soluciones a cualquier dispositivo o cliente - como HTML5, Silverlight, Flash, Windows 8, iPads, iPhones, Android, Xbox, y Windows Phone. Windows Azure Services soporta una gran variedad de formatos de streaming - como Smooth Streaming, HTTP Live Streaming (HLS), y Flash Media Streaming.

Uno de los aspectos que hacen único a Windows Azure Media Services es que todas sus características están expuestas usando una API REST HTTP. Esto es así tanto para los servicios multimedia, como para los servicios de nuestros partners. Esto hace que sea muy fácil automatizar workflows multimedia e integrar los servicios en nuestras aplicaciones. Como el resto de Windows Azure, sólo hay que pagar por los servicios de Windows Azure Media Services que usemos - haciendo que el coste sea muy interesante.

Windows Azure Media Services

Windows Azure Media Services usa el mismo backend que se usa para ofrecer eventos de deportes en vivo - como los juegos Olímpicos de Invierno de 2010, el Mundial de Fútbol 2010, los Campeonatos de Wimbledon 2011 y la SuperBowl 2012. Con Windows Azure Media Services podremos montar y automatizar soluciones en la nube que sean capaces de ofrecer soluciones a una gran audiencia.

Aprende más

Hemos usado Windows Azure Media Services en el 2012 National Association of Broadcasters (NAB) Show, los asistentes pudieron hablar con el equipo y ver demos en directo.

También podéis visitar windowsazure.com media para ver las características que ofrece, y pasaros por los recursos para desarrolladores de windowsazure.com para a ver cómo podemos usarlo. También podéis registraros para una cuenta de prueba enviando un email a mediaservices@microsoft.com (junto con los detalles del escenario para el que lo queréis usar).

Estamos deseando ver las cosas que sois capaces de hacer.

Scott.

Traducido por: Juan María Laó Ramos.

Artículo original.

Primer camino para alcanzar el Nirvana del Garbage Colector

Para ponernos en contexto y verlo más claro debemos saber que lo que vamos a ver es realmente importante en el mundo de los videojuegos ya que en este mundo el consumo de memoria y de recursos es algo crucial y hay que optimizarlos al máximo. En este sentido el proceso de recolección de basura es algo importantísimo ya que consume recursos del sistema y si se ejecuta en mitad del juego se puede producir una bajada de rendimiento importante.

En este primer post de la serie vamos a ver una de las formas de evitarlo.

Este es el post original de Shawn Hargreaves:

En este post vimos cómo saber si el recolector de basura de nuestra Xbox está tardando mucho. Vimos que el tiempo que tarda el recolector de basura es el resultado del producto del número de veces que se recolecta por la latencia misma de la recolección.

Esto nos hace pensar en dos formas de mejorar el rendimiento del proceso de recolección de basura. Podemos reducir el número de recolecciones, o podemos reducir la latencia del proceso de recolección. Con que consigamos reducir uno de esos valores se notará una mejora bastante notable en el rendimiento total.

En este post vamos a ver el primer caso:

Elegir una frecuencia de recolección adecuada

La frecuencia con la que se produce la recolección de basura es directamente proporcional al número de veces que reservamos memoria. Si nunca reservamos memoria, el proceso nunca se lanzará.

Para reducir el número de recolecciones, debemos reservar memoria para aquello que vamos a necesitar mientras cargamos los niveles, y evitar reservas de memoria en el tiempo de juego, evitando así que el recolector de basura entre en acción en mitad del juego.

Hay varias formas para evitar la reserva de memoria:

No reserves memoria (jah!)

Es simple, no hagas news de tipos por referencia. Está bien cuando lo hacemos con tipos por valor como Matrix, Vector3, Color y demás.

Cada vez que queramos hacer un new de un tipo por referencia, debemos usar un pool de objetos para reusar sus referencias. Los ejemplos de Particle y Audio 3D de creators.xna.com usan esta técnica, y SwampThingTom escribió sobre un pool genérico y reusable.

No uses clases que reserven memoria por sí mismas.

Cuando añadimos datos a una colección como un List<T> o un Dictionary<K,V>, se reserva memoria cuando se quieren ampliar. Podemos evitarlo usando el constructor existente en el que se indica el tamaño específico de la colección. Usando este constructor hacemos que se reserve la memoria necesaria para toda la colección haciendo que esta no tenga que ampliar ni disminuir la memoria que necesita.

Ten cuidado cuando formatees cadenas. Es difícil manipular cadenas en .NET sin causar reservas de memoria.

Evita que el CLR reserve memoria.

El CLR reserva memoria cuando ocurre el boxing. ¡Evítalos como si de una plaga se tratase! El boxing puede ocurrir por muchas razones, algunas son obvias, otras no tanto, veamos cuándo ocurre el boxing.:

  • Si asignamos un tipo por valor a una variable Object.
  • Si guardamos tipos por valor en una colección no genérica.
  • Si accedemos a tipos por valor a través de una interfaz.
  • Si usamos un enumerado como clave de un diccionario, las operaciones internas del diccionario generan boxings. Podemos evitarlo usando claves enteras (de tipo int), y hacer casting a los valores de nuestro enumerado antes de añadirlas al diccionario.

No dejes que el compilador de C# reserve memoria.

Puedes ser realmente tricky usar delegados (especialmente los que están definidos "inline") sin hacer que el compilador reserve memoria. Esto es todo un mundo por sí solo, pero en caso de duda evita el uso de delegados o eventos

Los yield hacen que el compilador reserve siempre memoria.

Los foreach pueden reservar memoria sin cuidado. Pero ojo, esto no significa que tengamos que evitarlos. Suele ser la forma más rápida de recorrer una colección.  Aprended las reglas para usarlos de manera adecuada

Todo lo que no reserve memoria está bien.

A los discípulos del camino de la frecuencia se les permite tener estructuras de datos complejos. Pueden reservar cientos de miles de objetos mientras su juego carga, llenar el heap con una malla de objetos referenciados entre si. Siempre que no reserven nada después de que termine de cargar, el recolector de basura nunca se ejecutará, así que no hay problema ninguno en mantener en memoria objetos complejos.

Resumen

Hemos visto una forma de hacer que el recolector de basura no se ejecute mientras se está jugando al juego: evitando hacer reservas de memoria durante el juego, en vez de eso las hacemos en el proceso de carga y se mantiene todo en memoria.

En el próximo post veremos la segunda opción: Elegir la latencia adecuada.

Juan María Laó Ramos.

Post original.