CDPedia 0.7

Python Argentina (PyAr) se enorgullece de anunciar la versión 0.7 de la CDPedia. Esta versión fue entregada a Educ.ar para ser distribuida en escuelas del todo el país, y ya está disponible para la descarga pública.

La CDPedia es un proyecto del grupo de usuarios de Python Argentina que permite acceder a la información de la Wikipedia en castellano sin necesidad de una conexión a Internet. Se puede descargar libremente de la red y grabar a CDs o DVDs para repartirlos sin restricciones. La CDPedia funciona en cualquier computadora, ya sea que tenga Linux, MacOS o Windows como sistema operativo.

CDPedia

La versión 0.7 de CDPedia en DVD fue recientemente entregada para su evaluación a Educ.ar quien, por medio de un acuerdo con Wikimedia Argentina y PyAr, está por distribuir esta enciclopedia libre en todas las escuelas de Argentina.

Esta misma versión, con contenido de Wikipedia a Febrero de 2011, ya está publicada para descargas libremente en versiones CD y DVD, se puede bajar directamente o usando un torrente. Y planeamos hacer una tirada de mil DVDs para tratar de iniciar algo viral y que llegue a toda la gente posible... te recomiendo (y te agradezco) que copies estos discos y los regales a tus amigos, familia y conocidos. La información debe ser libre, así mejoramos la calidad de nuestra educación.

Para mayor información e instrucciones para la descarga, visitar la página de CDPedia.

Comentarios Imprimir

NO al Canon Digital

¿Qué es el canon digital?

Es un gravamen que afecta a dispositivos de almacenamiento y reproduccion digital o analógica: CDs y DVDs, grabadoras de discos, reproductores de mp3, teléfonos ceulares, tarjetas de memoria, discos rígidos, cámaras, etc., y que en algunos casos podrían aumentar hasta un 75% su precio actual.

No es un impuesto ya que lo recaudado no se reinvierte en la sociedad ni es recolectado por el Estado, sino que se deriva directamente a asociaciones privadas (AADI, ARGENTORES, CAPIF, DAC, SADAIC, SAGAI y SAVA) que gestionan la recaudación de dinero por reproducción de obras bajo sus propias normativas (¡incluso las libres!).

¿A quiénes afecta?

La medida perjudica a consumidores y artistas de igual manera, ya que el proyecto presentado por los senadores Pichetto y Giustiniani no incluye pautas administrativas para distribuir lo recaudado entre los artistas y desincentiva el consumo de la tecnología afectada debido a los altos costos.

¿Por qué no deberia aprobarse?

Porque va en contra un derecho básico al hacer una presunción de culpabilidad, cuando en realidad la Constitución nos asegura a todos el derecho a la inocencia.

El proyecto aumenta la brecha digital y cultural, dificultando, aún más el acceso a medios de almacenamiento a personas de bajo recursos.

No pone en consideración a las instituciones educativas, ni al proyecto Conectar Igualdad. Una ley muy similar fue declarada inconstitucional y derogada por el Tribunal de Justicia de la Unión Europea. Esta ley que ya se había implementado en varios países de Europa no cumplió con los objetivos que justificaron su aprobación.

Más información

La Fundación Vía Libre está siguiendo esto al detalle, les recomiendo leer los posts relativos a este tema.

Comentarios Imprimir

Distribuyendo un programa hecho en Python

Más que un análisis completo de las tecnologías para permitir la distribución de programas hechos en Python, este post es casi una receta o colección de anotaciones para seguir un camino. Y es que es un camino que no me fué fácil recorrer, porque la mayoría de los mecanismos para distribuir código Python están pensadas para distribuir bibliotecas hechas en este lenguaje, y no programas.

¿Dónde está la diferencia? En dónde van las cosas.

Antes de seguir: para todo el armado usé distutils, que es lo que está en la biblioteca estándar. Le pegué una mirada a otras cosas como setuptools, distribute, etc, pero todas (aunque son más aptas para cosas más complejas) no me solucionaban el problema básico y me complicaban un poco la vida en otros aspectos.

¿Dónde van las cosas?

Volviendo a el lugar en dónde se instala el código Python... si uno quiere distribuir una biblioteca, la respuesta es sencilla: en el directorio de bibliotecas de Python de tu sistema. ¿En dónde particularmente? Bueno, depende de tu sistema; incluso en Linux esto fue cambiando y no es el mismo lugar siempre. En mi máquina tengo /usr/lib/python2.6/dist-packages/, que en parte apunta a /usr/share/pyshared/.

Igual, no importa la ubicación exacta: usando distutils (u otras alternativas) las bibliotecas van a parar al lugar correcto sin mayor esfuerzo.

¿Pero qué pasa si no es una biblioteca sino un programa? El primer detalle es que necesitamos un ejecutable que arranque nuestro programa. Distutils y amigos tienen esto bastante bien manejado, se les puede especificar un script, y terminan instalando todo de la siguiente manera:

script -> /usr/bin/</span>
todo el resto /usr/lib/python2.6/dist-packages/ (o similar)

Hasta acá todo bien, ¿no? No. Resulta que nuestro programa tiene imágenes, archivos de audio, etc, y está "mal visto" meter esos archivos "de datos" dentro del directorio de bibliotecas de Python. Entonces, lo que recomiendan por ahí es:

script -> /usr/bin/
archivos de datos -> /usr/share/
código python -> /usr/lib/python2.6/dist-packages/ (o similar)

Esto ya no es tan fácil de lograr, porque la distribución de archivos de datos es como un parche en los sistemas de distribución de bibliotecas.

Además, si nos vamos a poner quisquillosos de no meter archivos de datos en el directorio de bibliotecas, yo pregunto: ¿por qué meter código de nuestro programa, que no es una biblioteca, en el directorio de bibliotecas?

Entonces me embarqué en el siguiente capricho: quería que la distribución de mi programa vaya a parar a:

script -> /usr/bin/ todo el resto -> /usr/share/

Los archivos de datos, por supuesto, mezclados con "todo el resto".

Estructura de nuestro programa

Primero lo primero, ¿cómo organizamos nuestro proyecto? Yo tengo lo siguiente (simplificado, pueden ver toda la estructura en los archivos del proyecto Encuentro):

  • un directorio 'bin' donde tengo el script que arranca todo:

    bin/encuentro
    

esto es un archivo ejecutable que no hace mucho más que jugar un poco con los directorios y el sys.path para que se encuentre al resto del código Python de nuestro programa (en dos situaciones: cuando ejecutamos bin/encuentro desde el repositorio mientras estamos desarrollando, y cuando está instalado finalmente en el sistema), e inicializar alguna estructura básica y arrancarla, para que comience nuestro programa.

  • un directorio con el nombre de nuestro proyecto, con el resto del programa:

    encuentro/__init__.py
    encuentro/main.py
    encuentro/network.py
    
  • directorios con los archivos de datos, adentro de nuestro proyecto (no por separado), en este caso:

    encuentro/ui/main.glade
    encuentro/ui/preferences.glade
    encuentro/ui/update.glade
    

Una vez aclarado eso, quedan dos preguntas sencillas y una complicada por contestar: las sencillas son ¿cómo el script encuentra al resto del programa instalado? y ¿cómo accedemos a los archivos de datos desde nuestro código?.

La primera es usando una variable que se inyecta en el script en el momento de instalar el programa (ver más abajo el cuándo hacemos eso en setup.py).

La segunda es accediendo a los archivos de forma relativa al código. Yo tengo esto al principio del programa:

BASEDIR = os.path.dirname(__file__)

y luego hago cosas como:

data_file = os.path.join(BASEDIR, 'ui', 'preferences.glade')

Finalmente, la pregunta complicada: ¿cómo hacemos para que todo esto funcione?

Distribuyendo programas

En realidad, la respuesta no es tan complicada una vez que está resuelto (como tantas cosas en la vida).

Para incluir todos los archivos, en el setup.py, en la llamada a setup() hay que poner:

packages = ["encuentro"],
package_data = {"encuentro": ["ui/*.glade"]},
scripts = ["bin/encuentro"],

Fíjense como ahí declaro el paquete donde está mi programa, el script, y los archivos de datos. Pero hay un bug, hasta en Python 2.6 inclusive, que hace que para meter los archivos de datos con eso sólo no alcanza, y hay que declararlos también en el MANIFEST.in:

include encuentro/ui/*.glade

Para que todos estos archivos vayan a parar al lugar correcto, hay que hacer algo específico: una clase que acomoda cosas en el proceso de instalación. Pueden ver el detalle de esa clase en el setup.py de Encuentro, pero basicamente hace dos cosas:

  • Construye un directorio donde va a quedar todo con el prefijo indicado, "share" y el nombre del proyecto, y autocorrije el directorio de instalación con eso.
  • Guarda ese directorio de instalación nuevo en los scripts declarados, usando una cadena especial como bandera, de manera que al quedar el script instalado sabe dónde buscar el programa entero.

(importante: no olvidar declarar en la llamada a setup() a esta nueva clase como la clase que será usada para instalar!)

Finalmente, está bueno probar que todo funca bien. Las pruebas que yo hice fue crear el .tar.gz con python setup.py sdist, descomprimirlo en otro lado que nada que ver y hacer python setup.py install --prefix=/tmp (para que se instale en /tmp y probarlo ahí adentro) y también sudo python setup.py install (para que se instale en el sistema y probarlo así).

También, luego de hacer todo el proceso de packaging, cuando pbuilder me dejó el .deb, lo descomprimo y veo que la estructura está correcta y que la variable reemplazada en el script tiene el valor que debería; igual, la prueba de fuego con el .deb es instalarlo con dpkg -i y probar el programa.

Nota final: ahora me falta armar un .exe para que se pueda ejecutar en Windows, pero eso será otro post.

Comentarios Imprimir

Laburando en UK

La semana pasada la pasé en Londres, en un sprint de todo Online Services. Estuvo muy bueno, porque es en estos eventos donde vemos a nivel de estrategia en dónde estamos, qué vamos a hacer los próximos meses, prioridades, etc.

También está copado poder ver cara a cara e interactuar (trabajando o tomando una cerveza) con los compañeros de trabajo, que normalmente están del otro lado del chat.

Obviamente, la mayor parte de lo que vimos y escuchamos ahí es confidencial, pero les aseguro que Ubuntu One va a rocanrolear de formas muy interesantes en los próximos meses...

Otra actividad que se hace en este tipo de reunión general es algo para "integrar el grupo"... el año pasado resolvimos unos acertijos que implicaban pasear por Londres, pero este año fue distinto: fuimos a una Escuela de Cocina donde guiados por los chefs/profesores hicimos pizzas entre todos (pizzas que luego, por supuesto, nos comimos nosotros mismos).

Ingredientes

La verdad es que estuvo muy muy bueno el evento... no sólo porque las pizzas estaban ricas, sino porque la onda del lugar y de la gente era genial. Encima, a mí me tocó como chef a Anna Venturi, dueña del lugar y autora de un texto que estaba tipo cuadrito en una de las paredes del lugar:

Venturi's table - la filosofía atrás del negocio

Si alguna vez me ponía de mal humor - lo cual era frecuente en mi adolescencia - mi abuela hacía que la ayude a preparar la cena. Para cuando las albóndigas estaban hechas mi humor se había levantado y estábamos riendo juntas.

La cocina es un lugar donde se comparten secretos - tanto de la vida como del arte de cocinar. Las familias se juntan en las cocinas porque en ningún otro lado de la casa la gente se comunica tan abiertamente. Los problemas son cortados y diseccionados, las discusiones hierven y se evaporan, y las preocupaciones desaparecen. Desde muy joven aprendí que cocinar juntos es una gran manera de hablarse los unos a los otros. Podés intentar ponerte complicado en la cocina pero no lo lograrás.

Cocinar juntos es siempre una experiencia positiva. Crea una intimidad entre la gente que es muy difícil lograr en el día a día. Mi abuela me enseñó que cocinar no tiene que ser complicado. La clave son ingredientes de buena calidad y sabores simples. El cocinar es un acto creativo, casi infantil por momentos donde olvidamos nuestras preocupaciones y no tememos ensuciarnos las manos y experimentar. Mirar como la gente se transforma al preparar comida es lo que más disfruto. Es un proceso que nos lleva a una época en la que no nos importaba tener harina en el pelo o comer mezcla de torta directamente del bol.

Finalmente, el acto de preparar una comida juntos es una manera de dar algo a nuestra familia y amigos. Es un placer simple que es frecuentemente olvidado en nuestras ocupadas vidas. Comer juntos alrededor de una mesa me recuerda nuestra pequeña cocina en Vía Cappuccini o los veranos que pasé con mi familia en Riccione. La clave es compartir buena comida y crecer juntos como personas.

Anna Venturi

A nivel de viaje... no mucho, la verdad... los días de trabajo fueron intensos, y más allá del domingo y el sábado que paseamos un poco, el resto de las noches sólo fuimos a comer o a comprar algo para comer y cenábamos en la habitación. Salimos a comer tres veces en total... a un restaurant indio, a uno vietnamita y a un pub "muy local" para probar lo que allá llaman "fish and chips" (por lejos, la comida más floja de estas tres que dije):

Fish and chips

El clima estuvo mucho más feo que el año pasado (esta vez sí nos tocó el típico clima de Londres), tuvimos algunas lloviznas mientras paseábamos, y el domingo volvimos empapados al hotel. Pero si de clima se trata, lo complicado fue volver a Argentina, por las cenizas del volcán Puyehue. Por suerte, justo se corrieron para que podamos volver la mayoría... los vuelos anteriores fueron cancelados, y los posteriores también (tengo compañeros de trabajo que recién pudieron volver hoy...).

Las fotos de todo, acá.

Comentarios Imprimir

Inflación

Dos datos con respecto a la inflación en Argentina.

El primero es sencillo: lo que me cobra el Automovil Club Argentino por mes por la cobertura para auxilios mecánicos y etcéteras, desde octubre 2005 hasta la fecha (mismo servicio sobre el mismo auto):

Curva ACA

El segundo es más complicado. Desde hace un tiempo que compro carne y derivados en la misma carnicería (Chalin, en Mataderos: es buena carne, relativamente barata, y me la mandan a casa). Desde hace poco más de un año guardo los tickets que te dan al comprar (donde indican el corte, el precio y el peso, todo muy transparente).

Con esta info quise hacer también algo que indique los "aumentos de la carne", pero al haber tantos cortes distintos, y al no siempre comprar los mismos cortes, la curva quedaba un enchastre. Entonces lo que hice fue calcular cuanto aumentó cada corte con respecto a la primera vez que lo compré, y luego unificar en cada fecha de compra todos los aumentos de los distintos cortes.

El resultado es el gráfico siguiente, donde se ve el aumento sufrido con respecto a la compra anterior:

Aumento carne

Todos los números crudos en esta planilla de cálculos.

Comentarios Imprimir