Twitpic: 27/09/2010
Twitter updates desde Twisted
¿Tenés un servidor escrito en Twisted? ¿Tenés eventos críticos o importantes que mandás por mail o a celulares? ¿Qué tal publicarlos en Twitter?
La versión original de este artículo utilizaba la biblioteca Twitty Twister, la única pensada para usar Twitter desde Twisted. Lamentablemente no funciona bien con el nuevo sistema de autenticación de Twitter por lo que voy a usar Tweepy, una librería con la cual hacer la danza de oAuth es muy sencillo.
1) Registrar un usuario dónde publicar las notificaciones.
2) Con ese usuario, registrar una aplicación. Es muy importante usar el mismo usuario para ahorrarnos algunos pasos en la danza oAuth.
3) De la página de la aplicación creada, tomar la siguiente información: consumer key, consumer secret (desde la home de la aplicación), access token y access token secret (de la página My Access Token).
4) Código:
Con los datos del punto 3, creamos el módulo twitterupdates.py:
import tweepy TWITTER_KEY = 'xxxxxxxxxxxxxxxx' TWITTER_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' MY_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxx' MY_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxx' auth = tweepy.OAuthHandler(TWITTER_KEY, TWITTER_SECRET) auth.set_access_token(MY_KEY, MY_SECRET) twitter = tweepy.API(auth)
y desde nuestra aplicación Twisted lo importamos:
from twitterupdates import twitter
Postear una actualización en Twitter o cualquier otra petición a un servidor externo tiene una naturaleza bloqueante y en un framework de concurrencia colaborativa, como es Twisted, no podemos darnos ese lujo. Para solucionar esto, utilizamos deferToThread:
deferToThread(twitter.update_status, "Mensaje a postear en Twitter")
Esta llamada retorna un objeto Deferred al cual se le pueden añadir callbacks o errbacks. La llamada bloqueante es corrida en un hilo aparte.
Enjoy!
Reflotando MyTwitGroup
MyTwitGroup o www.mytwitgroup.com es un servicio que implementamos con dos compañeras hace unos 6 meses. Uno de los objetivos del proyecto era ver como funcionábamos como equipo, si podíamos construir y entregar software en tiempo y forma. Nos fue bastante bien.
El servicio
La idea del servicio surgió de una necesidad real. En la cátedra de Comunicaciones somo 4 personas que usamos Twitter y queríamos usar esa herramienta para comunicarnos con los alumnos, pero no queríamos obligarlos a que nos sigan a cada uno.
MyTwitGroup revisa periódicamente el timeline de cada uno de los miembros y si encuentra un tweet con el hashtag #com lo publica utilizando la cuenta de la cátedra.
El servicio lo pueden usar desde empresas hasta bandas de rock. Yo creo que es útil, pero para entenderlo realmente tenés que usarlo. Si tenés una "cuenta grupal" probalo, no te cuesta nada.
Fallas
Cuando implementamos la primera versión del sistema, utilizamos la forma básica de autenticación de Twitter: era fácil de implementar y funcionaba. Tenía un problema, el grupo que creaba una cuenta en el sitio debía dejar la contraseña de la cuenta del grupo para que luego se puedan hacer las publicaciones automáticas. Tuvimos resistencia de usuarios por esto. Intentamos solucionarlo obteniendo un certificado que podamos usar para enviar la información por HTTPS. Los certificados son caros. Usamos uno gratuito unos meses, pero luego caducó. Esta fue la falla 1.
Falla 2. Hace menos de un mes Twitter decidió apagar su sistema de autenticación básico y nuestro servicio dejó de andar. Algo corto de tiempo por otros proyectos y obligaciones, con la ayuda de fisa migramos a la nueva forma de autenticación: OAuth.
OAuth en Twitter está mal implementado e hizo renegar a muchas personas; por semanas, populares clientes no funcionaron y a los paranoicos de la seguridad no les termina de cerrar la implementación OAuth de Twitter. Pero a nosotros nos vino bien! Usando OAuth dejamos de pedirle la password al usuario y muchos que no hubiesen probado el servicio, tal vez lo hagan. También dejamos de necesitar un costoso certificado.
Bugs fixing
Cambiamos de hosting y salió a la cancha, pero con algunos temitas que fui corrigiendo on demand. Cambié la BD de SQLite a PostgreSQL. Cambié el máximo tamaño para el hashtag de 10 a 20 (gracias walteralini por probarlo). No funcionaba la página "contact us" por que arrastré la configuración del viejo hosting.
Tengo que arreglar algunas cosas de usabildad todavía, el workflow logearse/editar puede ser engorroso, pero ya son detalles sutiles.
El sitio queda on line y ya tenemos algunos felices usuarios de esta nueva era. ¿Ideas o sugerencias? Dejalas en los comentarios!
Twitpic: 21/09/2010
Twitpic: 20/09/2010
Torta de Zanahoria
Ingredientes
- Zanahoria rallada cruda: 400g
- Huevos: 4 unidades
- Aceite: 150 ml
- Azúcar: 240g
- Harina Leudante: 400g
- Esencia de vainilla: 1 tapita
- Azúcar Impalpable: cantidad necesaria
Preparación
- Colocar en la licuadora todos los ingredientes (excepto la harina). Licuar hasta obtener una mezcla homogénea.
- Pasar el licuado a un recipiente e incorporar en 2 partes la harina revolviendo suavemente.
- Volcar en un molde de torta o moldes individuales (muffins), rociado con rocío vegetal.
- Hornear.
- Una vez fríos, espolvorear con azúcar impalpable.
Resultado
La receta la trajo mi hermana de Brasil cuando estuvo de intercambio en el 2008.
Twitpic: 16/09/2010
Cambiando el formato de los logs en Twisted
En Twisted se puede tener un log de todo lo que pasa en un programa de forma bastante fácil:
from twisted.python import log
from twisted.python.logfile import DailyLogFile
log.startLogging(DailyLogFile('log.txt', LOGDIR))
Todos los prints que anden dando vuelta ahora son entradas en el log y de yapa estoy usando DailyLogFile en lugar de un archivo común y corriente para que al final del día rote a un nuevo archivo en disco. Hay varias opciones, esta es la que me sirve a mí.
Por defecto los logs se ven algo así:
2010-05-28 07:41:00-0500 [__main__.TModBusFactory] Nuevo cliente: 190.136.29.16:12101
2010-05-28 07:41:00-0500 [__main__.TModBusFactory] Total: 1
2010-05-28 07:41:01-0500 [TModBus,0,190.136.29.16] G24 dice: :0090SFE00
2010-05-28 07:41:01-0500 [TModBus,0,190.136.29.16] SITIO SFE
2010-05-28 07:41:01-0500 [TModBus,0,190.136.29.16] Nuevo sitio registrado en MBProxy SFE
2010-05-28 07:45:49-0500 [__main__.TModBusFactory] Nuevo cliente: 190.136.29.16:30519
2010-05-28 07:45:49-0500 [__main__.TModBusFactory] Total: 2
2010-05-28 07:45:49-0500 [TModBus,1,190.136.29.16] G24 dice: :0090SFE00
2010-05-28 07:45:49-0500 [TModBus,1,190.136.29.16] SITIO SFE
2010-05-28 07:45:49-0500 [TModBus,1,190.136.29.16] SFE ya estaba conectado. Borrando anterior.
2010-05-28 07:45:51-0500 [TModBus,1,190.136.29.16] Nuevo sitio registrado en MBProxy SFE
¿Cómo podemos cambiar el formato de salida? Algunos tips.
Para cambiar el formato de la fecha y hora:
log.FileLogObserver.timeFormat = '%Y-%m-%d %H:%M:%S'
Para cambiar lo que aparece entre corchetes: utilizar log.msg y el keyword system:
log.msg("Nuevo cliente: %s:%d" % (self.peer.host, self.peer.port), system=' - ')
Con estos dos cambios se puede tener un log como este:
2010-05-28 07:41:00 [ - ] Nuevo cliente: 190.136.29.16:12101
2010-05-28 07:41:00 [ - ] Total: 1
2010-05-28 07:41:01 [SFE] G24 dice: :0090SFE00
2010-05-28 07:41:01 [SFE] SITIO SFE
2010-05-28 07:41:01 [SFE] Nuevo sitio registrado en MBProxy SFE
2010-05-28 07:45:49 [ - ] Nuevo cliente: 190.136.29.16:30519
2010-05-28 07:45:49 [ - ] Total: 2
2010-05-28 07:45:49 [ - ] G24 dice: :0090SFE00
2010-05-28 07:45:49 [SFE] SITIO SFE
2010-05-28 07:45:49 [SFE] SFE ya estaba conectado. Borrando anterior.
2010-05-28 07:45:51 [SFE] Nuevo sitio registrado en MBProxy SFE
Para cambiar aún más el formato de la salida, la única forma que encontré es extender FileLogObserver y sobreescribir su método emit. Discutimos un poco esto en StackOverflow.
nota: En Twisted también podemos usar el sistema de logging de Python, esto tiene la ventaja de que podemos trabajar con niveles de log y controlar mejor el formato y la forma en que se generan los logs, pero el problema de que no está preparado para funcionar en forma asincrónica y esto puede traer algunos problemas con Twisted.
