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!

Marcos Dione: quilt-instead-git-for-maintaining-forks

Ever since I started working in Elevation I faced the problem that it's mostly a openstreetmap-carto fork. This means that each time osm-carto has new changes, I have to adapt mine. We all know this is not an easy task.

My first approach was to turn to osm-carto's VCS, namely, git. The idea was to keep a branch with my version, then pull from time to time, and merge the latest released version into my branch, never merging mine into master, just in case I decided to do some modifications that could benefit osm-carto too. In that case, I would work on my branch, make a commit there, then cherry pick it into master, push to my fork in GitHub, make a Pull Request and voilà.

All this theory is nice, but in practice it doesn't quite work. Every time I tried to merge the release into my local branch, I got several conflicts, not to mention modifications that made some of my changes obsolete or at least forcing me to refactor them in the new code (this is the developer in me talking, you see...). While I resolved these conflicts and refactorings, the working copy's state was a complete mess, forcing me to fix them all just to be able to render again.

As this was not a very smooth workflow, I tried another approach: keeping my local modifications in a big patch. This of course had the same and other problems that the previous approach, so I gained nothing but more headaches.

Then I thought: who else manages forks, and at a massive scale? Linux distributions. See, distros have to patch the packaged software to compile on their environments. They also keep security patches that also are sent upstream for inclusion. Once a patch is accepted upstream, they can drop their local patch. This sounds almost exactly the workflow I want for Elevation.

And what do they use for managing the patches? quilt. This tool is heavily used in the Debian distro and is maintained by someone working at SuSE. Its documentation is a little bit sparse, but the tool is very simple to use. You start doing quilt init just to create the directories and files that it will use to keep track of your changes.

The modification workflow is a little bit more complex that with git:

  1. You mark the beginning of a new patch with quilt new <patch_name>;
    1. Then either tell quilt to track the files you will modify for this patch with quilt add <file> ... (in fact it just needs to be told before you save the new version of each file, because it will save the current state of the file for producing the diff later),
    2. Or use quilt edit <file> to do both things at the same time (it will use $EDITOR for editing the file);
  2. Then do your changes;
  3. Check everything is ok (it compiles, passes tests, renders, whatever);
  4. And finally record the changes (in the form of a patch) with quilt refresh.

In fact, this last 4 items (add, edit, test, refresh) can be done multiple times and they will affect the current patch.

Why do I say current? Because quilt keeps a stack of patches, in what it calls a series. Every time you do quilt new a new patch is put on top of the stack, and in the series just behind the current patch; all the other commends affect the patch that is currently on top. You can 'move' through the series with quilt pop [<patch_name>] and quilt push [<patch_name>]. if a patch name is provided, it will pop/push all the intermediate patches in the series.

How does this help with my fork? It actually does not save me from conflicts and refactorings, it just makes these problems much easier to handle. My update workflow is the following (which non incidentally mimics the one Debian Developers and Maintainers do every time they update their packages):

  1. I quilt pop -a so I go back to the pristine version, with no modifications;
  2. I git pull to get the newest version, then git tag and git checkout <last_tag> (I just want to keep in sync with releases);
  3. quilt push -a will try to apply all the patches. If one fails, quilt stops and lets me check the situation.
    1. quilt push -f will try harder to apply the troubling patch; sometimes is just a matter of too many offset lines or too much fuzzyness needed.
    2. If it doesn't apply, a .rej wil be generated and you should pick up from there.
    3. In any case, once everything is up to date, I need to run quilt refresh and the patch will be updated[1].
    4. Then I try quilt push -a again.
    5. If a patch is no longer useful (because it was fixed upstream or because it doesn't make any sense), then I can simply quilt delete <patch>; this will remove it from the series, but the patch file will still exist (unless I use the option -r[2]).

As long as I keep my patches minimal, there are big chances that they will be easier to integrate into new releases. I can even keep track of the patches in my own branch without fearing having conflicts, and allowing me to independently provide fixes upstream.

Let's see how this works in the future; at least in a couple of months I will be rendering again. Meanwhile, I will be moving to a database update workflow that includes pulling diffs from geofabrik.


[1] Being an old timer VCS user (since cvs times), I wish they would call this command update.

[2] Why not --long-options?


elevation openstreetmap utils