Road to #MozillaActivate, El Salvador 2018

Holi,

No se ustedes, pero de tanto estar viajando no me ha quedado demasiado tiempo para hacer tutoriales, pero me encanta documentar las cosas asi que esta vez vamos a hablar sobre la fundación Mozilla y porque fue que pare una semana en El Salvador. Bienvenidos.

Antecedentes ( esto ya parece un informe jajaja, pero vamos a hacerlo bonito).

El año pasado para el encuentro Centroamericano de Software Libre, Costa Rica 2017 hubo un evento alterno llamado #mozillaActivate, resulta que en el mismo encuentro hubo gente de #mozillaCentroamerica invitando a mas gente a unirse al movimiento de una internet libre, respetuosa con la privacidad y los derechos ( sí sé que suena medio raro,  pero lo que mozilla incentiva es que tengamos una internet libre y que todos seamos tratados por igual) a mi me parece excelente muchas cosas que esta haciendo Mozilla hasta que me dieron en el kokoro con algo llamado Web of things, que es una solución para el internet de las cosas preparada por Mozilla que realmente tiene un muy muy buen punto a su favor, Es realmente sencillo crear soluciones con su propuesta.
El contacto directo con Mozilla Centroamérica fue MoziKarlita, que amablemente nos invito a ser parte de Mozilla Centroamérica y pues con Lexo, dijimos esta bien.

Preparación del evento

Ponernos de acuerdo fue lento, tedioso y complicado.
Lo sé son palabras duras para un equipo que ya había trabajado junto, en este caso nosotros como integrantes nuevos de Mozilla Centroamérica y primeros miembros de Mozilla Guatemala fue un poco confuso saber como ayudar, ellos tenían sus métodos para hacer las cosas y yo y mis manías por andar mandando no se sintieron bien.

Realmente de lo único que puedo quejarme fue de que entre todo dejamos muchas cosas para el ultimo minuto, como yo por ejemplo perdiendo mi tarjeta del banco sin haber comprado los boletos de ida y vuelta a El Salvador, los que me siguen en Instagram, facebook y Twitter (@yeffrimic) se dieron cuenta de que mi mente andaba en otro lado y pues aquí oficialmente me disculpo, La cague jajaja.

La parte mas complicada de todo fue el hecho de que nadie quiso tomar la batuta de líder al principio  y se tuvieron que hacer malabares para que mozilla nos autorizara el evento y nos patrocinara. Al final y lo que importa fue que Mozilla nos aprobó el patrocinio (gracias David) y pues bueno ya teníamos todo preparado, charlas, presentaciones, lugar para dar las charlas asi que yeii, ya había viaje confirmado para El Salvador, Mozilla Activate y ECSL alla vamos.

Nos vamos a San Salvador, Gracias Mozilla

20180710_083538Él es Lexo, vive a 12 horas de la Ciudad de Guatemala y como a 24 de San Salvador.

Bueno al final llegamos a San Salvador, salimos mas o menos a las 7 am y llegamos al medio día, listos para descansar y preparar todo para el día D

Día de exposiciones

Dejo la hermosa agenda aqui y dare mis impresiones de todos.

https://docs.google.com/document/d/1v9SlhDQ9EHm0Tdn14UlzivmkibtT08yIvotK7XAawcI/edit?usp=sharing

Todos y cada uno de los que están en Mozilla CentroAmerica como representantes o asistieron como conferencistas al Mozilla Activate son unos putos cracks.

Empezando con Aaron y su increible manera de exponer porque Mozilla y no solo firefox sino todo lo que representa la fundación es de las mejores cosas en internet hoy en dia.

photo5059894245955053519

 

Roni y su dominio con los temas de privacidad en la red

photo5059856768070428666

no hablemos de Lexo, Carcamo con Rust que los vi por allí haciendo travesuras con uno de los lenguajes mas nuevos y potentes del momento.

photo5059856768070428659

 

photo5059856768070428660

Me impresiono bastante lo que puede hacer Firefox con web VR a cargo de David

photo5059894245955053522

 

Jorge estuvo hablando sobre programacion de videojuegos pero murphy fue su enemigo mortal no pudiendo proyectar porque el adaptador que tenía no funcionaba 😦
photo5059856768070428656
aqui esta con lexo tratando de solucionarlo, no se para que usan mac jajaja

moziKarlita hablando sobre la comunidad de mozilla y como ser parte de ella tambien alentó a muchos jovenes que estaban presentes.

photo5059856768070428664

 

y yo merengues hablando sobre lo que me encanta Internet de las cosas con al go llamado Mozilla IOT, y su web de las cosas, adjunto la presentación para que le echen un ojo, como he dicho antes esta es una excelente iniciativa de parte de Mozilla y todos los voluntarios para el internet de las cosas

photo5059856768070428668

 

Bueno, después de organizar, moverse y el calor de San Salvador cada uno fue cayendo a lo largo de la semana dormido por el cansancio unos en el ECSL y otros en el dia social y yo que siempre andaba con sueño.

photo5059894245955053517

Al final fue una experiencia increible hablandole a poco mas de 100 patojos( jovenes ) acerca de las bondades de fundación mozilla el proximo año será en Guatemala asi que quedan todos invitados a asistir.  No les conté muchas cosas que sucedieron para que el proximo año nos acompañen en Guatemala jajaja.

Con esto termino el articulo del dia de hoy pronto mas acerca de las microfaventuras .

Recuerden, solo necesitan una excusa para cambiar el mundo.

 

 

Guías de instalación de Firma Digital en GNU/Linux actualizadas

Se han actualizado las guías de instalación de Firma Digital de Costa Rica para GNU/Linux para Ubuntu y Fedora. Los cambios amplían la cantidad de software soportado, mayor estabilidad y otras ventajas.

Aislamiento de la librería en caja de arena

Una de las mejoras comunes en ambos sistemas permiten el aislamiento de la librería privativa en una “caja de arena” (sandbox). El propósito de este aislamiento es evitar caídas de los programas cuando dos usuarios distintos del mismo sistema tratan de acceder a la tarjeta. Esto es debido a que la librería libASEP11.so genera unos temporales en el directorio /tmp/ con un usuario, pero cuando intenta crearlos desde otro usuario diferente, la librería genera un error de segmentación que se propaga a la aplicación que la está utilizando.

Para solucionar el problema se utiliza un sistema de caja de arena que puede lanzarse sin privilegios administrativos mediante la herramienta bubblewrap, que permite montar en un espacio de nombres vacío del espacio de usuario la librería, por lo que en el caso de que dos usuarios del sistema utilicen la librería, la ruta /tmp/ estará aislada en ambos casos, no existiendo en el sistema de ficheros físico, evitando el problema mencionado.

Otra ventaja que se obtiene con este aislamiento es que la librería no genera el directorio oculto ~/.ase/ en los directorios de los usuarios, que llega a suponer una molestia cuando se generan búsquedas, ya que el directorio lo genera con permisos que impiden su acceso por defecto. Por otra parte, al tratarse de software privativo y no poder auditar el código fuente, el aislamiento mejora ligeramente la seguridad sobre lo que pueda realizar esta librería.

Otra característica que permite resolver este defecto es poder utilizar la tarjeta de Firma Digital para iniciar sesión con el PIN de la tarjeta de Firma Digital, desde la ventana de selección de usuario (gdm, GNOME Display Manager) si se configura localmente con algún mecanismo tipo pam_pkcs11. Antes no se podía realizar porque el plug-in gsd-smartcard de GNOME Settings Daemon, encargado de comunicarse con la tarjeta, se ejecuta con otro usuario distinto al de la sesión (en este caso, gdm). Antes de esta solución, cuando un usuario inicia sesión en el sistema, ese servicio quedaba activo con los ficheros generados en /tmp/ y provocaba que cualquier proceso que utilizara Firma Digital en la sesión de usuario se cerrara automáticamente, provocando gran inestabilidad.

El método que se ha emplado para resolverlo ha sido mediante la característica remote de p11-kit. P11-kit es parte del proyecto p11-glue, cuyo propósito es actuar de “pegamento” para consolidar todas las herramientas criptográficas del sistema y permitir estandarizar el acceso a servicios con dispositivos PKCS#11 de forma unificada. En la actualidad dispone de integración con características PKCS#11 de GnuTLS, NSS, OpenSSL, OpenSC, Java, y otros, así como la confianza de las autoridades de certificación (CA).

Hasta ahora se estaba utilizando p11-kit con un módulo que hacía referencia a una librería local (libASEP11.so). Sin embargo, p11-kit permite cargar módulos de forma remota, que puede resultar interesante para utilizar un dispositivo criptográfico existente en otra computadora, si bien en esta solución no se ejecuta nada remoto sino que sigue en local. El parámetro remote permite lanzar un comando personalizado que en este caso invoca el ejecutable brwap de bubblewrap, aislando la librería en esta caja de arena.

Gracias a esta mejora, en próximas entradas de blog explicaría cómo iniciar sesión en el sistema mediante Firma Digital y cómo bloquear la pantalla (sesión) extrayendo la tarjeta del lector.

Soporte de NSS (Chromium, Evolution, Acceso a llaveros) en Ubuntu

Se ha actualizado la guía de Ubuntu para incorporar un reemplazo de la librería NSS genérica del sistema (NSS es la librería de servicios de seguridad de Mozilla), utilizada (además de Firefox y Thunderbird) por el navegador Chromium, cliente de correo Evolution o el acceso a llaveros, para poder utilizar Firma Digital desde ellos. Esto ya era posible con la guía de Fedora, pero no en Ubuntu hasta ahora.

Integración mejorada en Fedora

Fedora, así como Red Hat, ha sido siempre la distribución GNU/Linux que desde mi punto de vista se ha esforzado más en integrar los sistemas criptográficos, utilizados en sector público y corporativo. En la última actualización que se incluye a partir de Fedora 29 completan la consolidación para poder cargar el módulo p11-kit-proxy desde la configuración de política de NSS para poder cargar módulos de terceros sin tener que realizar enlaces simbólicos como hasta ahora.

Fedora ya llevaba tiempo reemplazando libnssckbi.so (librería de módulos de seguridad de NSS) con p11-kit-trust por defecto, algo que permite unificar la confianza en los certificados de las CA de forma centralizada. También está unificada la configuración de cifrados utilizados en TLS a nivel de todo el sistema, para prevenir brechas de seguridad por configuraciones débiles. En este aspecto es indiscutiblemente la distribución mejor preparada, así como los aportes con los que se han beneficiado otras distribuciones, ya que se esfuerzan en que estas mejoras se incorporen en las versiones oficiales del software (upstream).

En una próxima entrada de blog mostraré cómo iniciar sesión localmente (sin sssd, usando pam_pkcs11 con mapeo local, sin LDAP) con la tarjeta de Firma Digital.

Cómo instalar Firma Digital de Costa Rica en GNU/Linux Ubuntu 18.04 y Debian 9

Esta guía documenta cómo instalar el controlador de la tarjeta de Firma Digital de Costa Rica y la jerarquía de certificados del Banco Central (SINPE) y del MICITT en los sistemas operativos Ubuntu 18.04 LTS y Debian 9.

Esta guía de instalación tiene los siguientes propósitos:

  • Configurar de la forma más sencilla y adecuada el sistema para que funcione con la mayor cantidad de programas.
  • Lograr que funcione para todos los usuarios del sistema, incluyendo los nuevos usuarios creados tras las instalación.
  • Aislar la librería de Firma Digital en una “caja de arena” (sandbox) para que funcione con múltiples usuarios del sistema simultáneamente (soluciona un defecto en la librería al crear ficheros temporales). Esta característica no está disponible en Debian 9.

Instalación de las dependencias

  • Instalar el soporte CCID de PC/SC para que reconozca el lector de tarjetas e IcedTea-Web para poder cargar algunos lanzadores que usan Java Web Start (los navegadores ya no soportan applets Java, ya no es posible usar el firmador de la CCSS) y OpenJFX si pretende usarse algún firmador que lo use (NexU, por ejemplo). Bubblewrap es la herramienta para aislar la librería en la caja de arena. Binutils y sudo no vienen instalados en Debian por defecto.
sudo apt -y install pcscd bubblewrap icedtea-netx openjfx binutils sudo

En el caso de Debian, para poder usar los comandos con sudo, ejecutar como root usermod -a -G sudo nombredeusuario reemplazando nombredeusuario por el nombre de usuario que se desee usar con sudo y reiniciar para aplicar cambios. En Ubuntu no es necesario este paso.

Descarga del “instalador”

  • Descargar el “instalador” en el desplegable llamado “Usuarios Linux” en la página de descarga de instaladores del sitio web de Soporte Firma Digital de Costa Rica, introduciendo el número de serie de la tarjeta y aceptando las condiciones.
  • Descomprimir el archivo zip descargado con unzip, en el momento de escribir esta documentación se llama sfd_ClientesLinux_Rev09.zip. Se creará una carpeta llamada Firma Digital. Se asume que el archivo zip se ha descargado en la carpeta Descargas:
cd ~/Descargas/

unzip sfd_ClientesLinux_Rev09.zip

Instalación de los certificados

Es necesario agregar a la lista de confianza la jerarquía de certificados del SINPE y del MICITT. En teoría solamente sería necesario instalar los certificados raíz del MICITT pero en la práctica hay algunas aplicaciones que necesitan los certificados intermedios del SINPE para completar la cadena a la hora de validar. El último instalador también incluye una CA del BCCR, probablemente para el certificado de código de su propio firmador (que en teoría tampoco debería ser necesario si el sistema operativo está correctamente actualizado). Para ello, un conjunto de comandos:

  • Copiar los certificados:
sudo cp ~/Descargas/Firma\ Digital/Certificados/* /usr/local/share/ca-certificates/

sudo rename.ul -- .cer .crt /usr/local/share/ca-certificates/*.cer

for file in /usr/local/share/ca-certificates/*.crt; do sudo openssl x509 -inform DER -in "$file" -out "$file.tmp"; done 2>/dev/null

sudo find /usr/local/share/ca-certificates/ -type f -empty -delete

sudo rename.ul -- .tmp '' /usr/local/share/ca-certificates/*.tmp
  • Regenerar los archivos de certificados para todas las aplicaciones:
sudo update-ca-certificates --fresh

Instalación del módulo PKCS#11

Aunque hay un módulo en el directorio Librerías, no es la versión más reciente y tiene varios defectos de enlazado. La versión distribuida en el paquete PinTool es más reciente y funciona correctamente en todos los programas probados. En el siguiente proceso se extrae y se instala conservando la fecha original de la librería.

  • Instalar el módulo PKCS#11 privativo en /usr/lib/x86_64-linux-gnu/:
cd ~/Descargas/Firma\ Digital/PinTool/IDProtect\ PINTool\ 6.41.01/DEB/

ar p idprotectclient_641.01-0_amd64.deb data.tar.gz | tar zx ./usr/lib/x64-athena/libASEP11.so

sudo cp -p usr/lib/x64-athena/libASEP11.so /usr/lib/x86_64-linux-gnu/
  • Crear los siguientes enlaces simbólicos (necesarios para que funcionen algunos programas):
sudo ln -s /usr/lib/x86_64-linux-gnu/libASEP11.so /usr/lib/

sudo mkdir -p /usr/lib/x64-athena/

sudo ln -s /usr/lib/x86_64-linux-gnu/libASEP11.so /usr/lib/x64-athena/
  • Crear el fichero /etc/Athena/IDPClientDB.xml y abrirlo para edición:
sudo mkdir /etc/Athena/

sudo gedit /etc/Athena/IDPClientDB.xml
  • En la ventana del editor de textos gedit, pegar el siguiente texto, guardar y cerrar el editor:
<?xml version="1.0" encoding="utf-8" ?>
<IDProtect>
 <TokenLibs>
  <IDProtect>
   <Cards>
    <IDProtectXF>
     <ATR type='hexBinary'>3BDC00FF8091FE1FC38073C821106600000000000000</ATR>
     <ATRMask type='hexBinary'>FFFF00FFF0FFFFFFFFFFFFFFFFF0FF00000000000000</ATRMask>
    </IDProtectXF>
   </Cards>
  </IDProtect>
 </TokenLibs>
</IDProtect>
  • Crear un fichero llamado /usr/share/p11-kit/modules/firma-digital.module y abrirlo para edición:
sudo gedit /usr/share/p11-kit/modules/firma-digital.module
  • En la ventana del editor de textos gedit, pegar el siguiente texto, guardar y cerrar el editor:
remote: |bwrap --unshare-all --dir /tmp --ro-bind /etc/Athena /etc/Athena --proc /proc --dev /dev --ro-bind /usr /usr --ro-bind /lib /lib --ro-bind /lib64 /lib64 --ro-bind /var/run/pcscd /var/run/pcscd p11-kit remote /usr/lib/x86_64-linux-gnu/libASEP11.so

En el caso de Debian 9 la línea anterior no funciona porque incluye una versión demasiado antigua de p11-kit. En su lugar debe usarse esta otra línea: module: /usr/lib/x86_64-linux-gnu/libASEP11.so.

  • Crear un fichero llamado /usr/local/sbin/update-p11-kit-symlinks y abrirlo para edición:
sudo gedit /usr/local/sbin/update-p11-kit-symlinks
  • En la ventana del editor de textos gedit, pegar el siguiente texto, guardar y cerrar el editor:
#!/bin/sh

FIREFOX_LIB=/usr/lib/firefox/libnssckbi.so
FIREFOX_ESR_LIB=/usr/lib/firefox-esr/libnssckbi.so
THUNDERBIRD_LIB=/usr/lib/thunderbird/libnssckbi.so
NSS_LIB=/usr/lib/x86_64-linux-gnu/nss/libnssckbi.so

if [ -e "$FIREFOX_LIB" ]
then
    if ! [ -L "$FIREFOX_LIB" ]
    then
        echo "Firefox libnssckbi.so is not a symlink. Fixing..."
        mv -f "$FIREFOX_LIB" "$FIREFOX_LIB".bak
        ln -s /usr/lib/x86_64-linux-gnu/p11-kit-proxy.so "$FIREFOX_LIB"
    fi
fi

if [ -e "$FIREFOX_ESR_LIB" ]
then
    if ! [ -L "$FIREFOX_ESR_LIB" ]
    then
        echo "Firefox ESR libnssckbi.so is not a symlink. Fixing..."
        mv -f "$FIREFOX_ESR_LIB" "$FIREFOX_ESR_LIB".bak
        ln -s /usr/lib/x86_64-linux-gnu/p11-kit-proxy.so "$FIREFOX_ESR_LIB"
    fi
fi

if [ -e "$THUNDERBIRD_LIB" ]
then
    if ! [ -L "$THUNDERBIRD_LIB" ]
    then
        echo "Thunderbird libnssckbi.so is not a symlink. Fixing..."
        mv -f "$THUNDERBIRD_LIB" "$THUNDERBIRD_LIB".bak
        ln -s /usr/lib/x86_64-linux-gnu/p11-kit-proxy.so "$THUNDERBIRD_LIB"
    fi
fi

if [ -e "$NSS_LIB" ]
then
    if ! [ -L "$NSS_LIB" ]
    then
        echo "NSS libnssckbi.so is not a symlink. Fixing..."
        mv -f "$NSS_LIB" "$NSS_LIB".bak
        ln -s /usr/lib/x86_64-linux-gnu/p11-kit-proxy.so "$NSS_LIB"
    fi
fi
  • Agregar el atributo de ejecutable al script:
sudo chmod +x /usr/local/sbin/update-p11-kit-symlinks
  • Crear un fichero llamado /etc/systemd/system/p11-kit-proxy-updater.service y abrirlo para edición:
sudo gedit /etc/systemd/system/p11-kit-proxy-updater.service 
  • En la ventana del editor de textos gedit, pegar el siguiente texto, guardar y cerrar el editor:
[Unit]
Description=mantenimiento de enlaces a p11-kit-proxy

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/update-p11-kit-symlinks

[Install]
WantedBy=multi-user.target
  • Activar el servicio al arranque y ejecutarlo una primera vez para comprobar que funciona:
sudo systemctl enable --now p11-kit-proxy-updater.service

Eso es todo. Es necesario reiniciar Firefox y cualquier otra aplicación que use certificados para que se apliquen los cambios. Si se ha insertado el lector y la tarjeta al lector, estas aplicaciones preguntarán por el PIN en páginas donde se solicite autenticación (por ejemplo en el sitio web de Internet Banking del Banco Nacional), lo que indicará que se la instalación ha sido exitosa.

Si el componente de firma del Banco Central está instalado debería funcionar para poder realizar la prueba de firma. El sitio web de Soporte Firma Digital podría usar todavía la prueba de Java y no funciona con los navegadores modernos. En su lugar podría usarse la prueba con el firmador BCCR desde la página de Firma Digital de verificación de certificados (requiere instalar los certificados para poder entrar).

Quizás resulte interesante utilizar la herramienta Firmador, software libre para firmar documentos.

Cómo instalar Firma Digital de Costa Rica en GNU/Linux Fedora 28

Esta guía documenta cómo instalar el controlador de la tarjeta de Firma Digital de Costa Rica y la jerarquía de certificados del Banco Central (SINPE) y del MICITT en el sistema operativo Fedora 28.

Esta guía de instalación tiene los siguientes propósitos:

  • Configurar de la forma más sencilla y adecuada el sistema para que funcione con la mayor cantidad de programas.
  • Lograr que funcione para todos los usuarios del sistema, incluyendo los nuevos usuarios creados tras las instalación.
  • Aislar la librería de Firma Digital en una “caja de arena” (sandbox) para que funcione con múltiples usuarios del sistema simultáneamente (soluciona un defecto en la librería al crear ficheros temporales).

Instalación de las dependencias

  • Instalar el soporte CCID de PC/SC para que reconozca el lector de tarjetas e IcedTea-Web para poder cargar algunos lanzadores que usan Java Web Start (los navegadores ya no soportan applets java, ya no es posible usar el firmador de la CCSS) y OpenJFX si pretende usarse algún firmador que lo use (NexU, por ejemplo).
sudo dnf -y install pcsc-lite icedtea-web java-1.8.0-openjdk-openjfx

sudo systemctl start pcscd.socket

Descarga del “instalador”

  • Descargar el “instalador” en el desplegable llamado “Usuarios Linux” en la página de descarga de instaladores del sitio web de Soporte Firma Digital de Costa Rica, introduciendo el número de serie de la tarjeta y aceptando las condiciones.
  • Descomprimir el archivo zip descargado con unzip, en el momento de escribir esta documentación se llama sfd_ClientesLinux_Rev09.zip. Se creará una carpeta llamada Firma Digital. Se asume que el archivo zip se ha descargado en la carpeta Descargas:
cd ~/Descargas/

unzip sfd_ClientesLinux_Rev09.zip

Instalación de los certificados

Es necesario agregar a la lista de confianza la jerarquía de certificados del SINPE y del MICITT. En teoría solamente sería necesario instalar los certificados raíz del MICITT pero en la práctica hay algunas aplicaciones que necesitan los certificados intermedios del SINPE para completar la cadena a la hora de validar. El último instalador también incluye una CA del BCCR, probablemente para el certificado de código de su propio firmador (que en teoría tampoco debería ser necesario si el sistema operativo está correctamente actualizado). Para ello, un conjunto de comandos:

  • Copiar los certificados:
sudo cp ~/Descargas/Firma\ Digital/Certificados/* /usr/share/pki/ca-trust-source/anchors/
  • Regenerar los archivos de certificados para todas las aplicaciones:
sudo update-ca-trust

Instalación del módulo PKCS#11

Aunque hay un módulo en el directorio Librerías, no es la versión más reciente y tiene varios defectos de enlazado. La versión distribuida en el paquete PinTool es más reciente y funciona correctamente en todos los programas probados. En el siguiente proceso se extrae y se instala conservando la fecha original de la librería.

  • Instalar el módulo PKCS#11 privativo en /usr/lib64/:
cd ~/Descargas/Firma\ Digital/PinTool/IDProtect\ PINTool\ 6.41.01/RPM/

rpm2cpio idprotectclient-641.01-0.x86_64.rpm | cpio -dim ./usr/lib/x64-athena/libASEP11.so

sudo cp -p usr/lib/x64-athena/libASEP11.so /usr/lib64/
  • Crear los siguientes enlaces simbólicos (necesarios para que funcionen algunos programas):
sudo ln -s /usr/lib64/libASEP11.so /usr/lib/

sudo mkdir -p /usr/lib/x64-athena/

sudo ln -s /usr/lib64/libASEP11.so /usr/lib/x64-athena/
  • Permitir temporalmente al usuario local cargar aplicaciones gráficas con sudo (para gedit):
xhost si:localuser:root
  • Crear el fichero /etc/Athena/IDPClientDB.xml y abrirlo para edición:
sudo mkdir /etc/Athena/

sudo gedit /etc/Athena/IDPClientDB.xml
  • En la ventana del editor de textos gedit, pegar el siguiente texto, guardar y cerrar el editor:
<?xml version="1.0" encoding="utf-8" ?>
<IDProtect>
 <TokenLibs>
  <IDProtect>
   <Cards>
    <IDProtectXF>
     <ATR type='hexBinary'>3BDC00FF8091FE1FC38073C821106600000000000000</ATR>
     <ATRMask type='hexBinary'>FFFF00FFF0FFFFFFFFFFFFFFFFF0FF00000000000000</ATRMask>
    </IDProtectXF>
   </Cards>
  </IDProtect>
 </TokenLibs>
</IDProtect>
  • Crear un fichero llamado /usr/share/p11-kit/modules/firma-digital.module y abrirlo para edición:
sudo gedit /usr/share/p11-kit/modules/firma-digital.module
  • En la ventana del editor de textos gedit, pegar el siguiente texto, guardar y cerrar el editor:
remote: |bwrap --unshare-all --dir /tmp --ro-bind /etc/Athena /etc/Athena --proc /proc --dev /dev --ro-bind /usr /usr --symlink /usr/lib64 /lib64 --ro-bind /var/run/pcscd /var/run/pcscd p11-kit remote /usr/lib64/libASEP11.so
  • Crear un fichero llamado /etc/crypto-policies/local.d/nss-p11-kit.config y abrirlo para edición:
sudo gedit /etc/crypto-policies/local.d/nss-p11-kit.config
  • En la ventana del editor de textos gedit, pegar el siguiente texto, guardar y cerrar el editor. Es importante que exista una línea en blanco al final para que funcione correctamente. Crear este fichero no será necesario a partir de Fedora 29 porque ya existirá con este contenido:
library=p11-kit-proxy.so
name=p11-kit-proxy

  • Regenerar los ficheros de configuración de las políticas para todas las aplicaciones:
sudo update-crypto-policies

Eso es todo. Es necesario reiniciar Firefox y cualquier otra aplicación que use certificados para que se apliquen los cambios. Si se ha insertado el lector y la tarjeta al lector, estas aplicaciones preguntarán por el PIN en páginas donde se solicite autenticación (por ejemplo en el sitio web de Internet Banking del Banco Nacional), lo que indicará que se la instalación ha sido exitosa.

Si el componente de firma del Banco Central está instalado debería funcionar para poder realizar la prueba de firma. El sitio web de Soporte Firma Digital podría usar todavía la prueba de Java y no funciona con los navegadores modernos. En su lugar podría usarse la prueba con el firmador BCCR desde la página de Firma Digital de verificación de certificados (requiere instalar los certificados para poder entrar).

Quizás resulte interesante utilizar la herramienta Firmador, software libre para firmar documentos.

Firmador digital de documentos para Costa Rica

Firmador es un pequeño programa de escritorio para firmar documentos que cumplan la Política de Formatos Oficiales de los Documentos Electrónicos Firmados Digitalmente publicada por el MICITT.

Esta herramienta se ha diseñado para ser simple, fácil de usar y que funcione en múltiples sistemas operativos. La descarga es relativamente ligera y requiere tener instalado Java 8 y los controladores de Soporte Firma Digital.

Por ahora firma documentos PDF. En próximas versiones el programa soportará otros formatos de documento electrónico oficial y otras mejoras.

El programa es software libre y abierto a la colaboración de cualquier persona interesada para mejorar su código o utilizarlo para cualquier propósito.

Firmador tiene su propio sitio web: https://firmador.app

On crowdsales and multiple inheritance

On 2017 we saw a mind-blowing number of crowdsales and ICOs running in the Ethereum blockchain. They have proven to be a powerful tool to collect the funds required to start a project, and they are one of the most common uses for smart contracts right now. The Zeppelin team has been very involved in this topic, auditing many crowdsale contracts, and supporting OpenZeppelin, the most popular framework to build these crowdsales. What we found was a lot of contracts repeating the same basic concepts, with very similar code, and common vulnerabilities.

Earlier this year, part of the team took the task to redesign our base Crowdsale contract in order to support a lot of new crowdsale flavors out of the box and to make the experience of building and publishing your own crowdsale more clear and secure. The idea is to make audits less necessary, with an architecture that is modular, that encourages reuse and that will be collectively reviewed. These new contracts were added to OpenZeppelin version 1.7.0, and since the release they have been widely used by our community with great success. So, this is a good moment to show off :)

Let's start with a dive into the source code of the Crowdsale base contract. The first thing you will notice is a lot of comments, guiding you through the details of the OpenZeppelin crowdsale architecture. They explain that some functions are the core of the architecture and should not be overriden, like buyTokens. Some others like _preValidatePurchase can be overriden to implement the requirements of your crowdsale, but that extra behavior should be concatenated with the one of the parent by calling super, to preserve the validations from the base contract. Some functions like _postValidatePurchase can be just added as hooks in other parts of the crowdsale's lifecycle.

Building on top of this base, we now provide some contracts for common crowdsale scenarios involving distribution, emission, price, and validation.

So, let's say that you want to set a goal for your crowdsale and if it's not met by the time the sale finishes, you want to refund all your investors. For that, you can use the RefundableCrowdsale contract, which overrides the base _forwardFunds behavior to send the funds to a fancy RefundVault while the crowdsale is in progress, instead of sending them directly to the wallet of the crowdsale owner.

Another common scenario is when you want the tokens to be minted when they are purchased. For that, take a look at the MintedCrowdsale contract, which overrides the simple _deliverTokens behavior of the base class to call instead the mint function of an ERC20 Mintable token.

What if we want to do something more interesting with the price of the tokens? The base Crowdsale contract defines a constant rate between tokens and wei, but if we override _getTokenAmount, we could do something like increasing the price as the closing time of the crowdsale approaches. That's exactly what the IncreasingPriceCrowdsale contract does.

To get started developing and deploying a crowdsale using the OpenZeppelin framework, Gustavo Guimaraes published a nice guide where you will see in action a crowdsale that is timed and minted.

These are just a few examples. I invite you to explore the OpenZeppelin crowdsale contracts to see all the new flavors that you can easily use to fund your cool idea; and take a look at the SampleCrowdsale contract, a more complex scenario that comes with full test coverage. If you like OpenZeppelin, remember that you are welcome into our vibrating community to help us adding new contracts or improving the existing ones.

On the repo you will also find that all these contracts are very well tested. And as we have seen, the new architecture is clearer and safer, with each contract explaining the functions that you can or can't override, and how to do it. However, you should be extra careful when combining them. It's not the same to have three contracts with one condition than to have one contract with three conditions. The combination increases the attack surface, so you need to have a good idea of what you want to achieve, and know the implementation details of the tools you are using.

Before you go ahead and deploy a complex crowdsale that combines some of our contracts, I would like to spend some time going deep into how Solidity works when you combine contracts through multiple inheritance, like Gustavo did in his guide to make a contract that inherits from TimedCrowdsale and from MintedCrowdsale.

Multiple inheritance is hard, and it can get very confusing if you abuse it. Some languages don't support it at all; but it is becoming a very common pattern on Solidity.

The problem, from the point of view of the programmer, is to understand the order of the calls when a contract has multiple parents. Let's say we have a base contract A, with a function named f:

contract A {
  function f() {
    somethingA();
  }
}

Then we have two contracts B and C, both inherit from A and override f:

contract B is A {
  function f() {
    somethingB();
    super.f();
  }
}

contract C is A {
  function f() {
    somethingC();
    super.f();
  }
}

And finaly we have a contract D, which inherits from B and C, and overrides f too:

contract D is B, C {
  function f() {
    somethingD();
    super.f();
  }
}

What happens when you call D.f?

This is called the diamond problem, because we end up with a diamond-shaped inheritance diagram:

Diamond inheritance problem

(the image is from wikipedia)

To solve it, Solidity uses C3 linearization, also called Method Resolution Order (MRO). This means that it will linearize the inheritance graph. If D is defined as:

contract D is B, C {}

then D.f will call:

somethingD();
somethingC();
somethingB();
somethingA();

When D inherits from B, C, the linearization results in D→ C→ B→ A. This means that super on D calls C. And you might be a little surprised by the fact that calling super on C will result on a call to B instead of A, even though C doesn't inherit from B. Finally, super on B will call A.

If D is instead defined as:

contract D is C, B {}

then D.f will call:

somethingD();
somethingB();
somethingC();
somethingA();

When D inherits from C, B, the linearization results in D→ B→ C→ A.

Notice here that the order in which you declare the parent contracts matters a lot. If the inheritance graph is not too complex, it will be easy to see that the order of calls will follow the order in which the parents were declared, right to left. If your inheritance is more complicated than this and the hierarchy is not very clear, you should probably stop using multiple inheritance and look for an alternate solution.

I recommend you to read the wikipedia pages of Multiple inheritance and C3 linearization, and the Solidity docs about multiple inheritance. You will find in there a complete explanation of the C3 algorithm, and an example with a more complicated inheritance graph.

To better understand how this can impact your crowdsales, take a look at the case that Philip Daian brilliantly explains on his blog post Solidity anti-patterns: Fun with inheritance DAG abuse. There, he presents a Crowdsale contract that needs "to have a whitelist pool of preferred investors able to buy in the pre-sale [...], along with a hard cap of the number of [...] tokens that can be distributed." On his first (deliberately) faulty implementation, he ends up with a crowdsale that checks:

((withinPeriod && nonZeroPurchase) && withinCap) || (whitelist[msg.sender] && !hasEnded())

Pay close attention to the resulting condition, and notice that if a whitelisted investor buys tokens before the crowdsale has ended, she will be able to bypass the hard cap, and buy as many tokens as she wants.

By just inverting the order on which the parents are defined, he fixes the contract which will now check for:

(withinPeriod && nonZeroPurchase || (whitelist[msg.sender] && !hasEnded())) && withinCap

Now, if the purchase attempt goes above the cap, the transaction will be reverted even if the sender is whitelisted.

There are some simple cases, where the order of the conditions is not important. By now, you should have started to suspect that the contract above became complicated because of the || (or) condition. Things are a lot easier when all our conditions are merged with && (and), because in that case the order of the conditions doesn't alter the result.

Our new architecture was crafted for using require instead of returning booleans, which works nicely to combine and conditions, and to revert the transaction when one fails. Let's say that we have a crowdsale that should only allow whitelisted investors to buy tokens while the sale is open and the cap has not been reached. In this case, the condition to check would be (in pseudocode):

require(hasStarted() && !hasEnded())
require(isInWhiteList(msg.sender))
require(isWithinCap(msg.value))

Our contract would be as simple as:

pragma solidity ^0.4.18;

import "zeppelin-solidity/contracts/crowdsale/validation/TimedCrowdsale.sol";
import "zeppelin-solidity/contracts/crowdsale/validation/WhitelistedCrowdsale.sol";
import "zeppelin-solidity/contracts/crowdsale/validation/CappedCrowdsale.sol";

contract WhitelistedTimedCappedCrowdsale is TimedCrowdsale, WhitelistedCrowdsale, CappedCrowdsale {

  function WhitelistedTimedCappedCrowdsale(
    uint256 _rate,
    address _wallet,
    ERC20 _token,
    uint256 _openingTime,
    uint256 _closingTime,
    uint256 _cap
  )
    public
    Crowdsale(_rate, _wallet, _token)
    TimedCrowdsale(_openingTime, _closingTime)
    CappedCrowdsale(_cap)
    {
    }

}

It doesn't matter how you order the parents, all the conditions will be checked always. But take this with a grain of salt. All the conditions will be checked, but the order will be different. This can have different side-effects on Solidity, as some paths will execute statements that other paths won't, and it could lead an attacker to find a specific path that is vulnerable. Also, if your parent contracts are not super clear, they might be hiding an || condition in a few hard-to-read code statements.

It's very easy to think that the parent contracts will just be magically merged into something that will make sense for our use case, or to make a mistake when we linearize them in our mind. Every use case will be different, so our framework can't save you from the work of organizing your contracts' hierarchy. You must analyze the linearization of the inheritance graph to get a clear view of the functions that will be called and their order, and always always add a full suite of automated tests for your final crowdsale contract to make sure that it enforces all the conditions.

To finish, I wanted to show you my repo where I will be doing experiments with crowdsales and their tests: https://github.com/elopio/zeppelin-crowdsales

Take a look at my PreSaleWithCapCrowdsale contract. You will see that I preferred to be explicit about the conditions instead of using super:

function _preValidatePurchase(address _beneficiary, uint256 _weiAmount) internal {
  require(_beneficiary != address(0));
  require(_weiAmount != 0);
  require(block.timestamp >= openingTime || whitelist[_beneficiary]);
  require(block.timestamp <= closingTime);
  require(weiRaised.add(_weiAmount) <= cap);
}

I encourage you to join me on these experiments, to try different combinations of crowdsales and to play switching the order of the inheritance graph. We will learn more about the resulting code that Solidity compiles, we will improve our mental picture of the execution stack, and we will practice writing tests that fully cover all the possible paths. If you have questions, find errors on the implementations in OpenZeppelin, or find an alternative implementation that will make it easier to develop crowdsales on top of our contracts, please let us know by sending a message to the slack channel. I am elopio in there.

A relevant experiment here is to use composition over inheritance. In OpenZeppelin we couldn't implement an architecture based on composition because of the high gas costs implied, especially during deployment. That is one of the reasons we are now hard at work on zeppelin_os, which minimizes deployment costs by helping you use libraries that are already on-chain. Expect exciting news very soon!

Thanks a lot to Ale and Alejo, who worked on these new contracts and helped me to understand them. <3

Cambiar el mundo ¿Es posible?

Si ustedes han estado conmigo los últimos meses creo que se han dado cuenta de que este ha sido un a;o diferente para mi en algunas cosas demasiado mal, pero el 90% del tiempo ha ido demasiado bien, la Comunidad Arduino Guatemala esta creciendo, he estado ayudando a mas personas con sus problemas tecnológicos (extra;o porque hace un par de a;os era otro tipo de ayuda la que normalmente ofrecía, pero bueno esos son otros 20 pesos :V), realmente ha sido un inicio de a;o espectacular trabajo aquí, trabajo allá, conferencia aquí, conferencia allá, ahora el que ha cambiado de cierta manera he sido yo, ya no comparto tanto en lo digital pero si me he vuelto mas allegado a las personas reales mas a un grupo de amigos de CCCGT.
No se, creo que crecer ya casi cumplo los 24 me ha hecho mas reservado con que cosas comparto en internet y cuales no, pero heme aqui compartiendo con todos ustedes algo que a día de hoy 27 de febrero, no puedo no compartirlo ( en eso me desahogo y tal vez llore, pero eso no lo sabrán porque están del otro lado de la pantalla, pero se que mis lectores van a intuirlo por las palabras que utilizare), Gracias a Luis Olivet por recomendarme compartirlo.
Pero bueno muy pocos saben que formo parte de un emprendimiento llamado Antigua Makerspace, el cual a groso modo esta orientado a utilizar STEEM (science, technology, engineering, entreprenuership and Math) ya un año desde que iniciamos este viaje y si ustedes piensan que es publicidad pues pueden cerrar la ventanita y seguir con sus vidas. No suelo contar mis proyectos personales por la misma razon que muchas personas lo suelen tomar a mal, pero en realidad hay muchas veces que no se como hacerlo. Bueno dejaremos mis problemas mentales para otra publicación jajaja.
Todo empezó con un mensaje, el cual decía que si podíamos apoyar para dar un taller de Robótica  a una escuela de niños con discapacidad visual( total, parcial, visión baja) la cual unas horas antes de llegar supe que era la escuela Santa Lucia( como el pueblo donde vivo ) del Comité pro ciegos y sordos. Si por aquí va la cosa, pero créanme no es el típico post donde uno se sorprende de que los niños con discapacidad tienen las mismas capacidades cognitivas que los demás, mi publicación va un poco mas allá.
Y como siempre digo que si, me gustan los retos aparte de que nunca digo que no, asi que allí empezaba el reto, el mensaje decía son 25 niños ciegos y yo en mi cabeza “Mierda, si me cuesta con niños ahora con niños ciegos me va a costar mucho mas(algo de lo cual me iba a sorprender mas adelante)”, pero como siempre he dicho la mejor manera de aprender es enseñar así que me puse en contacto con mi llamada de emergencia, para que me hiciera ganas para poder ir a la capital en la madrugada. Un par de tropiezos en nuestra logística para movernos la noche del 26 pero estábamos seguros de que de cualquier manera íbamos a ir.
Estuve bastante emocionado, durante la noche que no podía dormir ( aparte de que tenia un dolor del cuello tan feo que no podía voltear a ver a ningún lado, aun lo tengo pero ya es menos), yo y mis planes perfectos donde todo sale bien decían irse a dormir a las 10 para despertarse a las 4 bañarse e irse, la realidad fue otra, dormir a las 12:30 despertar a las 4:30 y levantarse a las 5:10, aún no estaba seguro el transporte hasta que veo el mensaje, ya voy para allá. Como buen trabajador me fui sin desayunar, madrugando por una cosa estúpida llamada trafico, yo soy del pensamiento de madrugar para viajar 300kms es una buena idea; madrugar para viajar 30-40 kms es una estupidez.
Llegando a la escuela que de fuera parece algo súper chiquito, del tamaño de unos cuantos cuartos y dos niveles, pensé: “tengo hambre”, así que fuimos a un canasto de comida que estaba en la esquina a “desayunar” con mi amigo MDR, con la pena de que de verdad yo no tenia idea de como iba a ser la cosa, fui y hable con el guardia que no tenia ni idea de que le estaba diciendo no porque no entendiera, sino que no estaba enterado de la actividad así que decidimos esperar, una hora para ser exactos, los que me  han intentado contactar saben que yo sin acceso a internet no funciono así que estaba pidiendo wifi del cel de MDR, nos acabamos 60 megas en 20 minutos ya solo nos quedaban 40 para el resto del día jaja eran las 8 am.
Ya cansado y con sueño decidí ir con el guardia e inventarle la casaca de que quería hablar con la directora aunque no sabia si era hombre o mujer el encargado, asi que le dije: “poli, mire no esta la directora es que ya es tarde”, pura casualidad fue que si era mujer xD le conté que eramos los de robótica y pues nos dejo pasar.
Era un centro educativo bastante grande, muy limpio y acogedor realmente amplio y hasta tenia parqueo en la parte de atrás. (adiós prejuicio 1), ah olvide mencionar que este proyecto es conjunto con la secretaria nacional de ciencia y tecnología, SENACYT. Realmente esperaba una mejor bienvenida de parte de uno de sus miembros, pero creo que se molesto al ver que tenia el pelo verde e iba con playera, pantalón y tenis, mientras el iba con su traje super presentable. Cuestión de gustos y comodidad supongo, que bueno que me quite los aretes del labio y no tengo tatuajes, sino ni me deja participar. No es la primera vez que me topo con personas así, así que lo mejor es ser profesionales y hacer bien tu trabajo que para eso fue que te llamaron, cuando entro en modo trabajo me irrito fácilmente cuando se meten con lo que hago, no hubo nunca discusiones ni nada solo se sentía la mala vibra. ( aclaro de una vez que de ninguna manera me insulto ni hizo ningún desprecio, fue mas como subestimacion hacia mi persona), empezamos a sacar los robots y yo no tenia ni idea de como hacerle para explicar a los niños, se me acerco el encargado y nos empezó a explicar como había sido el taller anterior ( si este era el segundo y yo aun trataba de descifrar como le hicieron el anterior).
Empezaron a llegar los niños se sentaron, empezaron a tocar la mesa cuando objeto robotico no identificado aparece. IMG_1266
Al igual que todo niño con juguete nuevo no querían soltarlo ni compartir con nadie, pero hubieron algunos veteranos ( que ya habían tomado el curso) que dijeron a su compañero mas cercano, “mira estos son los ojos” y le ponían las manos al compañero en el sensor de proximidad. Eso fue lo mejor de la mañana, compartir lo que saben y enseñar. Dejamos que los niños jugaran y como buenos niños hacían bulla y no ponían atención y aquí mi miedo porque no sabia si iban a entender o no lo que les iba a decir.
Hubo un acto protocolario pequeño y fugaz agradeciendo a todos y bueno empezamos
“Hola niños mi nombre es Yeffri soy su profesor de robótica y tengo el pelo verde”, instantáneamente las risas de los niños en ese momento se fue mi miedo y empezó mi seguridad, seguía sin saber que hacer pero estaba seguro de que iba a funcionar.
Les dimos los des armadores sin instrucciones de como desarmarlos y pum.
Entre tanto y tanto empezaron a desarmar los robots, había de todo niños que se les caían los tornillos, niños que los guardaban en el pantalón y luego estaban ellos. Aunque he de admitir que normalmente se pierden 8-10 tornillos en este caso de todos los robots se perdio 1 tornillo.

IMG_1282

Me estoy centrando en cosas que me sorprendieron, la mayoría buenas pero no todo es bueno mas adelante vamos a verlo.

Al final pues la idea era primero memorizar o conocer el robot, desarmarlo y luego volver a armarlo. y que creen Si es posible armarlo sin ver nada. Yo no puedo hacerlo.

Hubieron algunas cosas como el hecho de que no conocían que el desarmado tenia dos cabezas una de cruz y la otra hexagonal así que perdieron bastante tiempo intentando atornillar con la cabeza equivocada.

IMG_1286.JPG

Armados ya los robots pos vamoaprogramar

IMG_1296.JPG

y he aquí el mayor de los problemas de la inclusión de personas con discapacidad que si bien es cierto que estamos tan avanzados que ya podemos hablar con una cosa para decirle que compre papel de baño por amazon, no hemos podido crear un software lo suficientemente bueno para personas ciegas, aquí hay un gran problema y es que muy pocos estamos trabajando en ello, digo trabajando por Sonar.

Normalmente para programar a los Mbots se utiliza mblock que es un software basado en Scratch y S4A, bastante bueno e intuitivo, estos de makeblock le han metido bastante dinero a esto. mblock, no funciona con el text to speech de windows XP, baaaaaad. Entonces lo que hicimos fue abrir el bloc de notas y con el text to speech de la computadora pudimos esquivar algunas cosas, pero de nuevo mas problemas el código esta en ingles con funciones, programación pura que los niños jamas en la vida habían escuchado. Vomo pude y con ayuda de los profesores pudimos liarla y logramos programar el Mbot para utilizarlo como detector de obstáculos. Nuestras mentes de adultos siempre intentando meterles conocimiento mientras ellos lo único que quieren es jugar( quédense con esta frase).

Todo esta bien hasta que te empiezas a fijar bien en los detalles, como toda sociedad hay personas que no se incluyen aquí también, pues los niños con ceguera total se mantenían sentados y callados mientras los demás gritaban y jugaban en el piso con los robots.

Esta nena estuvo parada por 5 minutos esperando a que alguien le hablara.

20180227_120915.jpg

Les enseñamos algunas cosas que imprimimos en 3D como una etiqueta braille que podían leer perfectamente.

Bueno ya terminado el curso era hora de los diplomas, yeei

img_1309.jpg

Asi que gracias a SENACYT los niños pudieron tener un robot en sus manos.

Y los niños ya pudieron volver a ser niños y jugar con los robots el resto del día.

Teniendo en cuenta que no se dispone de herramientas necesarias para que la inclusion de personas con discapacidad en muchos ámbitos aparte de las laborales, estamos hablando de cosas sociales, lúdicas y sobre todo de aprendizaje, cuando esas barreras se rompan o podamos saltarlas por cualquier medio estoy seguro que vamos a poder cambiar el mundo, es una necesidad del mundo. Yo por mi parte seguiré luchando intentando hacer el mundo un poco mas humano y mas accesible para todas las personas, con proyectos como estos con sonar, la matriz braille etc.

Realmente hay muchos proyectos que tienen el potencial de cambiar el mundo, luego están los proyectos que gracias a SENACYT buscan cambiar el mundo de los olvidados, de los despreciados dándoles herramientas para que dentro de algunos años puedan hacer algo con este conocimiento. El proximo taller es con niños con discapacidad auditiva, seguire informando que tal nos va.

Si ustedes me preguntan a dia de hoy y con esta experiencia si es posible cambiar el mundo yo puedo decir abiertamente SI juntos podemos lograrlo.

Asi que los dejo con esta  hermosa sonrisa para que puedan sentirse mejor.

img_1284.jpg

PD: al terminar de redactar esta publicación estaba lleno de lágrimas, malditas injusticias, los niños no tienen porque nacer asi. Pero estamos hablando de que cerca del 10% de la población guatemalteca tiene alguna discapacidad y la mayoría es discapacidad visual producida por falta de control pre y post natal, pero es que como quieren que las personas lleguen a comprar prenatales y pastillas a las farmacias caminando kilómetros si no tienen ni para comer, realmente esto es una cadena y me siento bien basura al pensar que no puedo realmente ayudar de una mejor manera, asi que lo mejor que puedo hacer es seguir compartiendo el conocimiento que tengo y tratar de nunca despreciar a nadie. Sé que es un placebo para que mi corazón no sufra, pero aun no se como ayudarlos.

Error programadora ESP8266-01: Solucion.

Houston tenemos un problema. La programadora barata que encontramos en ebay no funciona 😦

20180223_183857

Holi, Bienvenidos de nuevo a the microfcontrol, ha sido un año bastante bueno en Guatemala con respecto a tecnología e internet de las cosas y especialmente para la comunidad que mañana 24 de febrero tendrá su primera reunion, Asi que nos vemos mañana en Teclab, edificio Tec, 4 grados norte, Junto con Giangoolabs Yeii.

Entrando en materia, hace un año aproximadamente que Oscar Leche (Fundador de la comunidad) me dijo, mira esta programadora para el ESP esta cool, yo ya llevaba cerca de un año de estar jugando con los ESP8266 (ay, como pasa el tiempo… Gracias al sensei kestler por haberme iniciado en el camino del IoT ), la cosa es que no pude hacer nada con ella, ya que no había ni nombre de la placa ni información, pero gracias a internet y un poco de research, logré dar con la solución.

Bueno antes vamos a poner un poco en contexto que es el ESP8266, bueno ya llevamos poco mas de dos años desde que empezamos a hablar sobre IoT en Guatemala con la comunidad y con los miembros, yendo y viniendo de departamento en departamento incentivando a jóvenes (algunos universitarios, otros como yo que no lo son) a que inventen y se unan a la ola de internet de las cosas. Pueden leer un poco mas en esta publicación. Dos años después de verdad ha dado frutos, he recibido solicitudes de ayuda de 4-5 tesis, he visto proyectos de IoT materializarse y realmente es gratificante como esta cambiando el movimiento.

Bueno y toda esta casaca para que es, pues los primeros dispositivos de IoT que empezamos a usar fueron efectivamente los ESP8266, del cual pueden ver que casi todo lo que hay en este blog con WiFi esta hecho con ello, es uno de los favoritos a nivel mundial por la comunidad maker por el costo principalmente, pero tiene sus ventajas grandes.

De fabrica vienen para programarse o interactuar con LUA, que tambien tengo una guia lo interesante es que los makers vieron su potencial asi que ahora ya podemos utilizar micropython o arduino para poder utilizarlo, haciendo un Flasheo a la memoria e insertando un binario nuevo con el código, en micropython solo se flashea una vez para que se pueda ejecutar el interprete y luego por comunicación serial o por medio de wifi para poder reprogramarlo necesitamos que el pin0 cuando se enciende el ESP8266 reciba un pulso de GND, esto lo podemos hacer bastante bien con un jumper o un pedazo de alambre, lo mejor es usar un boton para ponerlo en modo programming.

El problema

El problema con la programadora es que sirve unicamente para poder comunicarnos via serial a el esp8266, cuando queremos usarla para reprogramar no funciona porque no esta en modo programar.

Solución

Poner un jumper entre el pin 0 y GND, para así poder ponerlo en modo programar el problema con soldar directamente un cable entre gnd y pin0 es que cada vez que conectemos nuestro esp8266 va a entrar en modo programación y no sabremos si nuestro codigo funciona o no hasta que recarguemos el Binario.

Solución de la solución

20180223_212256

Un botón, un pin conectado a GND y el otro a pin0 y se acabo el problema.

Quedaría algo así:

 

Instagram Photo

y pues bueno realmente no es la gran solución, pero es La solución así que cualquier cosa por favor háganla saber.

Nos vemos en la siguiente publicación.

Y recuerden solo necesitan una excusa para cambiar el mundo ❤

PD: se me olvido mencionar que este modelo de ESP8266 es el mas barato de todos asi que es mejor que compren una sola quemadora y luego tengan una placa especificamente hecha para poder usarlo despues, les va a salir mas barato que un nodemcu y aprovechan mejor el hardware.

 

Quipus incas y cifrado con factorización de números primos

Dibujo de un inca y su quipu

Según este sabio [Nordenskiöld], los indios colocaban en las tumbas únicamente quipus con números que a sus ojos tenían valor mágico, expresándolos no en forma directa sino mediante otros que los incluyen o que son sus múltiplos y tratando de hacerlos coincidir con la numeración resultante de cálculos obtenidos de la consulta de los astros. [...]. La finalidad que llevó a los indios a tal práctica fue entretener, mediante estos complicados «rebus», a los espíritus malignos, quienes se esforzarían para desanudar las cuerdas y encontrar esta numeración mágica [...].

en Estudio sobre los quipus, de Carlos Radicati di Primeglio.

Y así fue como lxs incas inventaron el cifrado con factorización de números primos, la base de todas las comunicaciones seguras y criptomonedas de hoy. :D

Domotica con Telegram: Como utilizar un chatbot para controlar cosas conectadas a internet

Holi, lo sé no es el mejor titulo del mundo, pero mi compañero (me robo la idea ). Pero bueno a dejar de llorar y empezar a crear,

El dia de hoy vamos a crear un chatbot para poder controlar nuestras cosas conectadas a internet por medio de MQTT y python. WUJU

Lo que necesitamos:

  • Telegram app
  • Python3
  • Mosquitto
  • Arduino IDE
  • ESP8266
  • Ledes
  • DHT11

Vamos a empezar por lo que ya conocemos y es la parte electronica, hay una serie de complicaciones con respecto a nuestro querido ESP8266, es que no es tolerante a 5v, por lo que tendremos que tener bastante cuidado a la hora de meterle sensores analogicos o señales de 5v, podemos utilizar un divisor de voltaje o un nivelador de voltaje.

ARDUINO IDE

Necesitamos Algunas librerias, a estas alturas del partido no creo que sea necesario que tener que explicar como instalar las librerias, pero si eres nuevo en mi blog te recomiendo que leas la serie de IOT de mi blog y estés en lo ultimo a nivel mundial como nosotros.( ja, ja, ja( asi se escribe la risa xD))

La logica del codigo es la siguiente, por medio de WIFI, nos conectamos a un broker ( en este caso local) pero puede ser en la nube aunque uno local funciona muy bien, se suscribe a los topicos para controlar las salidas en este caso /salida1, hasta la /salida4 recibiendo un CHAR o Caracter 0 o 1 para apagar y encender respectivamente. luego veran que la luz de su esp8266 azul se queda parpadeando, eso quiere decir que funciona correctamente el codigo, cada 5 segundos envia el estado del sensore humedad y temperatura respectivamente.

Codigo:

/*
 Este sketch es para controlar 4 salidas digitales distintas
 tambien tiene un dht11 para enviar la temperatura y un bluetooth para conectarse de manera local.

Circuito:
 NodeMCU v1.0
 DHT11
 Modulo Blutooth hc-06 o hc-05
 4 modulos de relay o relays
 led amarillo, rojo.
 resistencia 10k para el dht11




Yeffri J. Salazar
 Hackerspace Xibalba y Comunidad Arduino Guatemala
 Themicrofcontrol.wordpress.com

*/
/************************************
 ** Librerias **
 ***********************************/
#include 
#include 
#include "DHT.h"
/************************************
 ** constantes **
 ***********************************/
#define salida1 D5
#define salida2 D6
#define salida3 D7
#define salida4 D8
#define ledAmarillo D4
#define ledRojo D1
#define pinDHT 9
#define puertoMqtt 1883
/***********************************
 ** objetos y variables **
 ***********************************/
DHT dht;
WiFiClient clienteWifi;//este cliente se encarga de la comunicacion con el wifi
PubSubClient clienteMQTT(clienteWifi);//este utiliza el cliente anterior para hacer poder crear la conexion mqtt
//si pasan por el hackerspace Xibalba pues ya tienen la clave
const char * ssid = "Hackerspace";
const char * claveWifi = "IOT12345";
const char * brokerMqtt = "192.168.1.10";// ip del broker sin http ni nada solo los numeros
uint32_t ultimoIntentoReconexion;
uint32_t timerEnvioDatos;
uint32_t cambioEstado = 0;
uint8_t estadoLed = 0;
uint16_t tiempoParpadeo = 350;
float humedad, temperatura;




void parpadeo(uint8_t led) {
 //Serial.println(millis() - cambioEstado);
 if ( millis() - cambioEstado > tiempoParpadeo) {
 // Serial.println(pasoSemaforo);
 cambioEstado = millis();
 estadoLed = !estadoLed;
 }
 digitalWrite(led, estadoLed);
}




void conectarAlWifi() {

WiFi.begin(ssid, claveWifi);
 Serial.print("conectando a");
 Serial.println(ssid);
 while (WiFi.status() != WL_CONNECTED) {
 delay(500);
 Serial.print(".");
 }

Serial.println("");
 Serial.println("Wifi Conectado ");
 Serial.println("direccion IP: ");
 Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* mensaje, unsigned int length) {
 String topico = topic;
 Serial.print("Mensaje Recibido del topico: ");
 Serial.println(topico);
 Serial.print("mensaje : ");
 for (uint8_t i = 0; i < length; i++) {  Serial.print(mensaje[i]);  }  //le restamos -48 para que el valor sea 0 o 1  //restamos el valor ascii para hacerlo un entero if (topico == "/salida1") {  digitalWrite(salida1, mensaje[0] - 48);  Serial.println("Salida 1 ");  }  else if (topico == "/salida2") {  digitalWrite(salida2, mensaje[0] - 48);  Serial.println("Salida 2 ");  }  else if (topico == "/salida3") {  digitalWrite(salida3, mensaje[0] - 48);  Serial.println("Salida 3 ");  }  else if (topico == "/salida4") {  digitalWrite(salida4, mensaje[0] - 48);  Serial.println("Salida 4 ");  }  else if (topico == "/temperatura") {  Serial.println(temperatura);  char msg[3];  snprintf (msg, 3, "%ld", (int)temperatura);  clienteMQTT.publish("/respuestaTemperatura", msg);  }  else if (topico == "/humedad") {  Serial.println(humedad);  char msg[3];  snprintf (msg, 3, "%ld", (int)temperatura);  clienteMQTT.publish("/respuestaTemperatura", msg);  }  else {  Serial.println("error de mensaje");  } } boolean reconexion() {  Serial.print("Conectando al broker mqtt");  //intentando conectar al broker  if (clienteMQTT.connect("ESP8266Client")) {  Serial.println("Conectado");  //publicamos que estamos conectados  clienteMQTT.publish("/conexion", "Conectado");  //nos suscribimos a los topicos para controlar los ledes  clienteMQTT.subscribe("/salida1");  clienteMQTT.subscribe("/salida2");  clienteMQTT.subscribe("/salida3");  clienteMQTT.subscribe("/salida4");  clienteMQTT.subscribe("/temperatura");  clienteMQTT.subscribe("/humedad");  } else {  Serial.print("falló, rc=");  Serial.print(clienteMQTT.state());  }  return clienteMQTT.connected(); } void entradaSerial() {  if (Serial.available()) {  char dato = Serial.read();  if (dato == 'a') {  digitalWrite(salida1, HIGH);  Serial.println("Salida 1 ");  }  else if (dato == 's') {  digitalWrite(salida2, HIGH);  Serial.println("Salida 2 ");  }  else if (dato == 'd') {  digitalWrite(salida3, HIGH);  Serial.println("Salida 3 ");  }  else if (dato == 'f') {  digitalWrite(salida4, HIGH);  Serial.println("Salida 4 ");  }  else if (dato == 'q') {  digitalWrite(salida1, LOW);  Serial.println("Salida 1 ");  }  else if (dato == 'w') {  digitalWrite(salida2, LOW);  Serial.println("Salida 2 ");  }  else if (dato == 'e') {  digitalWrite(salida3, LOW);  Serial.println("Salida 3 ");  }  else if (dato == 'r') {  digitalWrite(salida4, LOW);  Serial.println("Salida 4 ");  }  else if (dato == ' ') {  digitalWrite(salida4, LOW);  digitalWrite(salida3, LOW);  digitalWrite(salida2, LOW);  digitalWrite(salida1, LOW);  Serial.println("apagando todo");  }  else if (dato == '1') {  digitalWrite(salida4, HIGH);  digitalWrite(salida3, HIGH);  digitalWrite(salida2, HIGH);  digitalWrite(salida1, HIGH);  Serial.println("encendiendo todo");  } else {  Serial.println("error de mensaje");  }  } } void setup() {  Serial.begin(9600);  Serial.println("iniciando programa Holi mami");  dht.setup(pinDHT); // dht PIN  pinMode(salida1, OUTPUT);  pinMode(salida2, OUTPUT);  pinMode(salida3, OUTPUT);  pinMode(salida4, OUTPUT);  pinMode(ledAmarillo, OUTPUT);  pinMode(ledRojo, OUTPUT);  digitalWrite(ledAmarillo, HIGH);  digitalWrite(ledRojo, HIGH);  conectarAlWifi();  clienteMQTT.setServer(brokerMqtt, puertoMqtt); //le decimos cual es el servidor y el puerto al que se debe conectar  clienteMQTT.setCallback(callback);//le decimos como se llama la funcion de callback } void loop() {  entradaSerial();  if (!clienteMQTT.connected()) {  if (millis() - ultimoIntentoReconexion > 5000) {
 ultimoIntentoReconexion = millis();
 // Attempt to reconnect
 if (reconexion()) {
 ultimoIntentoReconexion = 0;
 }
 }
 } else {
 //cliente conectado
 if (millis() - timerEnvioDatos > 5000) {
 timerEnvioDatos = millis();
 //a falta de sensores enviamos valores aleatorios
 char msg[3];
 humedad = dht.getHumidity();
 temperatura = dht.getTemperature();
 snprintf (msg, 3, "%ld", (int)temperatura);
 clienteMQTT.publish("/temperatura", msg);
 snprintf (msg, 3, "%ld", (int)humedad);
 clienteMQTT.publish("/humedad", msg);
 Serial.print(dht.getStatusString());
 Serial.print("\t");
 Serial.print(humedad);
 Serial.print("\t\t");
 Serial.print(temperatura);
 }
 clienteMQTT.loop();
 parpadeo(D1);
 parpadeo(D4);
 }
}

He tratado la manera de hacer el codigo lo mejor legible posible asi que si no le entienden no duden en comentar abajo 🙂

Esto al final es algo que ya hemos visto anteriormente solo un poco tuneado, para que funcione para nuestros propositos la verdadera magia al final de todo esto la hará python ( ay python :3 ), eso quiere decir que necesitamos una computadora o un servidor para que corra nuestro script.

CHATBOT

Antes de empezar a programar y configurar nuestro servidor o maquina local, vamos a crear de manera super sencilla nuestro bot en telegram. Para quien no sepa que es telegram, pues es una aplicacion de mensajeria instantanea que funciona en web, escritorio y movil. yo suelo utilizarla mucho por su versatilidad y que aparte es open source gracias a ello tiene demasiadas features muy buenas que poco a poco la competencia como whatsapp ha ido implementando(copiando).

El papa de todos los bots.

Lo primero que debemos hacer es hablar con el padre de todos los bots el @BotFather, es super sencillo crear nuestro bot, al final nos dara un TOKEN  el cual usaremos para poder acceder a los servicios de la API de telegram. Este token es super secreto asi que tengan cuidado donde lo almacenan, por favor usen keypassxc (promocion gracias a que me ha ayudado mucho a guardar las 123873102937 contraseñas que utilizo ).

Asi que vamos a lo nuestro. Con esta serie de capturas de pantalla  veremos lo facil que es configurar el bot.  Pero si no quieres ver estos son los comandos

En el chat con BotFather,

/start
/newbot
Nombre del bot
usuario del bot
Haga click para ver el pase de diapositivas.

Servidor o maquina local

Como mencionaba en el parrafo anterior lo que necesitamos es una computadora para correr nuestro script de python3, pero bien puede ser una rpi como cerebro de nuestra casa.

Mosquitto

Sudo apt-get install mosquitto
sudo apt-get install mosquitto-clients

Python

La ultima vez que pregunte si era mejor usar python 2 o python 3 me regañaron demasiado fuerte asi que de ahora en adelante todo sera python 3
Utilizaremos esta muy bonita y facil de implementar libreria, tambien una libreria que nos ayudara en la comunicacion con el broker MQTT

https://github.com/eternnoir/pyTelegramBotAPI #telegram api 
https://www.eclipse.org/paho/clients/python/

Asi que la mejor manera de instalarla es como dice en el repositorio:

pip3 install pyTelegramBotAPI pip3 install paho-mqtt

Vamos entonces a probar un poco de codigo seguirmos las instrucciones del repositorio, pero traducido para mejor entendimiento. Cualquier duda consultar en el repositorio o escribir en los comentarios jovenes 😀

import telebot

bot = telebot.TeleBot("TOKEN") #la cadena que nos dio nuestro botfather

@bot.message_handler(commands=['start', 'help'])
def bienvenida(message):
	bot.reply_to(message, "Holi, bienvenido a themicrofcontrol")

@bot.message_handler(func=lambda message: True)
def repetirTodo(message):
	bot.reply_to(message, message.text)

bot.polling(timeout=30)

Algo que deben de saber es que las funciones handler se ejecutan en el orden en el que fueron declaradas asi que cuidado.

Ahora vamos a hacer un pequeño script que publica por medio de mqtt al broker que deseamos.

Primero ejecutamos el siguiente comando en la terminal para habilitar nuestro broker local

mosquitto -d

ahora ya podemos probar nuestro codigo en python3

import paho.mqtt.publish as publish
from time import sleep
while True:
    publish.single('/TopicoPrueba','holi',hostname='localhost')
    sleep(1)

Para verificar si estamos enviando correctamente los datos utilizaremos mosquitto_sub

mosquitto_sub -h localhost -t /TopicoPrueba

DeepinScreenshot_select-area_20180104171051

Una vez hecho esto cada segundo estaremos recibiendo informacion en este caso Holi.

Si bien es cierto que no soy un experto programador quise hacer este codigo lo mejor legible posible, se puede mejorar mucho, como todo en la vida.

La idea es la siguiente
Hablamos con nuestro chatbot corriendo este script en python para que pueda ejecutar las ordenes que le damos. El comando /start inicia la conversacion y nos dice los comandos (aun debo trabajar en la parte de la interfaz pero poco a poco), las ordenes son sencillas y descriptivas EncenderSalida1 enciende la salida 1 ja, ja, ApagarSalida1 la apaga y es lo mismo con las 4 salidas o las que queramos poner solo agregamos mas elif en la funcion.

Bueno sin mas les dejo el codigo y el repositorio:

Por alguna extraña razon,  no me aparece el codigo indentado, pero de igual manera se los dejo, por favor copienlo del repositorio.

 import paho.mqtt.publish as publish
 import telebot
 bot = telebot.TeleBot(token)
 @bot.message_handler(commands=['start', 'help'])
 def send_welcome(message):
 bot.reply_to(message, "Holi, bienvenido al chatbot mas kulz <3")
 bot.reply_to(message, "Comandos: \n EncenderSalida1, EncenderSalida2, EncenderSalida3, EncenderSalida4, EncenderSalida4, EncenderTodo.\n ApagarSalida1, ApagarSalida2, ApagarSalida3, ApagarSalida4, ApagarTodo\n Gracias")
 @bot.message_handler(func=lambda message: True)
 def echo_all(message):
 bot.reply_to(message, message.text)
 if(message.text == 'EncenderSalida1'):
 publish.single('/salida1','1',hostname='localhost')
 print("Salida 1 encendida.")
 bot.reply_to(message, "Salida 1 encendida.")
 elif(message.text == 'ApagarSalida1'):
 publish.single('/salida1','0',hostname='localhost')
 print("Salida 1 apagada")
 bot.reply_to(message, "Salida 1 apagada.")
 elif(message.text == 'EncenderSalida2'):
 publish.single('/salida2','1',hostname='localhost')
 print("Salida 2 encendida.")
 bot.reply_to(message, "Salida 2 encendida.")
 elif(message.text == 'ApagarSalida2'):
 publish.single('/salida2','0',hostname='localhost')
 print("Salida 2 apagada.")
 bot.reply_to(message, "Salida 2 apagada.")
 elif(message.text == 'EncenderSalida3'):
 publish.single('/salida3','1',hostname='localhost')
 print("Salida 3 encendida.")
 bot.reply_to(message, "Salida 3 encendida.")
 elif(message.text == 'ApagarSalida3'):
 publish.single('/salida3','0',hostname='localhost')
 print("Salida 3 apagada.") 
 bot.reply_to(message, "Salida 3 apagada.")
 elif(message.text == 'EncenderSalida4'):
 publish.single('/salida4','1',hostname='localhost')
 print("Salida 4 encendida.")
 bot.reply_to(message, "Salida 4 encendida.")
 elif(message.text == 'ApagarSalida4'):
 publish.single('/salida4','0',hostname='localhost')
 print("Salida 4 apagada.") 
 bot.reply_to(message, "Salida 4 apagada."
 elif(message.text == 'ApagarTodo'):
 publish.single('/salida4','0',hostname='localhost')
 publish.single('/salida1','0',hostname='localhost')
 publish.single('/salida2','0',hostname='localhost')
 publish.single('/salida3','0',hostname='localhost')
 bot.reply_to(message, "Todo encendido.")
 print("apagando todo.") 
 elif(message.text == 'EncenderTodo'):
 publish.single('/salida4','1',hostname='localhost')
 publish.single('/salida1','1',hostname='localhost')
 publish.single('/salida2','1',hostname='localhost')
 publish.single('/salida3','1',hostname='localhost')
 print("apagando todo.") 
 bot.reply_to(message, "Todo apagado")
 #print(message)
 print(message.text)
 print("iniciando programa")
 bot.polling(none_stop=False,timeout=30)

 

Bueno y con eso concluye el tutorial del dia de hoy no olviden comentar y compartir.

y recuerden, Solo necesitan una excusa para cambiar el mundo.