Libro «Programming the Microsoft Bot Framework»

Por fin he logrado arañar el tiempo necesario para leer con detalle el libro «Programming the Microsoft Bot Framework. A Multiplatform Approach to Building Chatbots» (Microsoft Press/Pearson Education, 2018), escrito por mi buen amigo Joe Mayo, a quien sigo desde el ya lejano 2009, cuando publicó su excelente «LINQ Programming«. Recomiendo de corazón el nuevo libro a todo aquel que quiera adentrarse en esta novedosa tecnología de Microsoft, empezando desde los fundamentos básicos y llegando hasta temas avanzados como la creación de canales de control personalizados o la integración con servicios de voz, correo, SMS y web, así como con los Servicios Cognitivos de Microsoft (Microsoft Cognitive Services), que potencian las modernas aplicaciones basadas en Inteligencia Artificial. Puede encontrar la Tabla de Contenidos del libro y algunas páginas de ejemplo en la página del libro en Amazon.com.

Debo mencionar que el autor se puso de muy mala suerte y dos de las API en las que se apoyó para el desarrollo de los ejemplos incluidos en el libro, Wine.com y Groove, fueron abandonadas por sus respectivos creadores después del envío del libro a imprenta. Pero esto es algo que sucede con cierta frecuencia cuando se experimenta con tecnologías novedosas, y para mí ni siquiera es un problema – hacer un poco de abstracción nunca viene mal. No obstante, el autor ha reescrito todo ese código de ejemplo basándose en datos de prueba y la API de Spotify (que al fin y al cabo es el sustituto de Groove), respectivamente. El código fuente actualizado puede descargarse desde el blog de Joe Mayo.

Empiece a programar. Un enfoque multiparadigma con C#

A tiempo para Noche Vieja me ha llegado mi copia del recién-publicado «Empiece a programar: un enfoque multiparadigma con C#«, escrito por mi maestro y amigo Miguel Katrib y otros miembros de su equipo. Es, sinceramente, el libro que me gustaría tener a mi alcance si volviera a tener 18 años y empezara mi andadura en el mundo de la programación. Y siendo totalmente honesto, debo reconocer también que aprendí un par de cosas y rememoré muchas otras con la lectura del libro, a pesar de mis 30+ años de experiencia y casi 20 usando C#. No me extiendo más aquí, porque el lector interesado podrá encontrar mi opinión detallada en el Prefacio del libro, junto con la Tabla de Contenidos, disponibles en la página del libro en Amazon.com.

¡Feliz 2018!

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).

Buscando "El símbolo perdido" con LINQ (II)

«Now I know you’re all king horse
Between tenderness and brute force…»
(«King Horse», Elvis Costello, 2007)

Continuando con el problema propuesto en el post anterior (basado en «El símbolo perdido«, la última obra de Dan Brown), aquí presento el código final utilizado para resolver el problema, así como un análisis somero de los resultados obtenidos.

La adición de las condiciones que faltan al programa del post anterior (que la suma de los cuatro «cuadrantes», más la del cuadrado central, coincida con la de las filas, columnas y diagonales) nos permite reducir el número de «variables libres» sobre las que el programa debe iterar a 7, con lo que la cantidad de combinaciones a probar es del orden de MAX^7, donde MAX es el valor máximo que queremos poder almacenar en cualquier casilla.Inicialmente establecí MAX a 100, con lo que el número de combinaciones a intentar era realmente enorme. Pero el problema resultó más «flojo» de lo que pensaba: en unos dos días de cálculo ininterrumpido, Rainmaker ya había encontrado unas 500.000 soluciones, y el valor de la primera variable (a11) aún seguía siendo 1. Así que decidí no torturar más al pobre amigo y detuve la ejecución. A continuación, el primero de los cuadrados obtenidos:

1 4 11 29
26 14 3 2
12 7 21 5
6 20 10 9

Entonces decidí restringir la búsqueda a los cuadrados en los que el número máximo utilizado fuera el 20, lo que redujo considerablemente la cantidad de combinaciones a probar. En algo menos de un minuto, ya tenía a mi disposición los 320 cuadrados válidos existentes. De nuevo, aquí solo muestro el primero de ellos; el lector interesado en buscar uno más «bonito» puede ejecutar el programa y estudiar sus resultados.

11 1 13 19
18 14 4 8
3 9 17 15
12 20 10 2

Así que aquí está mi modesto homenaje a Visual Studio 2010 – un programa que utiliza LINQ y que se me antoja combina, usando las palabras de Elvis Costello, «ternura y fuerza bruta» (pero, ¿en qué medida cada una de ellas, amigo lector? 🙂 .

Código utilizado:

using System;
using System.IO;
using System.Linq;

namespace LostSymbol
{
class Program
{
private const int MAX = 20;

static void Main(string[] args)
{
const int firstSeed = 20;
const int secondSeed = 10;

var res =
/* first row /
from a11 in Enumerable.Range(1, MAX)
where a11 != firstSeed && a11 != secondSeed
from a12 in Enumerable.Range(1, MAX)
where a12 != firstSeed && a12 != secondSeed &&
a12 != a11
from a13 in Enumerable.Range(1, MAX)
where a13 != firstSeed && a13 != secondSeed &&
a13 != a11 && a13 != a12
from a14 in Enumerable.Range(1, MAX)
where a14 != firstSeed && a14 != secondSeed &&
a14 != a11 && a14 != a12 && a14 != a13
let sum = a11 + a12 + a13 + a14
/
second row /
from a21 in Enumerable.Range(1, MAX)
where a21 != firstSeed && a21 != secondSeed &&
a21 != a11 && a21 != a12 && a21 != a13 && a21 != a14
let a22 = sum – (a11 + a12 + a21)
where a22 > 0 && a22 <= MAX &&
a22 != firstSeed && a22 != secondSeed &&
a22 != a21 &&
a22 != a11 && a22 != a12 && a22 != a13 && a22 != a14
from a23 in Enumerable.Range(1, MAX)
where a23 != firstSeed && a23 != secondSeed &&
a23 != a21 && a23 != a22 &&
a23 != a11 && a23 != a12 && a23 != a13 && a23 != a14
let a24 = sum – (a21 + a22 + a23)
where a24 > 0 && a24 <= MAX &&
a24 != firstSeed && a24 != secondSeed &&
a24 != a21 && a24 != a22 && a24 != a23 &&
a24 != a11 && a24 != a12 && a24 != a13 && a24 != a14 &&
a13 + a14 + a23 + a24 == sum     /
second quadrant /
/
third row /
from a31 in Enumerable.Range(1, MAX)
where a31 != firstSeed && a31 != secondSeed &&
a31 != a11 && a31 != a12 && a31 != a13 && a31 != a14 &&
a31 != a21 && a31 != a22 && a31 != a23 && a31 != a24
let a32 = sum – (a12 + a22 + firstSeed)
where a32 > 0 && a32 <= MAX &&
a32 != firstSeed && a32 != secondSeed &&
a32 != a31 &&
a32 != a11 && a32 != a12 && a32 != a13 && a32 != a14 &&
a32 != a21 && a32 != a22 && a32 != a23 && a32 != a24
let a33 = sum – (a13 + a23 + secondSeed)
where a33 > 0 && a33 <= MAX &&
a33 != firstSeed && a33 != secondSeed &&
a33 != a31 && a33 != a32 &&
a33 != a11 && a33 != a12 && a33 != a13 && a33 != a14 &&
a33 != a21 && a33 != a22 && a33 != a23 && a33 != a24 &&
a22 + a23 + a32 + a33 == sum     /
middle quadrant /
let a34 = sum – (a31 + a32 + a33)
where a34 > 0 && a34 <= MAX &&
a34 != firstSeed && a34 != secondSeed &&
a34 != a31 && a34 != a32 && a34 != a33 &&
a34 != a11 && a34 != a12 && a34 != a13 && a34 != a14 &&
a34 != a21 && a34 != a22 && a34 != a23 && a34 != a24
/
fourth row /
let a41 = sum – (a11 + a21 + a31)
where a41 > 0 && a41 < MAX &&
a41 != firstSeed && a41 != secondSeed &&
a41 != a11 && a41 != a12 && a41 != a13 && a41 != a14 &&
a41 != a21 && a41 != a22 && a41 != a23 && a41 != a24 &&
a41 != a31 && a41 != a32 && a41 != a33 && a41 != a34 &&
a41 + a32 + a23 + a14 == sum &&    /
right-to-left diagonal /
a31 + a32 + a41 + firstSeed == sum     /
fourth quadrant /
let a42 = firstSeed
let a43 = secondSeed
let a44 = sum – (a14 + a24 + a34)
where a44 > 0 && a44 < MAX &&
a44 != firstSeed && a44 != secondSeed &&
a44 != a41 &&
a44 != a11 && a44 != a12 && a44 != a13 && a44 != a14 &&
a44 != a21 && a44 != a22 && a44 != a23 && a44 != a24 &&
a44 != a31 && a44 != a32 && a44 != a33 && a44 != a34 &&
a41 + firstSeed + secondSeed + a44 == sum &&
a11 + a22 + a33 + a44 == sum &&    /
left-to-right diagonal /
a33 + a34 + a43 + a44 == sum     /
third quadrant */
select new
{
a11, a12, a13, a14,
a21, a22, a23, a24,
a31, a32, a33, a34,
a41, a42, a43, a44,
};

using (StreamWriter sw = new StreamWriter(«C:\TEMP\Solutions.txt«))
{
sw.WriteLine(«Start : » + DateTime.Now.ToString(«yyyy/MM/dd hh:mm:ss»));
int n = 0;
foreach (var r in res)
{
sw.WriteLine(«Solution » + n);
sw.WriteLine(«=============»);
sw.WriteLine(«{0} {1} {2} {3}», r.a11, r.a12, r.a13, r.a14);
sw.WriteLine(«{0} {1} {2} {3}», r.a21, r.a22, r.a23, r.a24);
sw.WriteLine(«{0} {1} {2} {3}», r.a31, r.a32, r.a33, r.a34);
sw.WriteLine(«{0} {1} {2} {3}», r.a41, r.a42, r.a43, r.a44);
sw.WriteLine();
sw.Flush(); n++;
}
sw.WriteLine(«Finish: » + DateTime.Now.ToString(«yyyy/MM/dd hh:mm:ss»));
}
Console.ReadLine();
}
}
}


Pop/Rock tip: Elvis Costello, cantante y compositor nacido en Inglaterra, lleva más de treinta años de éxito desde que debutó en 1977 con el excelente album «My Aim is True«. Su eclecticismo musical y letras trabajadas lo han convertido en un referente para varias generaciones de músicos.

Mención al libro en MVP Blog y disquisiciones al respecto

«In these days / When darkness falls early
And people rush home / To the ones they love
You better take a fool’s advice / And take care of your own
‘Cause one day they’re here / Next day they’re gone.»
(«New York Minute», The Eagles, 1994)

Hace unos días, como ya comentaba Unai aquí, se publicó una mención a nuestro libro sobre Entity Framework en el MVP Award Blog. Pequeños reconocimientos como éste tienen para mí un gran valor, pues me sirven para compensar los recuerdos relacionados con la clase de tarea que es escribir un libro: la más dura que me haya tocado nunca, sin duda alguna (y creedme que no toda la vida he estado dando cursos o sentado detrás de un ordenador). Esa tarea se hace más difícil aún cuando el libro trata sobre una tecnología novedosa; baste decir que los dos libros más esperados sobre el tema (el de David Sceppa y el de Julie Lerman) ya van con retraso con respecto a las fechas planificadas. Cierto es que nosotros éramos tres autores, pero aún no había documentación técnica y hubo que obtener mucha información mediante «buceo tecnológico», como bien lo denominó David Salgado. El libro, por supuesto, está muy lejos de ser perfecto; pero lo que puedo garantizar es que nos dejamos la piel en el intento. Y además, en tiempo extra, robado a nuestras familias, que es a lo que hace referencia la cita musical de hoy.


Pop/rock tip: «New York Minute» es una bellísima canción que fue compuesta por Don Henley en 1989 y que inicialmente apareció en un disco suyo en solitario. Luego los Eagles la utilizaron en su gira y disco de reunificación, «Hell Freezes Over» (1994), que sinceramente recomiendo (la versión acústica y en directo de «Hotel California» es especialmente espectacular). La letra de «New York Minute» trata precisamente sobre cómo los sentimientos quedan muchas veces relegados a un plano secundario en este mundo agitado en que vivimos, y tiene ahora mucha más actualidad que hace 20 años: hoy no hay que vivir en Nueva York para sentir el fenómeno.