Vídeos sobre Windows 7 para desarrolladores

“Johnny-come-lately, the new kid in town
Everybody loves you, so don’t let them down…”
(“New Kid in Town”, The Eagles, 1976)

Aquí os dejo un enlace a una excelente serie de vídeos que os pondrán al día sobre las novedades que ofrecerá a los desarrolladores el próximo Windows 7:

        http://www.msdev.com/Directory/SeriesDescription.aspx?CourseId=104 (requiere identificación mediante Live ID)


Pop/rock tip: “New Kid in Town“, un tema más en línea con el estilo tan californiano que había hecho tremendamente populares a The Eagles, fue el primer single extraído del álbum “Hotel California” (1976), y como posteriormente ocurrió con el tema que dio nombre al disco, llegó al número 1 de la lista de éxitos de Billboard.

Por cierto, ¿sabía usted que “The Eagles: Their Greatest Hits 1971-1975” (1975) es el disco más vendido de todos los tiempos? Y “Hotel California” está entre los 20 primeros… Fuente: Lista de discos más vendidos de RIAA.

Confesiones de un autor con prisas

“My mama said you can’t hurry love
No, you’ll just have to wait
She said love don’t come easy
But it’s a game of give and take”
(“Can’t hurry love”, Phil Collins, 1982)

Las prisas por salir al mercado tienen, sin lugar a dudas, algunos riesgos asociados. Esos riesgos los sufrí en carne propia al publicar “C# 3.0 y LINQ“, que ya estaba en la calle incluso antes de la salida definitiva de Visual Studio 2008. Para lograr eso, por supuesto, hubo que probar todo el código del libro con la Beta 2 de .NET 3.5 y C# 3.0, que se suponía no cambiarían hasta la salida de sus versiones finales. Según se demostró, eso era mucho suponer…

En la edición original del libro, que yo sepa, salieron dos cosas que luego no compilaban en la versión definitiva de Visual Studio:

a) El primer “bug” era el uso de los métodos Add y Remove de DataContext (“LINQ to SQL”, p. 280). Después de la Beta 2, el equipo de producto decidió renombrarlos como InsertOnSubmit y DeleteOnSubmit, dejándome colgado :-). Yo todavía no estoy 100% convencido de que el cambio de nombres haya sido positivo.

b) En el capitulo “Iteradores” (p. 44), se dice que .NET 3.5 incluye una clase System.Numeric.BigInteger para la implementación de enteros muy grandes. Esto realmente iba a ser así, pero a última hora se decidió que la clase no estaba lista para el prime time y se la eliminó. Esta clase sí va a formar parte (parece 🙂 de .NET 4.0, así que es bastante probable que si alguien lee el libro en 2010 esté recibiendo información 100% correcta.

De la primera de estas dos “erratas” me di cuenta enseguida, la anuncié inmediatamente en donde quiera que pude, y fue subsanada en la segunda edición del libro. La segunda aún sigue ahí, yo mismo me di cuenta solo al cabo de cierto tiempo, y nunca nadie me la mencionado, lo cual me ha llevado a pensar que o bien la gente no se ha dado cuenta porque no necesita los métodos numéricos en su trabajo diario, o bien nadie se ha leido en profundidad el capítulo (o el libro :-). Claro, también está la opción “optimista” de que la gente sí se ha dado cuenta, pero son condescendientes porque comprenden que uno no se puede haber sacado el truco de la manga, sino que eso debió funcionar antes.

I think now, looking back (esta frase me recuerda la excelente película de Oliver Stone, “Platoon“), que la cantidad de problemas de este tipo en el libro ha sido mínima, y que valió la pena sacarlo rápidamente para que así cumpliera con su objetivo principal: permitir a los programadores de habla hispana ponerse rápidamente on track en las nuevas características que .NET 3.5 y C# 3.0 ponían a su disposición. Espero que usted, amigo lector, esté de acuerdo.


Pop/rock tip: Phil Collins ha disfrutado de una larga carrera, en la que ha sido favorito de varias generaciones. Después de varios años como baterista y cantante de Genesis (mi etapa preferida, claro), decidió independizarse y dar a su carrera un rumbo más comercial, lo que indudablemente se ha reflejado muy positivamente en sus bolsillos. Durante esta segunda etapa ha tenido múltiples números uno, entre los que cabe destacar “Against All Odds“, “Sussudio“, “Easy lover” (con Phillip Bailey, de Earth, Wind & Fire) o “Another Day in Paradise“. Personalmente, de su producción en solitario me quedo con la banda sonora de la película de Disney “Tarzán“, que habré visto más de 20 veces con mi hija… Por cierto, esa banda sonora la grabó no solo en inglés, sino también en un más que correcto españolcastellano y otros seis idiomas más.

 

[OT] Mi homenaje a Marisa

“Lleva en el alma la bayamesa 
tristes recuerdos de tradiciones,
cuando contempla sus verdes llanos
lágrimas vierte por sus pasiones.
Ella es sencilla, le brinda al hombre
virtudes todas y el corazón,
pero si siente de la patria el grito,
todo lo deja, todo lo quema,
ese es su lema, su religión.”
(“La bayamesa”, Sindo Garay, 1919)

Hará ya pronto veinte años del día en que aterricé en Madrid Barajas sin conocer a nadie, con solo un puñado de sueños y sesenta dólares en el bolsillo. Quién sabe que habría sido de mí de no ser por Marisa y Fernando; ellos me acogieron como un verdadero hijo, y me ayudaron de mil formas diferentes hasta que logré despegar por mi cuenta. Luego, como hacen los hijos a veces, me tomé la licencia de desaparecer durante períodos prolongados; mas cuando volvía a verles, encontraba el mismo afecto y cariño de siempre, cual hijo pródigo que retorna al hogar paterno. Esta vez no me dio tiempo a volver a verla, algo que sentiré eternamente.

De Marisa nos quedará siempre su abnegación, su devoción por su bella familia y su gran amor por Cuba; un amor que cincuenta años de exilio no hicieron sino acrecentar. ¡Hasta siempre, Marisa! ¡Nunca te olvidaremos!


Referencia: Sindo Garay (1867-1968) fue un autor e intérprete de música tradicional, muchas de cuyas composiciones (algunas de ellas puestas de nuevo de actualidad gracias a Buena Vista Social Club) han ayudado a conformar la esencia de la idiosincrasia cubana. Algunos de los primeros recuerdos que conservo de mi infancia es el de mis abuelos escuchando “Guarina” o “La tarde”. Me siento tremendamente afortunado de haber nacido en un país tan lindo y rico en tradiciones; uno con el que vivirás soñando el resto de tus días, por mucho que intentes olvidarte de él.

Qué problema tiene este código? (R)

“See the pages as they turn
In their wisdom we will learn
Free from the prison, a curtain of iron”
(“Curtain of Iron”, Kansas, 1980)

Este post es la continuación (y respuesta) de otro anterior.

Antes que nada, la moraleja de esta historia: ¡estudia la documentación! O en la jerga de un técnico de soporte cabreado, “RTFM” (Read The Freaking Manual). Las guías generales para la publicación de eventos en .NET se resumen en esta página de MSDN, que es de donde extraje (modificándolo para simplificarlo, por una parte, y añadirle el problema, por la otra) el código que presenté la vez anterior.

Una primera desviación del esquema propuesto consiste en que no encapsulé el disparo del evento en la clase publicadora dentro de un método virtual protegido, para permitir la redefinición futura del comportamiento del disparo. Si bien con esto he introducido una limitación en el diseño de la clase, ello no será causante de error de ejecución alguno, como sí ocurre con mi segunda desviación del patrón propuesto.

El problema está en el cambio que introduje en la implementación del disparo del evento. Lo que en el original era algo así como:

            // Make a temporary copy of the event to avoid possibility of
            // a race condition if the last subscriber unsubscribes
            // immediately after the null check and before the event is raised
            EventHandler handler = MyEvent;

            // Raise the event. You could also raise the event
            // before executing the block of code
            if (handler != null)
            {
                handler(this, EventArgs.Empty);
            }

Yo lo traduje alegremente por:

            // Raise the event. You could also raise the event
            // before executing the block of code
            if (MyEvent != null)
            {
                MyEvent(this, EventArgs.Empty);
            }

En otras palabras, me cargué la variable local que se utiliza en el ejemplo original, e hice uso directamente del evento a) para comprobar si está asignado y b) para, en caso afirmativo, dispararlo. En aplicaciones con un único hilo de ejecución esto no presentará problema ninguno; pero en una aplicación con múltiples hilos, como bien reza el comentario en el código, el control podría transferirse a otro hilo después de ejecutar el paso a) con resultado positivo, e inmediatamente antes de ejecutar el paso b). Si en el contexto del hilo de ejecución que tome el control el suscriptor se des-suscribiera del evento, cuando el control retornara al hilo en el que el evento se dispara, MyEvent sería nulo, lo cual provocaría la correspondiente excepción. Estaríamos en presencia de lo que se conoce como una situación de competencia (race condition), un tipo de errores de los programas concurrentes que se manifiestan solo muy ocasionalmente (debido a la escasa probabilidad de que los sucesos se desencadenen en el orden requerido) y que resultan bastante difíciles de reproducir y depurar. Dada la importancia cada vez mayor que tendrá la concurrencia en el futuro, es necesario empezar a tomar conciencia de temas como éste.

Para “simular” la generación de una situación de competencia como la antes descrita, podríamos incorporar temporalmente a la clase publicadora, después de la comprobación de nulidad y antes del disparo del evento, una llamada a System.Threading.Thread.Sleep(0), que permite ceder inmediatamente el control a otro hilo de ejecución que esté a la espera (por razones que aún no he podido aclarar, en la documentación para Silverlight se recomienda utilizar el valor 1 en vez de 0). A continuación se muestra un pequeño ejemplo que termina provocando (en mi máquina 🙂 la situación antes descrita.

using System;
using System.Threading;
using System.Windows.Forms;

namespace RaceWithEvents
{
    public class Form1 : Form
    {
        // ….

        private void iteration()
        {
            Publisher pub = new Publisher();
            Subscriber sub = new Subscriber(pub);

            // Cancel subscription from a new thread
            Thread t = new Thread( () =>
            {
                pub.MyEvent -= sub.HandleMyEvent;
            }
            t.Start();

            // Call the method that raises the event
            pub.DoSomething();

            // Join on the created thread
            t.Join();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 10000; i++)
            {
                System.Diagnostics.Debug.WriteLine(i);
                iteration();
            }
        }
    }
}


Pop/rock tip: Por fin se me presenta la ocasión para hacer una referencia a mi banda favorita, Kansas (www.kansasband.com), que por primera vez incorporó un “toque americano” a la complejidad del rock sinfónico europeo de los ’70. Maestría interpretativa, rítmicas poco comunes con cambios frecuentes, la voz cristalina de Steve Walsh, pero sobre todo, para mí, letras que inspiran y sirven de guía para la vida – justo lo que les deseo que encuentren para sí mismos a mis lectores más jóvenes.

Curtain of iron” es un canto de esperanza dirigido a quienes sufren bajo sistemas totalitarios. Pertenece al álbum “Audio-Visions” (1980), el octavo de la banda y último que se grabó con la formación original. Comparado con best sellers como “Leftoverture” (1975), “Point of Know Return” (1977), “Two for the Show” (1978) o incluso “Monolith” (1979),  su éxito fue más que modesto, y anticipó el final de una era.

 

Qué problema tiene este código?

“I get down on my knees and I start to pray
Till the tears run down from my eyes, oh
Somebody, somebody, can anybody find me
Somebody to love?”
(“Somebody to love”, Queen, 1976)

Aquí va un puzle que sin dudas resultará sencillo para muchos, pero que puede que le enseñe algo interesante a otros.

El siguiente programa presenta una clase que publica un evento, y otra que se suscribe al mismo. Para simplificar, se asume que el evento no requiere datos personalizados, por lo que es del tipo predefinido EventHandler.

Qué problema(s) tiene la implementación de la clase publicadora? La respuesta – en una próxima entrega.

using System;

namespace ConsoleApplication1
{
    // Class that publishes an event
    class Publisher
    {
        // Declare the event
        public event EventHandler MyEvent;

        public void DoSomething()
        {
            // Block of code that does something

            // Raise the event. You could also raise the event
            // before executing the block of code
            if (MyEvent != null)
            {
                MyEvent(this, EventArgs.Empty);
            }
        }
    }

    //Class that subscribes to an event
    class Subscriber
    {
        public Subscriber(Publisher pub)
        {
            // Subscribe to the event using C# 2.0 syntax
            pub.MyEvent += HandleMyEvent;
        }

        // Define what actions to take when the event is raised
        public void HandleMyEvent(object sender, EventArgs e)
        {
            Console.WriteLine(“Event raised”);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Publisher pub = new Publisher();
            Subscriber sub = new Subscriber(pub);

            // Call the method that raises the event
            pub.DoSomething();

            // etc…
        }
    }
}


Pop/rock tip: Ya hemos hecho referencia anteriormente en este blog a Queen, un grupo que sin lugar a dudas ocupa un lugar muy destacado en la historia del rock. “Somebody to love” es una de mis canciones favoritas, y el ejemplo perfecto (junto con “Bohemian Rhapsody“) de una de las características mas sobresalientes de la música de Queen: las intrincadas armonías vocales. La letra de la canción no tiene nada que ver con el puzle – aunque el título del disco al que la canción pertenece sí ;-).

 (Abril 13 de 2009): El título del álbum en cuestión es “A day at the races“.

Nueva característica en .NET 4.0 :-)

“Life’s a train that goes from February on day by day
But it’s making a stop on April first”
(“April fools”, Rufus Wainwright)

Me hago eco aquí de este elaborado post publicado hoy por el equipo de Visual Basic, en el que describen una ingeniosa técnica que pondrán próximamente a nuestra disposición 🙂 para acelerar la ejecución de las aplicaciones Web.


Pop/rock tip: No es que sea yo ni mucho menos un fan del cantante norteamericano Rufus Wainwright, pero buscando letras de canciones alegóricas a la fecha de hoy, la suya fue la más adecuada que encontré.