Saltar a contenido

Index

Relacionando las inmersiones por Duncan Green con los PCR de ISF

Acabo de leer un artículo de Duncan Green hablando de la importancia de las «inmersiones» (pasar periodos de tiempo conviviendo directamente con los beneficiarios) en Cooperación para el Desarrollo.

Estoy de acuerdo con las líneas generales del artículo, pero me gustaría hacer algunos comentarios, a partir de la experiencia de Ingeniería Sin Fronteras con los Programas de Conocimiento de la Realidad y los propios comentarios al artículo original.

Los tiempos propuestos, de alrededor de una semana, son escasos. De hecho una de las críticas que se hacen a las inmersiones es la de creerse que por estar un par de días (o semanas) viviendo con gente empobrecida vas a conocer realmente sus necesidades. La contracrítica pasa por dos puntos:

  • Aumentar el tiempo de estancia. ISF fija el programa en dos meses, con aproximadamente una semana de convivencia directa. Un periodo de tiempo que tal vez debería ser revisado, siempre teniendo mucho cuidado en no sobrecargar a la familia de acogida, o quizás aumentándolo a dos semanas con dos familias distintas.
  • Fortalecer la formación y las herramientas para comprender el peligro de una sóla historia. Sea la de la televisión, o la de la familia con la que convives.

Otra de las críticas al artículo es que las inmersiones no dan voz a quien lo necesita, o más bien, el objetivo debería ser how we can build long-term partnerships with people in poverty. La contrapropuesta pasaría por no contemplar la inmersión como un fin en si mismo, si no como una actividad importante dentro de una estrategía más global. Este punto da para un par de nuevos artículos, pero en resumen se trataría de como conseguir que, beneficiarios, socios locales, voluntarios, donantes y decisores políticos llegaran a relacionarse entre sí como stakeholders (perdón por el palabro) y no mediante las relaciones jerárquicas más habituales. En esta lína ISF lleva a cabo varias acciones:

  • Acercar a la gente que conoces durante el PCR, mediante entrevistas, vídeos, … Por ahora se está haciendo de forma poco organizada, pero podría incluirse dentro de la estrategia de comunicación.
  • Se empiezan a realizar skypes periódicos de los grupos de voluntarios con los socios locales, con los beneficiarios es más complicado, ara aumentar las relaciones de confianza.
  • Los PCR cuando están en terreno, su fuente de contacto principal son los socios locales y no la persona expatriada de la asociación.

¿Cómo hacer que sea realmente provechosa para el individuo?. ¿Cómo hacer que sea provechosa para la organización?. Para que sea provechosa para la persona, como se dijo antes, el proceso de selección y formación de la persona escogida para participar en una inmersión debe ser riguroso. Para que sea beneficioso para la organización deben establecerse mecanismos formales que permitan reaprovechar lo que la persona aprende. Esta posiblemente es una de las partes menos trabajadas en ISF, por ahora se queda en un compromiso del PCR de colaborar por un periodo de tiempo con la organización tras su estancia.

Borrar automáticamente comentarios pendientes en WordPress

Esta mañana me he puesto a actualizar odiseus y he visto que la base de datos ocupaba cerca de giga y medio, siendo la mayoría consumido por los 300.000 comentarios de spam que se nos escaparon en un blog que hace tiempo que no tiene supervisión y no tenía Akismet instalado.

Por algún extraño motivo WordPress todavía no tiene un forma por defecto que permite marcar y eliminar todos los comentarios pendientes, tienes que hacerlo de 20 en 20. Las soluciones que vi no me convencían demasiado. Plugins anticuados, borrar cosas directamente en la base de datos sin saber las relaciones que puede haber en un multisite o entre tablas, … Y Akismet tampoco era capaz de lidiar con tantos comentarios.

Finalmente me decidí por el plugin WP-Optimize capaz de borrar los comentarios pendientes y hacer alguna otra cosilla mas

Por desgracia más de 50.000 comentarios ya estaban aprobados y no quería borrarlos todos sin más. La solución:

  1. Buscar la fecha del último post
  2. Marcar como no aprobados todos los comentarios hechos con posterioridad a un mes desde el último post

UPDATEwp_4_commentsSETcomment_approved= 0 WHEREcomment_date> '20110601';

A continuación podemos borrar los comentarios no aprobados con wp-optimize.

Tutorial básico de django south

South es una app de django que permite modificar la estructura de la base de datos de una aplicación django cuando cambiamos el modelo (models.py).

El comando syncdb sólo crea nuevas tablas, pero no modifica tablas existentes, así que si en el modelo de una aplicación renombramos un campo de una tabla existente syncdb no realizará ese cambio en la base de datos. A este tipo de cambios en la base de datos se les denomina «migración del esquema» y es de lo que se encarga South.

Instalación

  1. pip install south
  2. Agregar «south» a INSTALLED_APPS
  3. Ejecutar syncdb antes de crear nuestros propios modelos. Está será la última (y única) vez, que necesitamos ejecutar este comando
    manage.py syncdb

Usar south en un una app nueva

  1. Crear la aplicación, y empezar a rellenar el models.py
  2. Crear el script de migración inicial
    python manage.py schemamigration app_name --initial
  3. Hacer los cambios en la bbdd
    python manage.py migrate app_name

Usar south en una app ya creada

python manage.py convert_to_south app_name

En el caso de que haya otros desarrolladores en el equipo y cada cual esté usando su propia instancia de la base de datos, el resto de desarrolladores deberá migrar la primera versión en modo fake,
python manage.py migrate app_name 0001 --fake

el resto normal, así:
python manage.py migrate app_name

De lo contrario no podrán migrar su versión de la base de datos.

Migración de modelos

  1. Modificamos el models.py de nuestra aplicación
  2. Crear un nuevo script de migración
    python manage.py schemamigration app_name --auto
  3. Aplicar la migración a la bbdd
    python manage.py migrate app_name

Como funciona

Se puede decir que South funciona en varios niveles de abstracción disintos.

  • Añade una tabla en la base de datos que mantiene el estado actual de la base de datos. Es decir, guarda que migraciones se han aplicado.
  • Crea un directorio en la applicación, donde guarda para cada migración un fichero (script) con la información necesaria para realizarla
  • Añade varios comandos al manage.py

Los ficheros de migración generados en deben subirse al repositorio para que el resto de los desarrolladores pueda también realizar la migración.

Referencias

Nota: Editado el 7/Marzo/2015 para añadir el comentario de Mauricio.

Adios Facebook

Cierro Facebook.

Y quiero explicar el porque.

Eficiencia, ancho de banda, ruido y banalidad

Tengo una cuenta en «La Red Social» desde hace años, pero empecé a usarlo activamente desde hace unos cinco meses. Iba a estar fuera de mi entorno mes y medio y quería saber que estaba pasando.

Desde entonces mis visitas a facebook se han convertido en un «mañana seguro que hay algo que no puedo perderme». Falso. En estos meses en Facebook apenas en dos o tres ocasiones leí algo, personal o profesional, de lo que no me hubiera enterado por otra vía o me hubiera parecido especialmente interesante. Hasta ahora sólo ha supuesto ruído.

Y si lo haces por los contactos, los mejores están en otros sitios.

Privacidad

Hace poco un meme recorría facebook, animando a pegar en su muro un mensaje prohibiendo a EEUU espiar nuestro perfil. Al poco uno de mis contactos escribía lo siguiente:

LE DOY PERMISO a cualquier persona, institución, agente, agencia o estructura gubernamental, incluyendo al Gobierno Federal de los Estados Unidos, al de Mordor y a los Lannister, para hacer lo que les salga del rabo con la mierda que pego en mi muro, pues considero que mi privacidad ya fue violada, desgarrada y tirada a la puta cuneta el mismo día en que decidí tener una cuenta de Facebook.

Quiero aprovechar para mandarle saludos a mis amigos que me están mirando y al agente de la CÍA que revisa las cuentas de Hotmail y mata a todos los niños desnutridos cuyas fotos no son reenviadas.

Pega esto en tu muro porque, si no, viene un enano y le cuenta a tu familia que te drogas…

Soberanía Digital y cuando el mañana es hoy

Así como algunos se preocupan de los tomates que consumen o de contribuír a un sistema usurero, algunos nos preocupamos de otras cosas.

El mundo de Facebook es el de Huxley. El de lo grande frente a lo pequeño, lo centralizado frente a lo distribuido, y no es el que yo quiero.

Por supuesto, sigo teniendo incoherencias, y hay otros servicios que me costará más cerrar, pero poco a poco. Los que querais seguir leyéndome tan sólo tenéis que añadir este blog a vuestro lector favorito.

PD1: Gracias a los asistentes a la comida de ayer, organizada mediante la tradicional lista de correo: Andrés, Pablo, Nacho, Adri y al resto, que aún estáis sin blog. Sólo tenéis que avisar cuando queráis uno.

PD2: No, no estoy preocupado por perder el contacto con gente. Lo contrario. A la gente de la que te preocupas no se la felicita por facebook. El esfuerzo será mayor, pero el resultado también.

Emacs y análisis estático de código en python

Gracias a Cartolab he podido seguir dándole una vuelta al análisis de código estático en python. La idea era reducir los incómodos errores que se producen porque te equivocas al escribir el nombre de una variable o cosas parecidas de las que no te das cuenta has que ejecutas el código. Tratar de detectar estos errores de la forma en que lo veíamos en el artículo anterior sigue sin ser demasiado productivo y aquí es donde entra en juego la extensión para emacs Flymake.

Lo que hace Flymake es «pedirle» a emacs que esté continuamente realizando ciertos análisis sobre el código o tratando de compilarlo y/o ejecutarlo. En realidad flymake es un plugin bastante genérico que funciona del siguiente modo:

  1. Si al abrir un nuevo buffer está marcado como «a chequear», flymake programa un temporizador para el buffer. La forma de marcar buffers suele ser en función de la extensión del archivo que abramos
  2. Crea una copia temporal de los buffers abiertos cada cierto tiempo
  3. Ejecuta un programa externo sobre la copia del buffer. Este programa puede ser gcc, make u otra cosa como una herramienta de análisis estático de código.
  4. Parsea la salida que produce el programa externo y da una salida visual en el buffer actual para representar los posibles errores.

Activar flymake

Activar flymake junto a alguna de las herramientas que veíamos en el post anterior es bastante fácil. Flymake viene instalado por defecto, así que sólo tenemos que tener en el path los ejecutables a las herramientas de análisis, y añadir a nuestro .emacs las instrucciones para que se activen con los ficheros python.

flymake con pyflakes:
<br></br>(when (load "flymake" t)<br></br>(defun flymake-pyflakes-init ()<br></br>(let* ((temp-file (flymake-init-create-temp-buffer-copy<br></br>'flymake-create-temp-inplace))<br></br>(local-file (file-relative-name<br></br>temp-file<br></br>(file-name-directory buffer-file-name))))<br></br>(list "pyflakes" (list local-file))))<br></br>(add-to-list 'flymake-allowed-file-name-masks'("\\.py\\'" flymake-pyflakes-init)))<br></br>

flymake con pylint (el comando epylint es un modo especial de pylint para trabajar con emacs)
<br></br>(when (load "flymake" t)<br></br>(defun flymake-pylint-init ()<br></br>(let* ((temp-file (flymake-init-create-temp-buffer-copy<br></br>'flymake-create-temp-inplace))<br></br>(local-file (file-relative-name<br></br>temp-file<br></br>(file-name-directory buffer-file-name))))<br></br>(list "epylint" (list local-file))))<br></br>(add-to-list 'flymake-allowed-file-name-masks'("\\.py\\'" flymake-pylint-init)))<br></br>
flymake con pep8
(when (load "flymake" t)<br></br>(defun flymake-pylint-init ()<br></br>(let* ((temp-file (flymake-init-create-temp-buffer-copy<br></br>'flymake-create-temp-inplace))<br></br>(local-file (file-relative-name<br></br>temp-file<br></br>(file-name-directory buffer-file-name))))<br></br>(list "pep8.py" (list "--repeat" local-file))))<br></br>(add-to-list 'flymake-allowed-file-name-masks'("\\.py\\'" flymake-pylint-init)))<br></br>

Por otro lado también podriamos configurar flymake para hacer que se pasarán las tres herramientas de forma automática pero yo lo veo innecesario dado que la información que proporcionan es en muchos casos redudante y estamos disminuyendo el rendimiento del ordenador.

Además de indicarle a flymake con que herramienta queremos trabajar, tenemos que activarlo para los buffers que nos interesen. Esto podemos hacerlo de varios modos:

  • Manual. Activando el modo menor de flymake. M-x flymake-mode
  • Que active el modo menor flymake cuando estemos en el modo python. Añadiendo al .emacs
    (add-hook 'python-mode-hook 'flymake-mode)
  • O que active el modo flymake en base a las extensiones de fichero que le hemos pasado anteriorme (flymake-allowed-file-name-masks)
    (add-hook 'find-file-hook 'flymake-find-file-hook)

Configurar flymake

Por defecto flymake ilumina (highlight) la línea de código donde se produce el error, empleando un color u otro en función de si es un error o un warning. Al dejar el ratón encima de la línea con el error (hover) nos muestra la descripción del error.

Para cambiar los colores que se emplean por defecto podemos emplear algo parecido a esto:
<br></br>'(flymake-errline ((((class color)) (:background "LightPink" :foreground "black"))))<br></br>'(flymake-warnline ((((class color)) (:background "LightBlue2" :foreground "black"))))<br></br>
Para que subraye en lugar de hacer highlight de la línea con el error:
<br></br>'(flymake-errline ((((class color)) (:underline "red"))))<br></br>'(flymake-warnline ((((class color)) (:underline "yellow")))))<br></br>

Para hacer que el fringe derecho se muestre un indicador de en que líneas hay errores podemos usar rfringe. Aunque yo no he sido capaz de hacerlo funcionar.

Mostrar la descripción del error en el minibuffer. Esto es imprescindible cuando se trabaja en modo -nw.
<br></br>(defun my-flymake-show-help ()<br></br>(when (get-char-property (point) 'flymake-overlay)<br></br>(let ((help (get-char-property (point) 'help-echo)))<br></br>(if help (message "%s" help)))))<br></br>(add-hook 'post-command-hook 'my-flymake-show-help)<br></br>
Aunque el código anterior a mi me funciona, para mostrar el error en el minibuffer se suele emplear el plugin flymake-cursor.

Moverse a través de los errores. Podemos emplear los comandos M-x flymake-goto-prev-error para ir al error anterior, o M-x flymake-goto-next-error para ir al siguiente. También podemos vincularlos a determinadas teclas:
<br></br>(global-set-key [TECLA] 'flymake-goto-prev-error)<br></br>(global-set-key [TECLA] 'flymake-goto-next-error)<br></br>
Links relacionados