Una experiencia ALM ++

En estos últimos tres meses he tenido la oportunidad de aplicar Scrum y TDD de manera estricta.

Ha sido una experiencia muy enriquecedora y la voy a compartir con todos.

En el proyecto hemos usado Team Foundation Service y Visual Studio 2012 como solución ALM con la plantilla por defecto de Scrum. Con esto solventamos varias cosas de un plumazo:

  • Gestión del Backlog
  • Definición de Sprints
  • Gestión de Tareas.
  • Gestión de Bugs.

La interacción con el cliente también la hacíamos a través de la web del proyecto.

Lo que más me llamó la atención fué lo fácil que es la gestión de bugs. Cuando el cliente encontraba un bug, lo abría y le ponía la prioridad, el scrum Master lo comunicaba en el daily scrum y nos organizábamos para ver quién lo corregía

ALM

  • Teníamos definidas varias Builds para cada parte del sistema que lanzaba una compilación y ejecución de los Test Unitarios que había para asegurar que no se había roto nada.
  • También había otra serie de Builds manuales necesarias para generar una versión para desplegar en los distintos entornos Desarrollo, Pre-producción y Producción.

La verdad que esto de no salir de Visual Studio para crear un sistema es una bendición. En su día integré Jenkis, Trac y Subversion en un proyecto en .NET, me maravillaba lo que se podia hacer con estas herramientas. La verdad es que me costó un tiempo montarlo y después mantenerlo.

Y en una conversación con el Scrum Master me soltó esto:

“Luego te llegan los empalmados que si Subversion, Jenkins, Jira, Trac, Bugcilla, que es gratis. Si estás desarrollando en .NET, el intentar integrar todo eso para que funcione con .NET es posible, pero es cuestión de tiempo y dinero”

Y en estos tres meses de trabajo, le habremos dedicado 40 horas a estos temas (daily scrums incluidos) y todo sin salir de Visual Studio.

Knock, knock … Buenos días developer, venimos a hablarle de TDD

Aviso: Este es un post que te va a vender TDD.

En otras publicaciones han resumido las bonanzas de TDD, como el libro de @carlosble "Diseño ágil con TDD". Os lo recomiendo desde ya.

Pero he encontrado una presentación de Francesco Carucci, antiguo desarrollador de Crytek que actualmente trabaja en Apple, en la que muestra/vende TDD desde el punto de vista del desarrollo de video juegos.

Me ha parecido muy bien estructurada y cómo vende TDD, así que lo pongo aquí para escribirlo, compartirlo y de manera egoísta, como un ejercicio para que me ayude a no olvidar algunas cosas.

La estructura consiste en poner las diferentes razones y excusas que solemos dar para no escribir tests o por qué no hacer TDD y las respuestas que deberíamos grabarnos como mantras. Así que allá vamos:

No hago Tests por que ...

... el tiempo que gasto en escribir test es tiempo que podía estar escribiendo código.

  • Al final gastamos más tiempo en debugear y mantener código que escribiéndolo.
  • Si escribimos primero los test y el código que los pasa, el código que los pasa es código de producción. La consecuencia es que tardamos menos tiempo en tener código que funciona, esto es: código de producción.
  • La modificación del código es más confiable. Cuando modificamos código lo hacemos "más tranquilos" ya que sabemos que vamos a romper pocas cosas, y si se rompen, nos vamos a dar cuenta rápido.
  • Se evitan bugs de regresión. Al detectar un bug, escribimos un test que lo reproduzca y ese bug no volverá a aparecer.
  • Se detectan antes los bugs, como ya vimos en el post anterior

... los test no lo pueden probar todo

  • Un test es mejor que ninguno.
  • El código legacy o de terceros no hay que testearlo a menos que tengamos que modificarlo.
  • Roma no se construyó en un día, pero se construyó (y conquisto el mundo conocido)

... este código es temporal y lo cambiaré después, no necesito testearlo

  • Todo el código se modifica tarde o temprano. Hacer código que sea fácil de cambiar es la razón fundamental de TDD: elimina la sobre-ingeniería (KISS, Keep It Simple, Stupid!)
  • Los requisitos cambian: entonces hay que modificar los tests afectados y el código de producción. Pero como está testeado unitariamente, el código está más desacoplado, es más fácil de modificar y los cambios tendrán menos efectos secundarios.

En el mundo del desarrollo de juegos

El desarrollo de juegos es diferente: los test automatizados pueden no funcionar.

  • En general el desarrollo de juegos es totalmente diferente …
  • … pero escribir código es lo mismo, incluso más simple.
  • El código de un juego es más algoritmia y matemáticas, eso es incluso más fácil de testear que un proceso de negocio.
  • Un código de sobresaliente es lo mismo tanto en un juego como en una web.
  • El código de un juego cambia a menudo: más cambios es un motivo más para tener test que comprueben que no se ha roto nada.

Los juegos son para divertirse, un test no puede comprobar que un juego sea divertido.

  • Pero sí puedes capturar bugs, y menos tiempo debugando errores significa más tiempo para implementar la parte divertida.
  • Crear un test para un bug te asegura que ese bug no volverá a aparecer (El 30% de las correcciones de bugs crean nuevos bugs debido a efectos colaterales)

Esto es un juego AAA, es muy arriesgado hacer test automatizados sobre él.

  • Los juegos AAA son muy complejos, muy tecnológicos y muy divertidos. Para conseguir un juego AAA, se deben usar herramientas adecuadas, y los test automatizados son una de esas herramientas.
  • Lo arriesgado es NO hacer test en un juego AAA

¿Cuándo TDD no es apropiado?

  • Prototipos. Mientras buscamos/probamos posibles soluciones a un problema.
    • La solución final SÍ debe estar hecha con TDD.
  • En el código de wrappers de librerías existentes.
  • En la capa GUI, eso no es testing unitario, es testing de integración.
  • En código de bajo nivel, el que está muy cerca del hardware

Objetivo: Producir más funcionalidades en menos tiempo.

No perdamos de vista el objetivo, producir lo antes posible código que vaya a producción, esto es código que funciona, libre de bugs y mantenible

¿Y tu porqué no haces Test o TDD?

TDD: Mentirosos el ciclo no es Red – Green -Refactor

Nos han engañado estos del TDD, son unos malditos mentirosos, el verdadero ciclo es:

Think - Red - Green - Refactor

Y no te lo dicen, aunque para algunos iluminados sea algo implícito, el primer paso es pensar (Think) el algoritmo/lógica que quieres implementar, y es ese primer paso el que siempre me saltaba. Soy una persona visceral y suelo actuar por impulsos, y a la hora de programar ... pues me pasa un poco que me dejo llevar.

Por eso voy a desglosaros cómo veo yo el ciclo de TDD:

Think

  1. Piensa y reflexiona la lógica que tienes que implementar.
  2. Identifica las diferentes responsabilidades que hay
  3. Por cada responsabilidad habrá una clase. (¡Quieto!, aparta las manos del teclado, no es el momento de escribir las clases. Dibújalas en un PDA (Papel de Apuntar))
  4. Elige un buen nombre para cada una de ellas. Nombres descriptivos, limpios, claros, afeitaditos. Evita las terminaciones de LoQueSeaObject, LoQueSeaManajer, etc... Si no dice nada sobre la funcionalidad de la clase quítalo. Si aún así estás tentado a ponerlo, es que esa clase hace más de una cosa (Principio KISS), así que vuelve al paso 1.
  5. En el PDA dibuja las relaciones entre las diferentes clases

Foreach (responsabilidad in PDA)

  • Crea una clase de Test por cada una (ejemplo: responsabilidad1Test)
  • Y ahora sí, en cada clase de test haz todos los Red - Green - Refactor necesarios para probar la funcionalidad que la clase testeada debe tener.

Mis conclusiones

Escribe tu código como si un asesino esquizofrénico que tiene tu dirección fuese a mantenerlo

Esta es una frase muy conocida en el mundo Agile, no recuerdo si era exactamente así, pero lo que viene a resumir es que al final pasamos más tiempo leyendo, debugeando y manteniendo código que escribiéndolo. Por eso es muy importante pensar muy bien el nombre que les vamos a dar a las clases, variables, métodos, propiedades, etc. En definitiva haz lo que sea necesario para que tu código sea legible.

La formación no es importante, es IMPRESCINDIBLE

Aprender la teoría está bien, pero si viene acompañada de una práctica con alguien que te guíe te va a ayudar mucho más, sí, es algo obvio, pero que no se suele hacer.

Las herramientas de refactoring son nuestras amigas

Sólo hablo del "generate method" y "generate class" de Visual Studio, no me han hecho falta más. Cuando empiezas a escribir el test, y haciendo clic derecho y buscar esa opción en el desplegable nos permite crear rápidamente las clases y métodos que nos vayan haciendo falta, pero no te olvides del asesino esquizofrénico.

El Nirvana del TDD

El Nirvana del TDD es no tener que debugear para detectar un bug, sólo crear un test que lo reproduzca y corregirlo. Si consigues llegar a este punto ya eres un TDD Master.

¿Cómo ampliarías este post?

[Evento CartujaDotNet] Wave Engine

Wave EngineImagina que quieres hacer un juego, pero sólo quieres programarlo una vez y desplegarlo en la mayoría de plataformas posibles.

Deja de soñar y aprende a usar Wave Engine y podrás desplegar tus juegos en iOS, Android, Windows 8 y Windows Phone.

Los grandes Marcos Ligthyear y David Woody nos enseñarán todo lo necesario (y quizás algo más ... ) para empezar a sacarle partido a Wave.

¿Dónde y cuando?

En el Cloud Pointing de Sevilla.

c\ Biología, 12, Edificio Vilamar 2, 3ª Planta
Parque Empresarial Nuevo Torneo
41015 Sevilla

El Jueves 23 de Mayo de 19:30 a 21:30.

Aquí tenéis juegos reales hechos con Wave Engine. Y estas son  unas cuantas demos tecnológicas.

¿Te lo vas a perder? Pues regístrate aquí

Microsoft Sync Framework 2.1 (COM Error 80040154 Class not registered)

He tenido que trabajar en un proyecto para sincronizar tanto bases de datos como blobs con Azure , Microsoft Sync Framework y Worker Roles.

Nota: Ibon Landa nos explica qué es un worker role de Azure aquí.

La cosa es que una vez instalado Microsoft Sync Framework y empezar a trabajar con él, estaba obteniendo una excepción que no entendía muy bien:

{"Retrieving the COM class factory for component with CLSID {EC413D66-6221-4EBB-AC55-4900FB321011} failed due to the following error: 80040154 Class not registered (Exception from HRESULT:

0x80040154 (REGDB_E_CLASSNOTREG))."}

La máquina en la que suelo trabajar es una máquina x64, con el sistema operativo también en x64.

Tras un tiempo buscando por google pude llegar a la conclusión que no estaba encontrando el componente de Sync Framework. Tras comprobar que estaba todo instalado no conseguía averiguar cuál era el problema.

Ya desesperado me dio por pulsar en la segunda página de resultados de google y ahí estaba: Sync Framework 2.1 Com Error

La cosa es que como tenía un proyecto de test para probar las clases que iba creando, resulta que Visual Studio se ejecuta siempre en modo x86, y como los test se lanzan desde Visual Studio, no estaba encontrando las librerías correspondientes.

La solución

Instalar los componentes x86 de Sync Framework y problema resuelto.

Espero que sirva.

Juan María Laó Ramos

PlainConcepts

Plain Concepts Cloud Tour

Desde Plain Concepts nos invitan a un evento bastante interesante sobre tecnologías Cloud: http://www.plainconcepts.com/cloudtour/

Nos hablarán  sobre todo de qué opciones tenemos de usar el Cloud si no trabajamos con tecnologías Microsoft, aquí teneís los principales temas de los que se hablará:

  • IaaS - Linux, Máquinas y Redes Virtuales
  • PaaS, trabajando con Java y Eclipse
  • PHP y Azure Web Sites
  • Almacenamiento en la nube – SQL, NoSQL
  • Big Data y Hadoop
  • Desarrollo de backends para el desarrollo de aplicaciones móviles

El evento es a nivel nacional. Aquí tenéis los diferentes lugares, fechas y enlaces de registro:

¿Te lo vas a perder?

 

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.