брокеры бинарных опционов с бездепозитным бонусом
קמגרה למכירה
купоны на lamoda

DEMystiPy

Acabo de parir otro software.

Todo se resumía a emprender el aprendizaje de software libre ya listo o intentar aprender algo del tema programando, como la primera opción me significaba un verdadero embole, me decidí por programar algo usando toda biblioteca que me sirva para mi objetivo.

Lo que necesitaba era procesar y hacer ciertos cálculos estándares sobre Modelos de Elevación Digital (DEM, Digital Elevation Model), que qué son? Eso, imágenes que en el fondo son matrices donde cada elemento (pixél) representa la elevación del terreno.

Entonces me sumergí en las profundidades de la web buceando por bibliotecas para procesamiento de DEMs. Yo ya sabía abrirlas, y visualizarlas, me faltaba el procesamiento para obtener productos como mapa de pendientes (slope), de sombreado (hillshade), índices de rugosidad, entre otros.

Mi primer encuentro tuvo que ver con gdaldem, una aplicación que realiza todo esto, así que simplemente la envolví en “mi” soft y acabo de liberar la primer versión recontra beta.

Mi nueva criatura se llama DEMystiPy, y no solo consiste en una aplicación de escritorio sino que además incluye un tutorial sobre el modo de programar en Python DEMs. Es decir, DEMystiPy son dos cosas:

  • Un tutorial o guía para programar DEMs en Python
  • Un software de escritorio que realiza el procesamiento

Aquí les dejo un breve video mudo que muestra el funcionamiento

Mi intención es agregar este software como parte de titi  pero primero debe estar un poco mas pulido.

El proyecto está alojado en https://gitlab.com/emilopez/DEMystiPy y en breve pretendo arreglar algunos bugs e incluir otras funcionalidades, aunque sabemos que “mi breve” puede estirarse , siendo cauto, a un año mínimo.

El flamante coordinador de la Tecnicatura Universitaria en Software Libre me acaba de recordar que me faltó lo único importante, el cierre de cada publicación, GRACIAS! Entonces, ahora sí, lo que todos estábamos esperando…

Regando la plantita

Ya se me va el año y ni cerca estuve de escribir las publicaciones mensuales que me había autoimpuesto. Cerquísima estuve del otro objetivo, conquistar a Nati, pero no puedo adelantar nada, porque lo estoy cocinando a fuego lento y ya vieron el puterío que arman los medios: Ley de medios ya!!

Me quedan 3 escritos a medio terminar, así que voy a tratar de tenerlos antes que empiece el 2015. Uno sobre Arduino, otro sobre Software Libre y finalmente uno sobre distintas tecnologías para escribir. Acá va la primera entrega, regando la plantita.

Desde hace mas o menos 25 años una de mis abuelas me regala calzoncillos para navidad, lo que no era un inconveniente, hasta que en los últimos 5 le sumó una planta. La poca vida vegetal que habita mi depto tiene que ver con verduras fuera de estado y con las plantas que me va regalando la querida octogenaria. El drama es que irremediablemente se me mueren (las plantas che!). Durante el año las revivo mil veces y van zafando, pero luego en enero, no hay reanimación que dé resultado.

muerta_vivaAl frente, la viva, cuidando sus espaldas, fiambre vegetal!

De los miles de misterios que han cautivado a la humanidad, el que más intriga me produce es ver cómo carajo crece un arbusto en la pared de una casa abandonada o el capricho de una planta vigorosa asomando de las ínfimas grietas de una cochera. Einstein ya nos anticipaba que dios juega a los dados, pero nunca imaginé que así de gracioso iba a ser con esta cuestión. Con mi máxima dedicación por mantenerlas vivas, amasacro mono y di-cotiledóneas a mansalva y resulta que las que andan por ahí sin el más mínimo cuidado crecen y de repente se convierten en frondosos árboles, lrpmqlrmp!!  no es justo!

Esta injusticia de la vida, en la que vengo sumando numerosos decesos, además de convertirme en agnóstico-ateo, me motivó a buscar una solución que no requiera de intervención humana (ni divina).

20141217_092638La última plantita con vida

Incansablemente me ofrecieron cuidarla, que la riegan, que la llevan, que no se que más. Que me convenía usar esto y lo otro, que por capilaridad, que con unas esponjas mojadas, y bla bla bla. Toda alternativa donde no había que programar ni jugar con Arduino me servía. Entonces, mi proyecto fue hacer un regador automático!!

Resumiendo, ¿en qué consiste?
Agarrás un sensor de humedad de suelo y lo ensartás en la tierra de la maseta, por otro lado usás una bomba diminuta de agua sumergida en un balde, todo eso lo combinás con algo más de electrónica y un pequeño software encargado de encender la bomba una vez que el suelo esté muy seco o apagarla en caso contrario. Una pavada, vió!

Componentes

  • Sensor de humedad de suelo: FC28 y placa YL-38
  • Placa Arduino UNO
  • Bomba de agua 12V
  • Un electrónico amigo
  • Opcional: Shield RTC + datalogger

Receta

Conectás el sensor de humedad de suelo en las entradas analógicas de tu Arduino UNO, regás la planta y la dejás unos días secándose, hasta cuando vos consideres que ya necesita agua. Ahí te fijás el valor que arroja el sensor. En este caso, el sensor da valores entre 0 y 1024, de mojado a  seco (esto en realidad se infiere ya que 0 significa que no hay resistencia eléctrica, y esto sucede porque el agua es conductora, y 1024 cuando la resistencia eléctrica es alta, o sea, crocante de seco!).

Dejé almacenando los valores en una memoria SD porque quería observar la dinámica del proceso, esto se hace con un shield datalogger, que además de tener una ranura para tarjeta SD cuenta con un reloj que nos permite acceder a la hora, finalmente encontré que un valor umbral cercano a 400 era el correcto para empezar a regar. En la siguiente gráfica se observan los valores de resitsencia en el tiempo:

humedadLo que sigue es poner un pin digital del Arduino en alto cuando el valor de resistencia alcance ese umbral, una verdadera pavada en el mundo de Arduino.

Lo que requiere mayor complejidad es realizar una interfaz para que el arduino pueda activar la bomba con ese valor alto. La interfaz consiste en un relé, un transistor y una fuente de 12V. Con el valor alto (5 volts) del pin previamente mencionado, lo que haremos será activar el relé de modo tal que al switchear, permita alimentar a la bomba y por ende se encienda. Cuando el pin esté en estado bajo (0 volts) se abrirá el circuito del relé y la bomba quedará desconectada.

Esta parte que explico no fue de mi autoría, sino que acá es donde entró en juego la inestimable ayuda del electrónico que les mencionaba arriba. También podrías adquirir un shield y sale con fritas, pero es gastar plata, así que hacete amigo de un electrónico!

Acá se observa la bomba conectada al relé, con un transistor y una resistencia, todo acoplado en una mini protoboard que es una paquetería. rele_bomaAcá el Arduino UNO r3, con el shield de datalogger, y adherida otra miniprotoboard donde conecto los 5V y el GND, para dejarlos más accesibles al resto de los componentes.arduino_dataloggerFinalmente, el sensor de humedad mas todo lo demás, formando un hermoso combo navideño.comboAhora, un video que muestra su funcionamiento.

El código correspondiente no lo voy a compartir porque no quiero que me lo copien y se hagan multimillonarios regando plantas automáticamente. Acá va el código para que todo funcione:

#include <Wire.h>           // Libs
#include "RTClib.h"         
#include <SD.h>

RTC_DS1307 RTC;             // instancias
File fhumedad;

int umbral = 400;           // valor umbral

void setup(){
  pinMode(10, OUTPUT);      // Para la SD
  pinMode(4, OUTPUT);       // Pin Digi. 4 de Salida: activa el rele
  Serial.begin(9600);
  Wire.begin();             
  RTC.begin();              
    
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
  }
  if (!SD.begin()) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  delay(2000);
}
 
void loop(){
    DateTime now = RTC.now();
    int yyyy = now.year();
    int mm = now.month();
    int dd = now.day();
    int hh = now.hour();
    int mi = now.minute();
    int se = now.second();
    
    int resistencia = analogRead(A0);        // Pin analog. 0: sensor de hum.
    
    fhumedad = SD.open("humedad.txt", FILE_WRITE);
    if (fhumedad){
      imprimir(yyyy,mm,dd,hh,mi,se,resistencia);
      fhumedad.print(yyyy);
      fhumedad.print('-');
      fhumedad.print(mm);
      fhumedad.print('-');
      fhumedad.print(dd);
      fhumedad.print(' ');
      fhumedad.print(hh);
      fhumedad.print(':');
      fhumedad.print(mi);
      fhumedad.print(':');
      fhumedad.print(se);
      fhumedad.print(' ');
      fhumedad.print(resistencia);
      fhumedad.print(' ');

      if (resistencia >= umbral){
        digitalWrite(4, HIGH);          // supero umbral-> pin 4 en alto
        fhumedad.print("1");
        Serial.println(" 1");
        delay(300);                     // espero 300 miliseg y...
        digitalWrite(4, LOW);           // pin 4 en bajo
        fhumedad.print("0");
        Serial.println(" 0");
        delay(700)
      }
      fhumedad.println();
      fhumedad.close();
    }else {
       Serial.println("error opening file");
    }
   delay(500);
}

void imprimir(int y,int m,int d,int hh,int mi,int se,int val){
  // imprime en pantalla timestamp y valor
  Serial.print(y);
  Serial.print('-');
  Serial.print(m);
  Serial.print('-');
  Serial.print(d);
  Serial.print(' ');
  Serial.print(hh);
  Serial.print(':');
  Serial.print(mi);
  Serial.print(':');
  Serial.print(se);
  Serial.print(' ');
  Serial.print(val);
}

Tal como se preguntará el lector despierto, faltan los equemáticos que indiquen cómo conectar cada cosa, sin embargo, se me complicó con el fritzing, así que lean los comentarios del código que ahí se explica.

Ahora sí, lo que realmente todos estábamos esperando:

SciPyConAr 2014

Me debatía si salir a correr con este terrible viento o filosofar baratito por este blog, y bue, acá estoy. Hoy no te voy a mostrar código, ni formas de resolver problemas mios, solo te voy a contar lo lindo que es ir a conferencias donde el 98.6% de las charlas te interesan y gustan muchísimo!

Generalmente, y debido al lugar en el que laburo, me tengo que morfar simposios, conferencias, congresos que son un verdadero embole. Pero por suerte me saco las ganas dos veces al año con la SciPyCon y la PyCon, ambas, en sus ediciones locales.

La cosa es que, después de un cálido viajecito de ida de 16hs llegamos a Bahía Blanca. La ciudad es linda, las transeúntes más todavía, y la mayoría de los Bahienses te van a decir que no hay nada para hacer, pero se venden mal, buscá, hay lindos lugares (tip: Monte Hermoso a 80km). La cuestión es que ahí se llevó a cabo la segunda edición argentina de la SciPyCon, la conferencia del lenguaje Python orientado al ambiente científico, industrial e ingenieril.

Me traje varias cosas bajo el brazo y ya probé algunas otras, pero la que más me copó fue bokeh, una biblioteca de visualización que voy a usar en unos proyectos en los que estoy laburando, y supongo que pronto escribiré acá mis avances. Además, presentamos un poster, adiviná de qué? Y claro, de titi, Él software de visualización de imágenes satelitales. Te lo dejo para que lo mires y evalúes si no me debería haber dedicado al diseño gráfico.

scipycon2014_v1.1Y acá, como quedó impreso y en exposición, junto a uno de sus autores más simpáticos:

foto-scipyconarYa finalizando la hermosa semana, y para despedirse no sin haber tocado el mar, nos fuimos a Monte Hermoso.

scipyconar_monte_hermososcipycon-mhermoso2Por último, un simpatiquísimo retorno con 9 hs de retraso a la ciudad Santafesina! Y ahora, calentando los motores para ir a la PyCon 2014, que  se hace en Rafaela, que lindo que sea tan cerquita!!!

Y ahora si, lo que todos estábamos esperando:

Software fósil

Eso de que en los mismos ríos entramos y no entramos, pues somos y no somos los mismos no se da en el mundo del software libre. Cientos de veces me re-encontré con un problema que un par de años antes había resuelto y lamentablemente no había documentado. En su momento pensé o que nunca más me lo iba a encontrar o que luego lo iba a documentar. Ajá, tengo menos predicción que Melconián (El modelo bancario argentino se va a exportar, 2001 [ya se, había intereses espurios ahí]).

Entonces, mi drama?

Que mis aminos se niegan a llamarme barrilete cósmico o hijo del viento, ese es mi drama real, pero además:

Allá por 1994, mi viejo tenía un software que corría bajo DOS y que usaba para almacenar las histórias clínicas de sus pacientes. La empresa que desarrolló el soft dejó de dar soporte y, con el correr de los años, fuí ingeniándomelas para hacerlo andar en cada nueva plataforma que Bill le proporcionaba. Mal yo, mala mia, ya se, nunca le hice otro software libre para estas tareas, pero bue, mi viejo ya estaba acostumbrado a ése y tenía miles de pacientes cargados y, extraer esos datos era una gesta equivalente a cruzar la cordillera de Los Andes en pelotas. No iba a tener el tiempo para hacerlo y pretendía mantener firmemente la regla del herrero y su cuchillo no metálico.

Obviamente es software privativo y acá queda super en claro lo costoso de independizarse de un sistema que además de ser cerrado no cuenta con estándares abiertos para almacenar la información. La cuestión es cómo hacerlo andar 20 años después en los sitemas operativos de 64 bits (GNU/Linux o los otros) mientras le hago o consigo uno libre.

Y acá vino nuevamente el Software Libre a salvarme cuando las papas queman. DOSBox emula una PC Intel x86, completa con sonido, graficos, mouse, joystick, etc, todo lo necesario para correr viejas aplicaciones DOS que no pueden ser ejecutadas en las PCs y sistemas operativos actuales como Linux, FreeBSD y las ovejas negras de la flia. de Bill. Es GPL v2 y el proyecto está en sourceforge.  Así que primero lo instalás:

aptitude install dosbox

Después de ejecutarlo la primera vez te crea en el home del usuario un directorio oculto junto a su archivo de configuración: /home/emiliano/.dosbox/dosbox-0.74.conf

En dosbox-0.74.conf tenemos que dar las instrucciones para que ejecute el programa. Al final, dentro de la sección autoexec hay que montar en un C falso el directorio de nuestro software fósil, luego dar las instrucciones para ingresar y lanzar el ejecutable, algo así en mi caso:

[autoexec]
# Lines in this section will be run at startup.
# You can put your MOUNT lines here.

# monto el dir
mount c /home/emiliano/softFosil

# me paso al falso c
c:

# entro al dir del programa
cd diogmed

# ejecuto el programa
dmed

Una vez guardada esta configuración, al ejecutar dosbox ya nos abrirá el software en cuestión, mirá esta captura:

dosbox_diogenes Ahora sí, mientras buscamos un software que rompa las cadenas del imperio, lo que todos estábamos esperando:

titi 0.2.0, sale con fritas

Si bien vengo atrasado, por cada opúsculo vertido, hay docenas de borradores en el lado oscuro de mis párpados, entreverados con maravillosas jugadas futbolísticas que se desvanecen por la mañana.

Pero ese tiempo de imaginación se terminó y acá vengo a contarles la nueva versión de Titi. Que qué es? Es un Software Libre para visualizar y extraer valores de imágenes satelitales. La última versión liberada es la 0.2.0 y está disponible para todo el mundo desde acá: https://github.com/emilopez/titi/releases/tag/v0.2.0

No solo para mirar está el mundo y por ese motivo agregué algunas funciones útiles a la hora de procesar una gran cantidad de imágenes. Ponele que tenés 678 mapas de evapotranspiración y que necesitás extraer el valor de un pixel de cada una de ellas. Ahora, el drama viene porque ese pixel -imaginate que corresponde al patio de tu casa- no siempre se encuentra en la misma fila y columna, viste que los satélites tienen esa loca manía de moverse, entonces la foto que sacan no siempre está encuadrada sobre la misma superficie, es más, nunca es igual.

Entonces?
Bueno, miro el metadata de la imagen, y con la información que saco de ahí calculo la fila y columna correspondiente a la latitud y longitud del patio en cuestión, eso lo hago con cada imagen y mientras ese laburo lo hace titi vos te armás unos ricos mates o, si es de tardecita y vivís en Santa Fe, te destapás una birra. El módulo que realiza estos cálculos masivos se llama titi-k, me maté, y acá una rápida grabación sobre su uso.

Por otro lado, cabe destacar que hay un nuevo programador aportando a este software, que si bien me tiró con un fardo de laburo -decenas de centenas de líneas de código-, en breve habrá una nueva versión con soporte para visualizar las imágenes del reciente satélite desarrollado por la CONAE de Argentina y la NASA, el Aquarius SAC-D. Así que, se paciente, que esto pinta lindo.

Y ahora sí, lo que todos estábamos esperando:

Internet de las cosas

Así se refieren ahora al envío y recepción de información a Internet por aparatos. Es un concepto algo viejo pero que en los últimos años vino tomando fuerza. Asusta un poco que los aparatos tomen decisiones en forma autónoma, y nos termine pasando lo de Matrix, tranqui, mientras podamos programarlos todavía tenemos el poder.

A causa del tsunami de 2011, que devastó gran parte de Japón, incluyendo la planta nuclear de Fukushima, pasó a tener vital importancia la medición de radioactividad por parte de instrumentos Geiger que subían automáticamente los valores registrados a la web, específicamente a Pachube. Según leo por ahí, a los pocos días, miles de personas conectaron dispositivos de este tipo para que suban los valores de radiación detectados.

Pachube ahora se llama Xively, y provee una plataforma (PaaS, del inglés Platform as a service) para subir datos en tiempo real, además de una API disponible para varios lenguajes -entre ellos python- como así también a través de la amada consola usando curl (command line tool for transferring data with URL syntax).

Si bien la API está en github con licencia BSD, no estoy seguro que tan libre es la plataforma. Más allá de esto, uno puede elegir compartir sus datos, y según leo en sus FAQs la info ahora también será de ellos, cosa que no me molesta, “compartí con tus hermanos me decía mi vieja”:

I’m concerned about my data, who owns it?

We are too, that’s why Xively’s Terms of Service put you in control! You own your data. You choose whether to share all, part, or none of it. You choose who you want to share it with. You choose the terms that you want to share it under. You can view our terms of service here: https://secure.logmein.com/policies/privacy.aspx
 

Entonces, supongamos que hasta tanto no armemos nuestro propio servidor para atender esta info usamos xively. Supongamos que tenemos un arduino midiendo alguna variable. Supongamos que Sabella no nos considera argentinos. Supongamos que aún no mandamos a Internet directamente desde arduino porque no lo probamos y también te pido que supongas que usamos un router liberado con OpenWRT para agarrar estas medidas que nos escupe arduino. Entonces, conectamos el router y la placa arduino mediante USB y ahora, cazamos esto haciendo uso de pyserial, y lo mostramos en pantalla, para ver qué llega:

#!/usr/bin/env python
import sys, serial
import time
import datetime
 
port = '/dev/ttyACM0'
ser = serial.Serial(port, 9600)
while True:
    try:
        line = ser.readline()
        print datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S'), line
        print line
    except KeyboardInterrupt:
        print 'exiting'
        break

Fijate que ahí estoy usando un timestamp generado desde python que NO es lo recomendado, pero como aún no tengo un RTC en arduino que me tire la hora, lo uso para probar. Ojo, capaz no te anda el diálogo entre los dos aparatos, te está faltanto instalar en OWRT:

opkg install python pyserial kmod-usb-acm

Ahora voy a dejar para el lector entusiasta y aplicado que con esos datos leídos por el puerto genere un JSON llamado update_feed_historical.json, que por ejemplo contenga datos históricos de un mismo sensor. Se tendría que verse algo así:

{
  "version":"1.0.0",
   "datastreams" : [ {
        "id" : "sensor1",
        "datapoints":[
        {"at":"2014-05-01T19:35:43Z","value":"42"},
        {"at":"2013-04-01T19:40:43Z","value":"84"},
        {"at":"2013-04-01T19:45:43Z","value":"41"},
        {"at":"2013-04-01T19:50:43Z","value":"83"}
        ],
        "current_value" : "40"
    }
  ]
}

Ahora, nuestro router podría ejecutar un script desde el cron, ponele una vez por día, y me sube todo lo registrado a xively. Entonces, el contenido del script bash tendría algo así:

curl --request PUT \
     --data-binary @update_feed_historical.json \
     --header "X-ApiKey: TU_KEY" https://api.xively.com/v2/feeds/TU_FEED

Bien, muy domingo es hoy y me estoy recuperando de una migraña terrible, razón por la cual escribí esto a las apuradas y con poca claridad. Pero resumamos para que lo entienda alguien más que yo.

  • Leemos con Arduino el valor de sus sensores y lo escupo por el puerto USB (pendiente de publicar acá, ya se viene, en breve, NO seas ansiosa!)
  • Conecto un router SOHO al que previamente le reemplazamos el firmware con una distro de GNU/Linux llamada OpenWRT.
  • Programamos un script python dentro del router, que agarre cada tanto lo que reciba por USB y lo vaya agregando a un archivo JSON con la estructura que necesita xively (ver en el sitio oficial)
  • Cada otro tanto, mas espaciado que el tanto previo, ejecutamos un script bash que usa curl para subir el bloque de datos a xively

Por último, supongamos que me creés que todo esto anda 20 puntos!

Y ahora sí, lo que todos estábamos esperando:

Te encontrare donde pueda,
me llevarás hasta el cielo,
perdurarás en el aire
mientras te vuelvo un sueño

De certificados y esas rarezas humanas

Y ya en el ocaso del mes rasguño la mitad de las obligaciones autoimpuestas. El tiempo últimamente se me escurre como agua entre los dedos de los pies, sin embargo acá estoy, firme como un soldado, cumpliendo, aún con los ojos llenos de sueño.

En base a una detallada observación del reino animal, puedo decir que la raza humana se diferencia del resto de los animales en su obsesión por los certificados. Quiere una constancia de cada charla que presenció, ya sea sobre las similitudes entre un dogo argentino y el tema Cantata de Puentes Amarrillos de Luis Alberto, y no te das una idea de la cantidad de mails que son capaces de mandarte pidiéndote dicho “pelpa”, mas aún si les dijiste que se los ibas a dar. Ay, ay, ay, yo y mi bocota! (estimado lector, si ud. se siente agraviado, dese cuenta que es un chiste y sea feliz).

Así que bueno, 72 gentes (saludos a Corrientes!) querían un certificado por haber asistido al Festival de instalación de software libre mas grande del mundo, el FLISOL, y para darle lo que ellos querían, robé y usé código de por ahí, mas algo de lo que ya mostré otras veces en este hermoso lugar que tan a menudo nos encuentra. La receta fue la siguiente:

Ingredientes

  • Archivo CSV con 4 columnas: nombre, apellido, email, mas un campo que dice si quiere certificado (si/No)
  • Plantilla svg para el certificado
  • Código certg de Facundo Batista para generar certificados
  • Código desarrollado anteriormente para mandar emails

Preparación

Aprovechando nuestra inmensa capacidad en las artes pictóricas, hacemos una plantilla con inkscape poniendo una etiqueta para que sea reemplazada con el nombre y apellido de la persona:  {{name}}

El código certg va a generar un pdf poniendo en esa etiqueta los nombres que lea de un archivo yaml. Entonces, para no modificar ese código, hacemos un breve script que lea el CSV donde se encuentran todos los datos de las personas que asistieron al evento y los escriba en un nuevo archivo basándose en el yaml base, y obviamente manteniendo el formato. ¿Por qué me decidí por esta alternativa? porque quería aprender a generar y leer yaml. Entonces, ahí va:

# -*- coding: utf-8 -*-
#!/usr/bin/env python3

import yaml
import csv

fh = open('base.yaml', 'rt')
f2 = open('flisol2014.yaml', 'w')

config = yaml.load(fh)

#Columna del apellido y nombre en el archivo csv
col_ape = 0
col_nom = 1

with open('flisol-2014-asistentes.csv', 'rb') as csvfile:
    lista_inscriptos = csv.reader(csvfile, delimiter=';', quotechar='|')
    for inscripto in lista_inscriptos:
        if inscripto[3]=='si':
            config['replace_info'].append({'stopit':'.','name':inscripto[1]+
            ' '+inscripto[0]})

f2.write(yaml.dump(config,encoding=None))

Ahora tenemos en el archivo flisol2014.yaml todo listo para generar los certificados. Dentro de este archivo tenemos que poner el nombre del template svg que creamos antes -entre otros detalles menores-, y finalmente lo ejecutamos así:

./certg.py flisol2014.yaml

Ya está casi todo. Tenemos los 72 certificados, ahora lo que vamos a hacer es crear un script que lea del CSV los emails, nombres y, que adjunte según el nombre de archivo el certificado que corresponda. A esto lo hice del siguiente modo:

# -*- coding: utf-8 -*-
# Importamos libs
import smtplib
import mimetypes
import csv

# Importamos los modulos necesarios
from email.MIMEMultipart import MIMEMultipart
from email.Encoders import encode_base64
from email.mime.text import MIMEText
from email.MIMEBase import MIMEBase
from time import sleep
from string import Template

# Autenticamos
mailServer = smtplib.SMTP('smtp.gmail.com',587)
mailServer.ehlo()
mailServer.starttls()
mailServer.ehlo()
mailServer.login("TUMAIL@mail.com","TUPASS")

sms = Template(
"""Estimad@ $nombre,

Le enviamos el certificado de asistencia por haber participado en el
Festival Latinoamericano de Instalación de Software Libre realizado en la
ciudad de Santa Fe.

Le pedimos disculpas por el retraso y principalmente le agradecemos por
apoyar el FLISOL!

Le informaremos sobre futuros eventos relacionados con el software y la cultura libre.

Atte.

Grupo de Usuarios de Linux del Litoral (LUGLi).
http://lugli.org.ar
http://flisolsantafe.org.ar
"""
)

inscriptos_file = 'flisol-2014-asistentes.csv'
col_ape = 0
col_nom = 1
col_mail = 2
col_cert = 3

with open(inscriptos_file, 'rb') as csvfile:
    lista_inscriptos = csv.reader(csvfile, delimiter=';', quotechar='|')
    for inscripto in lista_inscriptos:
        if inscripto[col_cert] == 'si':
            ape = inscripto[col_ape]
            nom = inscripto[col_nom]
            mailto = inscripto[col_mail]

            msg = MIMEMultipart()
            msg['From'] = "Emiliano López"
            msg['To'] = mailto
            msg['Subject'] = "Certificado FLISOL 2014"
            msg.attach(MIMEText(sms.substitute({ 'nombre': nom})))

            # adjunta certificado
            distinct = (nom+ape).lower().replace(" ", "")
            cert_fname = "certificate-{}.pdf".format(distinct)
            attachFile = MIMEBase('application', 'pdf')
            attachFile.set_payload(file(cert_fname).read())
            encode_base64(attachFile)
            attachFile.add_header('Content-Disposition', 'attachment', filename=cert_fname)
            msg.attach(attachFile)

            ## Enviamos
            mailServer.sendmail("TUMAIL@mail.com", mailto, msg.as_string())
            print mailto+"    "+cert_fname
            sleep(4)

# Cerramos conexion
mailServer.close()

Al cabo de unos minutos, nos empiezan a responder agradeciendo por el certificado recibido, y claro, no es para menos, fijate que lindura el certificado que les hice:
certbillAhora sí, lo que todos estábamos esperando, el tema que bautizó al primer torneo de la liga de partidos al diome:

Invitando al FLISOL 2014 Santa Fe desde Python

Esto tenía que salir rápido por lo que es muy probable que la solución implementada en esta publicación esté lejos de ser la mejor. Pero andaba con poco tiempo para indagar, con cansancio para mejorar y con dolor de cabeza como para renegar. Contundencia y pragmatismo era lo que necesitaba.

El tema es el siguiente, tengo en un archivo CSV información sobre los asistentes al FLISOL del año pasado, entre esos datos está su email, nombre y apellido. Es una lista de 137 inscriptos y quería invitarlos usando un método más automático que escribirle a uno por uno a manopla, entonces necesitaba lograr un email algo amigable, que incluya su nombre en el contenido, el mensaje y que además adjunte la hermosa imagen del FLISOL 2014.

Bien, qué hago? simple, parseo el archivo extrayendo email, nombre y apellido, agarro un mensaje de invitación que escribí en el mismo programa, reemplazo ciertas etiquetas con el nombre y apellido, adjunto ese texto y la imagen al email y mando usando mi misma cuenta de gmail.

Itero hasta llegar al final y listo el pollo. Así sería la cosa:

# -*- coding: utf-8 -*-
# Importamos libs
import smtplib
import mimetypes

# Importamos los modulos
from email.MIMEMultipart import MIMEMultipart
from email.MIMEImage import MIMEImage
from email.Encoders import encode_base64
from email.mime.text import MIMEText
# para esperar y para reemplazar el nombre y apellido
from time import sleep
from string import Template

# Adjuntamos Imagen
file = open("FLISOL2014SFe.png", "rb")
attach_image = MIMEImage(file.read())
attach_image.add_header('Content-Disposition', 'attachment; filename = "FLISOL2014SFe.png"')

# Autenticamos con gmail
mailServer = smtplib.SMTP('smtp.gmail.com',587)
mailServer.ehlo()
mailServer.starttls()
mailServer.ehlo()
mailServer.login("ACA_EMAIL@gmail.com","ACA_TU_PASS")

# Texto del mail para reemplazar luego nombre y apellido
sms = Template("""Estimad@ $nombre $apellido,

Le enviamos una especial invitación a la nueva edición del
Festival Latinoamericano de Software Libre a realizarse en la
ciudad de Santa Fe.

Este año el evento se llevará a cabo en la Facultad de Ingeniería Química - UNL,
ubicada en Santiago del Estero 2829.

Inscripción y más información en http://flisolsantafe.org.ar .
Esperamos contar con su presencia!!!

Atte.
Grupo de Usuarios de Linux del Litoral (LUGLi).
http://lugli.org.ar""")

f = open("Flisol2013_participantes.csv",'r')
# Leemos todas las lineas
lines = f.readlines()
i = 0
for l in lines:
    i += 1
    dat = l.split(';')
    ape = dat[2]
    nom = dat[3]
    mailto = dat[4]
    # armamos el mail
    msg = MIMEMultipart()
    msg['From'] = "Emiliano López"
    msg['To'] = mailto
    msg['Subject'] = "FLISOL 2014 en Santa Fe"
    # reemplazo el nombre y apellido por lo leido
    msg.attach(MIMEText(sms.substitute({ 'nombre': nom, 'apellido': ape})))
    msg.attach(attach_image)

    # Enviamos
    mailServer.sendmail("TU_MAIL@gmail.com", mailto, msg.as_string())
    print str(i)+" "+mailto+"    ok"
    sleep(2)

#cierra el archivo
f.close()

# Cerramos conexion
mailServer.close()

Ahora me quedo sentado a esperar que se llene de personas la FIQ y desparramar software libre a troche y moche!

Ahora sí, lo que todos estábamos esperando:

La nerdiada del año, FLISOL 2014 en Santa Fe

Desde el 2005 a estos tiempos se realiza anualmente un evento del que vale la pena participar, es el Festival Latinoamericano de Instalación de Software Libre, FLISOL. En Santa Fe le venimos dando duro y parejo desde sus comienzos, aunque ya no recuerdo cuándo me sumé, venía participando del Grupo de Usuarios de Linux del Litoral (LUGLi) desde el 2000 y pico.

Se hace el cuarto sábado de abril y consiste en un evento libre y gratuito que fomenta la cultura y el software libre en todo Latinoamérica y alrededores en forma sincronizada. Las últimas dos que organizamos fueron muy concurridas, con picos máximos de ciento y tantos de personas -eso que nos llovió copiosamente en ambas- hecho bisagra para los flisoles Santafesinos, y según vi en las estadísticas, fuimos de los más masivos. Hasta antes del 2011 veníamos siendo apenas algunos tip@s más de los que la organizábamos. Acá una foto del 2013, realizado en la Escuela Provincial de Artes Visuales “Profesor Juan Mantovani”, donde un cluster de geeks están instalando a mansalva GNU/Linux, mientras el resto de la gente está escuchando las charlas:

instalando afull

Es un evento que me gusta y recomiendo, está plagado de gente con ganas de nerdiar un rato ayudando a otros que recién se inician. Es una de las formas de participar en el movimiento del Software Libre: o se escribe código y se lo publica bajo GPL, o se escriben manuales, o se lo traduce, o se lo instala, o se lo difunde, o todas a la vez. En el FLISOL hacemos fundamentalmente instalación y difusión, y desde que me sumé vengo oficiando (renegando) de instalador, una vez di una charla bastante mala sobre el proxy squid y ahora capaz doy una sobre Hardware Libre, veremos si logro armar algo indecente para mostrar.

Ser instalador es un embole -te perdés las charlas y el dueño de la máquina te mira con una desconfianza penetrante- pero a la vez es motivador saber que en cientos de ciudades de decenas de países latinoamericanos todos estamos haciendo lo mismo, esto sí que es la patria grande carajo!

Haciendo un cálculo al vuelo de pájaro, creo que en los flisoles o installfests voy liberando alrededor de 40 compus, es una gota de agua en el océano (bueeena), ya se, pero qué gota hermano! Yendo por más, este 26 de abril se viene otra edición en Santa Fe, esta vez la hacemos en la Facultad de Ingeniería Química de la UNL y, miren qué bellozor el afiche que tenemos:

afiche-flisol2014Pueden encontrar más info en http://flisolsantafe.org.ar . Va a haber charlas, café, compus, y GNU/Linux a diestra y siniestra, avívense muchachas/os, no se lo pierdan!

Ahora sí, lo que todos estábamos esperando, un poco de Luis Alberto:

Si no canto lo que siento
me voy a morir por dentro
he de gritarle a los vientos hasta reventar
aunque sólo quede tiempo en mi lugar

 

 

titi sigue siguiendo

Tengo cinco minutos tengo.

No me olvidé del desarrollo de Titi, y si bien aún no largué oficialmente una nueva versión, en la rama de desarrollo (lo que se llama trunk) hay varios cambios que en breve pretendo darles el golpe de gracia.

Ahora sos canción decía el socio de Ricardo Mollo en Pepe Luí. Me gusta esa mirada de pretender la vida eterna de alguien a partir de una canción. De ahí que quise hacer algo parecido, en vez de canciones lo que yo hago son programas (además de lujos en una cancha). Entonces me dije, “hacete un homenaje  para tu abuela y ponele su nombre a un software, no seas quedado”, de ahí que nació Titi, así que mi abuela perdurará en forma de bits (perdoname titi, es lo mejor que encontré!) mientras dure Internet, que supongo tiene para unos meses más.

Pero no termina ahí la cosa, además de convertirla en bits le puse licencia Libre, es GPL 3, con lo cual nadie lo va a poder cerrar, y se va a poder multiplicar ad eternum. Hey!, vos que estás ahí, sí, a vos te hablo, si cuando muero me hacés un software, hacelo GPL, tamos? y si puede ser en Python mejor.

Ya se cumplieron los cinco minutos, acá va un video de las últimas funcionalidades implementadas, además de una interfaz renovada!!

Social Widgets powered by AB-WebLog.com.

Social Widgets powered by AB-WebLog.com.

Social Widgets powered by AB-WebLog.com.