Mariano Guerra: Making a GIF out of a folder of PNGs (plus resizing)

   Publicado:

I need to update the gif from the Event Fabric landing page and I forgot how I did it last time.

So this time I will write it here as a reminder.

First take the screenshots, I do it the good ol' way by using the browser fullscreen and hitting the screeshot key at almost regular intervals.

That leaves me with a set of screenshots I want to resize, so I run:

mogrify -path small -resize 800x450 *.png

Note

This requires imagemagick to be installed

This will resize all the *.png files in the current folder to 800x450 and write the results into a folder called small.

Now we go to the small folder and generate the gif:

cd small
convert -delay 100 -loop 0 *.png animation.gif

This will greate a gif that transitions every second from the png images and save it in the animation.gif file.

Mariano Draghi (cHagHi): Rearrancando...

   Publicado:
Restart, human!

Restart, human! por Anders Sandberg

Nueva casa, nueva tecnología, nuevo formato. Todo es nuevo. Menos el contenido, que está abandonado hace casi un año. Y que ya venía semi abandonado antes de eso.

Ya ni los ¿clásicos? posts sobre los viajes estoy haciendo. Hay por lo menos dos que no están acá. Y es una pena. Esto nunca fue muy popular, ni tuvo muchos lectores, pero siempre fue un buen ejercicio esto de escribir, y más de una vez fue interesante en lo personal volver para atrás y releer algunas cosas. Y eso que he escrito cada pelotudez... :p Pero nada, las pelotudeces también son interesantes. Es interesante ver como uno cambia, o como el mundo cambia, y contrastar lo que pensaba, sentía o vivía mi "yo" de hace X tiempo con mi "yo" actual.

Y cada tanto, cada muy tanto, hasta llegué a escribir algo que le sirvió a alguien. Y eso también está bueno.

¿Y por qué dejé de hacerlo? No se muy bien, pero en general siento que la culpa es de Facebook y Twitter. Es mucho más fácil escribir una gilada de 140 caracteres en Twitter o un par de párrafos en Facebook que ponerlo en un blog.


Para motivarme un poco, porque uno ante todo es nerd (?), decidí demoler el blog anterior y armarlo otra vez. Estoy usando Nikola, mascota de Roberto Alsina, que resulta que además de recomendar muy buenos libros, desarrolla muy buenos generadores de sitios estáticos ;-) (¡gracias Roberto!)

La principal ventaja para mi de haber migrado a Nikola es que ahora el contenido del blog está en archivos de texto, en un formato que es legible por un humano incluso sin la magia que lo transforma en páginas web.

La segunda ventaja es que está desarrollado en Python, que es un lenguaje de programación que me gusta hasta el infinito y más allá más que PHP (que es lo que usa WordPress), y que me resulta mucho más fácil de entender cuando necesito tocar algo, o agregar funcionalidad, o hacer modificaciones.

La tercer ventaja es que Nikola es minimalista. No tiene las decenas de características que tiene WordPress, ni sus miles y miles de plugins. Tiene lo que necesito. Es más simple. Y cuando uno no necesita la complejidad extra, "simple es mejor que complejo" [*].

Migrar de WordPress a Nikola es algo que es más o menos automático en un 75%, pero si sos obse como yo y realmente querés emprolijar las cosas, requiere luego una serie de ajustes que dependen de cuan horrible sea el formato heredado de WordPress. Para algunos de esos ajustes fui haciendo reemplazos semi-automáticos con distintas herramientas, para otros tuve que ir a mano (y para esos casos, que no fueron taaaaantos, agradecí no haber estado escribiendo con más frecuencia :p). En todo este proceso me vino de 10 la experiencia previa de Humitos.

Todavía tengo cosas que ajustar, como los tags y categorías, o hacer que el sitio tenga un look un poco menos genérico. Y otro gran tema es encontrar un mecanismo cómodo para poder publicar desde el celu/tablet, o una compu desde la que no tenga acceso al servidor. Esto es medio una desventaja común a todos los generadores de sitios estáticos. Hay varias opciones, pero todas requieren algún trabajillo extra, todas tienen algún pero, y va a requerir un poco más de tiempo evaluar que es lo que más me conviene.

Pero la base está...


Para terminar el revoleo, el blog no está más alojado en un hosting compartido. Me llevé todo a un VPS. Y eso también es toda una novedad, y en parte un desafío, porque tengo que administrar absolutamente todo yo. Es un arma de doble filo: puedo hacer lo que quiera en el servidor, y por lo tanto también puedo romper todo. Y tengo que tener un ojo puesto en todo lo que sea configuración, actualizaciones, seguridad, etc.

Al pasar a un VPS hay una cosa que estaba seguro que no quería administrar: las cuentas de correo de mi dominio. Administrar un servidor de correo propio es, para mi, "ligas mayores" (para hacerlo razonablemente bien), así que tuve que encontrar una solución, preferentemente gratuita. En una época la respuesta obvia a esto era Google Apps, pero no es más gratis. Por recomendación de Roberto (que además de recomendar buenos libros, y de desarrollar buenos generadores de sitios estáticos, hace buenas recomendaciones de servicios en la nube), el correo de mi dominio quedó en Zoho, que ofrece un plan gratuito que me alcanza y sobra.

Y acá estamos. Todo nuevito. Ahora solo falta escribir...


[*]El Zen de Python

Roberto Alsina: Some New Stuff in Nikola

   Publicado:

I did so­me qui­ck wo­rk on Niko­la (a sta­tic web­si­te/­blog ge­ne­ra­to­r) la­te­l­y, after a long ti­me, and he­re's what it wa­s:

Multilingual Sitemaps

So, site­maps are us­ed by Google to in­dex your si­te. It turns out that they can des­cri­be when the­re are se­ts of pa­ges ­that are trans­la­tions of ea­ch othe­r. So the next re­lea­se wi­ll do that (Is­sue #1610)

Matplotlib Plots

Ma­tplo­tlib co­mes wi­th a sphi­nx ex­ten­sion to do plo­ts So I went and im­ple­men­ted it, this was Is­sue #1242 and it's a plu­gin ca­lled py­plo­ts, whi­ch wi­ll be soon at http://­plu­gin­s.­ge­tniko­la.­co­m#­p­y­plo­ts

I hated the ori­gi­nal co­de. It felt con­vo­lute­d, and just weird (i­t's pro­ba­bly just me) so I wro­te it from scra­tch and it has so­me mi­nor di­ffe­ren­ce­s, but it's fair­ly com­pa­ti­ble.

Classy Images

The do­cu­tils ima­ge di­rec­ti­ve, for whate­ver rea­so­n, does­n't su­pport a cla­ss op­tio­n, so you need to do things like this:

.. class:: foo

.. image:: blah.png

Whi­ch is ... not pre­tty. So I did a ha­cky plu­gin that mo­nke­y­pa­tches the ima­ge di­rec­ti­ve to add that op­tio­n. ­The plu­gin is at http://­plu­gin­s.­ge­tniko­la.­co­m/#­cla­ss­y-i­ma­ges and this fixes Is­sue 1538

Mediawiki Markup

dj­b­cla­rk po­inted out that the­re is a li­bra­ry to par­se Me­diaWiki from py­thon ca­lle­d sm­c.­mw so I im­ple­men­ted a plu­gin to use it, so now you can use Me­diaWiki ­ma­rku­p. The plu­gin is at http://­plu­gin­s.­ge­tniko­la.­co­m/#­me­diawiki

Removed Default Swatch from Bootswatch

This was Is­sue #1656 and now you ha­ve to spe­ci­fy ­the swa­tch. This is a usa­bi­li­ty fix, be­cau­se de­faul­ts ma­tter.

Played with KaTeX

Niko­la su­ppor­ts ma­th using Ma­th­Ja­x. Ma­th­Jax has so­me in­te­res­ting qua­li­tie­s:

  • It's 160MB of co­de or so
  • It's not prac­ti­cal to use wi­thout a CDN
  • It's not prac­ti­cal to use we­ba­sset bund­les wi­th it

Then, klin­gtnet men­tio­ned so­me­thing ca­lled Ka­TeX I had ne­ver heard abou­t. I did a qui­ck ha­cky con­ver­sion to see how it wo­rks. ­Not do­ne ye­t, to­ta­lly ex­pe­ri­men­ta­l, but it may be po­s­si­ble to bund­le it, and ma­y­be even ha­ve it tur­ned on by de­faul­t, re­mo­ving the need for the ma­th­jax la­bel whi­ch is aw­ful usa­bi­li­ty-wi­se.

So­me of the­se things are mer­ge­d, so­me are sti­ll PR­s, so­me are in co­re, so­me are plu­gin­s. They we­re all pre­tty fun ­to do :-)

Juanjo Conti: Visita al dentista (video)

   Publicado:

La semana pasada leí en una presentación de libros de La Gota, en Uhlalá Café. Leí Visita al dentista, un cuento del libro La prueba del dulce de leche:

Otras lecturas de la noche: Madamme Cherry, Gonzalo, Alejandra, Adriana, Daiana.

Manuel Kaufmann (Humitos): ¡Nos compramos un robot!

   Publicado:

Ya lo dije, el PyDay Asunción fue éxito y hoy sigue dando sus frutos.

El Sábado pasado participamos (en realidad solo asistimos, porque no ayudamos en mucho -nada, diría yo) al "HACKÁra Asuka Guaraní" para hacer la traducción de Sugar al Guaraní. Esta idea se propuso en el PyDay de Asunción, y semanas más tarde se llevó adelante: ¡Felicitaciones a todos por eso!

Ahí, en el PyDay Asunción yo le compré un robot "RoDi" a Gary Servin (disertante en el PyDay) con la idea de armar algún curso introductorio a la programación para chicos utilizando Python. Sin embargo, no tenía ni idea de RoDi y no había tenido tiempo de probarlo hasta hoy que me puse a jugar un poco.

El robot sale USD 40 (lo cuál es muy barato). Entonces, estaría bueno ver de comprar 2 o 3 más para tener un promedio de 10 alumnos y que trabajen en equipos de 2 o 3. ¿Cómo lo ven?

rodi.thumbnail.jpg

El robot RoDi

La dinámica es sencilla. Te conectás por WiFi a RoDi y le hacés GETs HTTP a diferentes URLs para que haga diferentes cosas (este firmware lo realizó Martín Abente -otro crack y disertante del PyDay).

Todo bien con RoDi, con Gary y Martín, pero a mí me gusta Python y es lo que quiero enseñar :) . Así que me hice una API super sencilla utilizando requests para empezar a gestionar la idea loca de hacer un curso de Python + Robótica para chicos y ver cómo me va. En principio sería un juego, una aventura más que nada. Tengo algunas ideas en la cabeza, pero hay que meterle fichas y hacerla más tangible...

>>> import rodi
>>> robot = rodi.RoDi()
>>> robot.blink(1000)
>>> robot.move_forward()
>>> robot.move_left()
>>> robot.move_backward()
>>> # easy, ha?
...

Y aquí un video de prueba:

Manuel Kaufmann (Humitos): Argentina en Python cruza el atlántico

   Publicado:

Anoche recibí un mensaje de Facebook solamente con esta foto:

argenpython-france.thumbnail.jpg

Sticker de Argentina en Python en un auto de Francia

Esta calcomañía la llevó Mathieu Wildcath (un chico que conocí en Mendoza allá por el invierno del año pasado) a Francia su país natal, cuando regresó hace un par de meses.

¡Vamos, que de a poquito vamos a ir llegando a todo el mundo!

Manuel Kaufmann (Humitos): POIs en La Palma de Cervelló

   Publicado:

¡Qué lindo que es despertarse y recibir un mail tan alentador!

Hoy me escribió Konfrare Albert, desde una asociación muy pequeña de una población muy pequeña cercana a Barcelona (como lo describe él mismo) llamada Konfraria de la Vila del Pingüí:

Te escribo para informarte de que hemos conseguido que el
Ayuntamiento de nuestro pueblo se comprometa a utilizar
OpenStreetMap en su web, y empecé a intentar generarles un mapa
que aproveche el potencial de OpenStreetMap.

Me topé con tu página y me pareció genial, así que viendo que el
código tiene una licencia GPL me decidí a empezar a adaptarla a
nuestras necesidades. Todavía no he colgado el código en GitHub
pero sí, la idea es hacerlo.

Decime si esto no es un win-win. Yo hice el sitio web porque tenía una necesidad personal y la cubrí con esta página. Luego, lo publiqué y unos meses más tarde me escriben para decirme que se consiguió que el Ayuntamiento use OpenStreetMap en su web y que encima van a usar un software que escribí yo.

Aquí pueden visitar la adaptación que está haciendo Konfrare:

their-pois.thumbnail.jpg

Sitio web en Catalán que están usando en La Palma de Cervelló

my-pois.thumbnail.jpg

Sitio web original

¡Grosos estos pibes!

Nota

¡Además, aparezco en los agradecimientos en catalán! :)

Gran part del codi ha estat aprofitat de la pàgina creada per
Humitos (lloc web), i de la que en podeu trobar el codi a
GitHub sota una llicència GPL.

Facundo Batista: Mis lugares favoritos en el mapa

   Publicado:


Hace algunos años me empezó a pasar que leía (o me pasaban) recomendaciones de lugares para comer, tomar algo, jugar al pool, etc, y luego cuando estaba en la calle, no las recordaba y terminaba yendo a cualquier lado al azar.

Se me ocurrió empezar a registrar los lugares en un mapa. La solución que usé fue basada en Google Maps: en la interfaz web creé una capa mía, en la cual empecé a cargar todos esos lugares. Luego, en el teléfono, iba a Google Maps, le decía que me mostrara esa capa, y ahí tenía el mapa con muchas estrellitas (cada lugar que había cargado) y podía ver qué tenía cerca, o para donde iba, etc.

Con el tiempo, se empezó a complicar.

En un momento, Google decidió que la versión del teléfono de Maps no iba a mostrar más "custom layers" (o sea, las capas que creabas vos). En otras palabras, ¡no podía ver más mis datos! Esto lo solucioné instalando una versión vieja de Google Maps en el teléfono (lo cual no es sencillo de hacer, pero funcionaba). Más adelante, Google empezó a complicar el uso de las capas en la versión web también. Y hace algunos meses, dejó de servir esa información, con lo cual aunque en el teléfono tuviera una versión que pedía esas capas al servidor, el servidor no las contestaba.

Esta foto es vieja, pero me encanta

En paralelo, hace un par de años largos que quiero empezar a irme en lo posible de los servicios de Google, y en función de eso en los últimos meses empecé a usar los mapas de OpenStreetMap ("OSM"), por recomendaciones de Nico, Humitos y Marcos Dione. Desde mitad del año pasado también lo puse en el teléfono, mediante la gran aplicación OsmAnd primero, y desde hace un par de semanas con MAPS.ME (que es bastante más rápida al mostrar los datos, y creo que es mejor decidiendo dónde mostrarte los nombres de las calles, lo cual es importante).

La gran ventaja de OsmAnd y MAPS.ME es que usan los mapas de OpenStreetMap (que son mejores en su calidad que los de Google Maps, y además son abiertos y colaborativos), y que además lo usan de forma offline. O sea, te bajás los mapas que te interesan (por ejemplo, el de Argentina) cuando tenés una buena conexión de internet y luego el mapa está en tu teléfono, con lo cual no necesitás internet cuando estás en la calle para consultar estos datos.

Pero, aunque estaba contento con la solución de "mapas" en su forma genérica, me faltaba esto de "anotar mis lugares". Hasta que Humitos me recomendó umap, donde podés justamente crear capas de lugares arriba de los mapas de OpenStreetMap (hay una gran cantidad de sitios que utilizan los datos de OSM y dan servicios arriba de ellos, ejemplos que me pasó Humitos: su propio "puntos de interes", otro con fotos de ciudades, y uno donde la gente registra árboles frutales).

En ese sitio, entonces, creé mi mapa de lugares para ir de parranda (no volví a armarlo de cero, sino que importé lo que exporté previamente de google maps). Para llevar estos datos a mi teléfono, exporté un KML, me lo mandé por mail, y en el teléfono le dije que lo abra con el MAPS.ME.

Y listo, :)

Manuel Kaufmann (Humitos): #asadogeek 2015

   Publicado:

Como hace ya varios años, Facundo Batista viene organizando el #asadogeek. El #asadogeek es un evento que reúne a varios programadores argentinos del núcleo de amigos de Facundo (¡50 aproximadamente!) donde nos juntamos a comer un asadazo que hace él mismo utilizando una de las mejores técnicas que he visto en mi vida, y mientras tanto, cotorreamos como chimenteros profesionales sobre diferentes temas relacionados a Python, educación, programación, ciencias, tecnología y cualquier cosa que se te ocurra para un grupo de 50 geeks. ¡Hubo hasta charlas sobre cómo programar un satélite!

asado.thumbnail.jpg

LA carne...

Si bien este no es un evento oficial de PyAr, es uno de los eventos que más me gusta de PyAr :P . En esta reunión siempre me encuentro con gente añeja de PyAr que aprecio mucho y que además hace mucho tiempo que no veo (como Alecu, Joac, Lucio, Facundo, Leito, Karucha, Anthony, Lipe, Roberto, Diego, entre otros). También gente que conozco hace poco, como a @gilgamezh, pero con quién pegué onda de inmeadiato cuando lo conocí en la PyCon Argentina 2014 en Rafaela.

Además, siempre "conozco gente nueva" (o la re-encuentro perdida dentro de mi memoria) como a Manuel Carlevaro, con quien estuve hablando bastante sobre las ciencias y la burocracia de los papers.

quilombo.thumbnail.jpg

Parte de los asistentes al #asadogeek

En fin, es un evento que trato de no perderme ningún año. En esta oportunidad viajé de Asunción, Paraguay a Formosa, Argentina en auto y luego volé desde ahí hacia Buenos Aires para poder asistir. ¡Sí! Te aseguro que valió la pena. Más allá de las satisfacciones personales, también cuadré (diría mi amiga colombiana, @EllaQuimica) varias cosas con Héctor Sánchez para la SciPyLA de Posadas, Misiones y conseguí un montón de contactos de Bolivia y Perú para el proyecto Argentina en Python gracias a Lipe. Así que fue doblemente un éxito en todos los sentidos.

Para aprovechar la volada, coordiné con Facundo para poder llegar unos días antes del asado a su casa y así poder compartir algunos momentos con él y su familia. Jugamos con Felipe a un juego de mesa que es muy similar a Logo que está buenísimo (salvo que se complotaron entre padre e hijo para hacerme perder todas las veces) y hasta le leí un cuento. También programamos un poquito de Encuentro con Facundo mientras esperábamos en la carnicería a que nos atiendan:

python-carniceria.thumbnail.jpg

Programando en la cola de la carnicería

¡Muchas gracias Facundo Batista por hacer semenjante movida y organizar este asado año tras año!

Nota

Facundo Batista: Hay días en el laburo...

   Publicado:


Hay días en el laburo donde tenés que hacer un trabajo, lo planeás, te juntás con gente, se decide que cosas se van a hacer, se separa todo en tres o cuatro partes, hacés cada una (con tests y todo), todo bien, te hacen los review, entra en trunk, va a producción, todo muy lindo, mirás las métricas, suben y bajan como corresponde, y sos feliz.

Hay otros días en el laburo, donde empezás a ver algo y decís "esto no puede ser", empezás rastrear por qué está ese número ahí y te das cuenta que los logs tienen un problema, entonces lo querés contrastar con las métricas, y te das cuentas que en las métricas falta data, decidís cruzarlo con otro dato y te das cuenta que todavía no están sincronizados los archivos donde eso está, lo tenés que pedir y te tardan tres o cuatro horas en dartelo, y después cuando lo podés cruzar te das cuenta que deberías haber estado registrando algún otro número más, pero que no todo está perdido porque lo podés sacar de forma indirecta, hacés un script para parsear un quintillón de registros, te da un resultado más o menos coherente, pero todavía tenés que resolver como puede ser que el problema realmente esté sucediendo, mirás el código, te das cuenta que esa función está siendo llamada desde siete lados de los cuales solamente te acordabas tres, y de esos siete lados hay dos que no tenes datos de cómo están llamados... 

Está todo roto

En fin, la mayoría de las veces termina todo con un final feliz, pero realmente estás uno, dos o tres días rascándote grupalmente la cabeza con tus compañeros de trabajo hasta que se resuelve el acertijo.

Share