Análisis del comportamiento tuitero de tu congresista

Como ya saben, hace unos días terminó la discusión, e idas y venidas, acerca del grupo de trabajo de derechos humanos del Congreso, presidido por la congresista fujimorista Martha Chavez (@MarthaChavezK36).

La discusión degeneró tanto que llegó al tuiter. La congresista Martha Chavez anunciaba en tuiter sus planes de trabajo dentro de la comisión y respondía a uno que otro insulto tuitero. Era notable la cantidad de tuits emitidos por la congresista. Pero, fueron muchos tuits? pocos? en qué horas acostumbra tuitar la congresista?

Usando herramientas de Linux, Python y unas cuantas librerías “open source” podemos analizar el comportamiento tuitero de Martha Chavez.

Descargué del tuiter los 3200 tuits más recientes de la congresista. Para eso usé un cliente de tuiter usable desde la consola Linux.

t timeline -c -n 3200 MarthaChavezK36 > MarthaChavezK36.csv

Aquí ven parte de los tuits descargados (click para ampliar).

3200 tuits más recientes de Martha Chavez

Hice un gráfico del número de tuits por día, usando Python.

timeline de la congresista Martha Chavez

timeline de la congresista Martha Chavez

Este timeline comienza el 24 de julio. Vemos que tuvo bastante actividad el 28 de Julio, mediados de Septiembre (cuando se discutía sobre la unión civil de parejas del mismo sexo), primera y segunda semana de Octubre (en esa época se tuiteaba sobre la renuncia de Fujimori por fax), primera semana de Noviembre (cuando se armó el chongo de su elección como coordinadora del grupo de trabajo sobre derechos humanos).

Parece que su destitución del grupo de DDHH no hizo que Martha Chavez tuitee tanto como cuando se hablaba de la unión civil (muy revelador!).

Pero supongo que Martha Chavez tuitea en sus horas libres, cuando ya terminó sus horas de trabajo en el congreso, además de los fines de semana.

Podemos ver esto si usamos sus tuits para generar un “punchcard”:

python analizar_tuits.py MarthaChavezK36.csv | python punchcard.py -f punchcard_Martha_Chavez.png

horas de tuiteo de Martha Chavez

Esto es alucinante! La congresista tuitea todos los días de la semana. Tuitea a forro entre las 8 y 10 de la mañana (ni bien llega al Congreso?). Tuitea con mayor fuerza los días Viernes. El menor número de tuits a la 1:00pm hace suponer que a esa hora almuerza. Sábados y Domingos, no descansa, tuitea tanto como los días lunes. Y parece que se va a dormir a la 1:00 am. Al parecer duerme menos de 8 horas (eso no es saludable congresista!).

Este nivel de tuits emitidos por Martha Chavez es muy alto? muy bajo? Podemos hacer una comparación con un tuitero consumado, neto y nato. Comparemos con el Útero de Marita:

Este es el punchcard del utero.pe.

punchcard uterope

Vemos que, al parecer, el útero.pe tuitea menos que la congresista. Uterope tuitea muy poco los viernes, sábados y domingos (a excepción de las 9:00pm cuando tuitea con furia, debe ser que a esa hora pasan los noticieros dominicales). Qué hace el uterope los viernes y fines de semanas que no tuitea? Debe tener buena vida. También tuitea bastante los jueves.

Aqui les dejo el código necesario para hacer este tipo de análisis (?) con cualquier tuitero. Pero fíjense que el tuitero no ande borrando sus tuits ni use tuits programados ya que malograría el “análisis”.

Sección geek

Código para producir el gráfico timeline y producir las fechas en formato unix, necesarias para dibujar el punchcard. El programa que hace el punchard lo saqué de aquí: https://github.com/aaronjorbin/punchcard.py

Guía práctica para hackear las páginas del Congreso

Según Wikipedia, un hacker es:

“A person who enjoys exploring the details of programmable systems and stretching their capabilities, as opposed to most users, who prefer to learn only the minimum necessary.”

Algunos creen equivocadamente que hacker = malechor, delincuente. Pero lo cierto es que hay varios tipos de hackers.

  • Aquel que infringe medidas de seguridad con fines maléficos, también se le conoce como “cracker”.
  • Un miembro de la comunidad Unix de programas de computación libre y “open source”, o alguien que usa este principio para desarrollo de software o hardware.

Además individuos considerados como hackers de la subcultura de programadores pueden hacer tareas repititivas de 100 a 1,000 veces más rapido que usuarios que no son hackers (gracias a que usan de técnicas de computación avanzadas).

El congreso peruano ha aprobado una ley de delitos informáticos recontra ridícula que ha sido criticada por muchos, por ejemplo en el blog http://iriartelaw.com y http://www.hiperderecho.org, además de ser considerada una ley Frankenstein. Esto evidencia que el congreso legisla sobre temas que desconoce.

Para demostrar qué tan mal redactada está la ley ex-beingolea. He decidido hackear las páginas web del Congreso de la República. Y aquí detallo el procedimiento.

Quiero hacer uso de programas informáticos para averiguar cúantos proyectos de ley ha propuesto cada congresista durante este año 2013.

Hay que buscar la página web del congreso que tiene la lista de los proyectos de ley emitidos este año:

Buscar la página con los proyectos de ley.

Buscar la página con los proyectos de ley.

Listado de proyectos de ley por fecha.

Listado de proyectos de ley por fecha.

Si vemos el código original HTML de esa página (hacer CTRL-U, si están en Mozilla Firefox) veremos que está compuesta de 4 “frames”. Cada “frame” corresponde a una parte de la página. Me interesa el último “frame”, el que contiene la lista de links a los proyectos de ley.

Código HTML de la página del congreso

Código HTML de la página del congreso

Si hacemos click al último “frame” nos encontramos con esta página:

"Frame" conteniendo la lista de proyectos de ley.

“Frame” conteniendo la lista de proyectos de ley.

Esta página lista 100 proyectos de ley, y al ver la dirección URL de esta página, nos damos cuenta que basta con cambiar el último parámetro Start=1 por Start=100 para obtener los siguientes 100 proyectos de ley.

Osea cambiar:

http://www2.congreso.gob.pe/Sicr/TraDocEstProc/CLProLey2011.nsf/PAporNumeroInverso?OpenView&Start=1

por:

http://www2.congreso.gob.pe/Sicr/TraDocEstProc/CLProLey2011.nsf/PAporNumeroInverso?OpenView&Start=100

Puedo escribir un hack (osea script) que me colecte rápidamente todas las páginas que contienen los links. En lugar de bajarme documento por documento (lo cual me tomaría muuuuucho tiempo), lo puedo hacer al toque si hago uso de las tecnologías de información y comunicación que tanto miedo causa a los congresistas:

Hay 812 proyectos de ley para examinar. Necesitamos descargar cada proyecto de ley y copiar la lista de autores para contar cuántos proyectos ha sido emitido por cada congresista. Obviamente hacer esto manualmente me demoraría una eternidad. Para eso he creado un segundo hack. Es un script in Python que examina cada link, y extrae los nombres de los congresistas que son autores de cada proyecto de ley. Junta todos los nombres y hace un gráfico para poder visualizar los datos (el código de programación está al final de este post).

Bueno, el script estaba demorando mucho, me cansé de esperar y cancelé el programa por lo que no pude colectar toda la info. Pero la idea se entiende no?

Número de proyectos de ley presentado por cada congresista durante el 2013

Número de proyectos de ley presentado por cada congresista durante el 2013

Aquí se pueden descargar la dichosa ley http://www.hiperderecho.org/wp-content/uploads/2013/09/nuevaleybeingolea.pdf.

Hagamos recuento de las veces que he faltado a la ley:

Artículo 3. Atentado a la integridad de datos informáticos

El que, a través de las tecnologias de la información o de la comunicación, introduce,
borra, deteriora, altera, suprime o hace inaccesibles datos informáticos
, será reprimido
con pena privativa de libertad

-> Al escribir este post he introducido datos informáticos al servidor de WordPress usando tecnologías de la comunicación.

Articulo 6. Tráfico ilegal de datos

El que, crea, ingresa, o utiliza indebidamente una base de datos sobre una persona natural o jurídica, identificada o identificable, para comercializar; traficar, vender, promover, favorecer o facilitar información relativa a cualquier ámbito de la esfera personal, familiar, patrimonial, laboral, financiera u otro de naturaleza análoga, creando o no perjuicio, será reprimido con pena privativa de libertad no menor de tres ni mayor de cincó años.

-> Al bajarme la lista de proyectos de Ley del Congreso he ingresado a su base de datos para facilitar la información relativa al ámbito laboral de cada congresista sin crear perjuicio (ojo que no es necesario causar perjuicio para ir en contra de la ley).

Artículo 1O. Abuso de mecanismos y dispositivos informáticos

El que fabrica, diseña, desarrolla, vende, facilita, distribuye, importa u obtiene para su utilización, uno o más mecanismos, programas informáticos, dispositivos, contraseñas, códigos de acceso o cualquier otro dato informático, específicamente diseñados para la comisión de los delitos previstos en la presente Ley, o el que ofrece o presta servicio que contribuya a ese propósito, será reprimido con pena privativa de libertad no menor de uno
ni mayor de cuatro años y con treinta a noventa días-multa.

-> En este post publico el programa informático que he fabricado, diseñado y desarrollado con el fin de específicamente incumplir los artículos 3 y 6 de la presente Ley.

Conclusión

He violado la ley de delitos informáticos (ley ex-beingolea) 3 veces

Señores congresistas métanme preso. Quiero cárcel dorada como Antauro y Fujimori. Gracias.

Sección para geeks

Aqui está el código para bajarse los nombres de los congresistas que fueron autores de proyectos de ley durante el 2013:

Y aquí el código para plotear los datos:

Los que cobraron más: APDAYC 2012

El útero de marita está emitiendo informes diarios acerca de los manejos del dinero que realiza APDAYC en nombre de los compositores y escritores de música del Perú.

Marco Sifuentes escribió en Facebook que requiere ayuda para poder asimilar mejor todos los destapes que está posteando en su blog utero.pe (junto con Jonathan Castro).

Con ánimos de ayudar a la causa (#intervenganAPDAYC) me puse a ver la cantidad de dinero que cobraron algunos directivos del APDAYC durante el 2012, por concepto de derechos de autor. En el post uterino “se la llevan facil” aparecen algunos números, pero no se aprecia si esta ganancia es mucho (o poco) en comparación con lo ganado por los asociados de APDAYC que no son miembros del Consejo Directivo.

Intenté hacer un gráfico de lo ganado por los compositores más prolíficos en comparación con el dinero que cobraron los directivos de APDAYC.

Obtuve la lista de directivos de aqui. Y las ganancias de los 250 asociados que tuvieron más regalías durante el 2012 de aqui.

Tuve que bajarme el PDF, convertirlo a texto, y dibujar el gráfico. Como soy bien nerd, para convertir el texto usé comandos de Linux y para dibujar el gráfico usé el lenguaje de programación Python (con su librería gráfica matplotlib).

Aqui está el gráfico, y más abajo el código que tuve que tipear para hacer este “análisis” tan diligente 😉 (hacer click para agrandar la imagen).

Los que más cobraron, APDAYC 2012

Los que más cobraron, APDAYC 2012

Manya, son haaaaaartos los compositores que cobran regalías. Pero son unos pocos quien se llevan harta plata, y son muchos los que cobran poquito (se lleva 3 mil soles al año el que está en puesto 250).

Debemos alegrarnos por los miembros del Consejo Directivo de APDAYC que son afortunados en estar entre los que más regalías se llevaron durante el 2012 (por ejemplo José Escajadillo, Armando Massé y Julio Andrade, entre otros).

[Actualización 6 de Octubre 2013]

Un tuitero/bloguero influyente me sugirió averiguar si hay un patrón de las ganancias recibidas por los socios que tienen mayor poder de decisión en APDAYC. Osea ver si los que cortan en jamón en APDAYC ganan más o ganan menos en comparación con los socios que tienen menor voto en los manejos de la Sociedad Colectiva APDAYC.

El útero de marita nos cuenta que no todos los socios de APDAYC tienen el mismo derecho a voto. Por ejemplo cada voto de los socios principales vale por 5, cada voto de los socios vitalicios vale como 4 votos, cada voto de socios activos vale por 3.

Se supone que en una democracia cada persona es igual a un voto, pero en APDAYC eso no es así. Entonces los que tienen mayor poder de decisión del rumbo de APDAYC, los que parten y reparten son principalmente ese grupo de socios principales, vitalicios y activos.

Cuanto reciben de regalías los que cortan el jamón en APDAYC?

Estuve mirando otra vez los datos y me di cuenta que estos socios privilegiados son casi la mitad (138 socios, o el 55%) pero se llevan la mayoría de plata recaudada en APDAYC. El 84% del dinero cobrado por regalías durante el 2012 (7 millones de soles) se lo llevaron este grupo de socios con voto privilegiado. Mientras que la otra mitad de socios le corresponde poco más de 1 millon (16% del total).

Resulta interesante que los que cortan el jamón en APDAYC se lleven el 84% del dinero (a pesar de ser la mitad de socios con derecho a voto).

Bueno dicen que el que parte y reparte se lleva la mayor parte?

Aqui les dejo el gráfico para digerir mejor los datos (al final de este post está todo el código usado para los análisis).

Ganancias de socios principales, vitalicios y activos

La mitad de socios tiene voto privilegiado, cada voto vale de 3 a 5 veces que los votos de la otra mitad. Es curioso que además se lleven la mayor tajada de las regalías recaudadas por APDAYC.

[Actualización 7 Oct 2013]

Pero qué porcentaje de TODAS las regalías recibe este grupo de socios?

En la Memoria de APDAYC del 2012, señalan en la página 12 (o página 22 en
realidad), que se repartieron 29 millones de soles entre todos sus asociados.

Según el útero de marita “APDAYC tiene más de 8 mil afiliados, pero sólo 248 tienen derecho a voto en la Asamblea General”.

Supongamos que APDAYC tiene 8 mil socios, entonces entre ellos repartieron 29 millones de soles durante el 2012.

Quiero saber:

  • Qué porcentaje de estos 8mil son los socios con votos privilegiados (principales, vitalicios y activos).
  • Qué porcentaje del dinero total se llevan estos socios con voto privilegiado?

Estos son los datos:

  • Dinero total: 29,197,272 Soles
  • Número total de socios: 8000
  • Total socios con voto privilegiado: 138
  • Dinero recibido por socios principales: 1240,041.19
  • Dinero recibido por socios vitalicios: 59,347.69
  • Dinero recibido por socios activos: 5731,717.18
  • Porcentaje de socios con voto privilegiado: 1.7%
  • Porcentaje del dinero que se recibe este grupo: 24.08%

Y este es el gráfico resultante:

Porcentaje de ganancias de socios con voto privilegiado

Porcentaje de ganancias de socios con voto privilegiado, APDAYC 2012

Pues es de esperarse que el 1.7% de socios se lleve la cuarta parte de las regalías. Si vemos otra vez el gráfico de los socios más rendidores, los que más plata reciben, veremos que son los socios principales y activos (con voto multiplicado por 5 y por 3) quienes reciben más regalías.

Los socios principales y activos son los que más regalías cobraron durante el 2012.

Los socios principales y activos son los que más regalías cobraron durante el 2012.

Sección para geeks

Aqui el código en la consola de Linux:

# Bajarse la memoria en PDF y extraer las páginas 34, 35 y 36
pdftk Memoria_APDAYC_2012.pdf cat 34-36 output mas_productivos_2012.pdf

# convertir PDF a texto
pdftotext -layout mas_productivos_2012.pdf

# hacer limpieza manual para eliminar texto que no se necesita (joyas y premios)
# extraer nombres y ganancias
cat mas_productivos_2012.txt | sed 's/S\/\.//g' | sed 's/\$//g' | sed 's/\s\+/ /g' | sed -r 's/([A-Z]),/\1/g' | sed 's/,//g' | sed -r 's/(([A-Z]+\s)+)/\1,/g' | sed 's/ ,/,/g' | sed -r 's/^[0-9]+\s[0-9]+\s//g' | sed -r 's/\s*$//g' > tmp_mas_productivos.txt

# dibujar el gráfico usando Python y matplotlib
python mas_productivos.py

Y aqui el código actualizado en el lenguage Python:

# -*- coding: utf-8 -*-
import codecs
import locale
import prettyplotlib as ppl
import numpy as np
from prettyplotlib import plt

locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')

f = codecs.open("output/tmp_socios_principales.txt", encoding="utf-8")
data = f.read()
f.close()

# Esta es la lista de "Socios principales"
data = data.split("\n")
principales = []
vitalicios = []
activos = []
for line in data:
    line = line.strip()
    if len(line) > 0:
        line = line.split(",")
        if line[1] == "PRINCIPAL":
            principales.append(line[0])
        if line[1] == "VITALICIO":
            vitalicios.append(line[0])
        if line[1] == "ACTIVO":
            activos.append(line[0])

# cantidad de regalias por "socios principales"
f = codecs.open("output/tmp_mas_productivos.txt", encoding="utf-8")
data = f.read()
f.close()

data = data.split("\n")
princi_money = float()
vitali_money = float()
activo_money = float()
otros_money = float()

for i in data:
    if len(i) > 0:
        i = i.split(",")
        author = i[0]
        money = i[1].split(" ")
        money = money[len(money)-1]
        if author in principales:
            princi_money += float(money)
        elif author in vitalicios:
            vitali_money += float(money)
        elif author in activos:
            activo_money += float(money)
        else:
            otros_money += float(money)

## DO principales + vitalicios
## numero de socios por categoria
numero_socios = [str(len(principales) + len(vitalicios)),
                 str(250-len(principales)-len(vitalicios))]

print "Socios privilegiados con el voto " + str(len(principales) +
        len(vitalicios) + len(activos))

y = [princi_money + vitali_money, activo_money + otros_money]
annotate = [locale.format("%d", y[0], grouping=True) + " S/.",
            locale.format("%d", y[1], grouping=True) + " S/."]

width = 0.35
bar_color = ["r", "#66c2a5"]
plt.rc('font', **{'family': 'DejaVu Sans'})
fig, ax = plt.subplots(1, figsize=(8,6))
ind = np.arange(2)
xdata = ind + 0.05 + width
ax.bar(ind, y)
ax.set_xticks(ind + 0.4)
ax.set_xticklabels(["principales y vitalicios\n(" + numero_socios[0] + " socios)",
                    "otros socios\n(" + numero_socios[1] + " socios)",
                    ],
                    rotation="horizontal", multialignment="center")
ax.autoscale()
ax.set_title(u'Ganancias de socios principales y vitalicios\n comparados con el resto de socios',
        fontdict = {'fontsize':22}
        )

y_labels = ["0", "1,000,000", "2,000,000", "3,000,000", "4,000,000",
                "5,000,000", "6,000,000", "7,000,000", "8,000,000"]
ax.set_yticklabels(y_labels)

plt.ylabel(u'Regalías en S/.', fontdict={'fontsize':18})
plt.xlabel(u'Beneficiarios', fontdict={'fontsize':22})

ppl.bar(ax, np.arange(len(y)), y, grid="y", annotate=annotate, color=bar_color)
fig.tight_layout()
fig.savefig("output/socios_principales.png")
output = "Plot de socios Principales + Vitalicios guardados en archivo "
output += "``output/socios_principales.png``\n"
print output

## DO principales + vitalicios + activos
## numero de socios por categoria
numero_socios = [str(len(principales) + len(vitalicios) + len(activos)),
                 str(250-len(principales) - len(vitalicios) - len(activos))]

# Porcentaje de socios principales+vitalicios+activos versus otros
percent_pva = float((len(principales)+len(vitalicios)+len(activos))*100/250)
percent_socios_otros = 100.0 - percent_pva

# Porcentaje de DINERO de socios principales+vitalicios+activos versus otros
y = [princi_money + vitali_money + activo_money, otros_money]
percent_money_pva = int(float(princi_money + vitali_money + activo_money)*100/(y[0] + y[1]))
percent_money_otros = 100 - percent_money_pva

annotate = [locale.format("%d", y[0], grouping=True) +
                " S/.",
            locale.format("%d", y[1], grouping=True) +
                " S/."]

width = 0.35
bar_color = ["r", "#0099FF"]
plt.rc('font', **{'family': 'DejaVu Sans'})
fig, ax = plt.subplots(1, figsize=(9,6))
ind = np.arange(2)
xdata = ind + 0.05 + width

# write percentaje of money to plot
ax.annotate(str(percent_money_pva) +"%\ndel dinero", ha="center", color="w",
        size=38, xy=(0.2,1.2), xytext=(0.4, 2500000))
ax.annotate(str(percent_money_otros) +"%\ndel dinero", ha="center", color="w",
        size=18, xy=(0.2,1.2), xytext=(1.4, 150000))

ax.bar(ind, y)
ax.set_xticks(ind + 0.4)
ax.set_xticklabels(["principales, vitalicios y activos\n(" +
                            str(int(percent_pva)) + "% del total)",
                    "otros socios\n(" +
                            str(int(percent_socios_otros)) + "% del total)"
                    ],
                    rotation="horizontal", multialignment="center")
ax.autoscale()
ax.set_title(u'Ganancias de socios principales, vitalicios y activos'
        + '\ncomparados con el resto de socios',
        fontdict = {'fontsize':22}
        )

y_labels = ["0", "1,000,000", "2,000,000", "3,000,000", "4,000,000",
                "5,000,000", "6,000,000", "7,000,000", "8,000,000"]
ax.set_yticklabels(y_labels)

plt.ylabel(u'Regalías en S/.', fontdict={'fontsize':18})
plt.xlabel(u'Beneficiarios', fontdict={'fontsize':22})

ppl.bar(ax, np.arange(len(y)), y, annotate=annotate, color=bar_color)
fig.tight_layout()
fig.savefig("output/socios_principales_vitalicios_activos.png")
output = "Plot de socios Principales + Vitalicios + Activos guardados en archivo "
output += "``output/socios_principales_vitalicios_activos.png``\n"
print output

Código de cuáles miembros del consejo directivo se llevan más regalías

Aquí el código y datos para generar el pie-chart

Y aquí el código necesario para hacer el plot usando el paquete estadístico R.

library(ggplot2)
datos <- read.csv("output/socios_pva_versus_total.csv", sep=",",
              header=FALSE)
money <- datos[3:4,]
names(money) <- c("Socios","Regalías")

png(filename="output/socios_pva_versus_total.png",
      width=950, height=630, units="px")
ggplot(money, aes(x="", y=Regalías, fill=Socios)) +
  theme(text = element_text(size=22)) +
  geom_bar(width=1, stat="identity") +
  coord_polar("y", start=pi/3) +
  labs(title="Repartición de regalías, APDAYC 2012")
dev.off()

Aurelio Pastor firmó 149 indultos de un solo plumazo

foto Revista Eva

Aurelio Pastor se ufana que en un sólo día pudo haber firmado 31 indultos, pero en realidad fue capaz de conmutar 149 presos en un solo día, de un solo plumazo.

En el vídeo propalado por Cuarto Poder se ve al exministro de justicia Aurelio Pastor fanfarronear, mientras come una empanada, de sus poderes como conmutador de penas.

Pastor dice que ha logrado firmar hasta 31 conmutaciones en un solo día (ver en Youtube)

Hoy día voy a firmar 31 más, hoy día, ayer he firmado como 10, 15

Puede parecer muchos indultos firmados en un día. Pero en realidad Aurelio Pastor logró firmar conmutaciones de pena de 149 presos en un solo día! de un solo plumazo!

Cómo encontrar ese dato

En un post anterior expliqué cómo descargar TODAS las normas jurídicas emitidas por el Ministerio de Justicia durante los años 2006-2011.
En otro post expliqué cómo contar el número de indultos firmados por cada exministro de justicia durante el 2do gobierno aprista.

Luego de seguir las intrucciones en esos posts, obtendrás un folder pastor con todas las normas jurídicas emitidas durante su gestión como ministro.

Lo que queremos averiguar es cuántas conmutaciones firmó Aurelio Pastor por día y ver en qué día se firmó el mayor número de supuestos #narcoindultos.

Este comando de Linux hace la búsqueda y ordena el número de conmutados por día de menor a mayor.

grep -i 'conmutarle' * | awk -F ':' '{print $1}' | sort | uniq -c | sort -n | sed 's/.txt//g'

Este es parte del resultado:

 ...
 58 03-11-09
 63 14-10-09
 65 25-12-09
 66 13-02-10
 68 17-12-09
 69 29-11-09
 71 04-03-10
 75 07-01-10
 85 15-01-10
149 22-12-09

Como vemos el 22 de Diciembre del 2009 (fecha 22-12-09) Aurelio Pastor firmó el indulto de 149 presos!

Qué coincidencia que ocurriera a 3 días de celebrarse la navidad. Parece que Santa Claus tiene competidores.

Aquí está la norma jurídica emitida ese día. Te la puedes descargar desde el sitio web del Ministerio de Justicia.
http://spij.minjus.gob.pe/Normas/textos/221209T.pdf

He extraído todos los nombres de los agraciados ese día y la puedes ver aquí:
indultados_22_Diciembre_2009.txt

Aurelio Pastor y su pluma veloz #narcoindultos

Aurelio Pastor no fue el ministro que firmó más conmutaciones, pero fue quien las firmó a una mayor velocidad, casi 7 conmutaciones diarias durante su período, el doble y triple que los otros ministros de justicia durante el 2do gobierno aprista.

Hace unos días Aurelio Pastor dijo lo siguiente:

“Han existido otros ministros que han firmado más gracias (presidenciales) que yo”

Esto fue inmediatamente después que aparezca el avance del programa Cuarto Poder para hoy Domingo, donde se mostrará un vídeo en el que aparentemente Aurelio Pastor elegía a dedo los potenciales beneficiados por #narcoindultos y conmutaciones de pena, mientras come una empanada que le invitaron.

Según Wikipedia estos fueron los Ministros de Justicia y sus períodos durante el 2do gobierno aprista:

María Zavala Valladares	   | 28 de julio de 2006 - 19 de diciembre de 2007  | (510 días en el cargo)	
Rosario Fernández Figueroa | 20 de diciembre de 2007 - 10 de julio de 2009  | (569 días en el cargo)
Aurelio Pastor Valdivieso  | 11 de julio de 2009 - 16 de marzo de 2010      | (249 días en el cargo)
Víctor García Toma	       | 18 de marzo de 2010 - 12 de septiembre de 2010 | (179 días en el cargo)
Rosario Fernández Figueroa | 14 de septiembre de 2010 - 28 de julio de 2011 | (318 días en el cargo)

Ya que tengo en mi computadora TODAS las normas jurídicas emitidas por el ministerio durante los años 2006-2011 podemos contar cuantas conmutaciones de penas y #narcoindultos fueron firmadas durante el período de cada ministro (ver un post anterior para que sepas como descargué las TODAS las normas jurídicas.).

Este es el plan:

    1. crear un folder para cada ministro y copiar todas las normas del ministerio emitidas durante su período como ministro.
    2. para cada ministro, buscar el número de indultados/conmutados de pena
    3. hacer un gráfico que resuma los resultados

Seleccionar las normas del MinJus emitidas durante el período de cada ministro

Para la exministra María Zavala

# copiar a folder normas del 28 al 31 de Julio del 2006
ls *txt | awk -F '-' '$1 > 27' | grep '07-06.txt' | xargs -I {} cp -v {} zavala/.

# copiar a folder normas del 1 de Agosto al 31 de Diciembre del 2006
ls *txt | awk -F '-' '$2 > 07' | grep '06.txt' | xargs -I {} cp -v {} zavala/.

# copiar a folder normas del 1 de Enero al 31 de Noviembre del 2007
ls *txt | awk -F '-' '$2 < 12' | grep '07.txt' | xargs -I {} cp -v {} zavala/.

# copiar a folder normas del 1 de Diciembre al 19 de Diciembre del 2007
ls *txt | grep '12-07.txt' | awk -F '-' '$1 < 20' | xargs -I {} cp -v {} zavala/.

Del 28 de Julio del 2006 al 19 de Diciembre del 2007 hay 510 días y nosotros hemos guardado en el folder zavala 510 archivos:

ls zavala/ | wc -l
510

Entonces vamos por buen camino.

Para la exministra Rosario Fernández (1er período)

Fechas: 20 de diciembre de 2007 – 10 de julio de 2009

# copiar a folder normas del 20 al 31 de Diciembre del 2007
ls *txt | grep '12-07.txt' | awk -F '-' '$1 > 19' | xargs -I {} cp -v {} fernandez1/.

# copiar a folder normas del 1 de Enero al 31 de Diciembre del 2008
ls *txt | grep '08.txt' | xargs -I {} cp -v {} fernandez1/.

# copiar a folder normas del 1 de Enero al 30 de Junio del 2009
ls *txt | grep '09.txt' | awk -F '-' '$2 < 07' | xargs -I {} cp -v {} fernandez1/.

# copiar a folder normas del 1 al 10 de Julio del 2009
ls *txt | grep '07-09.txt' | awk -F '-' '$1 < 11' | xargs -I {} cp -v {} fernandez1/.

# tenemos 563 archivos
ls fernandez1/ | wc -l
563

Para el exministro Aurelio Pastor

Fechas: 11 de julio de 2009 – 16 de marzo de 2010

# copiar a folder normas del 11 al 31 de Julio del 2009
ls *txt | grep '07-09.txt' | awk -F '-' '$1 > 10' | xargs -I {} cp -v {} pastor/.

# copiar a folder normas del 1 de Agosto al 31 de Diciembre del 2009
ls *txt | grep '09.txt' | awk -F '-' '$2 > 07' | xargs -I {} cp -v {} pastor/.

# copiar a folder normas del 1 de Enero al 29 de Febrero del 2010
ls *txt | grep '10.txt' | awk -F '-' '$2 < 03' | xargs -I {} cp -v {} pastor/.

# copiar a folder normas del 1 al 16 de Marzo del 2010
ls *txt | grep '03-10.txt' | awk -F '-' '$1 < 17' | xargs -I {} cp -v {} pastor/.

# tenemos 249 archivos
ls pastor/ | wc -l
249

Para el exministro Víctor García Toma

Fechas: 18 de marzo de 2010 – 12 de septiembre de 2010

# copiar a folder normas del 18 al 31 de Marzo 2010
ls *txt | grep '03-10.txt' | awk -F '-' '$1 > 17' | xargs -I {} cp -v {} toma/.

# copiar a folder normas del 1 de Abril al 31 de Agosto del 2010
ls *txt | grep '10.txt' | awk -F '-' '$2 < 09' | awk -F '-' '$2 > 03' | xargs -I {} cp -v {} toma/.

# copiar a folder normas del 1 al 12 de Septiembre del 2010
ls *txt | grep '09-10.txt' | awk -F '-' '$1 < 13' | xargs -I {} cp -v {} toma/.

ls toma/ | wc -l
179

Para la exministra Rosario Fernández (2do período)

Fechas: 14 de septiembre de 2010 – 28 de julio de 2011

# copiar a folder normas del 14 al 30 de Septiembre del 2010
ls *txt | grep '09-10.txt' | awk -F '-' '$1 > 13' | xargs -I {} cp -v {} fernandez2/.

# copiar a folder normas del 1 de Octubre al 31 de Diciembre del 2010
ls *txt | grep '10.txt' | awk -F '-' '$2 > 09' | xargs -I {} cp -v {} fernandez2/.

# copiar a folder normas del 1 de Enero al 30 de Junio del 2011
ls *txt | grep '11.txt' | awk -F '-' '$2 < 07' | xargs -I {} cp -v {} fernandez2/.

# copiar a folder normas del 1 al 28 de Julio del 2011
ls *txt | grep '07-11.txt' | awk -F '-' '$1 < 29' | xargs -I {} cp -v {} fernandez2/.

ls fernandez2/ | wc -l
317

2. Para cada ministro, buscar el número de indultados/conmutados de pena

Podemos comenzar con el ministro Pastor. Podemos usar el comando grep para cuántas veces se usó la palabra conmutarle en cada una de las 249 normas jurídicas emitidas durante su período.

grep -i conmutarle pastor/*

pastor/04-03-10.txt:conmutarle de 04 años a 02 años 03 meses de pena privativa de libertad; la que vencerá el 12 de
pastor/04-03-10.txt:8. HIDALGO RODRIGUEZ, MARCO ANTONIO, conmutarle de 06 años 08 meses a 03
pastor/04-03-10.txt:9. CANALES RUGEL, GUILLERMO AMANCIO, conmutarle de 09 años a 05 años de pena
pastor/04-03-10.txt:10. CORONADO VILCA, MARIO, conmutarle de 08 años a 05 años de pena privativa de
pastor/04-03-10.txt:conmutarle de 06 años 08 meses a 03 años de pena privativa de libertad; la que vencerá el 25 de
pastor/04-03-10.txt:12. CHALCO RAMIREZ, JHON LUIS, conmutarle de 06 años a 03 años de pena privativa
pastor/04-03-10.txt:GUILLERMO, conmutarle de 13 años a 08 años 09 meses de pena privativa de libertad; la que
pastor/04-03-10.txt:14. ALBA BERMUDEZ, RONEI EBAN, conmutarle de 06 años 06 meses a 03 años 04
pastor/04-03-10.txt:15. RODRIGUEZ MANSILLA, CARLOS ALFREDO, conmutarle de 05 años a 03 años 04

Por cada persona que recibió conmutación de pena se usó 1 vez la palabra conmutarle y podemos usar el número de veces que se usó esta palabra como indicador del número de conmutaciones de pena.

# ministra María Zavala
grep -i conmutarle zavala/* | wc -l
0

# ministra Rosario Fernández, 1er período
grep -i conmutarle fernandez1/* | wc -l
2065

# ministro Aurelio Pastor
grep -i conmutarle pastor/* | wc -l
1679

# ministro García Toma
grep -i conmutarle toma/* | wc -l
434

# ministra Rosario Fernández, 2do período
grep -i conmutarle fernandez2/* | wc -l
1042

Quién indultó más presos?

Bueno, los números indican que Aurelio Pastor no fue el ministro que firmó más gracias presidenciales. Ese privilegio pertenece a Rosario Fernández.

Pero hay que tomar en cuenta que Rosario Fernández fue ministra dos veces, un total de 887 días, mientras que Pastor sólo fue ministro por 249 días.

Es curioso ver que la ministra Zavala no firmó ningún indulto a pesar que estuvo 510 días en el cargo. La lluvia de indultos comezó con la ministra Rosario Fernández, continuó con Aurelio Pastor, pero se desaceleró considerablemente durante la gestión de García Toma. Y los indultos regresaron a toda marcha durante el 2do período de Rosario Fernández.

Hipótesis nula

Deberíamos encontrar que el número de conmutados no depende de quién haya sido ministro. Si un ministro estuvo pocos días en el cargo debió haber firmado pocos indultos. Si un ministro estuvo muchos días, entonces tuvo oportunidad de firmar muchos indultos (o conmutaciones).

Entonces la hipótesis nula es que no hay efecto del ministro de turno sobre el número de indultos. Deberíamos encontrar una correlación lineal entre número de días en el cargo versus número de conmutaciones emitidas.

Si esto es falso y hubieron incentivos extraordinarios para emitir conmutaciones y algunos presos estuvieron pagando para ser liberados con especial intensidad durante el período de cierto ministro, no será posible encontrar una correlación entre el número de días que estuvo en el cargo cada ministro y el número de conmutaciones otorgadas.

Por ejemplo podemos plotear número de días en el cargo versus número de indultos otorgados (usando el paquete estadístico R):

library(ggplot2)
h1 <- read.csv("h1.csv", row.names=NULL)

png(filename="h1.png")
p <- qplot(dias, conmutaciones, data=h1,
    main="Relación entre días en el cargo \n vs. \n número de conmutaciones de pena?",
     label=ministro)
p + geom_text(hjust=0, vjust=0, aes(colour=factor(ministro))) +
    geom_smooth(method="lm", se=FALSE)
dev.off()

Relación entre número de días y número de conmutaciones

El gráfico nos da indicios que no hay correlación entre número de días y número de conmutaciones.

Para estar seguros podemos calcular el coeficiente de correlación de Pearson para averiguar si hay correlación positiva (r = 1) o negativa (r = -1):

> with(h1, cor(dias, conmutaciones))
[1] 0.168943

El valor de r = 0.168 es muy cercano a 0, por lo tanto no hay correlación positiva ni negativa entre el número de días y el número de conmutaciones de penas.

Entonces podemos rechazar la hipótesis nula, y aparentemente durante el período de ciertos ministros se emitieron conmutaciones a mano llena (Rosario Fernández, Aurelio Pastor), mientras que durante el período de otros ministros (García Toma y María Zavala) no se emitieron muchos.

Lo que dice Aurelio Pastor es cierto, él no es el exministro que firmó más conmutaciones de pena. Pero habría que preguntarse por qué Aurelio Pastor firmó conmutaciones con semejante velocidad (1679 conmutaciones en 249 días durante su período).

Aurelio Pastor firmó menos conmutaciones porque estuvo muy pocos días como ministro. Pastor firmó casi 7 indultos por día, una velocidad tremenda con la pluma, el doble de velocidad que Rosario Fernández y mucho más rápido que García Toma.

Aquí los datos:

ministro,  dias, conmutaciones, velocidad
Toma,       179,           434,      2.42
Pastor,     249,          1679,      6.74
Fernandez2, 318,          1042,      3.28
Zavala,     510,             0,      0
Fernandez1, 569,          2065,      3.63

Vean el gráfico, es demasiado obvio!

png(filename="velocidad.png")
c <- ggplot(h1, aes(ministro, velocidad), fill=factor(ministro))
c + opts(title="número de conmutaciones firmadas por día en funciones") +
    geom_bar(aes(colour=factor(ministro)))
dev.off()

Número de conmutaciones firmadas por día
Es cierto que Aurelio Pastor firmó menos conmutaciones, pero es porque no tuvo tiempo! Tuvieron que sacarlo como ministro por el escándalo del indulto a Crousillat.

Habría que preguntarle por qué tanto apuro en firmar conmutaciones.

Imagínense si Pastor hubiera sido ministro durante los 5 años! Las cárceles habrían quedado vacías?

Análisis del mensaje a la nación usando Linux

Según lo que pude leer en twitter el mensaje a la nación de Ollanta Humala este año estuvo algo aburrido. Pero lo mejor del discurso fue que duró la mitad que el del año pasado!

Luego de ver las nubes de palabras del mensaje de este año y ver al algunos opinar que este mensaje se parece mucho al del año pasado decidí hacer un rápido y rudimentario análisis de los discursos presidenciales del 2013 y 2012.

Estadísticas básicas

La cuenta de Scrib de PresidenciadelPeru tiene colagos los dos discursos. Bajé los archivos en formato PDF y los convertí a texto y averigué unas estadísticas básicas:

# convertir los archivos PDF a texto
pdftotext 101360576-Spr-28-de-Julio-2012.pdf       mensaje2012.txt
pdftotext 156579151-Mensaje-Presidencial-2013.pdf  mensaje2013.txt

# Cuantas líneas y palabras de texto tiene cada discurso?
wc -l mensaje2012.txt
1262 mensaje2012.txt

wc -w mensaje2012.txt
11989 mensaje2012.txt

wc -l mensaje2013.txt
690 mensaje2013.txt

wc -w mensaje2013.txt
6558 mensaje2013.txt

Vemos que el mensaje del 2013 tiene aproximandamente la mitad del número de lineas de texto que el 2012 (54.67%) y la mitad de palabras (54.70%). Este mensaje duró la mitad del tiempo que en el 2012 (63 minutos versus 2 horas). Entonces los ayayeros que aplaudían y gritaban en el congreso y no dejaban escuchar el discurso debieron haber interrumpido el mismo número de minutos que el año pasado. Ya que al parecer no tuvieron efecto significativo en la duración del discurso. Al contrario parece que este año Ollanta Humala pudo leer su discurso más rápido (a paso ligero).

Pero este año parece haber habido más quejas por los ayayeros. Debe ser una consecuencia de la baja desaprobación del presidente.

Frecuencia de palabras usadas en los mensajes

Las nubes de palabras son muy buenas para tener una idea de las palabras que han sido más usadas durante los discursos. Pero me da curiosidad tener los números duros de las palabras que más se usaron en el discurso.

Para ver las frecuencias de palabras tuve que hacer varias manipulaciones al texto para hacer una “limpieza” superficial de los archivos de texto y poder trabajarlo:

# Eliminar signos de puntuación usando el comando tr
tr -d [:punct:] < mensaje2012.txt > mensaje2012_nopunct.txt
tr -d [:punct:] < mensaje2013.txt > mensaje2013_nopunct.txt

# Convertir todas las mayúsculas a minúsculas
tr [:upper:] [:lower:] < mensaje2012_nopunct.txt > mensaje2012_lower.txt
tr [:upper:] [:lower:] < mensaje2013_nopunct.txt > mensaje2013_lower.txt

# Convertir todo el texto a una lista de palabras
tr ' ' '\n' < mensaje2012_lower.txt > mensaje2012_oneword.txt
tr ' ' '\n' < mensaje2013_lower.txt > mensaje2013_oneword.txt

Lo que nos da archivos conteniendo todo el discurso convertido a una lista de palabras:

mensaje
a
la
nación
del
señor
presidente
ollanta
humala
con
...

Podemos ver cuantas veces se usaron cada una de las palabras en cada uno de los mensajes a la nación.

Para el mensaje del 2012:

cat mensaje2012_oneword.txt | sort | uniq -c | sort -h

40 millones
41 estamos
44 ha
49 país
50 gobierno
52 estado
54 como
56 es
57 año
63 hemos
69 este
70 por
71 más
85
86 una
90 al
105 un
110 se
134 con
143 las
191 del
191 los
212 para
249 que
283 a
381 el
390 en
424 y
491 la
914 de

Las palabras comunes no nos interesan (de, la) pero vemos que se usó la palabra millones 40 veces.

Podemos averiguar cuántas veces se usó la palabra millones en el discurso del 2013:

cat mensaje2013_oneword.txt | sort | uniq -c | grep millones
    43 millones

Ollanta Humala mencionó la palabra millones 43 veces! Tres veces más que el año pasado. Pero este discurso fue 54% más corto! Si este mensaje hubiera sido de la misma longitud que el del año pasado, el presidente habría mencionado millones 86 veces? El doble que el año pasado. Este año ha sido una verdadera lluvia de millones. Lo cual puede preocupar porque como dice el conocido refrán dime de que presumes y te dire de qué careces.

Algo parecido pasa si vemos la frecuencia de la palabra seguridad:

En el 2012:

cat mensaje2012_oneword.txt | sort | uniq -c | sort -h | grep seguridad

1 seguridades
3 inseguridad
15 seguridad

En el 2013:

cat mensaje2013_oneword.txt | sort | uniq -c | sort -h | grep seguridad

2 inseguridad
13 seguridad

Si hacemos el ajuste por tamaño de discurso, este año el presidente mencionó la palabra seguridad casi el doble de veces que el año pasado.

dime de que presumes y te dire de qué careces

Te recuerdo tu narcoindulto usando tuitbot

https://twitter.com/otravezandres/status/355674291142021120/photo/1

En posts anteriores describí un método para averiguar en qué fecha del segundo gobierno de Alan García se había dado indultos y conmutaciones de penas a personajes que habían reincidido en el delito. Podemos construir un bot en twitter para que tuitee recordatorios el día que fueron indultados/conmutados de pena cada uno de estos angelitos. El tuit podría tener la siguiente estructura:

Como hoy (24 Jul 2009) indulté a Fulano Mengano, pero luego fue encarcelado por ESTE DELITO

Luego de usar herramientas de Linux para buscar nombres de la lista de reincidentes en todas las normas jurídicas emitidas por el Ministerio de Justica, habíamos obtenido una lista de 138 coincidencias:

02-07-09.txt:8. ABATE LUCIANO, LUCIO, conmutarle de 05 años 06 meses a 03 años 07 meses de
14-01-09.txt:56. AGUILAR TALAVERANO, JUAN CARLOS o AGUILA TALAVERANO, JUAN CARLOS,
12-05-09.txt:18. ALARCON MORA, MIGUEL ANGEL, conmutarle de 08 años a 06 años 08 meses de
28-01-10.txt:43. AGUIRRE ANGELES, ELVIS EDWIN, conmutarle de 04 años a 02 años de pena
27-02-09.txt:6. AGUIRRE ANGULO, OMAR WILLIAMS, conmutarle de 07 años a 04 años 04 meses
30-04-09.txt:7. ALCARRAZ CAMPOS, ABRAHAM, conmutarle de 05 años a 03 años 08 meses de
17-04-10.txt:13. ALMEYDA LEON, CESAR ARTURO, conmutarle de 05 años a 03 años de pena
17-06-09.txt:45. AMPARADO AMPARADO, ROLANDO WALTER o PAJARITO AMPARADO,
29-01-10.txt:18. ALVAREZ RENGIFO, LUIS ALFONSO, conmutarle de 10 años a 04 años 06
16-12-08.txt:61. ANDAVIZA CHILET, NILDA KARINA, conmutarle de 13 años a 10 años 10 meses de
...

Usando un comando de Linux podemos convertir esa lista, en un formato que sea más manejable:.

sed -i 's/\(.\+\)\.txt:[0-9]*\.*\s\([A-Z]\+\s[A-Z]\+,\s[A-Z]\+\).\+/\1 \2/g' coincidencias.txt

Lo que resulta en:

02-07-09 ABATE LUCIANO, LUCIO
14-01-09 AGUILAR TALAVERANO, JUAN
12-05-09 ALARCON MORA, MIGUEL
28-01-10 AGUIRRE ANGELES, ELVIS
27-02-09 AGUIRRE ANGULO, OMAR
30-04-09 ALCARRAZ CAMPOS, ABRAHAM
17-04-10 ALMEYDA LEON, CESAR
17-06-09 AMPARADO AMPARADO, ROLANDO
29-01-10 ALVAREZ RENGIFO, LUIS
16-12-08 ANDAVIZA CHILET, NILDA
...

Este comando convierte la fecha en formato internacional YYY-MM-DD y agrega algo de texto:

cat coincidencias.txt | awk -F ' ' '{print $1 " | " $2 " " $3 " " $4 " es indultado por Alan García, reincide en el delito poco despues | " $1}' | sed 's/^\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/20\3-\2-\1/g' > tmp.txt

Lo que produce:

2009-07-02 | ABATE LUCIANO, LUCIO es indultado por Alan García, reincide en el delito poco después | 02-07-09
2009-01-14 | AGUILAR TALAVERANO, JUAN es indultado por Alan García, reincide en el delito poco después | 14-01-09
2009-05-12 | ALARCON MORA, MIGUEL es indultado por Alan García, reincide en el delito poco después | 12-05-09
2010-01-28 | AGUIRRE ANGELES, ELVIS es indultado por Alan García, reincide en el delito poco después | 28-01-10
2009-02-27 | AGUIRRE ANGULO, OMAR es indultado por Alan García, reincide en el delito poco después | 27-02-09
2009-04-30 | ALCARRAZ CAMPOS, ABRAHAM es indultado por Alan García, reincide en el delito poco después | 30-04-09
2010-04-17 | ALMEYDA LEON, CESAR es indultado por Alan García, reincide en el delito poco después | 17-04-10
2009-06-17 | AMPARADO AMPARADO, ROLANDO es indultado por Alan García, reincide en el delito poco después | 17-06-09
2010-01-29 | ALVAREZ RENGIFO, LUIS es indultado por Alan García, reincide en el delito poco después | 29-01-10
2008-12-16 | ANDAVIZA CHILET, NILDA es indultado por Alan García, reincide en el delito poco después | 16-12-08

Hay que convertir la fecha que aparece al final de cada línea a un link hacia la norma del Ministerio de Justicia correspondiente:

cat tmp.txt | sed -r 's/([0-9]{2})-([0-9]{2})-([0-9]{2})$/http:\/\/spij.minjus.gob.pe\/Normas\/textos\/\1\2\3T\.pdf/g' > coincidencias.txt

Y ya tenemos listos nuestros tuis:

2009-07-02 | ABATE LUCIANO, LUCIO es indultado por Alan García, reincide en el delito poco después | http://spij.minjus.gob.pe/Normas/textos/020709T.pdf
2009-01-14 | AGUILAR TALAVERANO, JUAN es indultado por Alan García, reincide en el delito poco después | http://spij.minjus.gob.pe/Normas/textos/140109T.pdf
2009-05-12 | ALARCON MORA, MIGUEL es indultado por Alan García, reincide en el delito poco después | http://spij.minjus.gob.pe/Normas/textos/120509T.pdf
2010-01-28 | AGUIRRE ANGELES, ELVIS es indultado por Alan García, reincide en el delito poco después | http://spij.minjus.gob.pe/Normas/textos/280110T.pdf
2009-02-27 | AGUIRRE ANGULO, OMAR es indultado por Alan García, reincide en el delito poco después | http://spij.minjus.gob.pe/Normas/textos/270209T.pdf
2009-04-30 | ALCARRAZ CAMPOS, ABRAHAM es indultado por Alan García, reincide en el delito poco después | http://spij.minjus.gob.pe/Normas/textos/300409T.pdf
2010-04-17 | ALMEYDA LEON, CESAR es indultado por Alan García, reincide en el delito poco después | http://spij.minjus.gob.pe/Normas/textos/170410T.pdf
2009-06-17 | AMPARADO AMPARADO, ROLANDO es indultado por Alan García, reincide en el delito poco después | http://spij.minjus.gob.pe/Normas/textos/170609T.pdf
2010-01-29 | ALVAREZ RENGIFO, LUIS es indultado por Alan García, reincide en el delito poco después | http://spij.minjus.gob.pe/Normas/textos/290110T.pdf
2008-12-16 | ANDAVIZA CHILET, NILDA es indultado por Alan García, reincide en el delito poco después | http://spij.minjus.gob.pe/Normas/textos/161208T.pdf
...

Ahora necesitamos crear un tuitbot

Necesitamos crear una cuenta en twitter, y una cuenta en bit.ly para que convierta los links a una versión corta. Instalamos el programa llamado t que puede tuitear desde la línea de comandos de Linux (lo descargan de aquí y sigan las intrucciones). Luego de autenticar el programa t podemos hacer un tuit con el siguiente comando:

t update "Este es mi primer tuit"

Ahora necesitamos un script que vaya línea por línea de nuestro archivo coincidencias.txt y compare la fecha actual con la fecha en que se emitieron los indultos/conmutaciones. Si las fechas coinciden en mes y dia, se emite el tuit. Escribí ese script usando el lenguage Python y aquí está:

Archivo tuit.py:

#!/usr/bin/env python
# -*- coding: UTF8 -*-
import codecs;
import os;
import datetime;
import re;
import bitly;
import subprocess;
import time;

# This script will look for an event matching today's date and will tuit it
# using https://github.com/sferik/t twitter's client

# t update "mi primer tuit"

# api details for bitly
API_USERNAME = 'Usar tu propio username'
API_KEY      = 'Usar tu propia api_key para bitly'

# get current date mm-dd
today = str(datetime.date.today());
today = re.sub("^[0-9]{4}-", "", today);

# create a log file
file_log = open("log.txt", "a");

# read data
file = "coincidencias.txt";
data_file = codecs.open(file, "r", encoding="utf-8");

def format_date(date):
    date = date.strip()
    d = datetime.datetime.strptime(date, "%Y-%m-%d")
    try:
        return d.strftime("%d de %b %Y");
    except:
        date = date.split("-");
        if date[1] == "07":
            month = "Jul";
        return re.sub("^0", "", date[2]) + " de " + month + " " + date[0]

tuits = []

# process data
for line in data_file:
    line = line.split("|");
    # date as mm-dd
    date = re.sub("^[0-9]{4}-", "", line[0].strip())
    if date == today:
        event = line[1].strip()

        link = line[2].strip();
        shortUrl = bitly.Api(login=API_USERNAME, apikey=API_KEY).shorten(link)

        formatted_date = format_date(line[0]);
        f.write(formatted_date + "\n")

        tuit = formatted_date + ": " + event + " " + shortUrl;

        cmd = '/usr/local/bin/t update "' + tuit + '"';
        tuits.append(cmd)

# count number of tuits for today
n_tuits = len(tuits)
if n_tuits > 0:
    timeToSleep = 6.0*60*60/n_tuits
else:
    timeToSleep = 1;

print "N tuits: " + str(n_tuits)
file_log.write("N tuits: " + str(n_tuits) + "\n");

print "Time to sleep between tuits: " + str(timeToSleep)
file_log.write("Time to sleep between tuits: " + str(timeToSleep) + "\n");

for cmd in tuits:
    p = subprocess.check_call(cmd, shell=True);

    if p == 0:
        # sleep for some time within 6 hour shift
        time.sleep(timeToSleep)

data_file.close();
file_log.close();

Si hay varios tuits para tuitear por día, este script esperará unas horas entre cada tuit. Para no tener que correr el programa manualmente todos los días podemos utilizar un cronjob para que se ejecute automaticamente todos los días. Aprovechando que la computadora de mi oficia está siempre prendida, puedo crear un cronjob:

crontab -l
00 08 * * * python tuit.py

En este caso el script se ejecutará automáticamente todos los días a las 8:00 am y emitirá tuits parecidos a este:

24 de Jul 2011: URSULA VELASQUEZ, PAREJA es indultada por Alan García, reincide en el delito poco después bit.ly/142iKgw