Posts Tagged ‘ Python

django-thumbs ahora en blanco y negro

Trabajando con miniaturas de imágenes, nos ha surgido la necesidad de hacer algunas en blanco y negro.

Con este objetivo he decido mejorar el módulo django-thumbs añadiendo soporte para esto y de paso me he animado y ha realizado mi primera publicación en http://djangosnippets.org.

Toda la documentación está en el snippet que podéis encontrarlo aquí http://djangosnippets.org/snippets/2817/ 🙂

Un gran número de parejas jóvenes que se enfrentan a varios problemas de salud, tales personas pueden comprar medicamentos en línea recta sin orden. Antibióticos de penicilina muy populares que combaten las bacterias. Estos remedios no tratan una infección viral por ejemplo un resfriado común. Vamos a hablar de numerosas drogas existe. Kamagra es un remedio usado para tratar varias quejas. ¿Qué sabes sobre “Comprar Kamagra Oral Jelly“? Actualmente muchos hombres buscan la frase exacta “comprar kamagra 100mg” en Internet. (Leer más “Kamagra Oral Jelly“). Debido a que algunos de los problemas sexuales son emergencias médicas, es bueno conocer los síntomas. Ciertas personas que usan este medicamento generalmente no tienen efectos secundarios graves Kamagra. El farmacéutico necesita resolver qué dosis es la mejor en su caso. Si el medicamento se usa según sea necesario, es poco probable que esté en un horario de dosificación.

Extraño fallo en python reportlab 2.5

En el proyecto que ando inmerso actualmente estamos generando documentación en PDF continuamente.

 

Para ello renderizo un HTML con django para después haciendo uso de la biblioteca xhtml2pdf convertirlo a PDF, con muy buenos resultados. Esta biblioteca a su vez hace uso de reportlab (un toolkit para generar PDF), en su binding para python, concretamente estoy hablando de la versión 2.5.

Pues bien, aquí me he encontrado con un fallo en dicha biblioteca, que además está muy documentado y saltaba en documentos concretos, siendo muy difícil localizarlo en el documento origen.

 

Antes de andar buscando e indagando porque ciertos HTML provocaban el error he decido parchear el mismísimo reportlab, con sólo añadir 2 líneas tenemos el problema solucionado 🙂

 

Aquí les dejo el parche. Aplicar con patch -p1 -i reportlab_fix.patch en el directorio raíz de reportlab.

Un gran número de parejas jóvenes que se enfrentan a varios problemas de saludos cordiales, tales personas pueden comprar medicamentos en línea de investigación sin orden. Antibióticos de penicilina muy populares que combaten las bacterias. Estos remedios no tratan una infección viral por ejemplo un resfriado común. Vamos a hablare de numerosas drogas existe. Kamagra es un remedio usado para tratar varias quejas. ¿Qué sabes sobre “Comprar Kamagra Oral Jelly“? Actualmente muchos hombres buscan la frase exacta “comprar kamagra 100mg” en Internet. (Leer más “Kamagra Oral Jelly“). Debido a que algunos de los problemas sexuales son emergencias médicas, es bueno conocer los síntomas. Ciertas personas que usan este medicamento generalmente no tienen efectos secundarios graves Kamagra. El farmacéutico necesita resolver el problema qué dosis es la mejor en su caso. Si el medicamento se usa según sea necesario, es poco probable que esté en un horario de dosificación.

Mejorando django-simple-captcha

Esta semana estamos siendo objeto de un ataque de spam (basado en comentarios) en thechurchofhorrors.com, que aparte de lo absurdo de su objetivo es un auténtico incordio.

TheChurchofHorrors es un Magazine Cultural que yo mismo desarrollé hace un tiempo que sigo manteniendo y mejorando, el código fuente completo lo podemos encontrar en https://github.com/dugo/The-Church-of-Horrors

Al parecer el posible atacante ha sido capaz de romper la protección captcha de los comentarios, basada en django simple captcha versión 0.3.0

Recuerdo que se acordó la publicación de comentarios libre para fomentar la participación y la libertad de expresión, de hecho en las implementaciones iniciales mi idea era aprobar los comentarios, algo que molestó a mis compañeros.

Para solucionar el problema he implementado las mejoras expuestas en http://hacktimes.com/reforzando_django_simple_captcha/ pero con algunas modificaciones propias.

Leer mas

Exportando asientos a Contaplus

Y yo que creía que un asiento era eso, algo para sentarse…

 

Este post poco o nada tiene que ver con la temática que he ido llevando en el blog. Trata de un script en python para exportar asientos contables de Lugano (un obsoleto programa de gestión y contabilidad desarrollado en VB7) a Contaplus 2011.

Si bien va a ser muy raro que  alguien necesite exportar de dicho programa a Contaplus, puede servir de referencia a quién necesite exportar desde otro programa, ya que el formato de los ficheros de Contaplus sería exactamente el mismo.

 

Seré breve y conciso, ya que en casos cómo este vale más el código en sí que una explicación detallada y confusa.

Leer mas

Backups automáticos en Amazon S3

Como todo buen administrador de sistemas (si, a estas alturas ya creo que me puedo llamar así) te das cuenta que siempre es mejor automatizar procesos que hacerlos a mano.

Y ahora les ha tocado a las copias de seguridad, aquí les presento un script en python mediante el cual realizo copias diarias de mis sistemas de forma que pueda restaurarlos ante un desastre.

El funcionamiento es simple; comprimimos las bases de datos, los ficheros de configuración y las aplicaciones web para después subirlos a un bucket a Amazon S3.

Hecho esto, el script elimina la copia de seguridad del día anterior si esta no corresponde a un domingo, digamos que siempre tendremos una copia de seguridad semanal más una diaria que será la más reciente.

Para ejecutarlo necesitaremos tener instalado boto (pip install boto), un módulo python que se encarga de las operaciones con AWS y otro módulo, settings.py, que contendrá las directivas AWS_STORAGE_BUCKET_NAMEAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY que será el bucket a usar en S3, nuestra id de acceso y nuestra clave para AWS resp.

Hecho esto ya sólo nos quedaría crear un crontab para ejecutar el script diariamente.

El script lo podemos encontrar en http://snipplr.com/view/64969/amazon-s3-backup/

Un gran número de parejas jóvenes que se enfrentan a varios problemas de salud, tales personas pueden comprar medicamentos en línea recta sin orden. Antibióticos de penicilina muy populares que combaten las bacterias. Estos remedios no tratan una infección viral por ejemplo un resfriado común. Vamos a hablar por teléfono de numerosas drogas existe. Kamagra es un remedio usado para tratar varias quejas. ¿Qué sabes sobre “Comprar Kamagra Oral Jelly“? Actualmente muchos hombres buscan la frase exacta “comprar kamagra 100mg” en Internet de las cosas. (Leer más “Kamagra Oral Jelly“). Debido a que algunos de los problemas sexuales son emergencias médicas, es bueno conocer los síntomas. Ciertas personas que usan este medicamento generalmente no tienen efectos secundarios graves Kamagra. El farmacéutico necesita resolver el problema qué dosis es la mejor en su caso. Si el medicamento se usa según sea necesario, es poco probable que esté en un horario de dosificación.

HTML; yo te dejo limpio que tú sólo te ensucias

Recientemente me han pasado unas maquetas HTML diseñadas con la herramienta iWeb de Mac.

El principal problema que queríamos solucionar es que dicha herramienta, aparte de embeber estilos CSS en un fichero externo, mete muchos estilos CSS inline, algo que no viene nada bien para SEO.

Solución rápida; en lugar de abrir manualmente cada una de las maquetas, mirar los posibles estilos, intentar factorizar y construir un nuevo CSS con nuevas clases he escrito un script python con el que, mediante BeautifulSoup, leo el DOM del documento y creo nuevas clases en base a los estilos inline, nada complicado pero sí útil y funcional (cómo me gustan esas dos palabras :))

 

Sólo necesitamos tener BeautifulSoup instalado (pip install BeautifulSoup) y ejecutar con python css_extract.py <fichero.html>

Lo podéis ver en http://snipplr.com/view/64624/python-css-inline-extractor/

Un gran número de parejas jóvenes que se enfrentan a varios problemas de salud, tales personas pueden comprar medicamentos en línea recta sin orden. Antibióticos de penicilina muy populares que combaten las bacterias. Estos remedios no tratan una infección viral por ejemplo un resfriado común. Vamos a hablar de numerosas drogas existe. Kamagra es un remedio usado para tratar varias quejas. ¿Qué sabes sobre todo “Comprar Kamagra Oral Jelly“? Actualmente muchos hombres buscan la frase exacta “comprar kamagra 100mg” en Internet. (Leer más “Kamagra Oral Jelly“). Debido a que algunos de los problemas sexuales son emergencias médicas, es bueno conocer los síntomas. Ciertas personas que usan este medicamento generalmente no tienen efectos secundarios graves Kamagra. El farmacéutico necesita resolver qué dosis es la mejor en su caso. Si el medicamento se usa según sea necesario, es poco probable que esté en un horario de dosificación.

Optimizando Python con Cython

Python es un lenguaje interpretado, algo que hace muy fácil y cómodo el desarrollo pero que lo hace excesivamente lento en cálculo.

Para hacer el lenguaje más eficiente podemos utilizar Cython, un lenguage que basicamente traduce partes del código Python en C y lo compila en código máquina.

Este código compilado luego puede ser cargado desde cualquier módulo Python de forma totalmente trasparente.

El uso de Cython es relativamente simple, una vez instalado (mediante easy_install p.e.), trabajaremos con ficheros .pyx que serán en su mayoría código Python con ciertas optimizaciones, que explicaré a continuación.

Podríamos utilizar bibliotecas en C/C++ y hacer uso de ciertas funciones más eficientemente. Por ejemplo, para usar la función de sqrt() de math.h;

cdef extern from "math.h":
    double sqrt(double)

O bien eliminar el tipado dinámico en ciertas variables, mediante:

cdef int a
cdef double b

Donde las variables a y b corresponden a un entero y coma flotante, respectivamente y podrán ser usadas de forma normal.

Y por último, podríamos eliminar el tipado dinámico del retorno de una función con;

cdef int func():
    return 1

Para compilar copiamos el siguiente script como setup.py y ejecutamos python setup.py build_ext –inplace. Con él compilaríamos el módulo my_module contenido en el fichero my_module.pyx como my_module.so y quedará listo para ser importado en cualquier script Python.

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
 
ext_modules = [Extension("my_module", ["my_module.pyx"],libraries=[])]
 
setup(
  name = 'my_module',
  cmdclass = {'build_ext': build_ext},
  include_dirs=[],
  ext_modules = ext_modules
)

Algo realmente curioso es que la importación del módulo se hace de forma totalmente transparente, de forma que, si no existiera el fichero my_module.so cargaría el módulo my_module.py sin optimizar.

Podemos añadir un poco más de complejidad al script de compilación;

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy
 
ext_modules = [Extension("my_module", ["my_module.pyx"],libraries=["m"])]
 
setup(
  name = 'my_module',
  cmdclass = {'build_ext': build_ext},
  include_dirs=[numpy.get_include()],
  ext_modules = ext_modules
)

Aquí estamos indicando que vamos a utilizar la biblioteca libm de C (math.h) y la biblioteca numpy cuyas extensiones ya se encuentran compiladas en C.

Un gran número de parejas jóvenes que se enfrentan a varios problemas de salud, tales personas pueden comprar medicamentos en línea sin orden. Antibióticos de penicilina muy populares que combaten las bacterias. Estos remedios no tratan una infección viral por ejemplo un resfriado común. Vamos a hablar de numerosas drogas existe. Kamagra es un remedios caseros usado para tratar de varias quejas. ¿Qué sabes sobre “Comprar Kamagra Oral Jelly“? Actualmente muchos hombres buscan la frase exacta “comprar kamagra 100mg” en Internet. (Leer más “Kamagra Oral Jelly“). Debido a que algunos de los problemas sexuales son emergencias médicas, es bueno conocer los síntomas. Ciertas personas que usan este medicamento generalmente no tienen efectos secundarios graves Kamagra. El farmacéutico necesita resolver qué dosis es la mejor en su caso. Si el medicamento se usa según sea necesario, es poco probable que esté en un horario de dosificación.

Google App Engine como tu CDN dinámico

Debido a un proyecto he necesitado estudiar diferentes alternativas como CDN, y me decidí a estudiar GAE como una posibilidad.

Mi intención era subir contenidos multimedia (imágen, vídeo y sonido) dinámicamente y restringir el acceso a dicha información.

Para la subida hago un simple POST con la información y para la seguridad ideé un sistema basado en slots el cual explicaré más abajo.

Al ajo, vamos con el modelo:

# coding=utf-8
 
from google.appengine.ext import db
 
class Slot(db.Model):
    id = db.IntegerProperty(required=True)
    hash = db.StringProperty(multiline=False,required=True)
 
class File(db.Model):
    id = db.IntegerProperty(required=True)
    content = db.BlobProperty(required=True)

Como vemos, la clase File encapsula el fichero en sí, con un identificador y un BlobProperty que almacenará los datos.

La clase Slot encapsula un slot temporal que se ha abierto a ese fichero, consiste en un hash utilizado para cargar el fichero mediante la URL y el identificador del fichero en cuestión.

Las operaciones para acceder a un fichero en el CDN serían las siguientes;

  1. El cliente quiere obtener un fichero
  2. El servidor web (no AppEngine) hace la petición a AppEngine obteniendo el hash pertinente.
  3. El servidor web lleva este hash como URL al cliente, de la forma http://xxxx.appspot.com/[hash]
  4. El cliente obtiene el fichero e inmediantamente el hash es borrado.

De este modo, utilizo dos URLs:

  • /[string]: Siendo string un hash (previamente negociado) mediante GET obtengo el fichero y siendo string un identificador mediante POST subo el fichero concreto
  • /slot/[id]: Siendo id un identificador, obtendría un slot asociado a él.

De ambas funcionalidades la única pública es cargar el fichero con el hash, para las otras dos es necesario subir una contraseña previamente establecida.

Simple, ahora echemos un vistazo al script de AppEngine que gestiona la aplicación:

# coding=utf-8
 
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from django.utils import simplejson
import hashlib
 
from models import *
 
SECRET = "secreto"
 
class getSlot(webapp.RequestHandler):
    def post(self,id):
        if not id.isdigit():
            self.error(400)
 
        if self.request.get("passwd")==SECRET:
            hash = hashlib.sha256().hexdigest()
            Slot(id=int(id),hash=hash).put()
 
            self.response.headers['Content-Type'] = 'text/plain'
            self.response.out.write(simplejson.dumps(dict(slot=hash)))
        else:
            self.error(500)
 
class FileHandler(webapp.RequestHandler):
    def get(self,hash):
        query = Slot.filter("hash = ",hash)
 
        if query.count()==0:
            self.error(404)
            return
 
        # Get the slot
        slot = query.get()
 
 
        file = File.filter("id = ",slot.id);
        # Get the mimetype
        self.response.headers['Content-Type'] = 'image/jpeg'
        self.response.out.write(file.content)
 
        # Remove the slot
        slot.delete()
 
    def post(self,id):
        if not id.isdigit():
            self.error(400)
 
        if self.request.get("passwd")==SECRET:
 
            File(id=id,content=self.request.get("file")).put()
            self.response.headers['Content-Type'] = 'text/plain'
 
            self.response.out.write("ok")
        else:
            self.error(500)
 
 
application = webapp.WSGIApplication(
                                     [(r'/slot/(.+)', getSlot),
                                      (r'/(.+)', FileHandler),
                                     ],
                                     debug=True)
 
def main():
  run_wsgi_app(application)
 
if __name__ == "__main__":
  main()

Este script hace lo descrito anteriormente, por un lado nos permite subir ficheros al servidor, obtener el hash y acceder a dicho hash publicamente una sóla vez.

Las operaciones privadas se verifican mediante una contraseña que tenemos que establecer previamente, podríamos haber elegido cualquier otro método, pero este es el más simple.

Veamos el script que realiza las operaciones de subida;

# coding=utf-8
from poster.encode import multipart_encode
from poster.streaminghttp import register_openers
import urllib2
 
URL = "http://localhost:8080/"
 
def open_slot(id,passwd):
 
    register_openers()
 
    datagen, headers = multipart_encode({"passwd":passwd})
 
    request = urllib2.Request(URL+"slot/"+str(id), datagen, headers)
 
    print urllib2.urlopen(request).read()
 
def upload(id,file,passwd):
 
    register_openers()
 
 
    datagen, headers = multipart_encode({"file": open(file, "rb"),"passwd":passwd})
 
    request = urllib2.Request(URL+str(id), datagen, headers)
 
    print urllib2.urlopen(request).read()

Previamente necesitamos instalar la biblioteca poster de Python.
Este script mediante las funciones upload() nos permite subir un fichero con una ID determinada, el nombre del mismo y la contraseña para identificarnos.
Hecho esto, podremos abrir un slot asociado a él mediante la función open_slot().

Ahora para acceder al fichero, sólo tendremos que ir a la dirección http://[url principal]/[hash]

Resulta interesante este tipo de ejercicios con diferentes tecnologías para ver las utilidades que nos ofrecen.
Finalmente descarté el invento debido a las restricciones que tiene impuestas, por un lado, los campos Blob no pueden tener más de 1MB y aunque se podría aumentar indexando varios (consumiendo un riquísimo tiempo de CPU) los campos del POST no pueden ocupar más de 10MB.

Aún así, resulta interesante este sistema y porque no, su posible aplicación a otros proyectos.

Un gran número de parejas jóvenes que se enfrentan a varios problemas de salud, tales personas pueden comprar medicamentos en línea recta sin orden. Antibióticos de penicilina muy populares que combaten las bacterias. Estos remedios no tratan una infección viral por ejemplo un resfriado común. Vamos a hablar por teléfono de numerosas drogas existe. Kamagra es un remedio usado para tratar de varias quejas. ¿Qué sabes sobre “Comprar Kamagra Oral Jelly“? Actualmente muchos hombres buscan la frase exacta “comprar kamagra 100mg” en Internet. (Leer más “Kamagra Oral Jelly“). Debido a que algunos de los problemas sexuales son emergencias médicas, es bueno conocer los síntomas. Ciertas personas que usan este medicamento generalmente no tienen efectos secundarios graves Kamagra. El farmacéutico necesita resolver qué dosis es la mejor en su caso. Si el medicamento se usa según sea necesario, es poco probable que esté en un horario de dosificación.

Script Python con entorno de Django

Recientemente tuve la necesidad de crearme un script que utilizará el modelo de una aplicación Django sin necesidad de ejecutarlo como una vista, para ello simplemente creamos un script python normal al que añadimos:

from django.core.management import setup_environ

''' Esta ruta debe de ser la del proyecto, en mi caso como el script
estaba en un directorio de aplicación utilizaba la relativa ../'''
sys.path.append(os.path.abspath(os.path.dirname(__file__)+"../"))

import settings

''' Importamos el modelo que nos interese '''
from app.models import *

Ya podemos utilizar el modelo como cualquier vista.

Un gran número de parejas jóvenes que se enfrentan a varios problemas de salud, tales personas pueden comprar medicamentos en línea sin orden. Antibióticos de penicilina muy populares que combaten las bacterias. Estos remedios no tratan una infección viral por ejemplo un resfriado común. Vamos a hablar por teléfono de numerosas drogas existe. Kamagra es un remedio usado para tratar varias quejas. ¿Qué sabes sobre “Comprar Kamagra Oral Jelly“? Actualmente muchos hombres buscan la frase exacta “comprar kamagra 100mg” en Internet. (Leer más “Kamagra Oral Jelly“). Debido a que algunos de los problemas sexuales son emergencias médicas, es bueno conocer los síntomas. Ciertas personas que usan este medicamento generalmente no tienen efectos secundarios graves Kamagra. El farmacéutico necesita resolver el problema qué dosis es la mejor en su caso. Si el medicamento se usa según sea necesario, es poco probable que esté en un horario de dosificación.

Salvando la oscura era digital; de SQL Server 2000 a Django

Uno de los últimos problemas a los que me he tenido que enfrentar es construir, a partir de una base de datos SQL Server 2000 obsoleta, un modelo Django, que aunque no importa, está alojado en una BD Postgres.

En cierto modo, se parece a este documental, en el cuál se describe lo inaccesible que puede llegar a ser la información debido al rápido avance de los sistemas de almacenamiento.

Esto llegó a preocupar a la CIA, la cual guarda un ejemplar funcional de cada máquina con la que ellos han trabajado, con sistema operativo incluido. De forma que se pueda recuperar la información almacenada en dichos soportes obsoletos, en caso de que sea necesario. También tiene su punto paranoico.

¡Vamos al grano! Para empezar avisaré de que mi experiencia con SQL Server era nula (hasta este momento) y los sistemas con los que trabajo son GNU/Linux y sw libre preferiblemente.

Para ello, después probar con wine sin resultados, lo intenté con una VirtualBox y Windows XP, pero SQL Server tiene cerradas las conexiones  TCP, después de probar con diversos SP del mismo sin lograr conectar (para esto tenemos la plugin de Python pymssql, o podemos hacer un telnet 127.0.0.1 <puerto que sea>) resulta que SQL Server 2000 tiene cerrado el puerto TCP por seguridad… ya sabemos lo que entiende esta gente por seguridad…

SQL Server no habre el puerto TCP para conexiones entrantes, así que se identifica con credenciales de Windows y viendo el panorama decidí que no me interesaba meterme más en el tema, por lo que opté por exportar la BD entera a otro sistema, para esto utilicé el driver (que ya tenía instalado) MySQL ODBC, consiguiendo pasar al base de datos SQL Server virtualizada a una MySQL en host con GNU/Linux.

A partir de aquí me deshice de la VirtualBox y programé el parser.

En general, cuando requería sacar un objeto de la BD hacía la consulta a la base de datos en SQL “a pelo”, con los valores resultantes instanciaba las clases y las guardaba. Los problemas más destacables que tuve que afrontar fueron:

  • Elementos repetidos: Para esto almacenaba los elementos en un diccionario (par id en sqlserver-objeto), capturaba la excepción KeyError, si entraba en esta el elemento no existía y era creado, en caso contrario era descartado.
  • Claves externas huérfanas: ¿Tiene SQL Server 2000 restricciones en claves externas? Si las tiene la gente que programó la BD no las tuvo en cuenta, para esto consultaba el diccionario de la entidad maestro y capturaba de nuevo la excepción KeyError, en este caso si existía estábamos de suerte y el elemento era guardado, en caso contrario el elemento estaba huérfano y era descartado.
  • Relaciones muchos a muchos: Estas relaciones se modelan como una tabla id-id, para obtenerlas hacía una consulta cruzada en SQL para cada elemento, obteniendo así sus elementos relacionados, aquí aplicaba el mismo procedimiento que en el caso anterior sólo que con varios resultados.

Y mi pregunta es; ¿cómo han programado esta gente la BD?

Un gran número de parejas jóvenes que se enfrentan a varios problemas de salud, tales personas pueden comprar medicamentos en línea sin orden. Antibióticos de penicilina muy populares que combaten las bacterias. Estos remedios no tratan una infección viral por ejemplo un resfriado común. Vamos a hablare de numerosas drogas existe. Kamagra es un remedio usado para tratar de varias quejas. ¿Qué sabes sobre “Comprar Kamagra Oral Jelly“? Actualmente muchos hombres buscan la frase exacta “comprar kamagra 100mg” en Internet. (Leer más “Kamagra Oral Jelly“). Debido a que algunos de los problemas sexuales son emergencias médicas, es bueno conocer los síntomas. Ciertas personas que usan este medicamento generalmente no tienen efectos secundarios graves Kamagra. El farmacéutico necesita resolver el problema qué dosis es la mejor en su caso. Si el medicamento se usa según sea necesario, es poco probable que esté en un horario de dosificación.