Category Archives: Mapa de Aprendizaje

Definición de “Hecho” – DoD

17 Ene , 2018,
Jose Nunez
, ,
No Comments

Siguiendo con nuestro gran tema de equipos AGILE y metodología SCRUM, hoy queremos profundizar un poco sobre el concepto de “definición de hecho” o en inglés “definition of done”.

Es aquello que debe cumplirse para decir que una unidad de trabajo (historia de usuario) está hecha, completada, finalizada.

Una historia de usuario no puede ser considerada para aceptación a menos que cumpla con dicho criterio.

 

La definición de hecho es un acuerdo de equipo para asegurar la calidad del trabajo y la calidad de la dinámica de equipo a lo largo de un proyecto.

Una definición de hecho apropiada busca cumplir con las siguientes metas:

  1. Estándares de Calidad para Diseño y Código.
  2. Administración de Conocimiento.
  3. Integración y Entrega Continua.

Cada historia de usuario deberá cumplir con los siguientes criterios:

  1. Estrategia de versionamiento y ramificación de código. Corresponde al uso de un sistema de versionamiento de código y al uso de una estrategia de ramificación que incluya la creación de ramas funcionales a partir de una rama general de desarrollo, la actualización de las ramas funcionales con la ultima versión de la rama de desarrollo y la actualización del código de la rama de desarrollo desde las ramas funcionales luego de una revisión de código.
  2. Pruebas unitarias. Trata del desarrollo de pruebas unitarias para el código que haya sido modificado o creado durante cada historia de usuario. Las pruebas unitarias deben incluir simulaciones (mocking) de las interfases externas y alcanzar al menos una cobertura de código del 70%.
  3. Revisiones de código. Consiste en revisar el código creado y/o modificado durante una historia de usuario como mecanismo de aprendizaje para otros desarrolladores y como mecanismo de validación/mejora de la calidad del código.
  4. Documentación aplicable. Corresponde a actualizar la documentación aplicable, incluyendo documentos de arquitectura/diseño, documento experto, documentos de instalación y, en el caso de SPIKES (historias de investigación) la documentación del resultado de las investigaciones. También es recomendado el uso de WIKI’s para dicha documentación.
  5. Pruebas de aseguramiento de calidad. Se debe contar con un conjunto de pruebas para cada historia de usuario que validen el cumplimiento funcional del criterio de aceptación; y la ejecución satisfactoria de dichas pruebas.
  6. Integración del código en los ambientes de Desarrollo y de Pruebas (QA) deseablemente de forma automatizada.
  7. Pruebas de regresión e integración. Finalmente se debe contar con pruebas actualizadas de regresión e integración, deseablemente automatizadas, a fin de validar que los cambios en el código no hayan tenido efectos adversos indirectos sobre otras funcionalidades del sistema.

 

Cómo instalar Letsencrypt en una cuenta compartida de GoDaddy

23 Dic , 2017,
Jose Nunez
, , , ,
No Comments

Esta publicación se basa en el siguiente artículo Mike Seifriedhow-to-install-a-lets-encrypt-ssl-on-a-shared-godaddy-hosting-account

(!) Advertencia: Este procedimiento involucra crear una llave privada para su servidor desde un sitio de un tercero (ZeroSSL). Esto implica que ZeroSSL tendrá acceso a la llave privada que define la identidad de su sitio web. Se recomienda que para implementaciones que requieran una mayor seguridad, la llave privada de la identidad de su sitio web no sea compartida con terceros.


Paso 1 – ZeroSSL

Usando el servicio https://zerossl.com/ es posible generar los archivos necesarios para configurar un servicio SSL.

  1. Vaya a ZeroSSL, (una interface web para obtener certificados mediante Let’s Encrypt)
  2. Haga clic en “Online Tools” y luego escoja “FREE SSL Certificate Wizard”.
  3. Solicitud de firma de certificado: Digite la dirección del dominio al que desea configurar en la casilla de la derecha/arriba “Domains ONLY IF YOU DON’T HAVE CSR” y haga clic en NEXT. Esto generará un Certificate Sign Request (CSR) en la casilla de la derecha/abajo. Si ya tiene un CSR solamente pegue el contenido del mismo en la casilla derecha/abajo. Haga clic en el botón DOWNLOAD (derecha/abajo) para descargar el CSR que podrá reutilizar en futuras renovaciones de su certificado.
  4. Llave de su cuenta: Digite su dirección de email en la casilla izquierda/arriba “” y haga click en NEXT. Esto generará un “account key” en la casilla izquierda abajo. Si ya tiene un “account key” de Let’s Encrypt solo pegue el contenido en la casilla izquierda/abajo y haga clic en NEXT para el siguiente paso. Recuerde que puede usar el boton DOWNLOAD (izquierda/abajo) para descargar el “account key” y así reutilizarlo en futuras operaciones.
  5. ACME CHALLENGE: Seguidamente el sistema genera un archivo de prueba conocido como el “ACME CHALLENGE” para cada dominio que desea asegurar. Descargue el archivo y asegurese de copiarlo fisicamente en el servidor web que desea asegurar en la carpeta webroot/.well-known/acme-challenge/ de su dominio **. Haga clic en NEXT para que el sistema compruebe que el archivo está disponible desde su dominio.
  6. Luego de la comprobación del reto ACME, el sistema generará dos archivos: (1) la llave privada de su sitio web y (2) el certificado SSL de su sitio web. Descárguelos y guárdelos en un lugar seguro.

** La ruta de destino (carpeta de confirmación) luce así: /public_html/.well-known/acme-challenge/  . Este archivo será utilizados como prueba de que usted es dueño del dominio del sitio web que está configurando. Al solicitar un certificado ZeroSSL para una carpeta raíz es posible especificar ambas formas de acceso: yourdomain.com y www.yourdomain.com. Tome en cuenta que para instalar Let’s Encrypt en un sub-dominio no es necesario utilizar el sub-sub dominio www. También tenga presente que la carpeta de confirmación deberá ser accesible sin necesidad de autenticación.


Paso 2 – Configuración en CPANEL de GoDaddy

Ahora vaya al panel de control (cPanel) de GoDaddy y busque la sección de Seguridad (Security) y haga clic en SSL/TLS.

Alija “Install and Manage SSL for your site (HTTPS)”, y haga clic en  “Manage SSL sites”.

Allí encontrará un formulario sencillo donde podra registrar la siguiente información: a) el dominio, b) el certificado, c) la llave privada y d) el “bundle” de la autoridad certificadora. Los ítems b,c y d son elementos que ud recibió de ZeroSSL. Es importante notar que los certificados tienen marcadores de inicio y final que deben incluirse en el formulario (“—–BEGIN CERTIFICATE—–” y “—–END CERTIFICATE—–“; de lo contrario obtendrá un error indicando que el certificado no es válido.

También, el certificado obtenido de ZeroSSL tiene dos partes: el certificado y el “Bundle” de la autoridad certificadora (CABUNDLE); estos tambien tienen indicadores de inicio y final.

Una vez que ud tenga todos los datos en el formulario (en mi caso pude dejar el CABUNDLE vacio) se hace clic en “Install Certificate” y listo; su sitio web ya puede ser accesado usando el protocolo HTTPS.

Existe un plug-in de WordPress para asegurar el acceso via HTTPS que se llama Easy HTTPS (SSL) Redirection.

Experimentación Ondas Cerebrales

6 Dic , 2017,
Jose Nunez
, , , , ,
No Comments

Recientemente tuvimos la oportunidad de experimentar un poco con un sensor de ondas cerebrales (Emotiv Insight) que nos ha servido de introducción al fascinante mundo de los BCI (Brain-Computer Interface)

El proyecto que nos trajo a este punto trata de desarrollar formas de comunicación adicionales para personas con algunas dificultades físicas para comunicarse, incluyendo peronas con dificultades para el habla, la escucha o diversos niveles de parálisis cerebral.

En este artículo quiero condensar un poco una propuesta para una metodología de experimentación que nos permita capturar datos de este tipo de dispositivos y que sirvan de insumo para crear modelos de aprendizaje de máquinas que a su vez nos lleven a desarrollar modelos de interpretación de las ondas y por ende los deseos o necesidades de las personas.

Metodología de Experimentación

  1. Definir un repositorio para la documentación oficial de cada experimento y para los resultados de los experimentos.
  2. Definir personas y roles: facilitador, sujeto de experimentación, observadores.
  3. Definir objetivos y metas del experimento
  4. Definir características de los sujetos de experimentación.
  5. Definir un ambiente controlado para minimizar los estímulos no esperados y el ruido
  6. Establecer un guión o protocolo de pasos, tiempos y clases para el experimento,
    1. Definir tareas a realizar: preparación, arranque, ejecución, finalización y cierre.
    2. Identificar estímulos Intencionales: preparación, arranque, ejecución, finalización, cierre
    3. Identificar estímulos no intencionales: derivados, ruido aceptable, ruido no aceptable (invalidación temprana del experimento)
  7. El resultado de cada experimento será un archivo con la información sensada y la pre-clasificación de los diferentes eventos o estímulos ocurridos detectados por el observador. Este archivo se usará para generar modelos de aprendizaje de máquinas que nos permitan estudiar y entender los fenómenos documentados en cada experimento.

Como siempre, sus comentarios para enriquecer esta metodología serán de gran valor para nosotros.


Haga clic acá para una plantilla de ejemplo


Algunas Referencias Interesantes:

Realizando un Proyecto SCRUM exitoso en 7 pasos

27 Nov , 2017,
Jose Nunez
, , ,
No Comments

Continuando con nuestra serie sobre SCRUM les presentamos 7 pasos para un proyecto SCRUM exitoso.

Pueden ver nuestro artículo anterior que resume varios conceptos importantes de SCRUM.

También pueden ver acá que nuestra plantilla scrum incluye detalles de cada ceremonia SCRUM.

Paso 1Identifique una persona que esté dispuesta a llevar a cabo el rol de SCRUM master, una persona que lleve el rol de Dueño de Producto e identifique a su equipo de ejecución.


Paso 2 – El dueño de producto crea un backlog inicial que describa el producto en unidades de trabajo (historias de usuario). Para esto normalmente se requiere el trabajo conjunto entre el dueño de producto y el equipo de ejecución donde el scrum master facilita el proceso, principalmente orientando donde sea necesario al dueño de producto para que las historias de usuario tengan una buena descripción, criterio de aceptación y estimación superficial.


Paso 3 – Se realiza una ceremonia oficial de Planeamiento del Producto donde todo el equipo (dueño de producto, equipo de ejecución, scrum master) revisan el backlog, las estimaciones superficiales, agregando criterios técnicos y aclarando dudas sobre cada historia de usuario. Esta ceremonia es organizada y facilitada por el scrum master. El resultado de esta ceremonia es una estimación general del tamaño del proyecto.


Paso 4 – Se organiza el calendario del siguiente trimestre en iteraciones de dos semanas cada una (aproximadamente entre cinco a seis iteraciones en total). Para esto el scrum master organiza las siguientes ceremonias en el calendario del equipo:

  • Poda del backlog cada dos semanas. Acá se identifican dudas y se hace una estimación final del esfuerzo de cada historia de usuario.
  • Planeamiento de Iteraciones al inicio de cada iteración (cada dos semanas), incluyendo Cierre de Iteración, Retrospectiva y Planeamiento.
  • Actualizaciones Diarias (15 minutos a la misma hora)
  • Planeamiento incremental del producto al final del trimestre. El scrum master tiene la responsabilidad de asegurarse que cada ceremonia se ejecute y tenga el resultado esperado. Para esto cuenta con la colaboración indispensable de todo el equipo, especialmente del dueño del producto.

Paso 5 – Durante la ceremonia de poda del backlog, el equipo de ejecución junto con el dueño de producto identifican dudas en cada historia de usuario y hacen una estimación final del esfuerzo requerido para cada iteración medido en puntos (1,2,3,5,8,13). Se realiza el esfuerzo de dividir las historias de usuario más grandes (> 5 puntos) en historias de usuario más pequeñas alcanzables en una iteración. Se identifican también historias de usuario de investigación donde se requiera aprender cómo realizar alguna tarea o diseñar algo. Las historias de usuario que tengan las aclaraciones necesarias y la estimación final en puntos se denominan “historias podadas”. Esto es importante porque en una iteración solamente se pueden asumir historias podadas.


Paso 6 – En el planeamiento de iteración se identifican la disponibilidad de cada miembro del equipo para la iteración, incluyendo ausencias programadas (vacaciones, permisos, capacitaciones), la cantidad de horas que cada miembro del equipo (en especial el equipo de ejecución) tiene disponibles para realizar tareas de la iteración y se realiza la estimación detallada de cada historia de usuario que se vaya a adoptar en la iteración en términos de tareas y horas estimadas para cada tarea.Al final del planeamiento se tendrá:

  • Una lista de miembros del equipo de ejecución y horas disponibles para la iteración y días de ausencia programada.
  • Una lista de historias adoptadas (compromiso de la iteración) con el detalle de tareas y estimación de las horas que tomaría cada tarea y cual miembro del equipo está a cargo de cada tarea. La sumatoria de las horas estimadas para cada tarea por miembro de equipo se llama “asignación” (allocation) y no debe superar las horas disponibles para los miembros de equipo encargado. Con la cantidad de asignación entre la cantidad de horas disponibles por encargado calculamos el porcentaje de asignación que nos permite ver si un miembro de equipo tiene una signación muy baja (< 85%) o muy alta (>100%)

Paso 7 – El equipo de ejecución adquiere un compromiso por cada iteración. Durante las ceremonias de actualización diaria se actualizan las métricas de ejecución ( horas pendientes, puntos aceptados ) para calcular el gráfico de burndown y se aclaran dudas, se identifican dificultades que requieran ayuda de otros miembros del equipo. Durante todo este proceso el scrum master realiza una labor de facilitador y también da seguimiento a las necesidades de ayuda.

Durante la iteración se ejecuta el compromiso del equipo, se removen obstáculos y se monitorea la ejecución dentro del marco de la ceremonia de actualización diaria.

Al final de la iteración se realiza un cierre que involucra:

  • Una sesión retrospectiva (qué cosas debemos seguir haciendo, qué cosas debemos dejar de hacer y qué cosas debemos empezar a hacer) especialmente con miras a mejorar el % compromiso entregado.
  • Una demostración de las historias de usuario aceptadas por el dueño de producto como terminadas.
  • Y el reacomodo de historias de usuario que no se hayan terminado (compromiso fallido) hacia la siguiente iteración.

Y… en resumen:

En mi experiencia – Un resumen sobre SCRUM

26 Nov , 2017,
Jose Nunez
, ,
No Comments

La administración de proyectos es una de las actividades más importantes de quehacer humano. En gran medida, la administración de proyectos determina el éxito o fracaso de proyectos y hasta de organizaciones enteras.

En la actualidad la administración de proyectos ha evolucionado de modelos como Waterfall, donde un gerente de proyecto establece un cronograma y dirige un conjunto de personas para cumplirlo al final de dicho cronograma, a modelos más iterativos donde los roles de administración de proyecto y de equipo han sido completamente redefinidos; dando lugar a interacciones de equipo de trabajo más ricas y productivas. Uno de estos modelos es SCRUM.

También pueden ver nuestro artículo: Realizando un Proyecto en SCRUM exitoso en 7 pasos

El siguiente mapa mental ilustra los principales elementos que componen la metodología SCRUM:

En resumen

Proceso Iterativo

El modelo SCRUM permite llevar adelante proyectos simples y complejos mediante un proceso iterativo de planeamiento y ejecución, donde los equipos de trabajo son redefinidos para cubrir roles específicos como SCRUM Master, dueño de producto y ejecutores. Cada iteración usualmente se extiende por dos o tres semanas.


¿Qué es el proyecto? un conjunto de historias de usuario o metas

Un proyecto es entonces un conjunto de metas definidas por el dueño de producto (muchas veces con ayuda del equipo de ejecución). Cada meta (también llamada historia de usuario) se define en términos de descripción y criterio de aceptación.

Un ejemplo de una historia de usuario hipotética es el siguiente:

  • Descripción: Como cliente de uber, quiero poder pagar en efectivo
  • Criterio de aceptación:
    • La aplicación móvil tiene un botón para que el usuario escoja el medio de pago entre su tarjeta o efectivo
    • Cuando el usuario elige pagar en efectivo su tarjeta no es debitada con el costo del viaje
    • El conductor tiene un mecanismo para dar fe en su aplicación de haber recibido el dinero del pago

Esta lista de historias de usuario  es luego revisada por el equipo de ejecución para estimar a grosso modo el esfuerzo requerido para realizar cada una de ellas. Esta estimación de esfuerzo se hace en puntos relativos (1,2,3,5,8,13) . La siguiente lista muestra un ejemplo de la equivalencia de los puntos al esfuerzo requerido:

  • 1 punto: La historia de usuario se puede completar en 8 horas o menos con ningun riesgo previsible de extender su ejecución y ninguna dependencia externa.
  • 2 puntos: La historia de usuario se puede completar en 16 horas o menos y/o involucra una nivel bajo de riesgo y/o pocas dependencias externas.
  • 3 puntos: La historia de usuario se puede completar en 32 horas o menos y/o existen riesgos razoables de complejidad o dependencias externas.
  • 5 puntos: La historia de usuario se puede completar en 60 horas o menos  (más de una semana) y/o involucra riesgos importantes en complejidad o dependencias externas.
  • 8 puntos: La historia de usuario se puede completar en 80 horas o menos (dos semanas) y/o involucra riesgos críticos en términos de complejidad o dependencias externas.
  • 13 puntos: La historia de usuario se puede completar en 80 horas o más  (tres semanas o más) y/o involucra demasiados riesgos gríticos, demasiada complejidad o demasiadas dependencias externas.

Normalmente cuando una historia de usuario se estima en 5 puntos o más, se realiza el ejercicio de dividirla en historias de usuario más pequeñas que puedan ejecutarse en menos de una semana cada una.

Como nota final, existen dos tipos de historia de usuario: las historias de negocio y las historias de investigación (SPIKES). Las historias de investigación normalmente miden 2 a 3 puntos, tienen como objetivo aprender cómo se hace algo (crear conocimiento en el equipo)  y culminan con documentación sobre el resultado de la investigación y posiblemente nuevas historias de negocio a ser ejecutadas en iteraciones posteriores.

Al conjunto de historias de usuario que definen un proyecto se le llama “backlog”


Iteraciones, tareas y ejecución

Cada iteración de dos o tres semanas se inicia con un proceso detallado de planeamiento donde cada historia de usuario del backlog que se vaya a trabajar en la iteración es desglosada en tareas y miembros del equipo que realizarán cada tarea, más una estimación en horas del esfuerzo necesario para realizar cada tarea.

Al conjunto de historias  de usuario y tareas elegidas o planeadas para ejecutarse en una iteración se le conoce como el compromiso del equipo en esa iteración. El equipo entonces hará todo lo necesario para cumplir con su compromiso para con el cliente o el dueño del producto; incluyendo trabajos interdisciplinarios, investigaciones, sesiones de trabajo, etc.

Una historia de usuario se considera terminada cuando (1) todas sus tareas han sido completadas con éxito, (2) se han cumplido todos los criterios de aceptación y por ende ha sido aceptada por el dueño de producto y (3) la historia de usuario cumple con la definición de terminado que normalmente incluye documentación, integración de resultados, demostraciones, pruebas, etc.


Rituales o Ceremonias

Se dice que la vida del ser humano está definida por sus rituales, por aquellas cosas que realiza frecuentemente. Por ejemplo una persona que tiene el ritual de levantarse a las 4 de la mañana a correr tiene una definición de vida diferente de una persona que tiene el ritual de levantarse a las 8am a tomar capuccino dulce.

Los principales rituales del modelo SCRUM inclyen:

  • Planeamiento Incremental del Producto: Es cuando se revisa el backlog en equipo y se determinan los cambios necesarios (remover historias de usuario, agregar nuevas historias de usuario, nuevas dependencias, etc.)
  • Poda del backlog (grooming): Es cuando se realiza la estimación de cada historia de usuario en términos de puntos. Para esto el equipo (incluyendo el dueño del producto) se reunen por dos o más horas y revisan la definición de cada historia, el criterio de aceptación de cada historia y la definición de “terminado” adoptada por el equipo.
  • Planeamiento de Iteración: En esta ceremonia de aproximadamente 1 a 2 horas se planea la itereación siguiente. Normalmente se realiza inmediatamente después del cierre de la iteración anterior. Aquí se identifican (1) aspectos limitantes como la disponibilidad de cada miembros del equipo, vacaciones, etc; (2) las historias de usuario que se trabajarán en la iteración siguiente y (3) las tareas específicas y la estimación en horas de cada tarea. De nuevo, al conjunto de historias de usuario y tareas de una iteración se le conoce como el compromiso del equipo.
  • Reunión de Actualización Diaria (DSU): Esta es una ceremonia de máximo 15 minutos donde cada miembro del equipo comunica sus avances, la ayuda que pudiera necesitar y sus planes para el día. Es importante aclarar que un DSU donde nadie necesita ayuda es probablmente un DSU demasiado superficial.
  • Cierre de Iteración: En esta sesión normalmente de 1 hora se da por concluida una iteración y se identifican logros, correcciones de equipo necesarias y planes. Normalmente se realiza junto con el Planeamiento de Iteración en una sesión conjunta que ronda de 2 a 3 horas.
    • Demostraciones: Cada miembo del equipo demuestra sus logros de la iteración.
    • Retrospectiva: Esta ceremonia tiene como objetivo la mejora continua del equipo. Acá cada miembro del equipo expresa qué cosas considera que el equipo debería (1) dejar de hacer, (2) continuar haciendo/profundizando y (3) comenzar a hacer; especialmente con miras a la parte del compromiso de iteración que no se haya logrado o a las dificultades que se enfrentaron durante la iteración.
    • Movimientos de historias de usuario no terminadas a la iteración siguiente

Estado del Proyecto, Métricas y Velocidad de Equipo

Como ya mencionamos un proyecto es definido como el conjunto de historias de usuario que componen el backlog y por sus recursos, es decir el equipo de ejecución.

El tamaño del backlog se define como la suma de los puntos asignados a todas las historias de usuario del backlog.

Luego de tres iteraciones es probable que el equipo de ejecución sea capaz de preveer cuantos puntos pueden ejecutar por iteración. Esta métrica es importante para el proyecto por que permite estimar en el tiempo la duración aproximada del proyecto.

Así, si un backlog mide 100 puntos, y la velocidad del equipo es de 10 puntos por iteración de dos semanas, se puede preveer que se requerirán al menos 10 iteraciones para completar el proyecto, es decir 20 semanas o lo que es lo mismo 5 meses.

Estas métricas aparte de ser muy simples permiten también conocer en el tiempo el estado del proyecto, tanto respecto a la iteración que se está ejecutando (cuantos puntos han sido aceptados, cuantos puntos están siendo ejecutados (WIP), cuantos puntos no se han empezado) así como respecto al proyecto como un todo (cuantos puntos se han ido ejecutando por iteración, cuantos puntos faltan para completar el proyecto, incrementos o disminuciones de velocidad de equipo en el tiempo, etc.)


Enlace a Plantilla

Como un aporte final les adjunto este enlace donde resumo los roles, ceremonias y presento una plantilla para un backlog de historias de usuario.

También en esta plantilla muestro la construcción de un gráfico de “burn-down” que permite visualizar el avance de la iteración vs el ideal esperado.

 

Espero que les sea de utilidad.

Enlace de Google Sheets. Plantilla SCRUM (haga clic acá)

 

 

Algunos conceptos interesantes de Machine Learning usando Anaconda / Python

23 Sep , 2017,
Jose Nunez
, ,
No Comments

Continuando con nuestras recientes publicaciones sobre “Machine Learning” (artículo anterior sobre fundamentos), en esta oportunidad compartimos algunas cosas que hemos aprendido siguiendo el tutorial “Machine Learning in Python Step by Step“.

Para poder entender este artículo recomendamos seguir el tutorial paso a paso… no se toma más de 30 minutos.

  1. Anaconda: Aprendimos que se puede configurar un ambiente relativamente completo para experimentación con Machine Learning y Python usando Anaconda.
  2. Dataset IRIS: Existe un “Hello World” para Machine Learning basado en un dataset llamado “IRIS” 3. Este consiste en un conjunto de datos que describe tres tipos de flores Iris (setosa, virginica y versicolor) por las dimensiones de su sépalo y pétalo; se puede usar para entrenar un modelo de aprendizaje de máquina para que este infiera el tipo de flor (clasificación) con base en la combinación de parámetros.
  3. Arreglos: Python provee mecanismos para expresar y manipular arreglos de forma sumamente robusta. Podemos resumirlos de la siguiente manera:
    • Básicamente [a:b,c:d] donde a:b representa un rango de filas y c:d representa otro rango de columnas.
    • array[:,0:4] retorna todas las filas de la matriz y las primeras 4 columnas a partir de la columna cero.
    • array[:,4] retorna todos los elementos (filas) de la quinta columna (índice 4)
      
      
  4. Entrenamiento y Validación: El entrenamiento y validación de modelos de aprendizaje de máquinas usualmente suele dividir los datos conocidos en 80% para aprendizaje o creación del modelo y 20% para validación del modelo generado. En este tutorial se usa la función model_selection.train_test_split(X,Y, test_size, random_state) de la libreria sklearn.
  5. SKLEARN LIB: Existen diversos algoritmos de clasificación en la librería sklearn:
    1. LogisticRegression
    2. LinearDiscriminationAnalysis
    3. KNeighborsClassifier
    4. DecisionTreeClassifier
    5. GaussianNB
    6. SVM/SVC
  6. Precisión de Los Algoritmos: Diferentes algoritmos presentan diferentes niveles de precisión dependiendo del problema a resolver. Estos se pueden evaluar usando funciones como model_selection.cross_val_score que da como resultado medidas estadísticas como la media y la desviación estandar. Esta validación se puede confirmar con gráficos de tipo box charts, scattered matrix e histogramas. Estos gráficos se generan en python usando librerías como matplotlib
  7. Aprender y Predecir: Una vez entrenado el modelo (con knn.fit()) se pueden generar predicciones (knn.predict())
  8. Matriz de Confusión: Las predicciones pueden ser validadas mediante mecanismos como confusion_matrix que provee una análisis simple de valores esperados y valores predichos de manera correcta y errónea.
    • La matriz de confusión tiene un eje (x) que representa los valores conocidos, y un eje (y) que representa los valores predichos.
      setosa     ==> [[ 7   0   0]
      versicolor ==>  [ 0  11   1]
      virginica  ==>  [ 0   2   9 ]]
                        se  ve  vi
    • Esto se interpreta así:
      • Se identificaron 7 setosas adecuadamente.
      • De las 12 versicolor se identificaron 11 correctamente y una como virginica
      • De las 11 virginicas se identificaron 9 correctamente y 2 como versicolor.

Referencias:

  1. Machine Learning Step by Step: https://machinelearningmastery.com/machine-learning-in-python-step-by-step/
  2. Confusion Matrix: http://scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html
  3. IRIS: https://es.wikipedia.org/wiki/Iris_flor_conjunto_de_datos
  4. Iris Setosa Imagehttps://www.rhs.org.uk/Plants/9355/Iris-setosa/Details

 

Modelando Bases de Datos Relacionales con XAMPP y phpMyAdmin

12 Sep , 2017,
Jose Nunez
, , , , , , ,
No Comments

Alguna vez habrán enfrentado la necesidad de modelar una base de datos relacional.

El mundo de bases de datos relacionales (RDBM) está regido por unos cuantos titanes en el tema. Desde Oracle, pasando por MS SQL Server y sin olvidar MySQL (y su hermana MariaDB) y PostgreSQL.

Para efectos de este artículo nos enfocaremos en MySQL y su nueva ramificación MariaDB.

MySQL forma parte de una pila de tecnologías web sumamente influyentes a nivel mundial. Nos referimos al “Stack LAMPP” que se traduce en Linux, Apache, MySQL, PHP/PERL.

En este conjunto de tecnologías, LINUX figura como un principal contendor en el mercado de sistemas operativos para servidores web (si es que existe tal cosa); mientras que Apache se desempeña como uno de los principales programas de servidor web a nivel mundial. Luego tenemos MySQL que es el componente de base de datos y finalmente PHP como lenguaje de programación para la web del lado del servidor.

Existen varios sistemas de instalación de la pila LAMPP; en nuestro caso usaremos una publicada por la organización ApacheFriends.org denominadada XAMPP. La “X” viene por la compatibilidad con sistemas operativos fuera de LINUX. Así XAMPP permite la instalación de la pila AMPP tanto en LINUX como en MS Windows y OSx de Mac.

A su vez, XAMPP trae algunas utilidades adicionales de las cuales vale la pena mencionar el sistema phpMyAdmin. Una herramienta avanzada que permite el diseño y manipulación de bases de datos MySQL.

Una vez que hemos descargado e instalado XAMPP en nuestro computador, y que nos hemos asegurado de que los servicios para Apache y MySQL están funcionando adecuadamente, podemos acceder al poder de XAMPP la dirección del servidor local: http://localhost/

La siguiente imagen muestra nuestra pantalla principal de XAMPP por medio del navegador.

Nótese entonces que en el menú superior a la derecha tenemos la opción “phpMyAdmin”

Seguidamente se ilustra como luce nuestra versión de phpMyAdmin en este momento.

Al lado izquierdo tenemos las diferentes bases de datos que están ya definidas en el servidor; mientras que a mano derecha tenemos el área de trabajo con diversos puntos de funcionalidad para editar bases de datos y cualquier otro elemento de base de datos.


PASO 1 – CREACIÓN DE BASE DE DATOS

Comenzamos este ejercicio haciendo clic en el nodo “New” que se encuentra a mano izquierda sobre la lista de bases de datos.

Esto nos muestra un formulario para crear una nueva base de datos que básicamente pregunta por el nombre de la base de datos y por el conjunto de caracteres (collation) predeterminado para la base de datos. Este parámetro define qué tipo de simbología usará la base de datos para almacenar texto. Uno de los conjuntos de caracteres más efectivos para occidente es el utf8 con sus variantes por idioma. Para este ejemplo que soporta símbolos en español y otros idiomas usaremos utf8_bin.

Una vez creada la base de datos podemos comenzar con el proceso de modelado.

Para esto utilizaremos el siguiente enunciado:

Se requiere diseñar una base de datos relacional para manejo de inventarios. El inventario contabiliza las cantidades disponibles de productos de diversos tipos; tomados del catálogo de productos que vende la organización. Para efectos de inventario se tienen dos tipos de producto: (1) los productos “serializables” que son productos que se pueden identificar de manera única (por número de serie asignado por el fabricante) y (2) los productos “a granel” que no se pueden identificar de manera unica sino por cantidades, por ejemplo 1 Kg de tornillos, o 300 destornilladores. El inventario se maneja en diversas bodegas y a su vez se contabilizan las entradas y salidas de inventario para y desde cada bodega.

Con este enunciado vamos a dar un siguiente paso para la identificación de los elementos fundamentales del modelo conceptual, es decir las entidades y sus relaciones.


PASO 2 – Identificación de Elementos

Una técnica que proponemos para esto es la de marcar el enunciado con un color (azul) aquellas partes que describen una entidad y con otro color (verde) aquellas partes que describen una relación. Así el enunciado queda de la siguiente manera:

Se requiere diseñar una base de datos relacional para manejo de inventarios. El inventario contabiliza las cantidades disponibles de productos de diversos tipos; tomados del catálogo de productos que vende la organización. Para efectos de inventario se tienen dos tipos de producto: (1) los productos “serializables” que son productos que se pueden identificar de manera única (por número de serie asignado por el fabricante) y (2) los productos “a granel” que no se pueden identificar de manera única sino por cantidades de alguna unidad de medida; por ejemplo 1 Kg de tornillos, o 300 destornilladores. El inventario se maneja en diversas bodegas y a su vez se contabilizan diferentes movimientos como entradas y salidas de inventario para y desde cada bodega.

De esta forma hemos identificado las siguientes entidades:

  1. Catálogo de Producto
  2. Tipo de Producto
  3. Unidad de Medida
  4. Bodega
  5. Movimiento
  6. Tipo de Movimiento
  7. Fabricante

También se identifican algunas relaciones:

  1. Catálogo de Producto >==> Tipo de Producto
  2. Catálogo de Producto >==> Fabricante
  3. Catálogo de Producto >==> Unidad de Medida
  4. Movimiento >==> Tipo de Movimiento (entrada/salida)
  5. Movimiento >==< Bodega

Finalmente algunos atributos relevantes son:

  1. Número de serie
  2. Cantidad
  3. Nombre del Producto
  4. Nombre de Bodega
  5. Descripción de Unidad de Medida
  6. Nombre de Tipo de Movimiento

PASO 3 – Modelo Conceptual

Una vez identificados los elementos básicos del modelo de datos, podemos realizar un diagrama de Entidad-Relación que nos permita comunicar cuales son las entidades que componen el modelo y como se relacionan entre si.

Aunque basta con Power Point o algun otro software que nos permita generar cajitas y conectarlas con líneas; en nuestro caso usaremos el poder de phpMyAdmin.

Para esto tomamos cada entidad y definimos las tablas respectivas con los valores más fundamentales que podemos pensar para cada entidad:

  1. Tipo de Producto (Código de Tipo de Producto, Descripción)
  2. Unidad de Medida (Código de Unidad de Medida, Descripción)
  3. Fabricante (Código de Fabricante, Nombre)
  4. Catálogo de Producto (Código de Producto, Descripción, Código de Tipo de Producto, Código de Fabricante, Código de Unidad de Medida)
  5. Bodega (Código de Bodega, Descripción)
  6. Tipo de Movimiento (Código de Tipo de Movimiento, Descripción)
  7. Movimiento (ID de Movimiento, Código de Bodega, Código de Producto, Código de Tipo de Movimiento, Cantidad)

Nótese que hemos reorganizado las entidades de forma que primero se definen aquellas de las cuales hay dependencia en otras entidades. También debemos acotar que los nombres de las tablas (entidades) y sus atributos los realizamos usando una nomenclatura estándar, donde “cd” refiere a código, “dsc” refiere a descripción y “id” refiere a identificador numérico automático. Se usan ID’s en las entidades transaccionales, mientras que se usan códigos en las entidades tipificadoras.

La siguiente imagen muestra cómo se definen los campos básicos de una tabla (entidad). Para poder acceder a este formulario se hace clic en el nodo de base de datos “inventario” a la izquierda. En el área de trabajo hay una opción para iniciar la creación de una tabla (entidad) con una cantidad predeterminada de columnas (atributos)

 


PASO 4 – Modelado de las Relaciones

Una vez definidas las entidades (tablas) podemos visualizarlas usando el área de la izquierda, expandiendo los nodos correspondientes como se muestra en la siguiente imagen.

A su vez, si hacemos clic en la base de datos “inventario” podremos acceder a la función “Designer” la cual nos permitirá ir construyendo las relaciones entre las entidades (tablas) mientras que construimos el diagrama Entidad-Relación correspondiente.

La siguiente imagen muestra la función de diseño, desde donde se pueden crear relaciones entre las diferentes tablas.

Si hacemos clic en “Toggle small/big” en el menú de la izquierda podremos ver todos los atributos.

También, si hacemos clic en “Create relationship” podremos seleccionar – primero – un atributo de tipo “llave primaria” y – segundo – un atributo en otra tabla de tipo “referencia foránea” y así conformar las relaciones.

De esta forma podemos ver el diagrama con relaciones logrado como sigue, el cual no solamente expresa las relaciones en sí, sino también la cardinalidad entre las entidades.

Volviendo al diagrama reducido a solamente las entidades podemos ver que queda así; incluyendo indicadores de cardinalidad entre las entidades.

Estos diagramas son sumamente útiles para discutir y razonar sobre el modelo de datos. A su vez se puede utilizar phpMyAdmin para agregar o modificar atributos en la fase de modelado detallado de la base de datos.

Posibilidades con el pequeño Wheely

12 Ago , 2017,
Jose Nunez
No Comments

¿Recuerdan nuestro pequeño Robot de dos llantas?

Bien, le agregamos unos cuantos dispositivos más y veremos si lo podemos hacer un poco más listo.

  • Batería de Lítio-Polímero de 3.7V recargable. Para no gastar en baterías AA.
  • Regulador de 3V a 5V que nos permite usar la batería LIPO para alimentar una gama interesante de controladores y los motores a 5V.
  • Sparkfun Thing 8266: Este controlador nos da capacidades WIFI y además un mecanismo para cargar la batería LIPO usando un cable micro-USB convencional.
  • Arduino 101: Microcontrolador de gran capacidad que además trae acelerómetro y giroscópio en 6 ejes y comunicación Bluetooth BLE. Lo alimentamos a 5V, pero operan sus señales a 3.3V.
  • Sensor de proximidad para detectar obstáculos o mapear áreas que opera a 5V.
  • El ya conocido controlador S4A-EDU con puente H desconectabe. Nos permite controlar los motores en diferentes direcciones e incluye comunicación tx/rx que podemos usar para conectarlo a los otros micro-controladores mencioandos.

De momento no he programado mayor cosa con todo esto, salvo por este ejemplo; pero esperamos hacer algunas cosas interesantes con todas estas capacidades.

Mis primeros pasos con ionic

5 Jun , 2017,
Jose Nunez
, , , ,
No Comments

Bueno, como nos pasa a todos, un día desperté con esa imperiosa necesidad de crear una app para teléfonos inteligentes; y pues, comenzar no es fácil si tomamos en cuenta que las principales plataformas de desarrollo (IOS y Android) tienen sus costos y complejidades.

(!) Antes de seguir estas instrucciones asegúrese de entender las Condiciones de Uso de nuestro sitio.

Afortunadamente, mis compañeros del centro de innovación habían estado realizando una investigación sobre algo similar, y me hablaron del Ionic Framework, un sistema para desarrollar aplicaciones móviles usando tecnologías web (HTML, CSS, JS/TS, ANGULARJS) etc que luego pueden implementarse tanto en Android como IOS.

Dentro de las bondades de Ionic podemos listar las siguientes:

  1. Manejo de plantillas de proyecto predefinidas
  2. Acceso a características específicas de hardware (bluetooth, gps, camara, etc)
  3. Pre-visualizacion de las apps usando IonicView directamente en los dispositivos móviles tanto para Android como para IOS

Pero bueno, he querido comenzar con el pie derecho, configurando una estación de trabajo LINUX UBUNTU 16.04 así que aquí van algunos lineamientos básicos para comenzar:


#1 – NodeJS

Es necesario instalar nodeJS y npm. Para Ubuntuo 16.04 he encontrado esta guía que me ha parecido muy completa. En ella se discuten diferentes métodos. Yo elegí usar el método de nvm (node version manager) que se puede resumir en los siguientes comandos uno por uno.

Antes de iniciar vaya a https://nodejs.org/en/download/ y determine cual es la versión LTS (en nuestro caso es la 6.11)

cd
sudo apt-get update
sudo apt-get install build-essential libssl-dev
curl -sL https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh -o install_nvm.sh
bash install_nvm.sh
source ~/.profile
Opcionalmente: nvm ls-remote | grep Latest
nvm install  6.11
node -v
npm -v

#2 – Instalación de IONIC

Ahora, de acuerdo con la guía de inicio de IONIC procedemos con el siguiente comando (puede tardar muchos minutos):

npm install -g cordova ionic --verbose

Luego de unos minutos (como 15 con mi conexion 3G) y de mucho texto en la consola, podemos usar el comando ionic -v para determinar la versión que hemos instalado.

En este punto es importante crear una cuenta personal en https://apps.ionic.io/signup para poder visualizar las aplicaciones con Ionic View. Una vez creada la cuenta podemos usar el siguiente comando para que nuestra instalación de ionic quede conectada a nuestra cuenta.

ionic login

#3 Creación de un nuevo proyecto

(!) Antes de crear un nuevo proyecto, es importante asegurarse que su GIT local esté instalado y configurado.

Al momento de escribir este artículo, la guía de inicio hace mención de 3 tipos de proyecto: blank, tabs y sidemenu (aunque hay todo un mercado de tipos de proyecto en la red). La verdad nos gustó más el de tabs, así que usamos estos comandos:

cd
mkdir myIonicTests
cd myIonicTests
ionic start myApp tabs

Dado que ya habíamos hecho login en el paso anterior, podemos decirle que si (Y) a la pregunta de la terminal “Link this app to your Ionic Dashboard to use tools like Ionic View? (Y/n)“. Al decir que sí el sistema termina de crear el app y nos lleva al navegador de Internet a la página de ionic para crear nuevas apps para el visor. Más tarde será necesario utilizar el comando ionic link para conectar el código de nuestra app local con su correspondiente entrada en Ionic View.

(!) Notas: Algo importante de resaltar es que este template de una vez crea el proyecto como un repositorio GIT. Reconectar un repositorio GIT a nuestra cuenta GIT de preferencia es una tarea importante a  futuro, pero eso lo dejaremos para otro artículo.
Otra cosa importante es que el comando start de ionic necesitará una conexión a Internet estable para poder descargar todos los archivos, bibliotecas y dependencias necesarias.

En este punto ya podemos ejecutar el comando ionic serve para pre-visualizar el app en nuestro navegador local.


#4 Ejecutar la aplicación en un celular

Nótese que al crear la aplicación en el sitio web de ionic, se generó un código de identificación de la app. En la aplicación IonicViewer de Android o IOS se puede acceder con sus credenciales de ionic, o usando el código de identificación de la aplicación.

Antes de subir el código a Ionic View, necesitamos enlazarlo con nuestra nueva app; usando el comando ionic link. Se usan las flechas arriba y abajo del teclado para seleccionar el app.

Para subir el código más reciente utilizamos el comando ionic upload; luego en la aplicacion de celular Ionic View usamos la opción “Clear App Data” y luego “View App”

En una próxima entrada estaremos discutiendo cómo modificar el código.

 

Introducción al ESP8266

31 May , 2017,
Jose Nunez
, , , , ,
one comments

Aquí resumo algunas cosas que he ido descubriendo del ESP8266 esta semana:

#1 – El ESP8266 viene programado de manera nativa con un firmware que responde a comandos AT para realizar conexiones y comunicación WiFi. Una referencia útil al set de comandos se puede encontrar acá.

#2 – El ESP8266 puede ser programado mediante el IDE de ARDUINO. Para esto es necesario instalar la definición de placa usando la opción de Tools > Board Manager; pero antes de esto es necesario configurar la siguiente URL para definición de tarjetas adicionales usando la opción File > Preferences > Additional Boards Manager URLs.

URL:  http://arduino.esp8266.com/stable/package_esp8266com_index.json

Es necesario cerrar el IDE y volverlo a cargar para poder utilizar el board que aparece en la lista abajo como “Generic ESP8266 Module“. (!) Importante: Una vez re-programado el módulo se pierde el firmware que habilita los comandos AT. Para re-habilitarlos será necesario seguir alguno de los procedimientos disponibles para cargar el firmware

#3 – Se puede conectar el módulo directamente a la PC usando un convertidor USB-Serial FOCA 2.2 con las siguientes conexiones; pero antes se debe configurar el FOCA 2.2 para operar a 3.3V, caso contrario se daña el ESP8266:

esp8266_pinoutFOCAV2.2        ESP8266
   VCCIO -----> VCC (3.3V)
     TXD -----> RXD
     RXD <----- TXD
     GND <----- GND
   VCCIO -----> CH_PD

 Opcionalmente se enciende el dispositivo con el GPIO0 conectado a tierra (GND) para habilitar la descarga de sketches de ARDUINO en el módulo; y luego se desconecta de GND para operar con el Sketch descargado.
FTDI Cable             ESP8266
 VCCIO (red)    -----> VCC (3.3V) 
   TXD (orange) -----> RXD 
   RXD (yellow) <----- TXD
   GND (black)  <----- GND
 VCCIO (red)    -----> CH_PD

#4 – La definición de placa del ESP8266 de ARDUINO (“Generic ESP8266 Module“) incluye una cantidad importante de ejemplos muy básicos para la operación del módulo, ya sea como Cliente HTTP, o cliente WiFi, o Access point, e incluso la creación de redes tipo Mesh usando WiFi.

#5 – El módulo ESP8266 no tiene capacidad para comunicarse con servicios de Internet por canales seguros de tipo HTTPS, lo cual representa una limitante sobre el tipo de aplicación que se pueda implementar. Como medida mínima es recomendable conectar el ESP8266 a un IoT Gateway con capacidad de comunicación HTTPS hacia la nube y no usarlo en aplicaciones suceptibles en caso de ser “hackeadas” ya que es relativamente facil para un hacker poder interceptar los datos provenientes del ESP8266 (no cifrados) interpretarlos e incluso suplantarlos.

#6 – El ESP8266 se puede conseguir en Costa Rica en CR Cibernetica. Nótese que al momento de escribir este artículo el precio estaba en $7.95, solamente $1 por debajo del SONOFF que aparte de traer uno de estos módulos tiene el hardware necesario para manejar corriente AC y un programa predeterminado para poder operarlo mediante un App de teléfono.

#7 – En Amazon se puede conseguir hasta por $15 cuatro módulos ($3.75 cada uno!). En Wish.com se pueden conseguir incluso a $2. Aunque para ser sinceros la comodidad de comprarlos en CR Cibernética y que me los traigan a domicilio el día siguiente es inigualable.

 #8 – Volviendo a los comandos AT, se puede acceder a estos mediante una terminal como Putty usando el puerto serial del FOCA V2.2 a una velocidad de 115200 bauds, pero es necesario (al menos en el caso de Putty) utilizar [ENTER] y [CTRL]+[ J ] para enviar los comandos al módulo y obtener una respuesta. Una conexión parecida se puede usar desde un ARDUINO 101 (que opera a 3.3V) usando la librería SoftwareSerial para operar el ESP8266 usando comandos AT enviados desde el ARDUINO. También se puede operar el ESP8266 desde un arduino usando los GPIO del ESP8266 como indicativos de qué hacer y que un Sketch de ARDUINO en el ESP8266 tome decisiones y realice comunicaciones WiFi basadas en esas señales.

#9 –  Finalmente cabe mencionar que el módulo tiene la capacidad de almacenar información en estado apagado. Lo cual permite, por ejemplo, recordar cual fue el último SSID/Passphrase que se usó y reconectar al encender, tanto para aplicaciones basadas en comandos AT como para aplicaciones basadas en sketch de Arduino ejecutados en el módulo ESP8266.