Archive for the ‘programación’ Category
django-membergetmember
He liberado una nueva app para django para la gestión de campañas Member-Get-Member al estilo groupon y otros. Tu traes un amigo y yo os doy X créditos a cada uno. Más info en el README del proyecto en github
Feedback is welcome
I have posted a new django app to manage Member Get Member campaigns, as groupon or livingsocial do. You get a new user and we give you some credits to spend onsite. More info in the README file on github’s project repository
django-sermepa
Acabo de subir al github una versión sencilla para utilizar el TPV Virtual de Sermepa: django-sermepa
Django-sermepa funciona de una forma muy parecida a django-paypal IPN:
- En una página renderiza un formulario oculto y un botón de “Comprar”
- Esto te lleva al TPV Virtual de Sermepa (Servired) donde se paga
- Sermepa envía un post (el IPN de paypal) a tu servidor con los datos de la compra
- django-sermepa captura este post, lo almacena en BBDD, lo valida y ejecuta las señales correspondientes
Presentación recommenders
Para la presentación de la fiberparty del 7 de marzo del 2009 he preparado esta presentación.
pdb.set_trace() en Google App Engine
GAE redirecciona todo el stdout a la salida del navegador (response), por lo que el pdb tal cual no funciona. Para hacerlo funcionar hay que hacer un pequeño truco:
import sys, pdb
for attr in ('stdin', 'stdout', 'stderr'):
setattr(sys, attr, getattr(sys, '__%s__' % attr))
pdb.set_trace()
Yo lo he encapsulado en un fichero, así puedo usarlo más o menos como antes. Lo he llamado gpdb.py:
import sys
import pdb
def set_trace():
for attr in ('stdin', 'stdout', 'stderr'):
setattr(sys, attr, getattr(sys, '__%s__' % attr))
return pdb.set_trace()
Y para usarlo, en mi código añado:
import gpdb; gpdb.set_trace()
Y el Amigo Invisible llegó a la nube
He subido el amigo invisible versión Django + GAE y ha funcionado! Aquí tenéis una versión primitiva de la aplicación, pero que funciona al 100%. Y con múltiples exclusiones!
TODOs:
- L&F, ponerle el css adecuado
- Corregir los últimos cambios de app_bij.py que ha hecho David
- Uno, dos o tres pasos?
- Añadir todas las funcionalidades extras: Recuperar el sorteo, ver con quien juegas, comentar lo que quieres que te regalen…
- Añadir AdSense (y forrarme)
- …
- Y cuando todo vaya bien, mover el DNS para que www.amigoinvisibleonline.com apunte a la nube
PD. Tengo un límite de 2000 emails por día. Esto puede ser un problema, estas navidades estuve enviando más de 4000 al día, tendré que preguntar precios.
Primeros pasos con GAE y Django
Mi tutorial step-by-step:
- Te bajas el GAE SDK y te lo instalas
- Te bajas Django, si no lo tuvieras y quieres usar una versión moderna (>0.96)
- Crea tu proyecto django, donde quieras: django-admin.py startproject xxx
- Modifica el settings.py quitar todas las referencias a la BBDD, sessions, auth y admin. Ver esta nota
- Copiar django framework y todo su contenido en la raiz del proyecto
- Añade un fichero app.yaml, descriptor del proyecto, que contenga:
application: aio version: 1 runtime: python api_version: 1 handlers: - url: /static static_dir: site_media - url: /.* script: main.py
- Crea un fichero main.py, conteniendo lo siguiente:
import logging, os, sys
# Google App Engine imports.
from google.appengine.ext.webapp import util
# Remove the standard version of Django.
for k in [k for k in sys.modules if k.startswith('django')]:
del sys.modules[k]
# Force sys.path to have our own directory first, in case we want to import
# from it.
sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))
# Django imports and other code go here...
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
import django.core.handlers.wsgi
def main():
# Run Django via WSGI.
application = django.core.handlers.wsgi.WSGIHandler()
util.run_wsgi_app(application)
if __name__ == '__main__':
main()
- Crea los modelos usando los Types y Properties delGAE
- Si vas a usar ModelForms también. Recuerda que los forms normales y los formset son los de django.
- Para hacer las queries, usa estos comandos.
- Para ejecutar el proyecto: ./dev_appserver.py <projecto>
- Para acceder al admin, y a una consola interactiva, puedes verlo desde aquí: http://localhost:8080/_ah/admin
- Todo lo demás funciona igual. Eso sí, ojo con la librería contrib.auth, que tampoco existe, se usan cuentas de google.
- Por supuesto, la mayoría de pluggables fallarán, porque hay que migrar a los nuevos modelos…
Tengo el amigo invisible más o menos listo, tengo que probar el envío de mails, y luego lo subiré a los servidores de Google. A ver si mañana lo termino.
Google App Engine
Llevo esta tarde peleándome con el Google App Engine, para portar el amigo invisible a esto. Y no ha sido trivial. Por un lado, te quedas sin admin. La consola de administración del GAE no es para nada lo mismo. Por otro lado, y mucho mucho mucho más importante, no puedes usar import pdb;pdb.set_trace() Cómo puedes debugar sin eso?!!
Las diferencias con django se producen en la parte de BBDD, ya que se sustituyen los models de django por el sistema de Google. La definición es sencilla, pero los métodos para hacer queries dejan mucho que desear. Y las exceptions lanzadas también son diferentes.
Ojo también con los forms. Los ModelForms se extienden de un paquete de GAE, mientras que los forms normales son los de Django.
Por último, es posible y fácil utilizar Django en su versión actual. Simplemente hay que definir un archivo main.py (y declararlo en el app.yaml), con el siguiente contenido:
import logging, os, sys
# Google App Engine imports.
from google.appengine.ext.webapp import util
# Remove the standard version of Django.
for k in [k for k in sys.modules if k.startswith('django')]:
del sys.modules[k]
# Force sys.path to have our own directory first, in case we want to import
# from it.
sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))
# Django imports and other code go here...
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
import django.core.handlers.wsgi
def main():
# Run Django via WSGI.
application = django.core.handlers.wsgi.WSGIHandler()
util.run_wsgi_app(application)
if __name__ == '__main__':
main()
Aplicaciones biyectivas
Lo prometido es deuda. David nos explica lo que son aplicaciones biyectivas. Lo había puesto como comentario, pero mejor lo destaco en un post completo. Con todos ustedes, David Serrano:
Ya que me invitas a hacerlo, explicaré lo que es una aplicación biyectiva. En realidad es un concepto que a todos nos enseñaron en las clases de mates del cole…, tanto tiempo atrás, que se nos ha olvidado a la mayoría.
Si tenemos dos conjuntos de amigos, uno A y otro B (en principio diferentes y con posiblemente diferente número de integrantes) de manera que los amigos del conjunto A hacen regalos a los del conjunto B y los del conjunto B reciben regalos de los del conjunto A, una CORRESPONDENDIA es cualquier ley que dicte quién regala a quién de un conjunto al otro.
Si en dicha ley se ordena que TODOS los amigos del conjunto A deben regalar a UNA sola persona del conjunto B, entonces nuestra correspondencia se denomina APLICACIÓN.
Dicha ley (aplicación) puede incluir otras disposiciones; por ejemplo si todo amigo del conjunto B sólo puede recibir regalos a lo sumo de un amigo del conjunto A diremos que se trata de una APLICACIÓN INYECTIVA.
Otra posible disposición de la ley (aplicación) es que todos los amigos del conjunto B tienen que recibir regalos. Entonces estamos ante una APLICACIÓN SOBREYECTIVA.
Si una aplicación es inyectiva y sobreyectiva se dice que es BIYECTIVA.
Para poder construir aplicaciones biyectivas entre los dos conjuntos de amigos A y B, ambos deben tener el mismo número de integrantes.
En el caso del juego del “Amigo Invisible Online“, los conjuntos A y B son el mismo conjunto, esto es, el de la gente que juega.
El objeto del juego consiste en encontrar aleatoriamente aplicaciones biyectivas que sean compatibles con las exclusiones manifestadas por los participantes.
Si el lector está interesado en ver qué estrategias se han seguido para lograrlo, no tiene más que estudiar el módulo appl_bij a través del vínculo facilitado por Bosco. Dicho módulo está a nuestro parecer suficientemente explicado y documentado.
+3 millones de parados…
Pero no será por culpa de dooplan! En dooplan estamos buscando (ofertas 1 y 2) un nuevo programador para unirse al equipo. Actualmente somos 3 personas en el equipo técnico Hector, Robert y yo, y tenemos la suerte de estar bastante compensados, donde uno cojea el otro le puede ayudar.
Llevamos ya casi 3 meses de beta, tenemos lista una pequeña gran refactorización de la aplicación, y ya solo le queda poner una capa de pintura para que salgamos en serio. Así que queremos fichar a un junior developer, para poder formarle en django, python, jQuery… y nos ayude a todas las tareas que vayan a surgir a partir de ahora, ya que entramos en una fase crucial.
Los requerimientos son básicamente tener ganas de aprender, que le apasione internet y la programación web, que sea una persona inquieta, que no se conforme con lo que se le dice y sepa proponer sus ideas. La parte técnica ya llegará.
Si alguien le apetece probar, o conoce a alguien que encaje en este perfil, por favor, que me envíe un email.
Amigo Invisible Online en Google Apps
Este fin de semana he avanzado bastante con la nueva versión del Amigo Invisible, integrando la clase de aplicaciones biyectivas de David Serrano. Resulta que el sorteo del amigo invisible es un subconjunto de las aplicaciones biyectivas, que pueden ayudar a resolver el problema de las múltiples exclusiones.
En otro post explicaré lo que es una aplicación biyectiva, o mejor, que lo haga David, que yo no lo tengo tan claro
Lo que quería comentar es que el desarrollo en django me ha llevado 5 horas, un tiempo ridículo, así que para hacerlo un pelín más interesante lo voy a migrar a Google App Engine, a ver que tal. Ya contaré.


