Facundo Batista: Python y el manejo de dependencias


(there is an English version of this post, here)

Python tiene una biblioteca estándar muy extensa ("viene con las pilas incluídas"), pero es frecuente la necesidad de usar otros módulos que están afuera de la misma, casi siempre desde el Índice de Paquetes de Python (PyPI).

La manera original de instalar esos módulos es a "nivel de sistema" (sudo pip install foobar), en el sistema operativo de forma general, habilitándolos para ser utilizados por cualquier programa que se ejecute.

Más allá de necesitar permisos de root o administrador para instalar las dependencias de esta manera, el primer problema con el que nos encontramos es el de conflictos: el caso típico de dos programas que necesitan la misma dependencia pero en versiones distintas, lo cual no puede lograrse al instalar las dependencias en forma global.

Por eso es que es tan normal en el mundo de Python usar "entornos virtuales". Se crea un entorno virtual para cada programa, se instala las dependencias necesarias para cada programa en cada entorno virtual, y como lo que instalamos en ese entorno es sólo accesible desde dentro del entorno, no hay más conflictos.

En este punto, sin embargo, aparece el problema de la administración de los entornos virtuales: crearlos, instalarles cosas, activarlos para usarlos con cada programa y desactivarlos luego, recordar los nombres de cada entorno para cada programa, etc.

Para automatizar esto nació fades.

fades les permite utilizar todo el poder de los entornos virtuales sin tener que preocuparse por ellos.

¿Quieren ejecutar un script que necesita la dependencia foobar?

    fades -d foobar script.py

¿Quieren un intérprete interactivo teniendo foobar instalado como dependencia?

    fades -d foobar

¿Necesitan ejecutar el script pero con varias dependencias, alguna en una versión específica?

    fades -d foo -d bar -d baz==1.1 script.py

¿Tienen todas las dependencias en un archivo de requerimientos?

    fades -r requirements.txt script.py

Esto es sólo lo más sencillo que podés hacer con fades. Los entornos virtuales son una herramienta poderosísima, y automatizar y simplificar su uso hace que fades tenga bastantes opciones, algunas que usarán todos los días, y otras que les van a resultar muy útiles en casos puntuales.

Empiecen a usar fades de a poco (acá tienen toda la documentación) y van a encontrar que van a tener resuelto el tema de la administración de dependencias en programas y scripts, usando entornos virtuales pero sin la complejidad de tener que hacerlo directamente y a mano.

GiLgAmEzH: Regalo estos libros

Hoy me puse a ordenar/tirar papeles. Esta vez le tocó a mis cosas de estudio. Tiré un montón de libros, tuve que darle rosca de lo lindo a la destructora de papel, me divertí con diagramas de diseño, apuntes y cosas viejas y tengo un montón de libros para regalar.

OJO leer bien, son casi todos impresos en laser o fotocopias

  • Managing and Maintaining a MS Windows server 2003 environment.
  • Administering a MS SQL Server 2000. (estos dos estoy pensando en tirarlos directamente)
  • Access 2000 (para IBM y compatibles). Carlos Boqué. (que feo!!)
  • Manual de administración de Windows 2000 server de Compumagazine.

Estos ya encontraron nuevo dueño: UPDATE: 17/2/2015

  • Dictadura del diseño. Notas para estudiantes molestos. Carlos Carpintero.
  • Thinking in java (fouth edition), Bruce Eckel. tomos 1 y 2 (enormes).
  • Python para todos. Raúl González Duque.
  • Object oriented Analysis and Desing with applications, third edition. Boch, jacobson, Rumbaugh.
  • Probabilidad y estadística aplicadas a la ingenieria. Douglas Montgomery.
  • Estructura y diseño de computadores. David A. Patterson, John L Hennessy.
  • Métodos orientados a objetos: consideraciones prácticas. James Marin, James J Odell.
  • Matemáticas Discretas, cuarta edición. Richard Johnsonbaugh.

Creo que los de MS van a ir a la basura como corresponde ;)

Estoy a punto de directamente tirarlos. Pero tal vez alguno sirve y tal vez hay algún que otro caso raro que quiere uno de esos. Por ejemplo los de MS serían unas excelentes patas de cama.

Todos excepto los de MS son fotocopias. Si te interesa alguno escribime a mail at gilgamezh.me.

ramen!

Juanjo Conti: Estoy trabajando para imprimir un nuevo libro de cuentos

El título es Carne de los dioses, como uno de los cuentos. Y esta es la primera versión de la tapa:

carne_de_los_dioses.thumbnail.jpg

Algunos cuentos que va a incluir:

  • El viajero del cielo
  • El primer romántico
  • Carne de los dioses
  • El restaurador
  • El asado de los Reyes (no se sabe)
  • Los Lavalle Menéndez (no se sabe)
  • Fanáticos del matecocido (no se sabe)
  • La maravillosa vida de Henry Dijkstra

Pueden reservar un ejemplar dejando un comentario!

Manuel Kaufmann (Humitos): Crear lista de thumbnails bonitas

Tenía ganas de cambiar la presentación de los artículos de la sección de prensa en el sitio de "Argentina en Python" ya que eran simplemente una lista con la fecha y los links a la página y se veía horrible.

Esto tenía dos objetivos claros:

  1. Que se vea bonito, claro
  2. Tener un backup en imágenes de los sitios donde salió la nota

¿Qué pasa? Muchas veces esos sitios, blogs, links, lo que fuere; se caen o cualquier cosa y yo pierdo un material que para mí es importante. Entonces, quería tener una imagen completa del sitio web en dónde salió publicado. Para esto utilicé la extensión Full Page Screen Capture en cada uno de los sitios web.

Luego necesitaba hacer un thumbnail pequeño, pero que también se note algo de lo que era el sitio web. Aquí robé la idea de la presentación del sitio web de donaciones de Joac que no muestra el sitio web completo, sino solo la primera parte. Para hacer resize y cortar la imágen utilicé, obviamente, convert de ImageMagick:

for F in `ls *.png`; do {
    convert -resize 340x -crop 340x255+0 ${F} `basename ${F} .png`-340x255.png
}; done

Ese comando achica la imagen a 340px de ancho y a su correpondiente de alto, manteniendo el aspecto. Además, luego la corta a 340px x 255px y guarda el resultado con el mismo nombre que el archivo original pero le agrega -340x255 antes del .png

Una vez que tenía esto, utilicé el plugin meta_template de Nikola que hice hace unos días para incrustar los divs de Bootstrap3 como deseaba. Este es el template que utilicé:

<div class="col-md-4 col-sm-6 col-xs-12" style="min-height: 435px;">
 <div class="thumbnail">
   <a href="${href}">
    <img src="${src}" style="width: 340px; height: 255px;">
   </a>
   <div class="caption">
    <h3><strong>${title|h}</strong></h3>
    <p>${description}</p>
   </div>
 </div>
</div>

Y luego, dentro de mi archivo .rst de la página de Nikola:

.. template:: prensa-image
   :title: Blog de La Nación
   :description: Sexto encuentro nacional de Python Argentina
   :src: 2014_noviembre_1-340x255.png
   :href: http://blogs.lanacion.com.ar/data/argentina/sexto-encuentro-nacional-de-python-argentina/

El resultado en vivo: http://argentinaenpython.com.ar/historia/prensa/

prensa-section.thumbnail.png

Sección de prensa de Argentina en Python

Facundo Batista: Regalo de año nuevo: Encuentro 4.0


Para arrancar el año pum para arriba, ¿qué mejor que una nueva versión de Encuentro?

Lo más destacado de esta nueva versión es que hay dos backends nuevos!

Por un lado, ahora se puede descargar de Contenidos Digitales Abiertos (también conocido como CDA), con casi 4000 episodios de centenares de documentales y series para mirar.

Por otro lado, trae más de 180 charlas TED del capítulo TEDx de Buenos Aires (que incluye TEDxBuenosAires, TEDxRíodelaPlata, TEDxJoven, y un par más).

Encuentro

También tiene varias mejoras importantes, como que se limpian los nombres de archivos para que puedan ser grabados en cualquier lado (pen drives, fat32, etc), o que rearmé el esquema de downloads y ahora es mucho mucho más robusto que antes. E incluso estuve mejorando los scrappers para backends que ya estaban incluidos en versiones anteriores, pero ahora tendrán mejores títulos, nombres más prolijos, etc.

Y claro, varias correcciones menores también, y seguramente algún par de bugs nuevos :p.

Las instrucciones para bajar Encuentro en tu sistema (Debian, Ubuntu, Arch, Windows, o cualquier otro sistema), junto con el detalle de los cambios, instrucciones, y todo eso, en la página del proyecto.

¡Disfruten!

Manuel Kaufmann (Humitos): Todo vuelve a empezar, un escalón arriba

El 2016 me agarró en Huacho, Perú. Una ciudad que particularmente no tiene nada, pero fue la primera ciudad tranquila que encontramos luego de pasar Lima camino hacia el norte -nuestro norte: Ecuador. Decidimos quedarnos aquí una noche para ver si al día siguiente encontrábamos algo mejor o bien la posibilidad de trabajar un poco.

Por esas cosas de la vida, al día siguiente cuando nos estábamos yendo, se nos acerca un señor y nos ofrece una tarjeta de su hospedaje que quedaba retirado de la ciudad. "Sí o sí tenemos que ir a verlo antes de irnos" -dije. Y así fue. Fuimos al lugar era excelente, pero seguro que el precio era algo que no podíamos pagar. Johanna, sin pelos en la lengua, negoció el precio hasta conseguirlo por USD 4 la noche. ¡Es una genia!

Este año nuevo me agarra tomando Bacardí con Maracuyá en Perú. Maracuyá, una fruta que en mi vida había probado en un país que nunca había estado. Sonidos, rostros y culturas nuevas todo el tiempo. Conociendo y creciendo. Superando expectativas y hasta incluso mis propios sueños. Siendo feliz, pero raro.

Una felicidad incómoda, a veces. Una felicidad en la que mucha gente está colaborando para que se manifieste como tal. Una felicidad que la conseguí gracias a todo el apoyo de las diferentes comunidades de software libre y programación que he recibido durante los últimos 2 años de viajes, locuras, accidentes y descuidos. De sueños incumplibles e increíbles hechos realidad. De la confianza 0 en mi proyecto al "nos gustaría que vengas a dar una charla a nuestra ciudad". ¿Qué hice? ¿Cómo logré estar hoy aquí en Perú? ¿Qué sigue? Son preguntas que me hago día a día.

A veces creo que estoy cambiando el mundo. Seguido de un "¿me la estoy creyendo?", que termina en un: "bueno, al menos lo estoy intentando y, no sé si el mundo, pero algunas cosas de mi entorno logré cambiar", con lo que normalmente me quedo conforme y me hace dejar de pensar profundamente en eso. También tengo miedo. Miedo de defraudar a toda esa gente que ha pagado por mi felicidad. Esa gente a la que no entiendo qué le estoy brindando a cambio, pero me apoya. Su apoyo permite que me siga divirtiendo; permite que lleguemos a más lugares. Lugares desolados tecnológicamente, pero con un hambre de aprendizaje muy diferentes a los lugares donde "lo tienen todo".

Así me agarra el 2016; con ganas de seguir creciendo. Entender qué está sucediendo alrededor nuestro. Con una compañera de viaje excelente -otro sueño hecho realidad. Muchas veces recuerdo y me transporto al primer año de viaje solitario, a esos momentos de melancolía donde me la pasaba llorando y trataba de salir adelante porque confiaba en que, como decía antes, de alguna manera estaba cambiando el mundo -aunque no lo creía al 100%, pero tenía ganas de averiguarlo. Me transporto a Villa Tulumba, Córdoba, donde pasé uno de los peores momentos del viaje. Donde me auto-llevé al hospital y tenía miedo. Miedo de no poder seguir adelante. Me insultaba a mí mismo por haber cometido un error en la ruta.

Hoy, todo es muy diferente. Tener un compañero de viaje me ha hecho crecer mucho como persona y también profesionalmente. Miro los números de las cosas que han sucedido en 2015 y no lo creo. Leo los diarios, blog post, entrevistas de televisión y no creo que somos nosotros. Que somos ustedes. Que todo esto es Python Argentina. 2016, el año en el que cumpliré 10 años desde que me suscribí a la lista de esta comunidad. Yo tenía 20 y estaba con ganas de comerme el mundo. Viajaba a las reuniones de PyAr en Buenos Aires para sentarme al lado de mis ídolos y temblar, sin poder hablarles. A algunos de ellos recién les pude hablar, de forma tranquila, el año pasado...

Date: Sat, 10 Jun 2006 00:55:26 -0300

Hola a todos, bueno acá va mi hola mundo, soy muuuyyy nuevo en este
lenguaje... Empecé hace una semana, luego de haber concurrido a la
1er Jornada de Python en Santa Fe que de hecho estuvo muy buena.
Espero que este bien hecho mi Hola Mundo!!! ja

print "Hola mundo"

Esos tipos, esta comunidad, me lo dió todo: su tiempo. Tiempo que se multiplicó. Tiempo que estoy intentando devolver, re-invertir y tratar de que se multiplique en otros. Tiempo que me llevó a hablar diréctamente con la Python Software Foundation y poder explicarles qué es lo que quería hacer: ¿cómo transmitís que te querés ir de viaje en tu auto y organizar talleres "por ahí"? Y encima, les querés pedir plata...

No way!

2 años de cosas increíbles. Que no tienen explicación pero que así y todo quiero encontrar la forma de trasmitirles que cualquier idea por más loca que te parezca, estoy seguro que la vas a poder conseguir. No sé cómo, pero no hay que darse por vencido. 2 años en los que visité 7 países gracias al poder de una comunidad de programadores. Gracias a la confianza plena en la persona ajena. Eso, ¿cómo te explico que hoy en el año 2016 podés confiar en un desconocido? Y, encima, ¡es maravilloso!

¿Cómo te explico, yo, que he tenido miedo muchísimas veces, que no hay porqué temer? Las probabilidades de que te pase algo malo son bajísimas, pero ahí están. Y asustan. Sin embargo, hay un "algo" que te alarma y te aleja del peligro. No sé, el tono de voz de la persona con la que estás hablando. La brisa del momento que te provocó frío y malestar y decidiste irte de ese lugar. El perro que ladró en el momento en el que te estaban ofreciendo alojamiento. La casa al lado de un parque abandonado un día de lluvia...

No hay que tenerle miedo al miedo.

Hoy es 1 de Enero de 2016. El 9 de Enero tenemos un taller de Django Girls en Lima, el 23 en Piura, el 16 de Febrero viajo a República Dominicana a la PyCaribbean y el 5 de Marzo hacemos un PyDay en Chiclayo y... ¡Quiero más! No me alcanza el tiempo y, ¡quiero más! Creo que puedo dar más. ¡Quiero más gente en este equipo! La experiencia con Johanna ha traido un crecimiento exponencial. ¡No me quiero ni imaginar lo que se podría lograr si sumamos a otra persona!

¡Quiero Argentinas en Python por todo el mundo! ¡Quiero que el próximo mes organices un evento de Python en tu ciudad! Quiero que nos preguntes si te podemos ayudar a organizarlo. Quiero que compartas lo que sabes, del tema que sea, en el ambiente que sea y de la forma que sea. La ciencia y el mundo se crea compartiendo el conocimiento. No te vas a arrepentir :)

Manuel Kaufmann (Humitos): Corregir fechas de fotos con jhead

Una de las peores cosas que te puede pasar en la vida es que te olvides de setear la fecha en la cámara de fotos antes de comenzar a tomarlas. Bueno, en realidad no es tan grave, pero cuando el error lo comete otro hay que hacérselo saber de la forma que más lo impacte para que no lo vuelva a cometer :D

La cuestión es que sacamos fotos con varias cámaras de fotos en el taller de Django Girls Mendoza y luego, a la hora de mostrarlas, está bueno que estén ordenadas de forma ascendente de la primera que se tomó hasta la última intercalando las diferentes cámaras. Esto te permite ver cómo fue evolucionando el evento y desde diferentes puntos de vistas (los distintos camarógrafos).

Dicho de otra forma, lo que evitamos es comenzar viendo el evento por el almuerzo, luego el desayuno y finalmente la foto de cierre siguiendo de cuando inició la charla por la mañana temprano. ¿Se entiende? Claro, es un quilombo para seguirlo.

Para resolver esto, utilicé jhead que te permite manipular la información EXIF de las fotos de una manera sencilla:

sudo apt-get install jhead

Una vez instalado, me vastó con el leer el manpage: man jhead y algunos argumentos. Finalmente terminé utilizando estos dos comandos.

jhead -ds2015:11:12 DSCF*.JPG
jhead -ta+2:00 DSCF*.JPG
-ds: Sets the date stored in the Exif header to what is specified on the command line.
-ta: Adjust time stored in the Exif header by h:mm forwards or backwards.

El primer comando le indica que la fecha de todas las fotos es el 12 de Noviembre de 2015 (cuando fue el taller) y el segundo comando le dice que sume 2 horas a la fecha de cada una de las fotos. Ese número de 2 horas lo deduje mirando las fotos que habíamos tomado con la cámara que no tenía correctamente seteada la fecha y comparándolas con una que sí: mi celular.

Si leiste este post antes de las fiestas, vas a configurar correctamente la fecha de la cámara antes de empezar a tomar fotos. Y sino, vas a llegar aquí gracias a Google cuando estés desesperado por querer organizarlas de forma cronológica.

¡Salud!

Juanjo Conti: Goodreads review: Furgón (Ariel Bermani)

Me gustó como está escrito. Me gustó que sea cortito.
La primer mitad es como costumbrista/urbano. En la segunda intenta tener un toque como fantástico o místico pero me parece que se queda corto. O me quedo corto yo como lector, me quedé con la sensación de que está hablando de un acontecimiento real que no menciona (un accidente?), algo a lo que hace alusión pero yo no llego a comprender.
De paso, ya que estoy en exigente: no me gustó la parte mística/espiritual del personaje Mariana.

Rating: 2/5

Original: https://www.goodreads.com/review/show/1487214624

Manuel Kaufmann (Humitos): Crear mosaico de fotos

En estos días he estado preparando la charla de Argentina en Python que voy a dar en @PyCaribbean en Febrero de 2016. En uno de los slides quería agredecer el apoyo que hemos recibido de toda la comunidad y para eso se me ocurrió poner una foto de un mosaico de todas las fotitos de perfiles de los seguidores de la cuenta @argenpython de Twitter.

Entonces, me puse a trabajar en eso.

Primero, busqué un script que había venido utilizando cuando estaba buscando herramientas para crear YourReminder (un programador de tuits automáticos) para obtener todos los seguidores de una cuenta en particular. Usé la biblioteca twitter:

twitter-follow --oauth argenpython > "argenpython.followers.txt"

Eso me dejó un archivo de la pinta:

b'thehandro'
b'raviol'
b'AlvaroAnguix'
b'rddebona'
b'kragen'
...

Luego, quería buscar todas las fotos de perfil de los usuarios que aparecen en ese txt. Para eso me hice este pequeño script en Python que accede a todas las urls de esos usuarios e imprime el link a la foto en la pantalla:

import re
import sys
import requests  # fades
from bs4 import BeautifulSoup  # fades

for user in open(sys.argv[1], 'r').readlines():
    url = 'http://twitter.com/{}'.format(user[2:-1])
    data = requests.get(url).content
    soup = BeautifulSoup(data)
    img = soup.find('img', {'class': 'ProfileAvatar-image'})
    print(img.get('src'))

Ejecutamos (obvio, con fades!):

$ fades get_twitter_profile_pics.py argenpython.followers.txt

https://pbs.twimg.com/profile_images/673314332340539393/lSKlxZ7r_400x400.jpg
https://pbs.twimg.com/profile_images/378800000304367652/2fb693020239400ff0062b15034890e3_400x400.jpeg
https://pbs.twimg.com/profile_images/676336395141672960/mB8x63HP_400x400.png
...

Ahora, teniendo todas las urls de las fotos de los perfiles, solo me quedaba bajarlas y hacer el mosaico. Mientras hacía este script de Python ya había preguntado por Twitter como hacer el mosaico y había obtenido una respuesta muy acertada a la cual finalmente modifiqué un poquito y fue lo que terminé usando.

Para bajar las fotos tenía dos caminos. Escribir algo en Python y lidiar programando, o pasarle toda esta basura a quien más sabe del tema: wget

fades get_twitter_profile_pics.py argenpython.followers.txt | xargs wget -c

Mientras esperaba que se bajen todas las fotos, me puse a leer las respuestas de Twitter y leer la documentación de convert y montage para finalmente terminar utilizando montage de esta forma:

montage ./*.{jpg,JPG,jpeg,png,gif} -tile 35x -geometry 96x96+0+0 -quality 90 ahlapelotita.jpg

Eso, finalmente, me llevó al resultado que necesitaba:

ahlapelotita.thumbnail.jpg

Mosaico de imágenes de perfiles de los seguidores de @argenpython

Y eso, ¡gracias a todos ustedes por el aguante!