Una sinfonía en C#

Un pequeño aporte a la comunidad de habla hispana.

Los memes de Javascript

No pasan más de 10 minutos desde que algo ocurre en el mundo hasta que Internet se llena de memes al respecto; sin embargo últimamente se ven muchos memes sobre Javascript y la idea de este post es explicarlos, o mejor dicho, explicar por qué son incorrectos.

El meme en cuestión

En meme del que voy a hablar en esta ocasión es éste, con Patrick Star de protagonista:

 

image

 

En este caso es una burla acerca de ciertos casos con las comparaciones en Javascript, y si bien tiene algo de gracia demuestra más que nada desconocimiento del lenguaje y vamos a explicarlo.

El comparador de igualdad

El comparador de igualdad de Javascript tiene una característica interesante que se podría resumir como que “hace el mejor esfuerzo por comparar los dos términos” para explicarlo simple: el comparador convierte los dos término en caso de no ser del mismo tipo y luego hace una comparación estricta, entonces esto nos lleva a la primera parte del meme:

0 == “0”

Básicamente al usar el comparador de igualdad == Javascript detecta que los términos no son del mismo tipo y los convierte, entonces esta comparación pasa a ser verdad como podemos ver al probarlo en Nodejs

image

es por eso que si queremos una comparación estricta usamos el operador de comparación estricta ===

image

Entonces, primer caso resulto, Javascript hace exactamente lo que dice la documentación que debe hacer, una comparación con conversión de tipos.

Un array vacío

Los arrays siempre tienen sus bemoles en todos los lenguajes y Javascript no es la excepción, pero por qué  0 == [ ] ?

La respuesta es que la conversión de un array vacío a entero nos retorna el valor de una posición de memoria vacía que es comparable con 0, entonces la comparación es verdadera, una vez más si usamos el comparador estricto es no es así:

image

La comparación con un string es false

 

"0" == [] 

Acá es simple, basados en lo anterior, es evidente que podemos convertir un array vacío a entero y nos retorna algo comprable con false porque después de todo estamos pidiendo que haga un esfuerzo por convertir una posición sin valores. En este caso el término de la derecha resultará ser o o algo comparable con false, sin embargo ahora el término de la izquierda es un string que a lo sumo es comparable con un 0.

Conclusión

Un lenguaje de programación es complejo y tiene detalles, si en el día a día lo usamos debemos conocer sus características y no olvidarnos que puede ser (como en el caso de Javascript) un lenguaje diseñado hace muchos años y si estamos acostumbrados a lenguajes más modernos que han aprendido de los problemas que pueden acarrear estas cosas y que los programadores de hoy en día usan un lenguaje sin conocerlo…

 

Nos leemos.

#NetConf en la Universidad Politécnica de Madrid

El evento

Como parte de evento que se realiza en todo el mundo durante estos meses, he tenido la suerte de organizar y participar como ponente en la NetConf en Madrid.

Gracias a la generosidad de la gente de la Universidad Politécnica de Madrid el evento ha tenido una locación inmejorable.

Ha sido una versión de tres charla en la que he tenido la suerte de compartir cartel con dos grandes del mundo de .NET de España como Javier Valero y Robert Bermejo.

Sobre Azure DevOps

Cuando preparé la charla no existía Azure DevOps por lo tanto mi charla fuer sobre Visual Studio Team Services, en concreto sobre cómo montar un entorno de despliegue continuo de una aplicación ASP Net Core en Docker sobre Azure.

Dejo un link a las diapositivas que utilicé durante la charla.

Gracias a los ponentes, a la UPM y a Tokiota por el apoyo.

Nos leemos.

IoT: ¿Cómo enviar mensajes MQTT a Azure IoT Hub?

No voy a descubrir nada diciendo que Arduino es la plataforma más popular para desarrollo de electrónica para el usuario “común”, por facilidad, por precio, por disponibilidad de información, herramientas, etc.

Si hablamos de contar con capacidad de conectarnos a una red inalámbrica con Arduino nos viene a la mente el ESP8266, este pequeño chip de bajo costo que soporta 802.11 b/g/n y cuenta con un stack TCP completo, pudiendo incluso trabajar por su cuenta gracias a que también tiene un microcontrolador incorporado. Un proyecto que nació poco después basado en el mismo chip es NodeMCU que es una plataforma para IoT que utilizar el ESP8266 y utiliza LUA como lenguaje (en realidad NodeMCU es el firmware no el hardware, pero lo vamos a usar de modo indiferente) en este caso gracias al trabajo de la comunidad existe un plugin para poder programar en C desde el IDE de Arduino que es justamente lo que vamos a hacer. Otra ventaja del hardware es que se puede conseguir por muy poco dinero y tenemos todo, wifi, entras / salidas digitales, analógicas, UART, etc.

Tener soporte MQTT en NodeMCU

La forma más común de contar con soporte para MQTT con mensajes bidireccionales y demás es utilizar la biblioteca PubSubClient y ya, funciona muy bien y no hay mucho que agregar así que eso es lo que vamos a hacer.

Acá podemos ver un ejemplo simple que nos proporciona la gente del equipo de desarrollo.

Enviando mensajes a Azure

En Azure tenemos dos servicios para recibir eventos en cantidad, Event Hubs y IoT Hub, bien, cuál usar es simple de decidir más allá de ponernos con comparativas de rendimiento y escalabilidad ocurre que Event Hubs hasta este día no soporta MQTT, así que vamos a usar IoT Hub.

Configurar IoT Hub y el cliente

Vamos a utilizar el código de ejemplo del PubSubClient y configurarlo para poder enviar mensajes, también ser podrán recibir, esta parte es un poco “mágica” porque no hay mucha información sobre los parámetros de la conexión, vamos a ver el código de ejemplo paso a paso donde tenemos que reemplazar valores y cosas.

const char* ssid = "........";
const char* password = "........";
const char* mqtt_server = "broker.mqtt-dashboard.com";

en ssid ponemos el nombre de nuestra red, en password la contraseña, esto es simple, ahora empiezan los datos raros.

en mqtt_server tenemos que poner el nombre de nuestro IoTHub, este nombre es <nombre de nuestro iothub>.azure-devices.net, en mi caso es “testesp.azure-devices.net”, quedaría así:

const char* ssid = "MI_RED";
const char* password = "PASSWORD_DE_MI_RED";
const char* mqtt_server = "testesp.azure-devices.net";

Agregar el cliente seguro de WIFI

Ya que IoTHub utiliza TSL tenemos que utilizar la versión segura de la biblioteca de conexión con la Wifi, entonces hacemos dos cambios, agregamos la referencia

#include <wificlientsecure.h>

y reemplazar la declaración de la clase WiFiClient por WiFiClientSecure así:

WiFiClientSecure espClient;

PubSubClient client(espClient);

Cambiar el puerto de conexión de MQTT

Por defecto se utilizar el puerto 1883 pero Azure utiliza 8883, quedaría así:

client.setServer(mqtt_server, 8883);

Configurando los datos de conexión

Esta es la parte más tricky, vamos a localizar la línea donde se hace la conexión

if (client.connect(clientId.c_str()))

Primero que nada vamos a utilizar otra sobrecarga, para utilizar la que recibe: deviceID, Usuario y password estos tres datos los obtenemos del siguiente modo:

El deviceID lo creamos en el IoTHub

image

En mi caso TestDevice

El usuario es simple, es el mismo nombre del nuestro IoTHub que usamos al principio con el nombre del device después, en mi caso es así:

testesp.azure-devices.net/TestDevice

Ahora viene la parte rara, en donde iría la password tenemos que poner un connection string SAS que hay que generar, la forma más simple de hacerlo es la siguiente:

Descargar el IoT hub device explorer de acá, una vez instalado volvemos al portal de Azure y buscamos la parte de Shared Access Policies, creamos una policy nueva o usamos una existente (depende de qué queremos) pero en todo caso, una vez que tenemos una vamos al detalle y copiamos el connection string de primary ( o el otro, es igual) y eso lo pegamos en el device explorer y presionamos “Generate SAS

image

Y ese SAS que se genera es justamente el password que tenemos que usar, tal cual está, entonces quedaría todo así:

if (client.connect("TestDevice", "testesp.azure-devices.net/TestDevice","SharedAccessSignature sr=testesp.azure-devices.net&sig=KKKKKKKKKKKKKKK%3D&se=1548536586&skn=blabla"))

Con esto podemos conectarnos al IoTHub, para enviar mensajes se hace publish, pero a un topic específico, en el caso de nuestro dispositivo el nombre es devices/<nombre del device>/messages/events/ tenemos que reemplazar la línea que dice:

client.publish("outTopic", "hello world");

por

client.publish("devices/TestDevice/messages/events/", "hello world");

Y para poder recibir es algo similar, cambiamos donde dice

client.subscribe("inTopic")

por

client.subscribe("devices/TestDevice/messages/devicebound/#")

Donde TestDevice es el nombre de nuestro dispositivo por supuesto

Por último, cambiar el tamaño máximo de paquetes del MQTT de la biblioteca PubSubClient:

Ya que el connection string es tan largo el máximo por defecto no nos será suficiente, tenemos que ir a buscar donde tenemos instalada la biblioteca PubSubCliente y cambiarla así:

MQTT_MAX_PACKET_SIZE 256

Y con eso ya está, ahora podemos compilar en el IDE, cargar el programa en el dispositivo, abrir el monitor serie y si todo a bien deberíamos ver que envía mensajes

image

Excelente, con esto será suficiente para enviar y recibir desde NodeMCU a Azure IoT Hub. Dejo el ejemplo de código modificado acá

Nos leemos.

Javascript tips: Jugando con strings, interpolación y otras yerbas.

Hace un tiempo (3 años) hablé sobre cómo tener strings multilínea en Javascript, una opción no tan conocida incluso hoy en día.

Bien, con las posteriores versiones del estándar y los navegadores de hoy en día ya contamos con algunas características más avanzadas para el manejo de strings, vamos a ver un poco de qué se trata.

Interpolación de strings

Una de las novedades de ECMA Script 6 2015 son los template string (o string interpolado) muy similar a C#, nos permite tener un texto (template) y que el interprete reemplace ciertas cadenas especiales con variables que están dentro del contexto, por ejemplo

var s = "mundo";
`Hola ${s}`

En este caso la variable s tiene el valor “mundo” y cuando hacemos referencia en la siguiente línea a la variable por nombre escribiéndola con esa sintaxis ${variable} y usando las comillas invertidas igual que el en caso de los strings multilínea.

Por supuesto que podemos hacer referencia a objetos complejos

var o = {"nombre": "Leonado", "twitter": "@leomicheloni"}
`Hola, mi nombre es ${o.nombre} puedes seguirme en twitter en ${o.twitter}`
"Hola, mi nombre es Leonado puedes seguirme en twitter en @leomicheloni"

Perfecto, y muy útil para que nuestro código sea más limpio y sea menos propenso a errores, pero hay más.

Qué pasa si hacemos referencia a algo que no existe, por ejemplo a una propiedad que no existe en el objeto, nada, como Javascript es dinámico simplemente nos muestra undefined.

var o = {"nombre": "Leonado"}
`Hola, mi nombre es ${o.nombre} y mi apellido es ${o.apellido}`
"Hola, mi nombre es Leonado y mi apellido es undefined"

Perfecto, no problem.

Sin embargo si hacemos referencia a una variable que no existe….

`Hola, mi nombre es ${nombre}`
Uncaught ReferenceError: nombre is not defined
    at :1:23

Pumm! se rompe, es decir se comporta igual que si concatenando el strings a la viaja usanza.

"Hola, mi nombre es " + nombre

Pero hay más

Procesar expresiones

También es posible procesar expresiones dentro de un template string, por ejemplo

`Hola, la suman de 1+2 es ${1+2}`
"Hola, la suman de 1+2 es 3"

Por supuesto que podemos sumar elementos de objetos

var o = {a : 1, b: 7};
`La suman de ${o.a} + ${o.b} es ${o.a + o.b}`
"La suman de 1 + 7 es 8"

Y listo, no podemos reemplazar una biblioteca de procesamiento de templates como Mustache con esto pero nos permite ahorrar trabajo y evitar errores, además de hacer nuestro código más limpio.

Nos leemos.