Novedades: actualmente estoy impulsando el proyecto Argentina en Python, desde aquí (ver mapa)

Instalar ICARO en Ubuntu

ICARO es una "plataforma" para experimentar y crear robots de forma sencilla destinada a estudiantes. Hace aproximadamente 2 semanas que estoy investigando como funciona su placa y me encontré con que está demasiada muy buena.

Entonces, como me encontré con que superó mis espectativas ampliamentes, decidí escribir un post para comentar cómo es la instalación de ICARO en Ubuntu ya que es un inconveniente no tan fácil de resolver sin un poco de conocimiento en el tema.

  1. Instalar los paquetes necesarios desde los repositorios oficiales:

    sudo apt-get install python-pygame python-rsvg python-usb \
    python-webkit python-serial python-gtk python-cairo \
    python-gtksourceview2
    

2. Instalar sdcc y sdcc-libraries desde los repositorios de lucid ya que necesitamos versiones viejas de esos paquetes porque en las nuevas han quitado el archivo /usr/share/sdcc/lib/pic16/libm18f.lib por problemas de licencias (creo) y es fundamental para trabajar con ICARO.

  • Agregar la siguiente línea al archivo /etc/apt/sources.list:

    deb http://cz.archive.ubuntu.com/ubuntu lucid main universe
    
  • Luego, instalar los paquetes que necesitamos:

    sudo apt-get update
    sudo apt-get install sdcc-libraries=2.9.0-5 sdcc=2.9.0-5
    
  1. Bajar el código fuente de github:

    git clone https://github.com/valentinbasel/icaro.git
    

4. Cambiar el nombre del ejecutable de sdcc-sdcc a sdcc en el archivo config.dat que está dentro del repositorio (es la primera línea del archivo).

  1. Copiar el Firmware desde el repositorio para trabajar con PICs:

    cd icaro
    sudo mkdir /usr/share/icaro
    sudo cp -r pic16 /usr/share/icaro
    

6. Copiar reglas UDEV desde el repositorio para el manejo de los grupos y permisos para escribir en el puerto USB de la placa:

cd icaro
sudo cp udev/* /etc/udev/rules.d/
  1. Agregar tu usuario a los grupos dialout y microchip:

    sudo usermod -a -G dialout $USER
    sudo usermod -a -G microchip $USER
    
  2. Modificar la línea de main.py:

diff --git a/main.py b/main.py
index efe5794..533629a 100644
--- a/main.py
+++ b/main.py

@@ -204,7 +204,7 @@ def comprobacion_errores(ventana):
             #tar=tarfile.open(dir_conf+"/np05.tar.gz","r:gz")
             #tar.extractall(dir_conf)
             #tar.close
-            shutil.copytree("/usr/share/icaro/pic16/np05",dir_conf+"/firmware/")
+            shutil.copytree("pic16/np05",dir_conf+"/firmware/")
         except:
             ventana.mensajes(2,"no se pudo copiar el directorio")
             exit()
  1. ICARO ya está configurado y listo para ser ejecutado mediante:

    python main.py
    

Eso es todo por ahora, espero resolver varios dolores de cabeza a la gente que tiene ganas de experimentar con esta placa y está renegando para instalarlo en Ubuntu/Debian/Huayra y/o derivados.

Además, para que con cada actualización del sistema ICARO me siga funcionando, "pinié" los paquetes sdcc y sdcc-libraries para que no sean actualizados y así no perder las librerías que necesitamos. Para eso, agregué estas líneas al archivo /etc/apt/preferences:

Package: sdcc-libraries
Pin: version 2.9.0-5
Pin-Priority: 555

Package: sdcc
Pin: version 2.9.0-5
Pin-Priority: 555

Nota

Si encontrás algo que me esté faltando en la explicación, por favor, comunicámelo por email o en los comentarios así actualizo el post.


Ahorre nafta

El Jueves pasado en la casa del Chemma me encontré con algo que tiene mucha historia:

instrucciones.thumbnail.jpg

Nikola, un proyecto comunitario

Como todos saben, y los que no se están enterando ahora, migré mi blog de wordpress.com a mi servidor personal pero además no estoy usando más wordpress para gestionarlo, sino que estoy usando Nikola.

Nikola me gusta, porque además que puedo escribir usando reStructuredText, es Software Libre y está hecho en Python. Y eso quiere decir que, además de que puedo modificarlo y agregarle nuevas funciones o corregir errores, sé como hacerlo. O bueno, eso creía...

La historia ya me ha visto trabajar con reStructuredText, pero nunca hice nada en serio. Digo, no "en serio", sino enserio. O sea, hablando en serio, nunca hice nada con él más que usarlo. Hace unos años atrás, cuando trabajaba en Machinalis uno de los proyectos en los que participé era sobre la documentación de un software que chequeaba unos reactores nucleares. Sí, suena como super mega increíble, pero lo único que hice yo fue migrar la documentación de ese software que creo que estaba en Microsoft Word a Sphinx (que usa reStructuredText). En esa migración tuve unos cuántos problemas con reStructuredText y que la mayoría de ellos se solucionaban extendiendo reStructuredText. Digamos, agregando algunas cositas extras mediante algunas líneas de programación en Python.

Recuerdo que por esos tiempos me partí la cabeza para entender cómo se hacía para extender reStructuredText y encima que Sphinx se dé cuenta que vos querés la versión extendida y no la que viene con él. Me acuerdo que me volví loco para hacer que toda esa cosa funcione, el proyecto estaba interesante y yo lo quería hacer perfecto, pero el cerebrito que me dieron no cubría con todo lo que necesitaba hacer (o al menos lo que me hubiese gustado hacer). Asique, no recuerdo muy bien cómo terminé solucionando las cosas...

Años después, trabajé en la traducción de "La Confusión de la Tortuga" con Melina y otra vez usamos reStructuredText para hacer el libro. Además, luego para hacer la versión final en PDF utilizamos una herramienta llamada rst2pdf, que "Oh!, casualidad" es del mismo autor que Nikola y que "Oh!, mirá vos" también usa reStructuredText como texto de entrada. Con ese libro tuve varios problemas con las imágenes, con algunos márgenes y demases que reporté al autor y siempre me tiró la de "Abrime un issue y yo lo miro esta noche", o "Fijate en tal archivo que está lo que necesitás cambiar" y yo como buen lazy (y teniendo en cuenta mi experiencia de extender reStructuredText) siempre tenía unas horas para esperar a "esta noche". Así, pasado unos días si no tenía noticias de él lo pingeaba y finalmente tenía mi bug arreglado :)

Esta vez, el "problema" que tenía era que no había forma de linkear un blogpost con otro dentro de mi blog sin tener que poner la URL completa y yo sabía, por la traducción del Tutorial de Python, entre otros, que había un rol llamado :ref: que podía servirme para hacer lo que yo quería hacer. Así que, pasó algo similar que con rst2pdf pero con la diferencia que, luego de haber leído su blogpost sobre su postura en el proyecto, me quise dar un poco más de maña y vencer esa barrera que había tenido durante este tiempo y finalmente aprender a extender reStructuredText. Así que, pregunté qué, cómo y dónde tenía que modificar para poder agregar esa nueva característica a Nikola y que todos puedan disfrutar de ella.

Mejor que cualquier profesor de cualquier Universidad (no me consta, no fui a todas), Roberto me tiró las mil y una data sobre cómo hacer lo que yo quería hacer. El 1, 2, 3 o el A, B, C de cómo hacer lo que yo quería en lenguaje natural como para que lo entienda cualquier idiota, seguido de unos "fijate acá" y "fijate allá como lo hizo éste". Así que con toda esa información, me puse manos a la obra y le dije que en 32hs lo iba a tener terminado. Utilicé 1, 2, 3, 4, 5, como referencia para terminar de entender y robé algunas cosas de esos lugares también.

A medida que estaba laburando, Roberto me dice que me dió permiso de commit en el repositorio oficial de Nikola, seguido de un "no hagas cagadas nomás", y luego de tener andando en mi máquina el rol que quería agregar, hice unos tests, actualicé la documentación, agregué eso al changelog y demás (todo como corresponde, ¿no?) y "Bueh, ya fue, lo mando". Y así fue como lo mandé al master de una...

Unos minutos después, me entero que había una serie de pasos un poco más amigables con el entorno que estaban usando, el sistema de chequeo para que cada commit pase los tests antes de ser aprobado en master y que básicamente me había mandado un mocaso. Ahí salió Roberto a decirme: "No te preocupés, hacé... Nah, dejá. Yo lo arreglo. Si vos supieras los mocos que me mandé yo no me hablarías más". Así, un rato más tarde ya tenía unas instrucciones completísimas sobre cómo hacer para colaborar correctamente con Nikola, sin mandarse ningún moco y sin hacer que todo explote, que igualmente, cuando lo hacés explotar te siguen tratando bien y todo :)

Así que, con ustedes, el nuevo rol reStructuredText para Nikola :doc:, que sirve para linkear un blogpost con otro dentro de un mismo sitio. Este feature va a ser agregado en la próxima release de Nikola que incluya features.

La verdad que los que laburan en Nikola tienen mucha y muy buena onda con los que quieren colaborar por más noob que sean. Varias veces me sentí medio boludo, pero hicieron que eso no se agrave al ayudarme a resolver los problemas que tenía y que había cometido. Yo creo, que si bien esa es la idea, también hay que tener ganas de hacerlo todo el tiempo, y estos dos días que estuve laburando en Nikola, los pibes me tiraron la mejor onda en todo momento.

¡Mis felicitaciones a ellos!


Solución Windows a: "No más mate frío"

Hoy Diego Mernes posteó en su Facebook:

la cagada de tomar mate solo es que si te distraés por unos minutos, no hay nadie que te recuerde que estás cebando, y se enfría al toque... una cagada... debería venir un muñequito que te pida un mate cada 3 minutos... ¿algún ingeniero que lo haga? yo lo compro!

Y me hizo reír porque yo ya había pasado por la misma sensación y, como lo había resulto, lo había publicado. Fue muy gracioso pensar que la publicación de semejante pelotudés le haya servido a otra persona para resolver "un problema". Que, aunque creas que no es muy grave, produce diarrea (por lo menos, a mí)

Entonces, le pasé el link a mi post y él hizo la solución Windows al problema del mate cada 3 minutos. Es muy, pero muy loco que hayamos pensado los dos que tenía que ser cada 3 minutos. ¿Porqué no dijo 4? ¿o 3.5?, no sé, otro número.

Acá su solución en PowerShell:

while ($true) {start-sleep -s 180; (New-Object -ComObject SAPI.SPVoice).Speak("mate")}