Despedida del programa Microsoft MVP

Después de 13 años como Microsoft MVP, este año me despido del programa. Y quiero hacerlo dando las gracias a todos, a la propia Microsoft y -sobre todo- a la gente que he conocido en este periodo: empleados de la propia Microsoft, toda la gente del programa MVP o de las comunidades, etc.

Al fin y al cabo, dejando a un lado los reconocimientos, conocer a toda esta gente ha sido lo mejor y más importante de este periodo, hasta el punto de poder decir que a algunos de mis mejores amigos los he conocido aquí. Y eso es mucho decir.

A decir verdad desde hace un par de años ya le había comentado a mamá Cristina (la gran madre de todos los MVP) mi intención de dejar el programa por diversos motivos, pero al final siempre me terminaba convenciendo para seguir por un tiempo…  que grande eres Cris y que razón tenías, muchas gracias por todo!

Entre estos motivos, destacaría el hecho de que hace tiempo que: ya no creo que por méritos propios merezca estar entre los reconocidos. Y esto es básicamente porque yo mismo elegí cambiar y hacer menos pequeñas contribuciones diarias (o casi) y centrarme en hacer dos o tres más grandes al año.

Ya no tengo ni el mismo tiempo ni -porque no decirlo- las mismas ganas que hace unos años… y sinceramente, hay gente que contribuye de ese modo mucho mejor que yo. Así que decidí que donde puedo aportar más, es por ejemplo en los eventos grandes tipo DotNetConference o organizando el GAPAND anual, que de momento seguirá.

Claro que no es el único motivo, siempre hay cosas en las que uno no está 100% de acuerdo, pero ahora no es el momento ni el lugar para hablar de ello. En este post sólo quiero, como he dicho al principio, dar las gracias a todos y decir que me lo he pasado pipa durante este tiempo. Siempre recordaré este periodo con muchísimo cariño!

Yo por mi parte bajaré el próximo día 5/6 de Octubre al Tech Summit en Madrid y aprovecharé para despedirme de todos los que me encuentre, ya que aprovecharé la excusa y me pillaré un tiempo sabático de todo esto, que ya me toca :P

Gracias a todos y ahora que sigan otros tirando del carro :D #NewBlood

L

Había pensado en esperar al 1 de Octubre para escribir esto, pero al final he decidido hacerlo ahora para no coincidir con la alegría de todos los nuevos (o renovados) MVP. Buen trabajo y felicidades, chicos! :D

ends

 

GAPAND 2016 is over

IMG_20160702_140840

BUENO…

Otro año ha pasado, y otra edición más del GAPAND a la saca. No, si al final esto va a convertirse en un clásico y todo… bueno, el tiempo lo dirá. Lo que si os puedo asegurar es que ha sido la mejor edición hasta la fecha, ya que el feedback de la gente (que al fin y al cabo es la única métrica que me interesa) es, a falta de una palabra más ‘fisna’: COJONUDO :D

Y eso no se paga con nada, sabéis? Porque vale, si, seguro que ya os imagináis que organizar un evento como este es un currazo. Y vaya si lo es! Lleva meses de trabajo duro, de coordinarse con mucha gente, de lidiar con 1000 temas distintos, de solucionar un montón de problemillas sobre la marcha, y todo por un día… un mísero día al año. Como nos gusta complicarnos la vida, eh? ;)

Pero es que todo eso no es nada cuando ves el ambientazo que se respira ese día. Cuando tienes la oportunidad de volver a ver a viejos amigos, y de hacer otros nuevos. Porque lo bueno del GAPAND (como en tantos otros eventos 100% comunidad) no está sólo en las sesiones, está en el contacto con la gente, y en el buen ambiente que se respira.

 

GRACIAS

Así que desde aquí quiero daros las gracias a todos los que en mayor o menos medida habéis ayudado a que este evento hay sido posible: GRACIAS! GRACIAS! Y MUCHAS GRACIAS! :D

A todos, a los colaboradores porque sin ellos no tendríamos un sitio en el que hacer el evento (Universitat d’Andorra), ni desayuno (Sant Eloi), ni comida (DevsDNA), ni camisetas para los ponentes (Eset) y para la gente del staff (Semic), ni camisetas de regalo (Microsoft), ni cervezas (Hack & Beers), ni cosas para sortear (Caldea, Andorra Turisme, etc.).

A los ponentes, porque además de ser unos cracks hacen el esfuerzo de prepararse contenido súper interesante para crear una agenda de los más chula. Y todo eso lo hacen sin recibir nada a cambio… es más, incluso tienen que costearse su hotel! Así que imaginaros su compromiso con la comunidad! Si eso no es amor y pasíon por lo que te gusta, no se qué puede serlo. Un aplauso enorme… sois muy grandes!

Y cómo no, a todos los que habéis asistido al evento… sin vosotros esto no tendría sentido. Me alegra especialmente haber visto este año a bastante gente joven (venga, que los viejos necesitaremos el relevo, más pronto que tarde :D), estudiantes de la propia universidad, y gente que ha venido de bastante lejos a pasar un día con nosotros en este pequeño país… GRACIAS!

Mención aparte para mi colega Jordi, que ha tenido la paciencia de aguantarme otro año, y de tirar del carro cuando era menester. Ah! Y de buscarse la vida como nadie, y hasta de hacer de Community Manager. Thx mate! ;)

Os dejo con algunas fotos del evento. Si tenéis algunas fotos chulas por favor contactad con nosotros para ampliar el álbum de recuerdos… gracias! :)

 

Y un resumen en forma de Timeline, con algunos tweets del #gapand2016 :D

https://twitter.com/eltitular_es/status/749158636593750017

Video de mi charla en la #dotNetSpain2016

Hola de nuevo,

Lo prometido es deuda, he subido a Channel9 un video sobre mi sesión de ‘async Best practices’ de la pasada #DotNetSpain2016 :)

https://channel9.msdn.com/Blogs/channel9spain/Async-best-practices-por-Llus-Franco

s1

El vídeo dura una hora y veinte minutos aproximadamente y trata todos los contenidos de la sesión y la última demo con un poco más de profundidad.

Espero que os guste. Lo podéis ver online o descargar para más tarde.

Muchas gracias Isa por haber insistido, y al resto por el buen feedback! ;)

Materiales++ de mi sesión ‘async best practices’

Hola de nuevo,

Durante los últimos días me ha contactado bastante gente haciéndome preguntas sobre mi sesión de la pasada DotNet Spain Conference.

Aquí van un par de ellas con sus respuestas, por si son de vuestro interés ;)

“Las demos eran un proyecto de consola, pero qué consola era esa? No es el clásico cmd de Windows, verdad?”

Pues no, desde hace tiempo he sustituido el cmd por la estupenda ConEmu, que permite abrir distintos shells (PowerShell, PuTTY, mintty, GViM, etc) y distribuirlos como tabs o mosaicos.

Podéis descargarla desde: https://conemu.github.io/

m1

En lugar de partir de cero para configurarla, os paso también mis settings por si queréis utilizarlas de punto de partida. Basta con ir a ‘Settings’/’Import’ y posteriormente ‘Save’ :)

ConEmu Settings (XML): http://1drv.ms/1VV4cwp

Y si no os gustan siempre podéis hacer un ‘Reset’ y empezar de cero :P

“En la última demo (la de cancelaciones a la BD) mostraste trazas en el SQL Profiler. Dijiste que tenías una plantilla creada para eso? La podrías compartir si no te importa?”

Of course! Esta plantilla básicamente muestra los eventos Starting y Completed de cada vez que se ejecuta un SQL statement (en este caso un Stored Procedure que tarda unos 5 segundos en completarse). Lo más interesante es que gracias a esta plantilla podemos ver si las peticiones terminan con éxito o han sido canceladas por el usuario, amén de la duración, que también nos puede indicar si ha terminado con éxito o no.

m2

SQL Profiler template: http://1drv.ms/1p43ti6

Para instalar la plantilla en tu SQL Profiler basta con descargarla y hacer doble click. Se abrirá el profiler y os informarà de que la plantila se ha importado con éxito.

A partir de aquí, cada vez que queráis usar esta plantilla de traza, basta con usarla como las que vienen ‘out of the box’:

m3

Intentaré ir ampliando este post con aquellas que crea que pueden ser de interés general. Si tenéis alguna pregunta, ya sabéis :)

Nos vemos,

 

DotNet Spain Conference 2016… I was there!

_1

El pasado miércoles se celebró en Madrid el mayor evento del año en tecnologías de desarrollo Microsoft. Un evento al que han asistido más de 1700 personas de forma presencial y unos cuantos miles más en streaming por Internet.

Y sólo puedo decir una cosa: ha sido una experiencia cojonuda a todos los niveles.

Me he rencontrado con viejos amigos y he conocido otros nuevos, he podido asistir a algunas sesiones ‘pata negra’ de otros colegas, he visto y oído al gran jefe Satya Nadella, y para rematarlo he tenido la oportunidad de poner mi granito de arena con una sesión sobre ‘async best practices’ la cual, por el feedback recibido parece ser que ha gustado a mucha gente, así pues… ¿qué más se puede pedir?

Como bastante gente me ha preguntado, aquí os dejo las slides de mi sesión, así como el código con las demos y la demo sorpresa final:

Slides on Slideshare

Code on GitHub

https://github.com/lluisfranco/AsyncBestPracticesDemos2016

_b

https://github.com/lluisfranco/AsyncDatabaseCancellationDemo

La verdad es que hacía bastantes años que no hacía una sesión para tanta gente, y os tengo que confesar que los 5 minutos antes de empezar fueron ‘complicadillos’. La ventaja es que al fin y al cabo todos los frikis somos como una gran familia, de modo que al empezar la sesión y empezar a hablar de nuestras cositas los nervios desaparecieron desde el minuto cero y todo fue como una seda.

Felicitaciones

Un 10 para la organización. Después de haber podido organizar unos cuantos eventos por mi cuenta y saber lo complicado que es, no quiero ni imaginarme lo que tiene que ser montar un evento de este calibre… chavales, lo habéis bordado. Os podéis tomar unos días de merecidas vacaciones :D

Creo poder decir sin lugar a dudas que ha sido el mejor evento al cual he asistido en España. Felicidades a todos!

Y como al fin y al cabo este es mi blog, me voy a dar un poco de autobombo, que coño! ;)

Aquí van algunos tuits, gracias a todos por el buen feedback!

 

 

DotNet Spain Conference 2015

Este fin de semana he tenido la oportunidad de participar en el mayor evento de la comunidad .NET en España hasta la fecha.

Se ha realizado en la Universidad de Alcalá, con record de asistentes. Cosa que no me extraña viendo la cantidad de charlas y hands on lab que se han realizado en varios tracks en paralelo. La verdad es que ha sido un éxito a todos los niveles, y sólo puedo decir que va a ser difícil superarlo en futuras ediciones. Se ha puesto el listón muy alto! :D

dotnetspain

En lo que respecta a mi, tuve la gran suerte de presentar -y que me aprobaran- una charla conjunta con mi colega Alex Casquete, sobre buenas prácticas sobre async, algo que precisamente no es mainstream pero que curiosamente ha tenido una aceptación muy buena. De hecho ha sido mejor de la que yo pensaba que podía tener en un principio, así que muchas gracias a todos por tanto feedback positivo!

Os dejo aquí las slides de la charla y las demos que utilizamos, ya que -para mi sorpresa- me las ha pedido bastante gente:

Sin embargo, en un evento como este no todo son sesiones técnicas. Lo mejor de todo es que he tenido la oportunidad de volver a encontrarme con un montón de viejos conocidos, con los que compartir buenos momentos y algunas cervezas, de modo que el networking ha sido… fantástico!

Os dejo con algunas fotos del eventazo. Gracias a todos! :D

Serializar listas genéricas en aplicaciones WinRT

andorraenamora

Edit (11/03/2013): Gracias a una sugerencia del colega MVP Javier Torrecilla se ha modificado el código para especificar el Encoding (UTF8Encoding) y así evitar problemas. Thx dude! :)

 

Hola de nuevo,

Rompiendo un poco con la serie de posts sobre las ‘Parallel Series’, hoy quiero escribir acerca de algo totalmente distinto. Y es que ando haciendo mis pinitos con mi primera aplicación Windows Store, y me estoy encontrando con bastantes cosas que no conozco, y que desde mi absoluto desconocimiento de la plataforma, encuentro bastante tediosas de realizar.

Hoy por ejemplo estaba tratando de almacenar ciertos datos en local -ya que para esta aplicación no quiero depender de ninguna base de datos porque en realidad son cuatro datos- y no he encontrado una forma directa de persistir listas genéricas en el sistema de ficheros local.

Si que es cierto que las herramientas están ahí para ser usadas ‘a mano’, pero he echado en falta una forma más sencilla de hacerlo (que no quiere decir que no exista), de modo que he creado una clase para facilitarme el proceso.

Su propósito es muy específico, pero básicamente permite guardar y leer cualquier lista genérica List<T> a un fichero, que puede ser guardado en la carpeta Local, Temporal o de Roaming.

La clase es la siguiente (aunque supongo que es muy mejorable):

using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using System.Xml.Serialization;
using Windows.Storage;

namespace MySampleApp.Domain
{
    public class LocalStorage<T>
    {
        public List<T> Data { get; set; }
        public string Filename { get; set; }
        public StorageFolder StorageFolder { get; set; }

        public LocalStorage(string filename)
        {
            Filename = filename;
            Data = new List<T>();
            StorageFolder = ApplicationData.Current.LocalFolder;
        }

        public async Task SaveAsync()
        {
            if (!await fileExistAsync(Filename))
            {
                await StorageFolder.CreateFileAsync(
                    Filename, CreationCollisionOption.ReplaceExisting);
            }
            await saveToLocalStorageAsync();
        }

        public async Task<List<T>> LoadAsync()
        {
            if (await fileExistAsync(Filename))
            {
                return await loadFromLocalStorageAsync();
            }
            else
            {
                await StorageFolder.CreateFileAsync(Filename);
                return null;
            }
        }

        public async void DeleteAsync()
        {
            try
            {
                if (await fileExistAsync(Filename))
                {
                    var file = await StorageFolder.GetFileAsync(Filename);
                    if (file != null) await file.DeleteAsync();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        private async Task<bool> fileExistAsync(string fileName)
        {
            try
            {
                await StorageFolder.GetFileAsync(fileName);
                return true;
            }
            catch
            {
                return false;
            }
        }

        private async Task saveToLocalStorageAsync()
        {
            var sessionFile = await StorageFolder.CreateFileAsync(
                Filename, CreationCollisionOption.ReplaceExisting);
            using (var sessionRandomAccess = await sessionFile.OpenStreamForWriteAsync())
            {
                var serializer = new XmlSerializer(typeof(List<T>), new Type[] { typeof(T) });
                serializer.Serialize(new StreamWriter(sessionStream, new UTF8Encoding()), Data);
                await sessionStream.FlushAsync();
            }
        }

        private async Task<List<T>> loadFromLocalStorageAsync()
        {
            var sessionFile = await StorageFolder.CreateFileAsync(
                Filename, CreationCollisionOption.OpenIfExists);
            if (sessionFile == null) return null;
            using (var sessionInputStream = await sessionFile.OpenReadAsync())
            {
                var reader = XmlReader.Create(new StreamReader(
                    await sessionFile.OpenStreamForReadAsync(), new UTF8Encoding()));
                var serializer = new XmlSerializer(typeof(List<T>), new Type[] { typeof(T) });
                Data = (List<T>)serializer.Deserialize(reader);
                return Data;
            }
        }
    }
}

Y para utilizarla basta con disponer de una lista de objetos de un tipo T:

var customers = new List<Customer>();
customers.AddRange(getSampleCustomers());

Y posteriormente crear una instancia de LocalStorage:

var storage = new MySampleApp.Domain.LocalStorage<Customer>("customers.xml");
//Opcionalmente podemos cambiar la carpeta de destino (por defecto es LocalStorage)
storage.StorageFolder = Windows.Storage.ApplicationData.Current.RoamingFolder;
//Añadimos los datos a persistir
storage.Data.AddRange(customers );
//Guardar los datos al fichero customers.xml
await storage.SaveAsync();
//Recuperar los datos del fichero customers.xml
await storage.LoadAsync();
//Eliminar el fichero customers.xml
storage.DeleteAsync();

Si alguien tiene alguna sugerencia o mejora que no dude en escribir un comentario.

Nos vemos! :)