python 3 support one (of the many) step closer

During the Barcelona sprint (report from Paul and Ramon) there was quite some work to bring dexterity related packages to work both in python 2.7 and python 3.5.

That work is mostly still pending to be merged, because we had a blocker: our current CI infrastructure (namely jenkins master and its nodes) run on a version of Ubuntu1 that does not provide python 3.5 by default.

So it would be a bit irresponsible to merge those changes without a way to ensure that the effort that was put during that sprint is not long forgotten and had to be done again from scratch some months later.

As reports about the newer Ubuntu version regarding python and plone are not that encouraging, and also due to other reasons, I decided to take the longest but long-term best approach: enters gforcada.compile-python!

An ansible role

So I decided to create an ansible role, given that our jenkins CI setup is already using some, and Plone community is also favoring it, to install all the system dependencies to compile Python 2.6, 2.7 and 3.5.

As extras I added:

  • install virtualenv on python 2.6 and 2.7 (on python 3.5 is already available)
  • install system dependencies for Pillow and lxml

See its README for all the details and more.

With that and vagrant I was able to test that a buildout.coredev (branch 5.1) runs all its tests without a problem :-)

I was tempted to add pypy as well, but I was too lazy/busy for that, if anyone feels like it, pull requests are always welcome!

I hope you find it useful and happy hacking!

  1. 14.04 for the curious []

PTotD

… also known as Python Tip of the Day:

What’s wrong (translation-wise) on this snippet of python code?

random = _("Lorem ipsum dolor sit amet, " +
           "consectetur adipisicing elit")

You are not going to see any warning on your code, if you don’t have this message translated you will never notice…

But unfortunately, as soon as you have this message translated you will notice that only half of the string is translated, which for Arabic or other RTL1 languages can be quite funny…

So, you already noticed right?

Turns out that gettext gets confused by the plus sign! As you already may remember by now, Python can join multiple strings just by putting them together, no need for a plus sign. Try it yourself on your python console:

>>> print ("Lorem " " ipsum" " dolor"
... " amet")
Lorem  ipsum dolor amet

So dear Python developers out there, pretty please double check your strings marked for translation, if not a translator will find out, hopefully before a release, and report it back :)

Planet GNOME

Seems that I pestered enough our (that sound good!) planet editor2 that he finally added me in. Hi GNOMEr’s around the globe!!

I’m Gil Forcada, Coordinator of the Catalan Translator Team, member of the Localization Coordination Team, nowadays also Damned-Lies maintainer and usually you see me on GUADEC’s behind the info desk :D

I’m all digital ears to digitally hear anything related to l10n/i18n and how to move GTP3 forward!

Edit: fixed the \ on the second code snippet (no need for that) and the LTR to RTL! Oh my!

  1. Right to Left []
  2. Wo was so nice to also create my planet hackergotchi! []
  3. GNOME Translation Project []

Micro servidor web amb Python

Tot i que el llenguatge més utilitzat (o en el que pensa gairebé tothom) quan parla de pàgines web és PHP, amb Python també es poden fer pàgines web :D

Un dels grans què del PHP és que engegues el servidor (Apache normalment), poses un fitxer php en algun lloc accessible i boom! ja tens la pàgina funcionant al navegador.
No se si existeix alguna cosa semblant, però amb Python encara ho pots fer més senzill (a mode de test i MAI en producció quedi clar):

from wsgiref.simple_server import make_server

def simple_app(environ, start_response):
    status = '200 OK'
    response_headers = [('Content-type','text/plain')]
    start_response(status, response_headers)
    return ['Hello world!\n']

# run the server
port = 8000
httpd = make_server('', port, simple_app)
print "Serving on port %i..." % port
httpd.serve_forever()

 

Amb el codi d’aquí sobre en teniu prou d’anar canviant el que hi ha dintre la funció per tenir ja alguna cosa que es mostri en el navegador :)

Python 2.4 i 2.6 al mateix temps

Degut a la feina haig de fer servir un programa1 que necessita la versió 2.4 de Python i diverses biblioteques (la PIL per exemple).

El problema està en que per defecte Gentoo compila els paquets de Python per a la versió de Python activa del sistema. Com que el sistema de paquets de Gentoo depèn de la versió 2.5 de python tenim un problema: no puc compilar per a la versió 2.4 ja que el programa que s’utilitza per a gestionar els paquets no es pot executar amb aquesta versió!

Si compilo els paquets per a la versió 2.4 de Python llavors no em funcionen per a la versió 2.6, o el que és pitjor (i que em va passar ahir mateix) que si per descuit actualitzes algun paquet de python te’l compila per a 2.6 i t’esborra la versió de 2.4.

Per sort hi ha una solució molt fàcil: al fitxer de configuració de l’emerge (el famós /etc/make.conf) hi pots establir una variable nova:

USE_PYTHON=”2.4 2.6″

Amb aquesta única línia ja li estàs dient a l’emerge que cada vegada que instal·li un programa de python el compili tant per a la versió 2.4 i la 2.6 :)

  1. El Zope, que és el servidor d’aplicacions que fa servir el Plone []

Plone Conference 2009 (Budapest)

ploneConf09Com que a la feina nova (més sobre això d’aquí uns dies) entre moltes altres coses també fem/farem pàgines web amb Plone ens ha semblat que seria una bona idea anar a la conferència anual que es fa cada any, així que tal com diu la imatge del costat des del 27 d’octubre fins a l’1 de novembre estaré a Budapest.

Com que la Sílvia treballa des de casa i tant li fa si es la casa de Molins o un apartament de Budapest també s’hi ha apuntat :)

Així que si per casualitat esteu a Budapest durant aquells dies feu-ho saber i ens podem veure ;)

Els que ja hi heu estat podeu deixar comentaris amb els must-see de Budapest també :)

Espero aprendre’n molt perquè de moment tinc un cacau força important amb el Plone aquest :)

Millorar el ressaltat de la sintaxi del Python al Vim

logotip del vimTot i que el Vim ja incorpora de forma predeterminada el ressaltat de sintaxi de Python avui he descobert que hi ha una extensió que permet millorar-ne encara més el ressaltat.

Només cal baixar el fitxer per a la versió de Python que utilitzeu (jo he baixat la versió 2.6 i la 3.0 ja que es poden instal·lar en paral·lel) i copiar-los a ~/.vim/syntax.

Obriu un fitxer de Python amb el vim i ja veureu :D

A més si us mireu els fitxers que us acabeu de baixar hi trobareu unes quantes opcions més de personalització (que ressalti el format del print, que mostri els espais i tabulacions que sobren …), totes aquestes personalitzacions les podeu afegir al ~/.vimrc.

Bones notícies pels traductors del GNOME!

logotip del GNOME LoveJa feia temps que s’estava coent el canvi i avui finalment s’ha fet (nota oficial) :D

Si ja us agradava les estadístiques del Damned-lies ara encara us agradarà més (si sou traductor) ja que s’ha integrat tota les funcions de gestió de traduccions del Vertimus a aquest primer.

Què vol dir tot plegat? Doncs que a partir d’ara ja podrem assignar-nos mòduls, marcar-los com a que esteu treballant amb ell (exemple al Totem i els detalls), que ja està traduït, que el revisor ja l’ha revisat i per tant està llest per pujar o simplement posar-hi un comentari (hi ha alguna errada o que l’estil no és correcta).

Tot això ha estat possible gràcies a que tant un com l’altre estaven escrits en Python (el Vertimus es va reescriure de PHP a Python de fet) i que seguidament es van integrar amb l’entorn de treball Django.

Tot  aquest treball l’han fet entre en Claude (col·laborador en la traducció del GNOME al Francès i membre del GTP) i l’Stéphane Raimbault (desenvolupador principal del Vertimus), evidentment si sabeu Python i Django esteu més que convidats a col·laborar-hi.

El següent gran pas del desenvolupament del Damned-lies serà integrar-hi el Transifex, un sistema perquè des de la pròpia pàgina web del Damned-lies es puguin fer les confirmacions (commits en anglès) de les traduccions i per tant tot el procés de traducció (que no la traducció en sí) ja estiguin integrats en una sola eina (estadístiques + gestió de la traducció + pujar els fitxers).

Però les bones notícies pels traductors no acaben aquí! En Leonardo Fontenelle ha fet un petit repás a com està el Gtranslator 2.0 i la veritat és que promet MOLT!

Traductors del GNOMEstay tuned!

arreglar bugs

Quan portes setmanes darrere un error que no hi ha manera racional d’explicar-lo i després d’un intensiu des de les 7 de la tarda a pràcticament les 12 de la nit (uff són unes 5 hores!) però l’acabes resolent … uff no té preu!

Això sí, ha sigut difícil trobar-lo el c*** quan per fi l’he trobat tenir obertes 12 terminals, diferents instàncies del Meld, uns quants Gedit, a saber quantíssimes pàgines web (amb l’Epiphany òbviament :)), etc etc

Com podeu veure que he posat el logo de l’empresa on treballo és un programa que estic fent per l’empresa i que gràcies a que ja (per fi!!) he trobat aquest bug aviat (espero) podrà veure la llum el què he estat fent :)

Nota no relacionada en absolut: Intenteu no barrejar programar en C i amb Python, us oblidareu TOTS els punt i coma del final de sentències a C i haureu de recompilar com 12 vegades per tonteries per l’estil :(

Introspecció a Python

Per tenir les dades que genera una aplicació que estic fent amb Python he escrit un parell de funcions que em permeten tenir un document estructurat (en xml) de totes les dades que es generen[1].

La tècnica de introspecció es basa en aprofitar les meta-dades (per dir-ho d’alguna manera) que tens sobre els objectes que has anat construint en l’aplicació per (dinàmicament) poder-ho formatar d’alguna manera.

Amb Python tenim algunes propietats, com molt bé es descriuen en un article d’IBM [2]:

  • objecte.__dict__ : Ens retorna una llista amb els elements que formen part de l’objecte. Així per mostrar els elements faríem:
  • for element in objecte__dict__:
    print “%s val %s” % (element, objecte.__dict__[element])

  • Si volem refinar el que volem mostrar tenim tot un seguit de funcions que ens diuen quin tipus de variable estem tractant: les comparacions amb el comparador is (exemple: if x is dict ….) per als tipus bàsics, callable per saber si és tracta d’un mètode, i per a objectes i classes isinstance(objecte, classe-o-llista-de-classes) i issubclass(classe, info-de-classe).

Només amb això podem treure molt suc a la informació que tenim ara mateix a les estructures de dades que estem muntant i si es fa el més genèric possible, no caldrà tocar ni una coma quan afegim més dades o hi encadenem alguna altra estructura.

[1] En certa manera hi ha truc perquè el sistema són classes que tenen diccionaris de classes a dintre fins a 5 nivells de manera que la introspecció és recursiva per naturalesa.

[2] És una mica vell, del 2002, però pels meus objectius n’he tingut ben prou :)