Solving Combinatory Problems with LINQ

”I saw you, I knew you, I touched you
When the world was young …”
Jimmy Page & Robert Plant, “When the World Was Young” (1998)

Hace unos días, en el contexto de una conversación con un colega de trabajo, me acordé del artículo “Solving Combinatory Problems with LINQ“, que en su día me publicó gentilmente MSDN y aún sigue por ahí. Sin duda alguna, y por una diferencia abismal (gracias, por supuesto, a Microsoft), es el texto más leído que haya escrito yo jamás, y en su momento dio lugar a discusiones como ésta.

Revisando el artículo al cabo de todo este tiempo, se me antoja ciertamente un poco naïve; me consuela la idea de que, al fin y cabo, eran tiempos en que “el mundo era joven” y LINQ acababa de nacer.


Referencia musical: Durante la década de los 90, los líderes del inolvidable Led Zeppelin, Jimmy Page y Robert Plant, publicaron dos discos que hicieron las delicias de los numerosos fans de la banda: “No Quarter” (1994) y “Walking into Clarksdale” (1998). “When the World Was Young” pertenece al segundo de esos trabajos.

"Welcome to the Jungle" en dNM

”Welcome to the jungle / We’ve got fun ‘n games 
We’ve got everything you want / Honey, we know the names…”
Guns N’ Roses, “Welcome to the Jungle” (1987)

Una de las personalidades del mundo de la informática cuya trayectoria sigo desde hace años con más interés (y admiración) es Herb Sutter, Lead Architect del equipo de Visual C++ en Microsoft y Chair del Comité de Estandarización de C++. Se trata, sin dudas, de una luminaria, cuya relevancia transciende las fronteras de la empresa para que trabaja y cuyos múltiples aportes permean a toda la industria informática. Herb es, además, un consumado comunicador, que destaca tanto por sus conferencias (de entre las más recientes, ver, por ejemplo, las dedicadas a C++ 11 en los eventos “Going Native 2012” y “Lang.NEXT 2012”, disponibles en Channel 9), sus libros (“Exceptional C++” y “More exceptional C++” son realmente excepcionales), como por sus artículos. De entre estos últimos, quisiera destacar dos que han constituido, cada uno en su momento, certeros análisis de la situación actual del hardware y de las implicaciones de dicha situación para el desarrollo de software: “The Free Lunch is Over” (diciembre de 2004) y “Welcome to the Jungle” (diciembre de 2011), este último disponible públicamente en su sitio web.

Durante el pasado mes de febrero, Herb tuvo la gentileza de conceder una entrevista a dNM (antes dotNetManía), en la que cuenta a Luis Fraile los detalles de sus actividades al frente de los equipos de trabajo dedicados al desarrollo de WinRT y Visual C++ en Microsoft, así como del Comité de Estandarización de C++. Pero no solo eso: Herb tuvo asimismo la amabilidad de permitirnos traducir “Bienvenido a la jungla (del hardware)” y publicarlo en castellano, para de esta forma hacerlo llegar a un público aún más amplio. Así que si aún no ha leído el artículo y desea conocer (en nuestro idioma) las opiniones de Herb Sutter con respecto al presente y futuro de la informática, y en particular sobre temas de tanta actualidad como el estado actual de la Ley de Moore o el futuro de la nube, no se pierda los ejemplares de abril y mayo de este año (nº 91 y 92) de dNM.


Referencia musical: Me imagino que Herb se haya “inspirado” para dar título al artículo en el famoso tema homónimo de Guns N’ Roses; banda que ocupó uno de los lugares más destacados en el rock de finales de los ’80 y principios de los ’90, y que dejó una huella que perdura hasta el presente. Incluso he visto algunas encuestas recientes que sitúan a Axl Rose como el frontman más destacado de todos los tiempos, un lugar que para mí siempre ocupará Robert Plant. Personalmente, el esplendor de Guns N’ Roses coincidió con una época en la que no oía mucho rock; tiempos duros, como son casi siempre los que preceden y suceden a una emigración.

NOTA: Las opiniones reflejadas en este artículo son mías propias, y no han sido revisadas ni aprobadas por la empresa en la que trabajo.

Applying LINQ to new data types

[This article was originally published in MSDN C# Developer Center, February 2008]

Given the enormous expressive power that LINQ (Language Integrated Query) puts in the hands of developers, it is not surprising that we have started to search for ways to “LINQ-enable” more and more data types and technologies. As Dinesh Kulkarni humorously put it in this post, soon we will have even “LINQ to Coffee Machine” :-). .NET Framework 3.5 and C# 3.0 offer us several ways to achieve that goal.

In many occasions, all that is needed in order to be able to apply integrated queries to objects of a certain type (of our own, or belonging to the .NET Framework class library) is to define for the type one or more entry points which could serve as the generators to which all the basic object query machinery incorporated into .NET Framework (LINQ to Objects) can be applied. This has been, for instance, the approach used in LINQ to XML, where a set of iterators (implemented as extension methods) have been defined that produce subsets of the nodes that compose an XML document as IEnumerable<T> sequences; once you call any one of these methods, you obtain an XML node generator to which the predefined implementations of the standard query operators Where(), OrderBy(), etc. can be applied. LINQ to XML also introduces several specialized query operators (“extensions”), but that’s another story.

As an example of simple “LINQ activation” of classes, here we present the implementation of an extension that will allow us to use integrated query syntax over data received through a named pipe. Pipes are a well-known inter-process communication mechanism that has been in use since very long in the DOS/Windows world; but only with .NET Framework 3.5 we will be able to use them in our managed code applications without having to recur to platform invocation. Pipes can be anonymous, conceived to be used to communicate a parent process and a child process residing on the same machine; or named, which offer much more power and can be used over a network. Specifically, named pipes offer message-oriented communications.

The following program implements a server which sends UTF8-encoded string messages to its listener through a pipe named CS3:

using System;
using System.Text;
using System.IO;
using System.IO.Pipes;

namespace Demos
{
    class Server
    {
        static void Main(string[] args)
        {
            const string PipeName = “CS3”;

            using (NamedPipeServerStream pipeStream =
                new NamedPipeServerStream(PipeName, PipeDirection.InOut,
                    1, PipeTransmissionMode.Message, PipeOptions.None))
            {
                pipeStream.WaitForConnection();

                // sending messages
                UTF8Encoding encoding = new UTF8Encoding();
                for (int i = 1; i <= 1000; i++)
                {
                    string msg = i.ToString();
                    byte[] bytes = encoding.GetBytes(msg);
                    pipeStream.Write(bytes, 0, bytes.Length);
                }
            }
        }
    }
}

The client, on the other end, composes received messages: 

namespace Demos
{
    class Client
    {
        static void Main(string[] args)
        {
            const string Server = “.”;
            const string PipeName = “CS3”;

            using (NamedPipeClientStream pipeStream =
                    new NamedPipeClientStream(Server, PipeName, PipeDirection.InOut))
            {
                pipeStream.Connect();
                pipeStream.ReadMode = PipeTransmissionMode.Message;

                Decoder decoder = Encoding.UTF8.GetDecoder();

                const int BufferSize = 256;
                byte[] bytes = new byte[BufferSize];
                char[] chars = new char[BufferSize];
                int numBytes = 0;
                StringBuilder msg = new StringBuilder();
                do
                {
                    msg.Length = 0;
                    do
                    {
                        numBytes = pipeStream.Read(bytes, 0, BufferSize);
                        if (numBytes > 0)
                        {
                            int numChars = decoder.GetCharCount(bytes, 0, numBytes);
                            decoder.GetChars(bytes, 0, numBytes, chars, 0, false);
                            msg.Append(chars, 0, numChars);
                        }
                    } while (numBytes > 0 && !pipeStream.IsMessageComplete);
                    decoder.Reset();
                    if (numBytes > 0)
                    {
                        // we’ve got a message – process it
                        Console.WriteLine(msg.ToString());
                    }
                } while (numBytes != 0);
            }
            Console.ReadLine();
        }
    }
}

What if the client process needed to filter, sort, group, etc. the received strings? Traditional coding approaches to implement these tasks could be applied, of course, but a more far-sighted approach would be to define a “LINQ entry point” in the form of an extension method for the NamedPipeClientStream class, so that it can be used as source for language integrated queries: 

namespace PlainConcepts.Linq
{
    public static partial class Extensions
    {
        public static IEnumerable<string> GetMessages(
            this NamedPipeClientStream pipeStream)
        {
            pipeStream.Connect();
            pipeStream.ReadMode = PipeTransmissionMode.Message;
 
            Decoder decoder = Encoding.UTF8.GetDecoder();
 
            const int BufferSize = 256;
            byte[] bytes = new byte[BufferSize];
            char[] chars = new char[BufferSize];
            int numBytes = 0;
            StringBuilder msg = new StringBuilder();
            do
            {
                msg.Length = 0;
                do
                {
                    numBytes = pipeStream.Read(bytes, 0, BufferSize);
                    if (numBytes > 0)
                    {
                        int numChars = decoder.GetCharCount(bytes, 0, numBytes);
                        decoder.GetChars(bytes, 0, numBytes, chars, 0, false);
                        msg.Append(chars, 0, numChars);
                    }
                } while (numBytes > 0 && !pipeStream.IsMessageComplete);
                decoder.Reset();
                if (numBytes > 0)
                {
                    // we’ve got a message – yield it!
                    yield return msg.ToString();
                }
            } while (numBytes != 0);
        }
    }
}

Note that thanks to the use of an iterator, queries built around this extension method will take advantage of lazy evaluation, so that messages will be retrieved on demand, as they are needed by the client application.

With such an extension method at hand, we will be able to process messages received from a named pipe stream this way:

namespace Demos
{
    using PlainConcepts.Linq;
 
    class Client
    {
        static void Main(string[] args)
        {
            const string Server = “.”;
            const string PipeName = “CS3”;

            using (NamedPipeClientStream pipeStream =
                    new NamedPipeClientStream(Server, PipeName, PipeDirection.InOut))
            {
                var input = from s in pipeStream.GetMessages()
                            where string.Compare(s, “3”) < 0
                            orderby s
                            select s;
                foreach (var s in input)
                    Console.WriteLine(s);
            }
            Console.ReadLine();
        }
    }
}

Processing messages this way can save us a lot of coding, making at the same time our code much more elegant and readable.

Download source code (VS 2010)

"C# 3.0 y LINQ" disponible en formato PDF

”All over the world
Everybody got the word …”
The Electric Light Orchestra, “All Over the World” (1980)

Desde hace unos días, todos los libros de la editorial Krasis Press (incluido mi “C# 3.0 y LINQ“) están a la venta en formato PDF a precios, en mi opinión, muy razonables. Como hacen prácticamente todas las demás casas que editan contenidos digitales, las copias personalizadas se generan dinámicamente y llevan una traza que identifica al comprador final.

Hace tiempo que perdí la cuenta de los amigos de toda Latinoamérica que me han escrito desde la publicación del libro, preguntando cómo conseguir un ejemplar; me consta que en una gran parte de los casos la ilusión se esfumaba completamente cuando la editorial, a quien yo trasladaba puntualmente los mensajes, les comunicaba los (inevitables) gastos de envío asociados a la compra. A partir de ahora, para decirlo en gallego (como una especie de homenaje a mi buen amigo José Manuel Alarcón :-), ¡Nunca mais!


Referencia musical: The Electric Light Orchestra (ELO) fue un grupo de pop-rock que gozó de gran popularidad durante los ´70 y buena parte de los ´80. Surgido con la idea de crear un rock con referencias a la música clásica (si le interesa, busque la versión de ELO de “Roll Over Beethoven“, que data de 1973), lo que me atrajo originalmente hacia ELO fue la presencia en la banda de mi instrumento favorito, el violín. Como ocurrió a muchos de los grupos de la época, su sonido se fue haciendo más comercial en la medida que el éxito iba creciendo; “All over the World” (1980) forma parte de la banda sonora de la película musical “Xanadú“.

Libros recomendados

”So you run and you run to catch up with the sun but it’s sinking
Racing around to come up behind you again…”
Pink Floyd, “Time”, from “The Dark Side of the Moon” (1973)

De manera similar a lo que sugiere el tema inmortal de Pink Floyd, esto de estar al día en todas las tecnologías que nos interesan se convierte cada vez más en misión imposible: cuando crees que ya “controlas” la versión N de la tecnología X, aparece su versión N+1.

Durante los últimos fines de semana, he estado intentando ponerme al día en algunas de las tecnologías que no utilizo de momento en el día a día y que han progresado bastante desde la última vez que “tropecé” seriamente con ellas; concretamente, me refiero a Silverlight y Entity Framework. Para ello, me he apoyado en dos excelentes recursos en castellano, escritos por grandes amigos y aún mejores profesionales, que se me antojan ideales no solo para los desarrolladores .NET castellanohablantes que quieran ponerse al día en las más recientes novedades incorporadas a las respectivas tecnologías, sino también para aquellos que se aproximen por primera vez a ellas y necesiten una fuente que los lleve de la mano, prácticamente desde cero y de una manera concisa, pero completa, a través de los múltiples tópicos que son simplemente imprescindibles para poder aplicarlas con éxito. Me estoy refiriendo a:

  • Programación en Silverlight 4.0“, de Marino Posadas (Netalia, ISBN 978-84-93489535). Una obra que, a pesar de su título, versa no solo sobre los temas más directamente relacionados con la programación en sí, sino también sobre los que tienen que ver con el diseño de interfaces de usuario; el capítulo dedicado a Expression Blend 4 es un buen ejemplo de ello. Esta edición no solo “toca” las nuevas características que se incorporaron por primera vez en la versión 4 de Silverlight (en particular, todo lo relacionado con la ejecución fuera del navegador), sino que además incluye un capítulo que describe los fundamentos del desarrollo de aplicaciones Silverlight para Windows Phone 7.
  • ADO.NET Entity Framework 4.0. Aplicaciones y servicios centrado en datos“, de Unai Zorrilla et al (Krasis Press, ISBN 978-84-93669676). Aunque, por razones obvias (le tengo mucho cariño a este libro, cuya primera versión ayudé a “traer al mundo”), puede que mi opinión no sea 100% imparcial, creo sinceramente que la presente edición mejora sensiblemente la original, complementando muchos de los temas originales, poniendo en su lugar a algunos de ellos que por aquel entonces se antojaban más relevantes, e incorporando excelentes presentaciones de prácticamente todas las nuevas características aparecidas con la versión 4.0. Otro gran “plus” de esta nueva edición es su mayor orientación práctica, con mejores ejemplos y un nuevo capítulo, “EF 4.0 en el mundo real”, dedicado a presentar las líneas generales del desarrollo de aplicaciones corporativas en múltiples capas basadas en EF 4.0 a través de un ejemplo disponible en Codeplex.

En resumen, dos excelentes obras, que recomiendo de corazón desde aquí a los lectores.

NOTA: Las opiniones reflejadas en este artículo son mías propias, y no han sido revisadas ni aprobadas por la empresa en la que trabajo.


Referencia musical: Para mí, el lugar que ocupa “The Dark Side of the Moon” (1973) en el mapa de la cultura popular occidental contemporánea lo define una estadística: 741 (me apasionan las estadísticas; tal vez por eso sea que me aferro desesperadamente al béisbol, en estos tiempos en que arrasan el soccer y el fútbol americano). 741 es el número de semanas consecutivas que estuvo “La cara oculta” en la lista Billboard de los 200 álbumes más vendidos (entre 1973 y 1988). Fueron más de 14 años, casi el doble de lo que hayan logrado alcanzar sus más cercanos perseguidores. Y ello, a pesar de no tratarse de un producto fabricado para el consumo fácil, estrictamente hablando. Un disco simplemente imprescindible, al igual que la mayoría de los demás trabajos de la banda, como “Wish You Were Here” (1975) o “The Wall” (1979).

Despedida como MVP

”Es de bien nacidos ser agradecidos”
(Refrán que me enseñó mi abuela Guillermina)

Este post está listo desde hace algunos días, pero decidí posponer su publicación hasta que salieran de la lista de los más leídos los posts de júbilo de mis compañeros que muy merecidamente han sido renovados por un año más o elegidos como MVP por primera vez, para no restarles protagonismo.

En mi caso, dejé de pertenecer al programa MVP el pasado 1 de enero. Y lo primero que debo dejar claro es que la decisión fue 100% correcta. He estado casi todo el año fuera de España, sin participar en las actividades de la comunidad. Por otra parte, he estado envuelto en un proyecto apasionante, aprendiendo un montón de cosas nuevas, y lo poco que podía haber hecho para haber merecido tal vez una renovación como MVP, simplemente quedó relegado a un plano secundario. Me refiero, por ejemplo, a cosas como publicar una versión actualizada a C# 4.0 del libro “C# 3.0 y LINQ”, o haber ayudado a mi buen amigo Unai en su excelente actualización del libro de Entity Framework a la versión 4.0 (que ya tengo por aquí; pienso escribir sobre él en los próximos días, tan pronto lo termine de leer). Así que, totalmente, Mea culpa.

Más allá de las florituras, el objetivo de este post es uno solo: expresar mi agradecimiento infinito a Microsoft por haberse fijado en mí por allá por 2004 y hacerme miembro del programa. La gran mayoría de las cosas buenas que han ocurrido en mi vida profesional a partir de entonces tienen que ver, de forma u otra, con esa decisión. En específico, quiero dar las gracias a los dos MVP Lead con los que tuve el honor de interactuar, Cristina González Herrero y Alberto Amescua Bernier, dos personas y profesionales “como la copa de un pino” que se desvivieron siempre a diario por transmitir nuestras quejas, opiniones y sugerencias a los equipos de producto, ponernos en contacto con las personas adecuadas dentro de esa gran empresa, y hacer otros miles de cosas más para que nuestra experiencia de MVP fuera lo más completa posible. Desde aquí les mando un fuerte abrazo, así como a todos los colegas MVP y empleados de Microsoft a los que he tenido el placer de conocer durante este hermoso viaje. Un afectuoso saludo también para los recién elegidos; me agrada sobremanera ver que el programa se rejuvenece y los “mayores” (como yo 🙂 van cediendo el protagonismo a las caras jóvenes. Se me antoja que nadie como los cubanos debemos tener clara la importancia de la alternancia y la renovación para la vitalidad de cualquier proyecto.

¡Seguimos en contacto!

NOTA: Las opiniones reflejadas en este artículo son mías propias, y no han sido revisadas ni aprobadas por la empresa en la que trabajo.


Referencia literaria: “Mea culpa” es un libro muy recomendable de uno de mis escritores favoritos, Guillermo Cabrera Infante. Nadie ha sabido captar como él el embrujo de mi Habana natal, esa Habana que persigue en los sueños a los habaneros por muchas décadas que hayan transcurrido desde que te escapaste (¿intentaste escapar?) de allí. Y ya que hablamos sobre Premios Nobel de Literatura, no se pierda el reciente discurso de aceptación del premio de otro gigante de las letras ibero-americanas, Mario Vargas Llosa, disponible aquí.

Silverlight Firestarter

”It was the heat of the moment
Telling me what my heart meant…”
(“Heat of the Moment”, Asia, 1982)

Mirando los vídeos del evento Silverlight Firestarter (todos accesibles desde aquí), se me ocurre que las palabras de Bob Muglia, pronunciadas (espero) en el calor del momento, ayudaron a fin de cuentas a llamar la atención sobre Silverlight y sobre este excelente evento…

Han corrido ríos de tinta con relación a esas declaraciones, pero si quiere leer aún algo más sobre el tema, puedo recomendarle los dos siguientes artículos:

  • “¿Silverlight vs HTML5? ¿Son buenos los estándares?”, de mi maestro y amigo Miguel Katrib, disponible aquí.
  • “El caso SilverGate”, de Braulio Díez y Reyes García, en la dotNetManía de este mes (nº 76). Este artículo incluye además referencias a las declaraciones de los principales actores que estuvieron implicados en el drama.

NOTA: Las opiniones reflejadas en este artículo son mías propias, y no han sido revisadas ni aprobadas por la empresa en la que trabajo.


Pop/Rock tip: A principios de los ’80, los grandes grupos de rock progresivo empezaron a desintegrarse bajo los influjos de la comercialización: era demasiado el dinero que se ganaba “vendiendo el alma al diablo” y dedicándose a interpretar productos mucho más asequibles al “gran público”. Comienzan entonces a surgir proyectos comerciales (¿super-grupos?) orientados a explotar las imágenes individuales de sus integrantes, a la misma vez que interpretando principalmente baladas y otros temas “suaves” capaces de subir a lo más alto de las listas de éxitos. Uno de los primeros representantes de esta tendencia fue Asia, banda en la que confluyeron John Wetton (King Crimson), Steve Howe y Geoff Downes (Yes) y Carl Palmer (Emerson, Lake & Palmer). “Heat of the Moment”, de su primer disco (llamado tambien “Asia”), fue su primer gran éxito.

Simplificando la programación asíncrona

”Parallel our sights
And we will find, that we need to be where we belong
Parallel our heights
Display our rights and wrongs, and always keep it strong.”
(“Parallels”, Yes, 1977)

Después de un buen tiempo sin escribir, “rumiando” a cada rato contra la incorporación a C# del tipado dinámico y toda la parafernalia asociada, a los que sigo aún sin encontrarles la “razón de estar” (ciertos anuncios recientes parecen hasta darme la razón), la presentación de la nueva Async CTP durante la PDC 2010 ha venido a insuflarme espíritu y confianza en que no todo está perdido y quedan muchas cosas interesantes aún por venir en relación con mi lenguaje favorito. Pero el lector no debería hacerme mucho caso en lo relativo a dynamic: creo que desde hace algún tiempo me estoy haciendo conservador (aunque, pienso, sin traspasar aún la delgada línea que separa “conservador” de “reaccionario” ;-). Es algo que pensé que jamás podría ocurrirme a mí, educado en la falacia bajo el signo de la “revolución interminable”; probablemente cosas de la edad :-).

En cuanto a la recién publicada Async CTP, pienso que se trata de una propuesta excelente, que simplificará en gran medida la programación asíncrona, cuya complejidad de implementación con la versión actual de C# es alta, algo de lo que puede dar fe cualquiera que se haya enfrentado al desarrollo de una aplicación medianamente “concurrente”. A través de la introducción de dos nuevas palabras reservadas, async y await, la programación asíncrona en futuras versiones de C# se hará casi tan clara y natural como la síncrona, dejando al compilador la tarea de generar prácticamente todo el código de fontanería asociado al tratamiento de los callbacks y aprovechando al máximo las bondades que ofrece la Task Parallel Library (TPL) introducida en .NET 4.0.

Para descargar la CTP y acceder a una gran cantidad de documentación y ejemplos (incluyendo un vídeo introductorio de Anders Hejlsberg), visite http://msdn.microsoft.com/en-us/async.

NOTA: Las opiniones reflejadas en este artículo son mías propias, y no han sido revisadas ni aprobadas por la empresa en la que trabajo.


Pop/Rock tip: Para esta ocasión, he utilizado un tema de uno de los “padres” del rock progresivo, Yes; una banda que dura ya más de 40 años, durante los cuales, a pesar de los numerosos cambios de personal, ha sido capaz de mantener en todo momento un altísimo nivel interpretativo. Mis álbumes favoritos de Yes son los pertenecientes al primer ciclo de la banda, uno de cuyos máximos exponentes es “Going for the One” (1977); álbum al que pertenece el tema “Parallels”.

Interview with Raj Pai, Group Program Manager of the VS Languages Team

Visual Studio Languages Community Program Manager Lisa Feigenbaum has published in her blog (with the kind permission of dotNetManía) the English version of the interview I did for the magazine with Raj Pai, Group Program Manager of the Visual Studio Languages Team at Microsoft. The interview was originally published (in Spanish) in the recent special issue dedicated to Visual Studio 2010; in it, the conversation mainly revolves around this version’s new features across the different supported programming languages, and then there’s some more. Enjoy!