Tecnología útil que incluya a todos

A veces, cuando nos paramos a ver el mundo, nos damos cuenta de que hay problemas que hoy en día son fáciles de resolver pero que paradógicamente siguen sin estar resueltos. Normalmente, la raiz de que esto sea así es que nadie con los conocimientos adecuados se ha enfrentado al problema. La tecnología es útil cuando resuelve problemas, pero para resolver problemas hay que saber que existen.

Top4ELA

Hace un par de semanas fui invitado por la Fundación Luzón a una especie de hackathon. En él se pretendía conseguir soluciones tecnológicas a los problemas que tienen en su día a día un colectivo con muchas dificultades. Ellos se encargaron de poner a gente con conocimientos de tecnologías dispares enfrente de los problemas que rodean a la ELA (Esclerosis Lateral Amiotrófica).

El evento fue organizado conjuntamente con Samsung España, quienes pusieron todo de su parte para que estuviésemos cómodos y centrados en el trabajo que teníamos por delante. Además nos prestaron sus últimos juguetes para que pudiésemos validar todo lo que planteásemos . Fueron de mucha utilidad todos, desde las cámaras 360, hasta su nuevo asistente virtual Bixby o sus teles con el nuevo sistema operativo Tizen.

La fundación trabaja para que la vida de los pacientes de ELA pueda ser mejor mientras se encuentra el origen de la enfermedad y esperemos que una cura.

La ELA es una enfermedad muy dura porque va destruyendo la capacidad motora de los pacientes mientras su cabeza sigue funcionando a la perfección. ¿Alguna vez habéis tenido la sensación de que vuestro cuerpo se ha dormido pero vuestro cerebro no? ¿De que os enteráis de todo lo que pasa a vuestro alrededor pero no tenéis modo de reaccionar? Imaginad que fuese así constantemente.

En las fases avanzadas de la enfermedad, los pacientes sólo pueden mover los ojos. Nada más.

La realidad de la ELA

Así, lo primero de lo que se encargó la fundación fue de ponernos en contacto con la realidad de la enfermedad. Pero esta no es sólo la de los pacientes, es también la de sus médicos, sus familias o sus cuidadores. Ejemplos de esto fueron Carlos Espada (Socio de Everis y enfermo de ELA a quien podéis ver en una charla a continuación), María Bestue (neuróloga que trabaja con pacientes de ELA), los hijos y la mujer de Francisco Luzón (el fundador de la fundación) o Angélica y Alexandra (dos de las cuidadoras de Carlos).

Los problemas de la ELA

La siguiente parte del trabajo, que gracias a la coordinación de Mario fue muy efectiva, se centro en identificar los problemas de cualquiera de estos actores que creyesemos que podríamos solucionar de un modo sencillo.

Uno de los problemas más graves de esta enfermedad es que convierte a los pacientes en grandes dependientes que necesitan hacer una inversión muy grande para vivir. Además, en la mayoría de los casos, estos dejan de poder realizar los trabajos que realizaban antes. Este es un problema muy grande debido a que dificulta el acceso a soluciones que podrían mitigar otros problemas más “pequeños”. Siempre he creído que las necesidades de todos deben de cubrirse desde las administraciones públicas, aunque mientras esto se consigue es de agradecer el trabajo de fundaciones como esta.

En algunos sitios se está intentando resolver ese gran problema, como en Japón dónde han creado un bar en el que los camareros son robots controlados por gente que sufre algún tipo de parálisis.

En nuestro caso nos quedamos con 4 problemas que creíamos que podrían tener alguna solución en el corto plazo:

  1. El desconocimiento que hay de la enfermedad.
  2. La perdida de identidad de los pacientes.
  3. La dificultad de comunicación de los pacientes (haciendo sólo uso de sus ojos).
  4. La fragmentación de los datos clínicos de los pacientes.
Soluciones

Cada uno de estos problemas, y sus posibles soluciones dan para largo y tendido.

Yo trabajé en el cuarto de estos, de la mano de dos cracks de los datos que ya han hecho público su resumen y análisis: Ana y Josep; y con María Bestue que nos ayudó tremendamente a entender las implicaciones de este problema básico.

En mi caso, voy a dejar para más adelante la creación de un “proyecto tipo” con un análisis más completo del problema y la solución que planteamos, que no sólamente afecta a los pacientes de ELA sino que a cualquiera nos podría resultar de utilidad en un momento dado, como cuando me estuve pegando con Sanitas por conseguir todos mis datos.

Para acabar, como punto y seguido, os dejo con un vídeo de César de La Hora Maker, que creo que resume muy bien el fin de semana además de lograr otros objetivos.

¿Cómo conseguir que una Inteligencia Artificial coloree las fotos del abuelo?

Cuando hablamos  de Inteligencia Artificial, es fácil pensar en sistemas muy complejos y caros. Sin embargo, lo más complejo es crear un modelo para resolver una clase de problemas. Ese modelo, una vez creado, es fácil de aplicar para solucionar un problema concreto usando un poco de imaginación. Hoy veremos como usar un modelo creado por otra persona, para nuestro objetivo: colorear las fotos que tengamos en blanco y negro de nuestros abuelos.

Imagen en blanco y negro coloreada por una Inteligencia Artificial
De una postal antigua, republicada en eldiariomontanes.es

Para la creación de un modelo, hay que saber mucho del ámbito de aplicación, hay que tener una buena base de matemáticas estadísticas y hay que conocer los diferentes algoritmos e invertir un buen tiempo probando cosas distintas. Mucha gente está creando distintos modelos, ya sea para practicar, para investigar o con otros objetivos.

Algunos de estos modelos son liberados por sus creadores, como el que nos ocupa hoy:

DeOldify es un proyecto basado en Deep Learning para colorear y restaurar imágenes antiguas. Su creador (Jason Antic) lo liberó bajo licencia MIT, lo cual nos permitirá hacer casi cualquier cosa con él.

Por tanto, para conseguir nuestro objetivo de hoy, que no es ni más ni menos que colorear las fotos antiguas de nuestros abuelos que tengamos por casa, podremos hacer uso de este proyecto.

Pero ¡ojo! También podríamos usarlo para montar un servicio online de coloreado automático de imágenes antiguas a razón de euro cada una, o para colorear las imágenes captadas por una cámara de visión nocturna (de las baratas que se ven en verde y negro).

¿Qué podemos esperar de esta Inteligencia Artificial?

En mis pruebas, que podéis ver en la foto de cabecera o en el mini-hilo que parte del siguiente twit, podéis ver los resultados con algunas fotos muy distintas. Probablemente, trabajando un poco sobre el modelo para afinar algunos puntos o incluso reentrenándolo (siguiendo los pasos de Jason) con imágenes similares a sobre las cuales queremos aplicar el modelo, podríamos obtener resultados mejores aún.

¿Cómo podemos usar esta Inteligencia Artificial?

Cuando estuve haciendo mis pruebas (hace un mes aprox.), y dado que quería jugar mucho, opté por instalar todo lo necesario en mi máquina. En ese momento no es algo que habría aconsejado porque no era trivial, pero ahora parece que con unas pocas instrucciones lo puedes tener funcionando en cualquier lado. ¡Ojo! No las he probado, pero Jason dice que en su ordenador funciona ;).

git clone https://github.com/jantic/DeOldify.git DeOldify
cd DeOldify
conda env create -f environment.yml

#Then run it with this:

source activate deoldify
jupyter lab

Sin embargo hay un modo mucho más sencillo y es ejecutarlo online partiendo del notebook subido a la plataforma de Google Colab.  Ten en cuenta que es una plataforma que no está pulida del todo y que no siempre funciona bien, por lo que si no te funciona a la primera: no te desesperes.

Los pasos serían:
  1. Visita la url.
  2. Abajo, donde ves las fotos de Lincoln y demás, cambia los links de los wget por links a las fotos que quieras (tienen que estar en internet en una url accesible a cualquiera, por ejemplo puedes compartirlas mediante un enlace de Google Drive). Si lo necesitases podrías copiar más bloques para procesar más fotos: un wget y un vis.plot_transformed_image por imagen.
  3. Ejecuta la opción de menú Runtime>Run all.
  4. Cuando el script llegue a la mitad (al bloque de auth.authenticate_user…) te pedirá que sigas un link y copies un código para autenticarte con una cuenta de Google. Esto es porque necesita descargarse los pesos que se han obtenido en los entrenamientos del modelo para que la red neuronal pueda usarlos con las nuevas fotos, cuando te lo instalas en tu equipo es un paso que se puede saltar, pero con este script de Colab es necesario.
  5. Espera a que procese las imágenes.
  6. Comparte conmigo tus resultados ya sea con un comentario, un twit o lo que veas.

Con estos pasos tan sencillos, obtendrás unas imágenes antiguas que antes sólo tenías en blanco y negro, coloreadas por una Inteligencia Artificial. Cuando tu familia te pregunte como lo has hecho, puedes hablarles de Inteligencia Artificial, Deep Learning, etc. o bien puedes usar el comodín de “magia de informático”.

Chatbots (III): La magia de crear chatbots sin abrir Visual Studio gracias a FormFlow

Los chatbots, las interfaces conversacionales, que empezaron a estar de moda hace un par de años resultan muy divertidos, pero no siempre son útiles. Requiere bastante esfuerzo diseñar una conversación teniendo en cuenta todas las opciones de respuesta que pueden plantear los usuarios. Pero: ¿es necesario controlar todas las posibles entradas para realizar una tarea de negocio? En la mayoría de las aplicaciones, la respuesta es un rotundo “no”. Si así fuese, no se basarían la mayoría de apps en formularios para recoger datos con los que hacer algo.

Seguir leyendo en CompartiMOSS.

Chatbots (II): Cómo lograr que tu móvil te lea Hacker News (los contenidos también)

Siguiendo con la serie sobre Chatbots, he preparado un programilla para que Google Assistant te permita navegar usando la voz por Hacker News (el foro de Y Combinator dedicado a noticias de tecnología) y escuchar el cuerpo de las noticias que más te interesen.

[In English]

Si sólo quieres usarla basta con que le digas a Google “Talk to Hacker News Reader. Sin embargo, si quieres conocer los puntos clave para poder hacer algo similar en pocas horas y con muy poco código sigue leyendo, porque vamos a ver 6 características humanas muy fáciles de obtener gracias a Dialogflow.

Dialogflow es una plataforma de Google (antes conocida como API.ai), que nos permite diseñar chatbots de un modo sencillo.

Es tan potente, que se pueden hacer muchísimas cosas sin tirar una sóla línea de código.

Por ejemplo, tiene integrado un sistema de reconocimiento de lenguaje natural el que, dándole unos cuantos ejemplos para que entrene, será capaz de reconocer lo que quieren decir los usuarios de nuestra acción y conducirles por las partes de nuestro chatbot para que obtengan la respuesta adecuada.

Por tanto, nos permitirá dar a nuestro chatbot de capacidades “humanas” de un modo muy simple.

1. Escucha

Los intents son el componente principal de un chatbot en Dialogflow. Lo podemos ver como cada unidad de conversación, es cada parte que nuestro sistema va a ser capaz de comprender y dar una respuesta.

Dialogflow nos permite indicar eventos y otras cosas que lanzarán ese intent, y en especial, nos permite indicar distintas frases que le sirvan de guía al chatbot, para que cuando las detecte sepa qué es ese y no otro el que tiene que lanzar.

También permite indicar directamente respuestas ahí mismo, que se irán lanzando aleatoriamente sin que tú tengas que programar nada.

2. Entendimiento

Que el chatbot pueda, sin que programemos nada, distinguir unas frases de otras es genial, pero le falta algo de poder. Al final, no sólo es importante escuchar las frases si no que también hay que entender los conceptos que están encerrados en ellas.

Al introducir las frases de ejemplo, tenemos la posibilidad de seleccionar partes del texto para decirle que es algo importante que debería abstraer y entender más allá de la muestra concreta.

Cuando el motor de reconocimiento del lenguaje entienda alguna de las entidades que hayamos mapeado a variables, las extraerá y nos las pasará como parámetros en las peticiones que nos diga que tenemos que procesar.

El sistema viene ya preparado para entender muchas cosas por defecto, pero nos da la libertad de definir nuestras propias entidades que nos ayuden a modelar exactamente lo que queremos. Por ejemplo, yo me he creado una entidad con los distintos apartados de noticias de Hacker News que se pueden leer: top, new, best, ask, show y job. Así el sistema puede entender que un usuario quiere que le lean los trabajos subidos a la plataforma o las últimas noticias.

3. Inteligencia

Cuando las opciones de respuesta de los intents no son suficientes, podemos crear nuestro propio servicio web que conteste a las peticiones que haya entendido el sistema.

Con las librerías que ofrece Google es fácil montar un servicio en cualquier lenguaje y plataforma. Sin embargo, para cosas pequeñas como el Hacker News Reader, nos permite codificar directamente sobre la plataforma código en node.js que será desplegado de manera transparente para nosotros en Firebase.

Cuando penséis en las cosas que podéis hacer, daros cuenta de que tirando de un servicio (en Firebase o dónde queráis) no estaréis ejecutando código en cliente, por lo que podéis hacer literalmente todo.

Por ejemplo, no os tenéis que ceñir a usar APIs para acceder a contenidos, pues no hay restricciones de cross origin que se apliquen a vuestro código. Tenéis todo Internet a vuestro alcance de un modo sencillísimo.

Mi acción permite al usuario escuchar las noticias que están linkadas desde Hacker News. Para esto se descarga la web (como si fuese un navegador) y la procesa para extraer el contenido (no me he esmerado mucho y se podría hacer mucho mejor).

4. Análisis

Para usar el editor inline, tendremos que tener algunas restricciones como que por narices nuestra función deberá llamarse “dialogflowFirebaseFulfillment” si queremos que se despliegue automáticamente y funcione todo bien.

Sin embargo, gracias a que Dialogflow escucha y entiende, al dotar de inteligencia a nuestro chatbot lo tendremos muy fácil para que sea capaz de realizar los análisis pertinentes de cada petición del usuario.

En el código podremos de un modo sencillo mapear cada uno de los intents que hayamos creado con funciones nuestras. Como estos se encargaban de escuchar, nos indicarán lo que el usuario quiere.

También podremos acceder a los parámetros que el sistema haya entendido gracias a las entidades que hayamos creado (entender).

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
    const agent = new WebhookClient({
        request,
        response
    });
    //...

    function read(agent) {
        var number = agent.parameters.number || 0;
        //...
    }

    let intentMap = new Map();
    intentMap.set('Default Welcome Intent', welcome);
    intentMap.set('Repeat', repeat);
    intentMap.set('Back', repeat);
    intentMap.set('Read', read);
    //...
    var promise = null;
    try {
        promise = agent.handleRequest(intentMap).then(function() {
            log('all done');
        }).catch(manageError);
    } catch (e) {
        manageError(e);
    }
    return promise;
});

5. Respuesta

Para que nuestro chatbot conteste, tan solo tenemos que hacer uso del método add de nuestro WebhookClient. Podremos pasarle directamente texto, sugerencias de respuesta para guiar al usuario o fichas con texto enriquecido en dónde podremos embeber imágenes, poner emoticonos, etc.

Hay que tener en cuenta que algunos de los dispositivos en los que potencialmente correrá nuestra aplicación pueden que no tengan pantalla o navegador web por ejemplo. Por lo que hay que tener en cuenta que, si queremos algo puramente conversacional, deberíamos evitar los estímulos visuales y ayudar a nuestro bot a expresarse sólo con el uso de la palabra.

6. Recuerdo

Una de las cosas que más nos exasperan a todos es tener que repetir las cosas una y otra vez, por lo que es importante que nuestro bot recuerde lo que ya se le haya dicho.

Para esto usaremos los contextos. Los contextos es una estructura que maneja Dialogflow para ayudarnos a filtrar entre intents y permitir a la plataforma lanzar el adecuado. Se pueden usar, por ejemplo, para saber si el dispositivo del cliente tiene pantalla.

Su uso no está muy documentado, pero una vez que ves como funcionan los dos métodos básicos, es trivial su uso para guardar información entre cada frase de una conversación.

    //...
    var context = agent.getContext('vars');
    var vars = context ? context.parameters : {
        ts: (new Date()).getTime() % 10000,
        items: [],
        pointer: 0,
        list: 0,
        //...
    };
    //...
    agent.setContext({
        name: 'vars',
        lifespan: 1000,
        'parameters': vars
    });
    //...

Con estas 6 capacidades humanas ya tenéis las claves para poder hacer algo similar vosotros mismos y dar mucha más funcionalidad a Google Assistant.

Espero que os resulte útil, tanto la acción en sí como la información extra. Si es así compartidlo y difundid la palabra.

Seguiremos con algunos otros sistemas que nos permiten también hacer chatbots de un modo sencillo, y con cómo integrar nuestros bots en distintas plataformas.

Chatbots (I): Crea una app para hablar con tu móvil sin programar nada

Comienza hoy una serie de posts relacionados con los chatbots, con una dirección y sentido pero sin saber muy bien a dónde llegaremos.

En el de hoy vamos a ver un modo supersencillo de crear una aplicación que te permita hablar (en plan chat o usando la voz) con tu móvil sin programar nada, ¡ni una sóla línea de código!

[In English]

Muchos, habréis usado ya Google Assistant. El “Siri” de Google al que accedías en terminales Android diciendo “Ok, Google”.

Ahora ya no está sólo en teléfonos Android, se puede disfrutar de su ayuda en los terminales con iOS, en los Google Home, smart watches, en coches, televisores, etc.

Por cierto, decir que Google  (por el programa de recompensas del que os hablé hace un par de meses) me mandó un mail indicándome que me va a regalar un Google Home por una aplicación que hice siguiendo este método, empleando tan solo unas pocas horas. ¿Queréis hacer lo mismo?

Cuando vais a la consola de actions (que así se llaman las aplicaciones para el asistente), al añadir un nuevo proyecto, Google te da varias opciones. Puedes programártelo todo contra una API, puedes usar una plataforma avanzada en la que puedes programar pero que te da muchas cosas hechas (se llama DialogFlow), o puedes usar una de las tres plantillas que tiene.

Como veis en la imagen previa hay 3 plantillas distintas:

  1. Trivia. Es una plantilla que te permite crear un juego de preguntas y respuestas. Por cada pregunta te permite aportar distintas respuestas e incluso sinónimos a las respuestas. Esta plantilla está preparada para cargar contenidos en Inglés, Francés, Alemán y Japonés.
  2. Personality Quiz. Es una plantilla preparada para crear tests de personalidad. Por ejemplo, podríais crear uno como el que usó Cambridge Analítica (la del follón con Facebook) para captar datos de millones de estadounidenses e influir en sus elecciones. Esta, por el momento, sólo se puede usar para crear contenido en inglés.
  3. Flash Cards. Es una plantilla que por el momento sólo permite crear apps en inglés, y que busca que se cree un juego educativo para aprender sobre cosas.

En el primer paso (salvo en la segunda que no dispones por el momento de esta opción), has de elegir el tipo de personalidad. Esto es principalmente elegir si quieres una voz de mujer, hombre o robot. La elección también influirá en el acento, expresiones y efectos de sonido que empleará tu aplicación.

En el segundo paso, el de contenido, es importante que os copieis la plantilla de Google Sheet que os ofrece, ya que si creais una vosotros desde cero, es muy fácil que no cumpláis con todas las validaciones que se realizarán después.

En la plantilla podéis cambiar cuanto queráis para adaptarla a vuestro contenido, pero es muy importante que en la segunda hoja (que está pensada para que introduzcáis varios parámetros de configuración) cambieis el título de vuestra aplicación, para no entrar en conflicto con otras aplicaciones que se hayan creado antes.

Una vez que hayáis seguido este wizard (el formulario que te guía paso a paso por un proceso, para los ajenos al mundo del diseño y desarrollo de aplicaciones), tan sólo tendréis que seguir el de Overview para indicar cómo se debe invocar a vuestra aplicación, poner descripciones e iconos, etc. etc.

Con esto hecho, ya estaréis preparados para mandar vuestra aplicación a validación y que una vez que sea aprobada, vuestros usuarios puedan decirle a su móvil “Talk to …” y que empiece la magia.

Recompensas para desarrolladores

Hablamos hace tiempo de distintos sitios en los que podías aprender a programar mientras jugabas. Hoy vamos a ver algunos sitios en los que para gamificar el desarrollo con sus tecnologías, te dan recompensas físicas a ciertos logros. A veces son unas simples (pero muy chulas) pegatinas, y a veces son cacharros con los que podrás jugar mucho más.

devRant duck

Por internet puedes encontrar algún recopilatorio e incluso hay alguna comunidad centrada en la obtención de recompensas (como codecuriosity y mulesoft), pero no conozco ninguno que tenga los premios o recompensas que se pueden conseguir específicamente en España, ya que algunas empresas distinguen entre países. Vamos a verlas:

  • En Codeship puedes conseguir merchan por usar su plataforma de integración continua.
  • En devRant puedes conseguir pegatinas o una bola anti-estrés si alguno de los mensajes que dejes en su comunidad de developers tiene más de 20 o 500 positivos. Si no quieres compartir nada, siempre puedes comprar en su tienda ¡y tienen patitos!
  • En Digital Ocean te dan unas pegatinas muy chulas de su mascota, sólo por rellenar una encuesta.
  • En Google Assistant te dan una camiseta si lanzas una aplicación, y te regalan uno de sus cacharros si consigues muchos usuarios, o si tus usuarios son recurrentes, o si pones tu aplicación en al menos dos idiomas.
  • En Product Hunt, si montas un evento o un hackathon, te mandan merchan para los asistentes.
  • En Hurricane Electric te dan una camiseta si te certificas como que sabes de IPV6.
  • En Scaleway te mandan una camiseta por usar su plataforma cloud.
  • En Datadog te mandan una camiseta por probar su plataforma de monitorización y análisis.

Estas son las que tengo fichadas ¿conocéis alguna otra?

Desarrollo seguro: OWASP

Recientemente, he estado repasando los cursos que hay online, en universidades y en otras entidades sobre desarrollo seguro, viendo que casi todos se centran en OWASP (Open Web Application Segurity Project), lo cual está muy bien, pero se quedan en hablar del Top 10 de vulnerabilidades, y en realidad hay mucho más.
security photo

Está muy bien saber cómo se puede originar un fuego, pero es mucho más importante saber cómo actuar en cada caso o cómo se puede evitar que el fuego llegue a iniciarse ¿no? Con la seguridad en el desarrollo pasa lo mismo.

En el PDF que resume las vulnerabilidades, se pueden ver unos anexos con las responsabilidades de cada perfil (manager, developer y tester), y una pequeña guía para que una organización sea  segura. Esos anexos son muy importantes, puesto que nos ayudarán a ver si estamos haciendo las cosas bien o no.

Y bien, sabiendo los problemas que pueden surgir y la responsabilidad de cada uno para tener una empresa que practique desarrollo seguro ¿qué hacemos? Llegamos al que para mi es uno de los compendios más importantes que realiza este proyecto: OWASP Proactive Controls. En él se resumen las buenas prácticas que hay que realizar para funcionar de un modo seguro y evitar la mayoría de los incendios. Este es su propio Top 10:

  1. Verificar la seguridad pronto y a menudo
  2. Parametrizar las queries
  3. Codificar los datos
  4. Validar todas las entradas
  5. Implementar controles de autenticación y de identidad
  6. Implementar controles de acceso apropiados
  7. Proteger los datos
  8. Implementar logging y detección de intrusos
  9. Aprovechar frameworks y librerías de seguridad
  10. Manejo de errores y excepciones

¿Pones todos esos puntos en práctica? Sé que puede parecer difícil, pero profundizando un poco más, podréis ver que tienen también guías específicas de cómo hacerlo con cada tecnología, porque no es lo mismo estar haciendo una app para Android, que una web en PHP, y siguiéndolas podréis de un modo sencillo aseguraros de que estáis poniendo todo de vuestra parte para que vuestros desarrollos sean seguros.