MVP Site interview (full version)

MVPPartySeattle2011_thumb[1]

Yesterday there was published my brief interview in the MVP site.

http://mvp.microsoft.com/en-US/Pages/default.aspx (english)

However, it is not the full version, that I publish here. Hope you enjoy it ;)

Lluís Franco Interview

Born in Barcelona (Spain) with more than 20 years of experience in the software development sector, Lluis Franco holds a number of Microsoft official certifications such as MCP and MCTS and has been recognized as MVP the past 10 years due to his active participation and moderation of the Spanish MSDN forums since 1997.

Lluis currently works as project development manager at FIMARGER a financial services company based in Andorra, where he founded the AndorraDotNet user group in 2007, being the first and almost unique user group based in this country.  Since 2010 he is also the president of the Andorra IT Professionals Virtual Association.

He maintains several blogs and is a regular host and speaker in local events in the region, such as the “Geek-A-Paloozaa” conference that took place in April 2012. He also contributes articles to the technological section of a local newspaper.

He resides in Andorra for more than 20 years, he is married and father of two girls.

1. What does it mean being an MVP?

It is something much more important to me now than when I was first awarded, as I wasn’t aware at that time of all the wonderful things that would happen to me and the great people I would meet over the time. Not only at a technical level, what the MVP community of course has, but also for the human quality of the majority of MVPs. I met many of my current best friends thanks to the MVP Program.

2. How was your start in the community?

It happened just by chance. As it was the case of many professionals in the IT industry I needed help to solve a problem and posted a question in the today disappeared Microsoft newsgroups, where I got the answer to my questions. I just loved this way of learning from other community members and one day I decided to give something back to them and I started to reply questions there. Sometime after I started running a webpage, a blog, another blog…. At some point I did a presentation at a local user group meeting and finally I started a new user group, hosting events… And I still really enjoy doing these things today.

3. What would you ask Steve Ballmer?

Let me see… The first thing that comes to my mind is to ask about some Microsoft business segments long-term strategy. But this is something that almost everybody would ask him, so I would rather ask about the good old times… So Steve, in your opinion, what has been the most important fact in Microsoft’s history? I am talking about the key factor or point in time that has made Microsoft what it is today.

4. What is the best software product in history?

I am in love with C#. For me this is the most beautiful, complete, and powerful programming language ever created. So therefore, the best software product for me is Visual Studio 2012, the best IDE in history (or at least the best I have ever used, that are many). Talking about operating systems, I have no doubt; Windows 8 is far the best one. At that point I have to say that I have not always worked with Microsoft products.

5. What would you change on Visual C#?

I would continuously add functional characteristics to it. In the latest versions we have seen the introduction of generic functions, delegates management, LINQ and moreover, lambda expressions have made of C# the programming language I have always dreamed about. It is really fun programming on C#! However some things are still missing such as Nested functions, for example. So as some of my friends mentioned to me, this would make functions to be considered 1st level citizens. There are also other things such as making the Framework and IDE a bit lighter. There are many different types of objects there and some collections could be eliminated.

6. Which is the last book you have read?

I am a compulsive technical book reader. But I also love fiction and science fiction books. I have last read ‘Ready Player One’, a novel with plenty of references of the 80’s : videogames, music, films, role games, comics and even toys. It has a young writing style and I could identify myself with the background described there. I also read technical books and of course, my favorite one: ‘The Silmarillion’.

7. Which music CD would you recommend?

Just one? In that case I would go for Radiohead’s ‘Ok Computer’. I really love this band’s the first albums. I like different kind of music from Bach to the heavy metal, including Jazz music too.

8. What makes you an excellent MVP?

I don’t consider myself an “excellent MVP”. For me being an MVP means a person with some technical skills but that is willing to share his knowledge and passion with the community in different ways, helping others that have helped them before. So the most important thing here is having the right attitude. So somebody that considers himself as being better than others because of the MVP Award probably wouldn’t deserve this recognition.

9. What is in your “Computer Bag”?

There is less and less software and more and more hardware in there. Many small devices, adaptors, that make life easier when I’m travelling. And of course, and old souvenir from the old MVP Program times, a Swiss knife with the MVP logo on it that contains a complete set of different tools, that I of course, have never used, but I hold it just in case.

10. What is the best thing that happened to you since you are an MVP?

Popularity, women, money… (I’m kidding). Maybe having being nominated as “C# MVP Of The Year 2011” as it is an Award that you can have once you are MVP and the winner is chosen by other MVPs within the same expertise. My first trip to Seattle was also great, but if I had to choose just one thing, this would be the people that you meet. There isn’t anything better than a “geeks & beers” meeting.

11. What is your motto?

It is something really simple: “Try to be a better person”, somebody able to be a model for my daughters when they will be older.

12. Who is your hero?

Sheldon Cooper, Yoda, Spock, Frodo, Cálico Electrónico and Fuckowsky from ‘Memories of an engineer’… But if I had to choose just one, this would be Tony Stark: Playboy, millionaire, genius, and with his own armor. However in real life the true heroes are those that do the most difficult thing: doing what is right under any circumstance, for eg. a child with a serious disease that encourages his parents in the bad moments…  This is really a true hero.

13. What does success mean to you?

Enjoying your daily work! In fact this would include two things: first of all having a job, what is not easy in today’s world and secondly, doing what you really enjoy for life. This is a true luck in life and what really can make you happy.

14. What would be your personal Project for this year?

Let’s see… I have already been in Seattle this year, attending to the MVP Summit, and also have organized the “Geek-a-paloozaaa” event in Andorra. So I would like to finish a series of technical posts about parallel computing that I have started some months ago, for what I don’t find the time to at this moment. In the personal side, I would like to spend more time with my loving ones.

See you :-D

Entrevista para el MVP Site (versión completa)

MVPPartySeattle2011

Ayer me publicaron una entrevista en el sitio internacional del programa MVP:

http://mvp.microsoft.com/es-ES/Paginas/default.aspx (spanish)

Sin embargo, no es la versión completa. Ésta la publico aquí, sin cortes. Espero que os guste ;)

Entrevista a Lluís Franco

Nacido en Barcelona y con 20 años de experiencia en el sector del desarrollo de software, Lluís Franco posee varias certificaciones MCP y MCTS y ha sido reconocido como Microsoft MVP durante los últimos 10 años, principalmente por haber sido colaborador activo y moderador en los grupos de noticias y en los foros MSDN de Microsoft desde 1997.

Actualmente trabaja como responsable de desarrollo de proyectos en FIMARGE una empresa del sector financiero situada en Andorra. En 2007 fundó AndorraDotNet, el primer grupo de usuarios y en 2010 la asociación virtual de informáticos del país. Escribe en varios blogs, y es organizador y ponente habitual en los eventos de los grupos de usuarios de la región. También colabora con un periódico local escribiendo artículos para su sección tecnológica.

En lo personal vive en Andorra desde hace más de una década, está felizmente casado con una mujer encantadora y es padre de las dos niñas más guapas del mundo.

1. Que significa ser MVP para ti?

Algo mucho más importante ahora que cuando recibí mi primera nominación, ya que por aquel entonces no era consciente de toda la gente que iba a conocer ni de todo lo que iba a suceder en los próximos 10 años. Y con esto no me refiero sólo al nivel técnico de este colectivo -que lo tiene, y mucho- sino a la calidad humana, porque a muchos de mis mejores amigos actuales los he conocido a través del programa MVP.

2. Cómo empezaste a colaborar en la comunidad?

Sinceramente? Pues de casualidad. La verdad es que como muchos otros profesionales, un día hace unos cuantos años necesitaba ayuda para resolver una duda, y buscando me encontré los ya desaparecidos grupos de usuarios, en los que me ayudaron a resolver la mayoría de mis dudas. Eso me encantó y poco a poco decidí devolver el buen trato recibido ayudando también a otros. Después empecé con una web, un blog, otro blog, a hablar en pequeños eventos, luego también a organizarlos… y mira. Hasta hoy :)

3. Si pudieras preguntarle a Steve Ballmer una pregunta, que te gustaría preguntar?

Ufff… lo primero que me viene a la cabeza es preguntarle por la estrategia a largo plazo de algunas de las líneas de negocio. Aunque pensándolo mejor, creo que todo el mundo debe preguntarle ese tipo de cosas, así que mejor le preguntaría por los viejos tiempos: Así que Steve, si me estás oyendo… ¿cuál crees que ha sido el hecho más importante en la historia de Microsoft? Me refiero a algún punto de inflexión que según tu opinión -y no la de un libro o película- sea lo que ha hecho de Microsoft lo que es hoy en día.

4. Cual crees que ha sido el mejor Software de la historia?

Soy un enamorado de C#. Para mí es, sin ningún lugar a dudas el lenguaje más bello, completo y potente jamás creado, así que por extensión VS2012 es el mejor IDE de la historia (o al menos de los que he usado, que son unos cuantos). En cuanto a sistemas operativos, para mí tampoco no hay duda: Windows 8 con mucha diferencia sobre el segundo. Y que conste que no siempre he trabajado con productos de Microsoft, y algunos me gustan mucho, pero a día de hoy ésta es mi opinión.

5. Si tú fueras el responsable de C# qué cambio te gustaría hacer?

Seguir implementando características de la programación funcional. En las últimas versiones, la aparición de genéricos, el manejo de delegados, LINQ y sobretodo las expresiones lambda han convertido C# en el lenguaje que siempre había soñado. ¡Créeme si te digo que hace muy divertido el desarrollar! Sin embargo todavía faltan cosas, y aunque no son imprescindibles (como las Nested functions) sí que harían -como dicen unos buenos amigos míos- que en C# las funciones fueran consideradas ciudadanos de primer nivel, y así dejarían de darme la paliza. Ah! Y permíteme agregar también otra cosa: Aligerar un poco el Framework y el IDE. Porque después de tantas versiones hay ciertos objetos y unas cuantas colecciones que deberían ser eliminadas… y perder unos Kb nunca viene mal.

6. Cuál fue el último libro que has leído?

Suelo ser un lector compulsivo de libros técnicos, fantasía y ciencia ficción, así que no esperes que te diga que un superventas. A ver, mi último libro ha sido ‘Ready Player One’, una novela llena de referencias de los años 80: Hay videojuegos clásicos, música, películas, rol, comics y hasta juguetes. Si bien el estilo es un poco juvenil, no deja de ser una perla para cualquier freak nacido en los 70, porque al fin y al cabo nos hemos criado en esa época. También suelo tener en mi mesilla de noche algún libro técnico del cuál ojeo fragmentos de vez en cuando y cómo no, mi biblia particular: El Silmarillion.

7. Que CD de música recomiendas?

Uno solo? Entonces supongo que me quedaría con el ‘Ok Computer’ de Radiohead. Lo encuentro un disco redondo dentro del género alternativo y como banda me encantan, sobre todo los primeros discos. Con todo, mi criterio musical va desde Bach hasta el buen Metal, pasando por mucho Jazz, así que no se si mi criterio es el más fiable.

8. Que hace que tú seas un excelente MVP?

No soy un excelente MVP, eso lo tengo clarísimo. Verás, déjame matizar lo que para mí significa ser un MVP: Un profesional con un cierto nivel técnico pero que destaca por querer contribuir a la comunidad, ayudando a otros como antes lo ayudaron a él. Y para eso la actitud es básica, y debe ser más importante que las cualidades técnicas. De modo que si alguna vez veis a alguien decir “Ves? Soy mejor que tú porque soy MVP”, pensar que esta persona no merece formar parte del programa. Es más, tenéis mis datos arriba. Poneros en contacto conmigo, ok? No bromeo.

9. Que contiene tu “Computer Bag”?

Cada vez menos software y más hierro. Y con la proliferación de pequeños dispositivos cada vez llevo más adaptadores, cargadores, conectores universales para los viajes y por supuesto una reliquia de mis primeros días de MVP: Una navaja suiza con el logo del programa MVP que contiene un montón de herramientas. No la he usado nunca, pero no pierdo la esperanza.

10. Cuál es la mejor cosa que te ha pasado desde que eres MVP?

La fama, las mujeres, el dinero… es difícil. Podría decirte que ser escogido como C# MVP of the year, ya que es un premio que se otorga una vez ya eres MVP por parte de tus propios compañeros. O mi primer viaje a Seattle, que también fue algo apoteósico. Pero si tengo que escoger una única cosa me quedo con la gente. Ya lo he dicho antes, pero me ha permitido conocer profesionales como la copa de un pino, que además son gente muy maja y dispuesta a ayudar a la comunidad sin reservas. Y lo mejor de todo es que la gran mayoría son unos geeks como yo. No hay nada como un buen geeks & beers…

11. Cuál es tu lema?

Me encantaría poder soltaros una frase molona, pero la verdad es que mi lema es bastante corriente: Intentar ser mejor persona y alguien en quién mis dos hijas se puedan identificar cuando crezcan. No pretendo cambiar la sociedad, con lo anterior ya tengo trabajo de sobras.

12. Quien es tu héroe?

Sheldon Cooper. Yoda. Spock. Frodo. Cálico. Fuckowsky de ‘Memorias de un ingeniero’, y algún otro que se me olvida. Pero supongo que si debo elegir me quedo con Tony Stark: Un tío que es un genio en varios campos, playboy y que viste su propia armadura de combate… ¡Venga ya! ¿A quién no le gustaría? Sin embargo en el mundo real un héroe es algo mucho más difícil: Alguien que hace lo correcto a pesar de complicadas que están las cosas y sin que nadie lo obligue, un niño con una enfermedad grave dando ánimos a sus padres… Eso si que son héroes!

13. Que significa el éxito para ti?

¡Trabajar de algo que te gusta! Fíjate que en realidad son dos cosas: La primera trabajar, que con la que está cayendo por todos lados, es casi un lujo. Y la segunda, encima, hacer algo que realmente te apasiona. Porque al fin y al cabo es algo que vas a tener que hacer durante muuuuchos años, y si no te apasiona estás perdido, ya que la pasión es el motor que va a hacer que evoluciones con los años. Intentad no perderla!

14. Mencione un proyecto que desearía cumplir este año.

Ya he ido a Seattle al MVP Summit, y también he organizado el primer Geek-a-paloozaaa en Andorra, así que a nivel de trabajo me gustaría terminar una larga serie de posts y videos sobre programación paralela que empecé hace unos meses y la he pausado temporalmente por falta de tiempo. He recibido mucho feedback pidiéndome que la continúe, y eso es lo que voy a hacer. Por otro lado a nivel más personal me gustaría no trabajar tanto, pasar más tiempo con mis seres queridos y no ser tan gruñón a veces. Por pedir que no quede!

Nos vemos! :-D

MVP por décimo año (Frodo, voy a por tí)

MVP_BlueOnly

:-)
Hola a todo el mundo!

Pues eso, que me acaba de llegar EL CORREO. Y a diferencia de otros años, la verdad es que no me acordaba de que hoy era el día D, el día en el que se nombran o renuevan a los MVPs de Octubre… y la verdad es que me he ahorrado algunos nervios. Bueno, al menos hasta hace 2 ó 3 horas, porque la inefable Pilar (que también es de Octubre) me lo ha recordado… Gracias por los nervios! Te debo una! :D

Sin embargo, al final ha llegado:

Estimado/a Lluis Franco i Montanyes,
Enhorabuena. Nos complace presentarle el programa de nombramiento MVP de Microsoft® de 2012. Este nombramiento se concede a los líderes excepcionales de la comunidad técnica que comparten de forma activa su experiencia de alta calidad y de la vida real con otras personas. Le agradecemos especialmente la contribución que ha realizado en las comunidades técnicas en el área de Visual C# a lo largo del pasado año.

La verdad es que este año me hace especial ilusión porque se trata de mi 10º año perteneciendo al programa, y caramba, y eso es una jartá de tiempo! Además, este año toca un anillo especial (como cada 5 años) así que cuando llegue ya os pondré una foto… aunque yo hubiese preferido un jamón ;)

No quiero ponerme sentimental, pero si quiero agradecer a quién sea (nadie sabe exactamente como funciona esto de las nominaciones) el que hay pensado que  merezco pertenecer a este grupo de monstruos. Y quiero decirlo así: Monstruos, porque la gente que pertenece al programa son unos verdaderos cracks técnicos, pero además -salvo raras excepciones- son gente realmente cojonuda. Lo que se llama buena gente, vamos… No es extraño que a muchos de mis mejores amigos los haya conocido aquí.

Dicho esto, como no quiero hacer un post que sea un tocho, os dejo algunos enlaces a los posts de antiguas renovaciones, en los que podréis ver desde fotos de lo mal que lo pasamos cuando nos juntamos, hasta algún video de los bautizos de los nuevos.

MVP Award 2011

MVP Award 2010

MVP Award 2009

MVP Award 2008

Muchas gracias a todos! :D

Parallel Series: Tasks, la 8ª maravilla

Nota: Antes de nada quiero disculparme por haber dejado sin publicar en esta serie durante tanto tiempo, de hecho casi un año. Afortunadamente no ha sido ningún problema de salud, si no el tener demasiados frentes abiertos. Ahora que parece que se van cerrando algunos pienso aprovechar para terminar la serie y embarcarme en algún otro nuevo que ya os contaré.

The show must go on

En los posts previos hemos hablado de PLINQ y de la clase Parallel, dos características que facilitan mucho la ejecución de datos en paralelo, sin embargo si alguien me preguntase cual es la característica que más me gusta de la Task Parallel Library lo tendría muy claro: El manejo de tareas asíncronas mediante la clase Task.

Durante muchos años los desarrolladores hemos tenido que lidiar -más ben pelearnos- con la multitarea y la ejecución de código asíncrono. Ya dese las primeras versiones de C# podíamos crear hilos a mano mediante la clase Thread, pero el proceso distaba mucho de ser sencillo y además adolecía de cierta complejidad para manejar cancelaciones o actualizar la interfaz de usuario. Y aunque han habido intentos de mejora como la interfaz IAsyncResult también han aparecido engendros infumables como el BackgroundWorker, el cual es tan malo como hacerse cirugía cerebral con manoplas uno mismo.

Task al rescate!

Así que cuando apareció la TPL y la clase Task los desarrolladores encontramos por fin un método simple y cómodo para ejecutar código asíncrono y además en paralelo. Y esto es realmente muy importante ya que hoy en día en muchas aplicaciones (al menos las que están bien diseñadas) se ejecutan tareas en paralelo para acceder a recursos externos o ‘costosos’, bases de datos, y sobre todo para actualizaciones de la interfaz de usuario. De hecho es tan importante que será una de las mejoras más importantes en la siguiente versión de C# 5.0 de la cual hablaremos al final de la serie.

TaskClass

Actions everywhere

Al igual que la clase estática Parallel y gran parte de la TPL, la clase Task se basa en acciones, de modo que si no las controlas demasiado dale una ojeada al post que publiqué hace un tiempo sobre el tema.

En su sintaxis más básica, se puede utilizar de este modo:

var t = new Task(() => {
    Thread.Sleep(1000);
    Console.WriteLine("A");
    });
t.Start();
Console.WriteLine("B");

O lo que es lo mismo:

Task.Factory.StartNew(() => {
    Thread.Sleep(1000);
    Console.WriteLine("A");
    });
Console.WriteLine("B");

La única diferencia es que en la primera declaramos la variable especificando la acción a ejecutar y luego la ejecutamos explícitamente mediante su método ‘Start’, y en la segunda no utilizamos ninguna variable, sólo especificamos y ejecutamos la acción mediante el método ‘StartNew’ de la clase ‘Task.Factory’.

Observando el código anterior, qué os pensáis que se escribirá primero? A o B? Evidentemente B, ya que podemos imaginar cómo el código no se detiene en el Thread.Sleep(1000) (éste se ejecuta en otro Thread) de modo que ejecuta inmediatamente el print ‘B’. Correcto.

Pero las tareas son mucho más, permiten desde devolver resultados hasta manejar éstas ‘unidades de trabajo’ encadenando tareas a continuación de otras, esperando a que terminen una o un grupo de tareas antes de ejecutar otra, cancelar una tarea o propagar excepciones entre ellas.

1) Devolver un valor desde una tarea…

Como en un método, una tarea puede devolver desde un tipo básico (int, string) hasta cualquier tipo complejo. Para hacer el ejemplo más interesante vamos a utilizar un método que examina la red local en busca de servidores SQL Server y devuelve una lista de strings:

public static List<string> GetSQLServerNames()
{
    List<string> sqlservernames = new List<string>();
    sqlservernames.Add("local");
    SqlDataSourceEnumerator enumSQLServers = SqlDataSourceEnumerator.Instance;
    foreach (DataRow server in enumSQLServers.GetDataSources().Rows)
    {
        if (server["InstanceName"] is System.DBNull)
            sqlservernames.Add(server["ServerName"].ToString());
        else
            sqlservernames.Add(
                string.Format("{0}\\{1}", server["ServerName"], server["InstanceName"]));
    }
    Console.WriteLine("end get servers");
    return sqlservernames;
}

La ventaja de usar este método es que tarda unos segundos en ejecutarse, con lo cual es un candidato perfecto para ser ejecutado de forma asíncrona:

var getServersAsync = new Task<List<string>>(() => GetSQLServerNames());
getServersAsync.Start();
Console.WriteLine("end call");

Si lanzamos este código observaremos que se imprime ‘end call’ inmediatamente, y tarda unos segundos en imprimir ‘end get servers’. Realmente se está ejecutando asíncronamente!

2) …y al terminar continuar con otra tarea

Ahora supongamos que tenemos otro método que se encarga de actualizar la interfaz de usuario  a partir de la lista anterior:

private void updateServersListUI(List<string> servers)
{
    comboBox1.Items.Clear();
    servers.ForEach(p => comboBox1.Items.Add(p));
}

¿No sería lógico que lo hiciese al terminar la tarea anterior? Pues la verdad es que si, y encadenar tareas es algo trivial y que ofrece mucha potencia al desarrollador. De hecho estoy seguro que ya se os ha ocurrido alguna aplicación ;)

Encadenar tareas es tan sencillo como utilizar el método ‘ContinueWith’:

var getServersAsync = new Task<List<string>>(() => GetSQLServerNames());
getServersAsync.Start();
Console.WriteLine("end button2");
getServersAsync.ContinueWith((p) => updateServersListUI(getServersAsync.Result));

Sobre el papel debería funcionar pero no lo va a hacer, ya que hasta ahora no nos hemos fijado en un detalle: En la plataforma .NET no es posible actualizar un control desde otro hilo distinto al que lo ha creado, y toda la interfaz de usuario se crea en el main thread o hilo principal. Y esta limitación todavía existe.

Estableciendo el contexto de ejecución

Antes de la TPL para actualizar la interfaz de usuario desde otro hilo debíamos utilizar el método ‘Invoke’ de la clase ‘Control’, de modo que deberíamos modificar el método anterior de este modo:

private void updateServersListUI(List<string> servers)
{
    if (this.InvokeRequired) this.Invoke(new Action(() =>
    {
        comboBox1.Items.Clear();
        servers.ForEach(p => comboBox1.Items.Add(p));
    }));
}

Pero no va a ser necesario, ya que como parte de la magia de la TPL se nos ofrece la posibilidad de llamar a ‘TaskScheduler.FromCurrentSynchronizationContext’ que nos permite acceder a la interfaz de usuario de forma segura. Así pues lo único que hay que modificar el código anterior es encadenar la segunda tarea usando el contexto de sincronización antes mencionado y olvidarnos de la llamada a Invoke:

getServersAsync.ContinueWith((p) => updateServersListUI(getServersAsync.Result),
TaskScheduler.FromCurrentSynchronizationContext());

Esperando la ejecución de varias tareas

Otra característica muy interesante es la posibilidad de esperar a que termine un grupo de tareas entero, o sólo una de ellas. Supongamos que tenemos unja serie de tareas que se encargan de aplicar unos efectos a una serie de imágenes:

var t1 = Task.Factory.StartNew(
    () => pictureBox1.Image = Properties.Resources.Landscape08.Invert());
var t2 = Task.Factory.StartNew(
    () => pictureBox2.Image = Properties.Resources.Landscape08.Grayscale());
var t3 = Task.Factory.StartNew(
    () => pictureBox3.Image = Properties.Resources.Landscape08.Brightness(140));
var t4 = Task.Factory.StartNew(
    () => pictureBox4.Image = Properties.Resources.Landscape08.Contrast(80));
var t5 = Task.Factory.StartNew(
    () => pictureBox5.Image = Properties.Resources.Landscape08.Gamma(1, 5, 1));
var t6 = Task.Factory.StartNew(
    () => pictureBox6.Image = Properties.Resources.Landscape08.Color(255, 0, 0));

Podría ser interesante no seguir ejecutando el código hasta que la primera termine, o hasta que terminen todas, o hasta que terminen todas pero con un timeout. O sea, que si no terminan todas en 100 milisegundos seguir con la ejecución:

Task.WaitAny(new Task[] {t1, t2, t3, t4, t5, t6});
Task.WaitAll(new Task[] {t1, t2, t3, t4, t5, t6});
Task.WaitAll(new Task[] {t1, t2, t3, t4, t5, t6}, 100);

Otra forma de conseguir esto es mediante la creación de una tarea, especificando que debe esperar a que se complete alguna tarea o todas las especificadas:

var t7 = Task.Factory.ContinueWhenAll(new[] { t1, t2, t3, t4, t5, t6 }, (t) =>
    {
    //DoSomething...
    });

Cancelando tareas

Al igual que en posts anteriores, la clase Task también admite cancelaciones, y a mi juicio suelen ser más utilizadas que sus equivalentes en PLINQ o Parallel, ya que pueden permitir a un usuario cancelar el acceso a un recurso que tarda más de lo previsto (una URL p.e.) y las tareas que debían ejecutarse a continuación.

Partiendo de la base de un método que hace un trabajo largo:

private void DoALongWork(CancellationTokenSource cs)
{
    try
    {
        for (int i = 0; i < 100; i++)
        {
            Thread.Sleep(10);
            cs.Token.ThrowIfCancellationRequested();
        }
    }
    catch (OperationCanceledException ex)
    {
        Console.WriteLine(ex.Message);
    }
}

Podemos cancelar la tarea llamando al método ‘Cancel’ del token:

var cs = new CancellationTokenSource();
var t = Task.Factory.StartNew(
    () => DoALongWork(cs)
    );
Thread.Sleep(500);
cs.Cancel();

Y al cancelarse el código entrará en el catch del método ‘DoALongWork’ en el que se realizarán las acciones apropiadas a la cancelación.

Cancelación y estado

Para terminar, en algunos casos puede ser interesante que en caso de éxito la tarea llame a una segunda, pero en cambio si se cancela llame a una tercera. Para poder hacer esto debemos preguntar por el estado de la primera tarea y realizar un pequeño truco: La excepción no debe ser interceptada en un bloque try!

Así pues el código del método quedaría de este modo (sin try):

private void DoALongWork(CancellationTokenSource cs)
{
    for (int i = 0; i < 100; i++)
    {
        Thread.Sleep(10);
        cs.Token.ThrowIfCancellationRequested();
    }
}

Y la llamada de este otro:

var cs = new CancellationTokenSource();
var t = Task.Factory.StartNew(
    () => DoALongWork(cs)
    );
Thread.Sleep(500);
cs.Cancel();

t.ContinueWith(task =>
    {
        switch (task.Status)
        {
            case TaskStatus.Faulted:
                MessageBox.Show("Fail");
                break;
            case TaskStatus.RanToCompletion:
                MessageBox.Show("Success");
                break;
        }
    }, TaskScheduler.FromCurrentSynchronizationContext());

Como podéis observar, podemos cambiar el flujo del código en función del estado de la tarea.

Importante: Para poder ejecutar este último ejemplo es necesario ejecutar sin depuración (Ctrl+F5)

Bueno, nos hemos dejado algunas cosas en el tintero, pero para no hacer muy largo éste post las veremos más adelante, en otros posts avanzados de la misma serie.

Hasta entonces prometo actualizar la serie con más frecuencia que hasta ahora ;)

Volver al índice de contenidos

Tienes Suscripción MSDN? Pues a publicar en la Store!

Good news!

Acabo de enterarme en tweetland gracias al colega @wasat de que todos aquellos poseedores de una suscripción MSDN (y no me refiero sólo a la ultimate, si no a todas aquellas que incluyen Visual Studio) también disponen de un beneficio adicional:

Se trata de una cuenta para desarrollar aplicaciones y publicarlas en la Windows Store, además de la ya conocida cuenta para publicar aplicaciones para Windows Phone 7. WOW!

msdn01

De este modo, todos aquellos que hemos empezado a hacer nuestras primeras aplicaciones lo tenemos más facil que nunca. Basta con ir al perfil de vuestra suscripción (‘Mi cuenta’ en el menú superior) y verificar si disponéis de la opción Cuenta para desarrolladores de Windows Store, en la que podreis solicitar un código de registro.

msdn_store_account

A partir de aquí, os recomiendo un vistazo a este artículo en el que indicaa cómo registrar el código en la store y aclara algunos de los términos sobre el uso del código de registro, como por ejemplo que de momento sólo se pueden registrar empresas y no desarrolladores:

En este momento solo se pueden registrar cuentas del tipo Empresa. No se podrá completar el registro si selecciona Persona como tipo de cuenta.

Peeeeero que esto no os frene ni un momento… me ha dicho un pajarito que si tenéis lista vuestra aplicación para Windows 8 os podéis poner en contacto con el propio José Bonnin (@wasat) o con la cuenta oficial de MSDN España (@esmsdn) y os ayudarán a pasar un excelence lab y publicar vuestra aplicación en la store.

Así que… Espartanos! A desarrollar! :-D

Nota para Microsoft MVPS: Supongo que todos sabéis que uno de los beneficios de pertenecer al programa es una suscripción Visual Studio Ultimate with MSDN, así que chavales… let’s dev! ;)

El misterio de Visual Studio 2010 y el proxy

En la empresa en la que trabajo utilizamos un proxy para acceder a Internet: Microsoft Forefront, y como todos los proxies tiene cosas buenas y no tan buenas. Pero en el caso que hoy nos ocupa, resulta que hoy el proxy me estaba jugando una mala pasada.

La cuestión es que en el proyecto que estaba desarrollando tenía que conectarme a un web service, pero cuando he ido a agregar la referencia al servicio me ha saltado el siguiente error:

image

(*) Obviamente la URL del servicio no es esa, aunque sirve perfectamente para ilustrar el proceso (al menos mi proxy tampoco deja agregar esta URL).

Si vemos el error en más detalle podremos apreciar claramente que el error es de autenticación:

image

Sin embargo, al intentar acceder a la URL con el navegador, éste accede perfectamente:

image

Uhm… que raro.

De modo que sólo queda suponer que Visual Studio no está utilizando las características de proxy definidas en las propiedades de Internet en el panel de control. Mal rollo porque hasta dónde yo se no hay ningún sitio en el que se puedan especificar. Sin embargo, después de investigar un poco he visto cómo se puede ‘forzar’ a Visual Studio a que utilice estas credenciales por defecto.

Basta con ir al path en el que tengáis instalado Visual Studio (por defecto “C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE”), editar el fichero devenv.exe.config con privilegios de administrador y en la sección <system.net> agregar el siguiente fragmento XML:

<defaultProxy useDefaultCredentials="true" enabled="true">
<proxy usesystemdefault="True" />
</defaultProxy>

De este modo:

image

Una vez realizado el cambio, reiniciar Visual Studio si estaba ejecutándose y ya podremos conectar con el servicio y agregar la referencia:

image

Saludos,

Today’s review – Advanced Installer

Hi again guys! :)

Today I’d like to tell you why I decided to change my software deployment method.

ClickonceHell

I’ve spent a lot of time in the last days looking for an alternative way to deploy client applications. During this period I’ve tested different options (including the options provided by Microsoft Visual Studio) and finally I’ve decided to use Advanced Installer.

But before that I wanna tell you why I’ve arrived to this point.

My situation

As a developer I’m still building some Windows applications, because most of these applications are targeted to the business market. And well, until now I’ve been using the typical Setup projects or ClickOnce, depending on each project.

Until now.

Because ClickOnce is not the best solution for complex deployments. It’s quite good for simple or medium scenarios, but is not enough when you need to use merge modules -or equivalent-, database scripts, registry entries, launch conditions, etc.

What about Setup projects? Well, I decided not to use them anymore since I read this post. Because these modules won’t be supported in future versions of Visual Studio. If you haven’t read this post, and you’re still using it, you must read it now.

So, in the previous link you’ve noticed that WiX is recommended instead of Setup projects, but in my opinion WiX is not a valid option, because doesn’t allow neither use designers to customize the installer nor install prerequisites.

For your information: The following table compares the features of Windows Installer Setup Projects, InstallShield 2010 Limited Edition, and the Windows Installer XML Toolset.

Advanced Installer

This application provides a powerful and easy way for making your deployments via Windows Installer plattform, offering different editions: From a freeware with the most common options to an edition for architects, with lots of stunning features like integration with App-V, VMware or System Center deployments.

In my particular case I downloaded a trial version (limited to 30 days) and started to make a test with a medium-size solution, with 20 projects inside. After playing a couple of hours with the tool, I built a complete setup project, including some advanced features like: Merge modules, file associations, launch conditionals (both system and software), prerequisites, registry entries and sql scripts. And of course with complete control over the installation options and the appearance of the setup wizard.

SetupOptions

WOW! Not bad at all… And most of these options are provided by free (not all but most of them).

Coming soon

Now I’m thinking in implement some advanced features, like licensing, trials  and updates. Yes, you can implement a licensing mechanism, and not only in a simply way. You can use your own C++ DLL, or send a POST to a URL to validate the license. It sounds really good!

Another interesting feature when using serial validation allows you to make trial packages. It allows your users to evaluate your product before purchasing, and also enables users to register after they have received a valid key. After the trial period expired the user will be able to run your application only after registration.

Licensing

Finally, my favorite: Advanced Installer provides a way to check for updates. If this option is enabled, before installing the application package, a version check will be executed. If a newer version of the installation package (current MSI) is available it will be downloaded and installed instead of the current one.

My review

A stunning product, with lots of options for making your deployments quickly and easy. You can customize your setup experience in great detail and the UI helps you to create complex installation packages in minutes.

Compared with other market leaders is much easier to use and it has a shortest learning curve.

Sincerly impressed. Good job guys! :)

Advanced Installer website: http://www.advancedinstaller.com/

PS – <IRONIC MODE ON> Ok. I understand traditional Windows applications are from the past, and nowadays everybody is developing web applications or WP7/Metro applications… this kind of developments doesn’t need too complex deployments, and maybe it’s better for everybody the marketplace-based model… But there are a few people that are still developing business applications. I just wanna say… PLEASE MICROSOFT, DON’T FORGET US! :)

Este es el manifiesto de los Free Radicals.

free-radical

Hacemos trabajo que es, ante todo, reconfortante. Pero cuando hacemos algo esperamos una validación extrínseca. No creamos solo para nosotros mismos. Queremos conseguir un impacto real y duradero en el mundo que nos rodea.

Pedimos libertad, tanto si trabajamos en compañías o por nuestra cuenta, para experimentar, participar en múltiples proyectos a la vez y desarrollar nuestras ideas. Avanzamos dentro de la flexibilidad y somos más productivos cuando nos sentimos totalmente comprometidos.

Hacemos muchos proyectos y, por lo tanto, cometemos errores a menudo. Vemos los pequeños fallos como oportunidades de aprendizaje y parte de nuestra educación experimental.

Tenemos poca tolerancia con las fricciones de la burocracia, redes de influencia de vieja escuela y las prácticas de negocio anticuadas. A menudo cuestionamos los procedimientos estándar y nos hacemos valer. Pero incluso cuando no podemos, no nos rendimos al status quo. En su lugar, encontramos fórmulas más interesantes a nuestro alrededor.

Esperamos que las compañías saquen lo mejor de nuestro trabajo y talento, ya sea una start-up o una gran compañía. Cuando nuestros proyectos y aprendizajes se estancan, nos vamos. Pero cuando podemos producir un impacto en algo que nos interesa, ¡estamos encantados! Queremos hacer nuestro trabajo siempre lo mejor que podemos.

Consideramos el open source, las API y el inmenso conocimiento colectivo de internet nuestro arsenal personal. Wikipedia, Quora y las comunidades abiertas para diseñadores, desarrolladores y pensadores fueron creadas por nosotros y para nosotros. Siempre que sea posible, difundimos conocimiento colectivo para ayudar a tomar mejores decisiones para nosotros mismos y nuestros clientes.

Pensamos que “networking” es compartir. Al compartir nuestras creaciones y las cosas que nos fascinan, creamos una comunidad de seguidores que nos dan feedback, ánimo y nos conducen hacia nuevas oportunidades. Por este motivo (y otros más), a menudo (no siempre) optamos por la transparencia sobre la privacidad.

Creemos en la meritocracia y el poder de las redes online para mejorar las habilidades que nos permiten hacer lo que nos gusta. Vemos la competencia como una motivación positiva más que como una amenaza.

Nos ganamos muy bien la vida haciendo lo que nos gusta. Nos consideramos, a la vez, artesanos y empresarios. A menudo somos nuestros propios departamentos de contabilidad, nuestra agencia de publicidad, nuestro asesor de desarrollo de negocio y nuestro comercial. Dedicamos la energía necesaria para invertir en nosotros mismos como negocio y empleamos las mejores herramientas y conocimientos (la mayoría son libres y online) para gestionar nuestro trabajo como una empresa de hoy.

Vía: YOROKUBU

Amazing: Awarded MVP of the Year!

mvplogohor

Surprised. Puzzled. Amazed. These are the words that define better my current feelings.

However, while writing these lines I’m just realizing I have a blissful smile, or maybe just a stupid smile. Why? Because I just received an email from Lisa Feigenbaum (Microsoft Community Program Manager) with this message:

“Congratulations on being awarded C# MVP of the Year based on your contributions in 2011!”

WOW! That’s amazing, and sincerely, totally unexpected

For the last 9 years I have been awarded a Microsoft MVP, and believe me, that’s something very important for me. Maybe not for being recognized as an ‘expert’ (it is hard to use that word while there are so damn good people out there), but because they recognize the work of helping the community.

So now, in a private survey all the C# MVPs around the world and the product team have decided to recognize my contributions with the ‘C# MVP of the year’ award, whatever that means.

On the next March 2nd there will be an honorary dinner sponsored by S. Somasegar (“Soma”), Senior Vice President of the Developer Division at Microsoft, with other executives and community leads in the division. Unfortunately, I won’t be able to attend because I come back from Seattle the same day in the morning. Nevertheless I promise you while I am in Seattle I’ll try to have a beer with some of these guys.

From here I’d like to congratulate the rest of the winners (there are 29 in all categories) and thank all my colleagues. Hey people, you’re great!

Kind regards from Andorra,

PS – Next week I´ll start telling you my experiences @ Seattle.

Alucina: Premiado C# MVP of the year!

mvplogohor

Sorprendido. Perplejo. Flipado. Esas son ahora mismo las palabras que mejor pueden definir mi estado actual.

No obstante, a medida que voy escribiendo estas líneas y lo voy realizando voy experimentando una alegría enorme, que ya está se empezando a transformar en una sonrisa beatífica, por no decir estúpida. Y es que he recibido un mail de Lisa Feigenbaum (Microsoft Community Program Manager) con un mensaje que dice:

“Congratulations on being awarded C# MVP of the Year based on your contributions in 2011!”

WOW! Mola mucho, aunque la verdad y aunque suene a tópico no me lo esperaba ni de coña…

Durante los últimos 9 años he tenido la suerte de ser reconocido como Microsoft MVP y eso es algo que valoro mucho. No tanto por ser reconocido como ‘experto’ (cuesta mucho emplear esa palabra habiendo gente tan condenadamente buena), sino por el hecho que se reconozca la labor de ayudar a la comunidad. Que al fin y al cabo es lo que debería contar en el programa MVP, y -seamos sinceros- no siempre es lo único que cuenta.

Pues bien, ahora resulta que en una votación entre los 234 compañeros MVP de la categoría de C# repartidos por todo el mundo y el equipo de producto han decidido nombrarme MVP de C# del año, sea lo que sea eso, que la verdad, todavía no lo tengo muy claro.

De entrada el próximo 2 de Marzo, hay una cena en Seattle con S. Somasegar (“Soma”), Senior Vice President de la división de desarrollo en Microsoft, así como otros peces gordos y miembros destacados de la comunidad. Para mi desgracia, no voy a poder asistir pues vuelvo de Seattle en mismo día por la mañana pero durante mi estancia en el campus de Microsoft trataré de al menos tomarme una cerveza con alguno de estos personajes :-)

Desde aquí quiero dar la enhorabuena al resto de premiados (he contado 29 en todas las categorías) y a todos mis compañeros. De verdad gente, sois grandes! :-D

Un abrazo a todos,

PD – La semana que viene ya os empezaré a contar mis batallitas en Seattle, en directo.