Raspberry Pi 4 + Arduino + Sensores + Socket.IO + HTML

En unos días estaremos llevando adelante un evento muy grande. Se viene la STEMFest por esta zona del planeta (Tauranga, New Zealand).

Y parte de mi trabajo será enseñarle a niños y adolescentes (Muchos… dicen que habrá cerca de 3000) que la tecnología, la programación y las ciencias, en general, son fáciles y divertidas.

Para esto, desde el grupo de “Junior DevTauranga” hemos estado creando diferentes proyectos con los que los asistentes podrán interactuar, armar y desarmar, crear código, editarlo. En fin, jugar!

Uno de estos proyectos ya lo he compartido en otro post. Pero ahora hemos agregado nuevos al repositorio.

Un sensor de temperatura y humedad. Un sensor para medir si debemos agregar más agua a nuestras plantas. Y un piano hecho con frutas.

Todos estos proyectos se pueden descargar desde: https://github.com/MatiasIac/STEMFestTauranga2019

Y, por supuesto, seguiremos agregando más en lo que queda de la semana!

Anuncios

Principios SOLID

Si no los viste o no te enteraste o te olvidaste. En este mes (Y el pasado), cree mucho contenido alrededor de los principios SOLID.

Principios que son parte de la caja de herramientas de cualquier ingeniero, programador, arquitecto, o quien sea que se dedique a crear código.

Este contenido está disponible en mi canal de YouTube, y podés verlo desde acá:

Esta lista seguirá creciendo con más ejemplos, así que te recomiendo visitarla de vez en cuando.

Realidad Aumentada en el navegador – Parte II

Hace una semana les contaba que había estado experimentando con un par de frameworks y herramientas de realidad aumentada para el navegador.

Todo esto se debe a un evento en el que estoy participando donde estaremos enseñando a niños y adolescentes sobre programación, lógica y demás (StemFest), y para divertir un poco a los participantes (Que parece que serán 3000… sí, una locura :S) me puse a crear una aplicación que simule el juego de la búsqueda del tesoro.

Teniendo en cuenta las características del proyecto: Web + JavaScript. Este puede ser ejecutado por cualquier navegador en cualquier dispositvo (Celular o escritorio) y con esto, no tener la necesidad de crear una aplicación nativa para cada plataforma.

En fin, y manteniendo mi palabra, en vez de explicar el código paso a paso, paso a dejar el repositorio de código con todo el proyecto funcionando.

https://github.com/MatiasIac/STEMFestTauranga2019

(El proyecto irá variando en esta semana, pero el core seguirá siendo el mismo 🙂 )

Creando realidad aumentada en el navegador

Image

Hace muchos años atrás (Como 10) hablaba en un evento público sobre el futuro de algunas tecnologías. Que ya había empresas que estaba apostando a ellas y que las herramientas eran cada vez más accesibles y, por lo tanto, más fáciles de usar e implementar.

Hoy, cuando se habla de realidad aumentada siempre pensamos en celulares y aplicaciones al estilo PokemonGO. Aplicaciones construidas con Unity3D, ARKit y otros. Pero nos olvidamos de los principios de la realidad aumentada y las posibilidades que nos brindaba con equipos de casi costo nulo (Nulo en el sentido de que cualquier computadora o dispositivo con cámara podía ejecutarlas).

En fin… este tipo de tecnología nunca murió y, por el contrario, con mayor poder de cómputo en los dispositivos volvió con más fuerza.

Hoy (Hace unos días, pero es el momento en el que escribo el post en contraposición de cuando será publicado :)), me crucé con AR.js, una herramienta que, en conjunto con otras como Three.js y AFrame, nos permite llevar el mundo de la realidad aumentada a la Web. Y cuando digo “Web” me refiero a HTML + JavaScript puro y duro.

Por esto decidí hacer un pequeño ejemplo (Foto que acompaña el post) y paso a dejarlo por acá:

<!DOCTYPE html&gt;
<html lang="en"&gt;
    <head&gt;
        <meta charset="UTF-8"&gt;
        <meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
        <meta http-equiv="X-UA-Compatible" content="ie=edge"&gt;
        <title&gt;Document</title&gt;
    </head&gt;
    <script src="https://aframe.io/releases/0.6.0/aframe.min.js"&gt;</script&gt;
    <script src="https://jeromeetienne.github.io/AR.js/aframe/build/aframe-ar.js"&gt;</script&gt;
    <body style='margin : 0px; overflow: hidden;'&gt;
        <a-scene embedded arjs&gt;
            <a-assets&gt;
                <a-asset-item id="avo" src="avo/Avocado.gltf"&gt;</a-asset-item&gt;
            </a-assets&gt;
            <a-marker-camera preset='hiro'&gt;
                <a-entity gltf-model="#avo" scale="0.3 0.3 0.3"&gt;</a-entity&gt;
            </a-marker-camera&gt;
        </a-scene&gt;
    </body&gt;
</html&gt;

Perceptrón (Inteligencia Artificial) con JavaScript

Ufff! Sí, más de un año desde el último post y, viendo las estadísticas del blog (Claramente) la gente que lo consulta es casi nula. Pero, los que me han seguido sabrán que mudé toda la creación de contenido a mi canal de YouTube: https://youtube.com/user/lacosagorda

En el canal subo un video (Como mínimo) por semana así que todo sigue activo. De cualquier manera, vuelvo por acá y no es que vaya a decir lo que suelo y luego me muerdo a mi mismo porque no puedo cumplirlo. Sí, lo que voy a decir es que iré dejando por acá esas cosas que hago de vez en cuando por puro gusto y que, por algún motivo, no he puesto en videos.

Como ya saben, me gusta explorar más allá de las herramientas que podamos usar. No quiero quedarme con el hecho de poder saber usar tal o cual framework: Quiero hacerlo por mí mismo (Aunque luego use un framework).

En fin, como el mundo de la inteligencia artificial está más movido que nunca y todo el mundo quiere usar este u otro framework, me puse en la tarea de comenzar a crear (Y entender) uno de los conceptos más comunes dentro del mundo de la IA: Cómo crear mi propia red neuronal que pueda aprender por su cuenta y sepa “predecir” determinados resultados en base a entrenamiento.

Así que, para poder iniciar, había que arrancar con la unidad más básica que se usa en este tipo de redes, junto a la función más comunmente usada. Estos son el “perceptrón” y la función “sigmoide”.

Por supuesto, no voy a entrar en detalle sobre cada uno de estas cosas porque (Y queda dicho para todos los siguientes posts que vengan), no quiero escribir tanto detallando cada una de estas ideas, las cuales requieren muchas páginas (Pero muchas). Si hace falta más información siempre se podrá acudir a una búsqueda en Google 🙂

En fin, un perceptrón; en este caso para operaciones tipo OR; nos sirve para poder categorizar entre dos tipos de elementos. La función sigmoide, por otro lado, le ayuda al perceptrón para marcar el umbral de activación para una operación dada en dicho perceptrón.

Básicamente obtendremos un 1 o un 0 si la operación se acerca al valor calculado/esperado. (De nuevo, estoy tratando de explicarlo lo más simple posible para no escribir toneladas de texto)

En definitiva, les dejo el “perceptrón“:

var perceptron = (function() {

    var neuro = function() {
        
        this._seed = 1;
        this._threshold = 1;
        this._bias = 1;
        this._learnRate = 0.1;
        this._weights = [];
        this._neuralData = [];
    };

    neuro.prototype._random = function() {
        var x = Math.sin(this._seed++) * 10000;
        return x - Math.floor(x);
    };

    neuro.prototype._multiply = function (inputs) {
        var result = 0;

        for (var i = 0; i &amp;lt; inputs.length; i++) {
            result += inputs[i] * this._weights[i];
        }

        result += this._threshold * this._weights[this._weights.length - 1];

        return result;
    },

    neuro.prototype._sigmoid = function(x) {
        return 1 / (1 + Math.pow(Math.E, -x));
    };

    neuro.prototype._retrain = function() {
        var neuralDataLength = this._neuralData.length;
        var hasSuccess = true;

        for (var i = 0; i &amp;lt; neuralDataLength; i++) {
            var trainData = this._neuralData.shift();

            hasSuccess = this.train(trainData.input, trainData.target) &amp;amp;&amp;amp; hasSuccess;
        }

        return hasSuccess;
    };

    neuro.prototype.exercise = function(iterations) {
        var i = 0;

        while (i++ &amp;lt; iterations) {
            var trainResult = this._retrain();

            if (trainResult === true) {
                console.log('Retraining ended after ' + i + ' attempts');
                break;
            }
        }
    };

    neuro.prototype.train = function (inputs, expected) {
        
        while (this._weights.length &amp;lt; inputs.length) {
            this._weights.push(this._random());
        }

        //neuron bias
        if (this._weights.length === inputs.length) {
            this._weights.push(this._bias);
        }

        var preceptionResult = this.process(inputs); //this.percieve(inputs);
        this._neuralData.push({input: inputs, target: expected, prev: preceptionResult})

        if (preceptionResult !== expected) {
            for (var i = 0; i &amp;lt; this._weights.length; i++) { var input = (i == inputs.length) ? this._threshold : inputs[i]; var adjustment = (expected - preceptionResult) * this._learnRate * input; this._weights[i] += adjustment; if (isNaN(this._weights[i])) throw new Error('Weight out of boundaries'); } return false; } return true; }; neuro.prototype.process = function (inputs) { return Number(this._sigmoid(this._multiply(inputs, this._weights)) &amp;gt; 0.5);
    };

    return new neuro();
}());

Para poder utilizar este objeto lo primero que deberemos hacer es entrenar nuestro perceptrón:

perceptron.train([0, 0], 0);
perceptron.train([0, 1], 0);
perceptron.train([1, 0], 0);

El primer parámetro en la función “train” es un vector con los diferentes (En este caso) valores que representan un modelo válido y el segundo, el resultado. Esto es, si tenemos los elementos del primero parámetro, esperamos como resultado el segundo parámetro. Para el primer caso, si tenemos un “0, 0”, esperamos “0” como respuesta.

perceptron.exercise(10000);

El siguiente paso es entrenar intensivamente el perceptrón con los datos enviados. Esto simplemente aplicará la función interna N cantidad de veces hasta encontrar un valor aproximado que pudiese dar los resultados esperados.

Una vez entrenado, ya podemos “preguntarle”:

console.log(perceptron.process([1, 1]));

En este caso, el resultado será “1”. Que, en base al modelo que hemos armado, es lo que esperamos.

Tu conoces tu empresa… el nuevo no

Sí, el título es una obviedad pero resulta que, para muchos, esto no lo es tanto. Y siguiendo con la lista de destructores de moral y motivación, acá va otro de esos que dejan un gusto a rancio en el paladar de los nuevos empleados: La inducción del nuevo personal.

Te ha pasado alguna vez que, siendo el primer día en la nueva empresa, nadie te presenta a nadie? No sabes quienes serán tus compañeros de trabajo? No te han presentado el proyecto en el que trabajarás? Nadie sabe muy bien quién es esa persona nueva que ahora camina por los pasillos?

A mi me ha pasado un par de veces.

Lugares de trabajo en donde todos parecen estar subidos a un tren, al que llegas tarde, ya está en movimiento, y no estás seguro que ese sea el tren que debes tomar. Solo ves pasajeros que te miran por la ventanilla con una cara que no puedes descifrar, y te hace pensar en si es efectivamente hacia dónde tienes que ir. Básicamente tu cara es esta:

Esto se debe a la asucencia total de una correcta inducción de parte de la empresa hacia tu persona. Con suerte podrás hacerte tu lugar, con el pasar del tiempo, pero esto tomará bastante tiempo, tal vez meses. Algo que pudiese haberse solucionado con una correcta inducción.

Lamentablemente muchas empresas no está preparadas para esto, no lo entienden, o simplemente piensan que es gastar dinero y que, tarde o temprano, el nuevo se adaptará. Por el contrario, esto puede destruir por completo la moral de esta persona ya que, al ingresar a un nuevo grupo, necesita del mayor apoyo posible para poder adaptarse de forma fácil. Descubrir cosas mientras se trabaja puede generar frustraciones, más si esas cosas descubiertas son las que atañan al puesto de dicha persona.

Como decía, he pasado por todo tipo de empresas. Algunas con inducciones excelentes, donde se invertía una semana entera para capacitar a los nuevos, hasta aquellas que ni siquieran presentaron mi posición al resto de los empleados. Esto último, haciendo que tras cada pedido de mi parte hacia algún subordinado directo, este se negara por pensar, por ejemplo, que él era mi supervisor.

En definitiva, hay muchas formas de realizar estas inducciones. Hay fórmulas básicas para seguir, pero no quiero ponerme a listar qué se debería hacer. Lo que sí voy a remarcar es lo que decía en el título: El nuevo no conoce tu empresa… trabaja para que lo haga en el tiempo más corto posible.

El asesino paradójico

En este momento ya te habrás dado cuenta que asesinos hay por cientos y que es casi imposible evitarlos a todos y que, ademas te ha tocado vivir alguno que otro. En mi caso, me han tocado todos en diferentes momentos.

Si bien todos son peligrosos, este afecta directamente a la empresa y puede llegar a matarla por completo. Si bien los anteriores afectaban a las personas (Principalmente) este puede marcar la diferencia entre una empresa que sigue en pié y otra que simplemente se estanca y desaparece.

Alguna vez viste alguna empresa que lleva años en el medio y nunca crece? Empresas que son consideradas solo “de paso”. Todo esto, claro, independientemente de las situaciones del mercado que, incluso, es lo contrario. Muchas veces son empresas con un nicho marcado o en situación en la que no existe competencia directa, pero así y todo, no se mueven.

En estas empresas (Claro, no en todas) arremete este asesino que me gusta llamar “paradójico“: Internamente se hacen mal las cosas, pero gracias al nicho, todo sale relativamente bien.

No es que se escriban mal las líneas de código y por arte de un fantasma en los circuitos, todo compile y ande perfectamente. En realidad el código, los procesos y procedimientos se hacen mal, y salen mal, pero al ser los únicos en el mercado o no contar con competencia directa y real, entonces sus clientes aceptan los resultados tales como les son presentados.

Dentro de mi tránsito por diferentes empresas me han tocado estar en dos, memorables, con este problema. Algunas de las costumbres destacables en estas compañías eran:

  • No entender su producto ni la materia prima con la que trabajaban.
  • Considerar que tener un proceso productivo atentaba contra la empresa.
  • No saber cómo y qué cobrarle a sus clientes.
  • No entender las capacidades de sus empleados.
  • Esperar que todo se haga espontáneamente sin anticipar ningún movimiento (No capacitar, no minimizar riesgos, no aprender).

Imaginemos por un momento un lugar donde el producto se realiza de tal forma que va contramano de cualquier buena práctica conocida. No porque se haya descubierto una mejor forma sino porque se desconocen estas prácticas. Un lugar en donde, sabiendo que existen necesidades puntuales de capacitación y actualizaciones, se opta por esperar que los empleados sepan usar la diferentes herramientas, solo porque un proyecto lo demanda.

Los proyectos suelen dejar un margen de utilidad muy ajustado o, incluso, generar pérdidas. La empresa fluctúa entre estos dos extremos y flota, se mantiene.

Pero, todos cometemos errores, por lo que equivocarse es parte del proceso de aprendizaje. Estas empresas, por el contrario, carecen de esta capacidad, la de aprender. Y ese es núcleo del problema: La incapacidad de aprender.

Esta incapacidad se combina con otros factores, ya que, dándole un respiro a la idea, algo que considero de lo más difícil es saber lo que no se sabe. O mejor dicho: Cómo saber lo que no sé que no sé?

Con esto quiero decir que si uno desconoce algo, en su totalidad, es imposible que sepa que lo desconoce. En este caso, estos lugares se niegan a quitar ese velo y prefieren mantener el Statu Quo.

Tal vez, llevados de la mano por alguna extraña incomodidad o por sugerencia de un tercero, contrarán a alguien externo con el objetivo de generar el cambio. El externo, al ver esta situación intentará romper con estas conductas, pero como la misma empresa quiere mantener todo estático terminará forzándolo a adaptarse a las prácticas ya establecidas o, en su defecto, llevarlo hacia la puerta de salida más próxima.

Como decía, el problema está en la incapacidad de aprender o querer hacerlo. Es la máxima en la zona de confort. Estas empresas suelen darse de cabeza cuando salen fuera de su capullo e intentan ir más lejos de su propio mercado. En ese momento, con mucha suerte, con el golpe, terminarán generando el cambio. Las que no, simplemente dejarán de existir.