Liberando dos pequeñas utilidades

Desde que empecé a trabajar en Canonical (hace más de diez años) fuí recorriendo distintas "grandes etapas".

Una de ellas fue la aventura del "teléfono Ubuntu", en la cual mi participación era en el equipo con el que armamos una determinada infrastructura en la nube para dar soporte a programejos que corrían en el teléfono (que se llamaban scopes).

Parte de esa infrastructura era más o menos aburrida: sólo éramos un pasamanos de otros servicios, como por ejemplo en el caso del clima (como podrán imaginar, no predecíamos el clima nosotros, sino que usábamos The Weather Channel (si recuerdo correctamente)).

Pero había una parte de esa infrastructura que fue fascinante construir: eso que llamábamos "scopes scope", que era basicamente darle soporte a un "buscador genérico" que había en el teléfono. Estaba buena porque vos podías buscar algo y nosotros inferíamos un montón de eso, y te dábamos información y ofrecíamos/recomendábamos otros scopes del teléfono.

Por ejemplo, si ponías "metallica", nos dábamos cuenta que era una entidad en sí misma, y te dabamos la info de Wikipedia sobre Metallica. Pero también nos dábamos cuenta que era una banda y te dábamos acceso a música y videos, y te tirábamos busquedas relacionadas para que investigues (por ejemplo, la discografía). Si ponías "Roma" te ofrecíamos información de esa ciudad, y te dábamos acceso a que veas su mapa, el clima, etc.

Metallica

No sólo eso, sino también teníamos algunas utilidades, justamente sobre dos de las cuales les vengo a hablar hoy.

Una era un conversor de unidades genérico. Un par de ejemplos:

  • ponías 42 km a millas y te daba 42 kilometers = 26.0976 miles
  • ponías 217c en kelvin y te daba 217°C = 490.15K
  • ponías 2 cup cc y te daba 2 US cups = 473.1765 cubic centimeters

La otra, una calculadorita piola. Ejemplos:

  • ponías 5 + 2*pi y te daba 11.28318530717958623199592694
  • ponías e ** -1 / sin(55) y te daba -0.3679695299155818045728854210
  • ponías log2(64) y te daba 6

Les comento de estas utilidades que teníamos en el scopes scope porque cuando se decidió cancelar el proyecto del teléfono, empecé a mirar qué código me daba lástima perder.

El que hacía el análisis lingüístico que mencioné antes era repiola, pero en verdad era un bardo. Muy muy difícil de construir toda la parafernalia de pequeñas bases de datos preprocesadas para que anduviera. Y los que eran códigos "pasa manos" no eran divertidos. Y había otras cositas por ahí, pero meh.

Estas dos utilidades sí me entusiasmaron, así que pedí permiso para liberarlas. Me lo dieron, y en su momento las separé del código base en que estaban, y las puse en sendos proyectos en Launchpad, como primer paso.

Finalmente, en estos días de cuarentena las rescaté, llevé a github, migré a Python 3, le dí un poco de forma a cada proyecto en sí, y las terminé subiendo en PyPI: unitconv y pysimplecalc.

Tengan en cuenta que ambas utilidades las pueden usar tanto desde linea de comandos como importarlas como módulo y usarlas desde cualquier otro código Python.

Comentarios Imprimir

Videos y fotos de la PyCon Argentina 2019 (más bonus track)

Finalmente tenemos (hace un par de semanas ya) subidos todos los videos de la PyCon Argentina 2019.

Pero no sólo eso, ¡también tenemos compartidas todas las fotos! Pasen y vean las del miércoles, jueves, y viernes.

Cerramos PyCon Argentina 2019

Como bonus track absoluto, una gran noticia: también tenemos subtítulos en las keynotes de la PyCon 2018, que habían sido en inglés: la charla de Carol Willing y la charla de Brandon Rodhes.

Post data: recuerden siempre que PyAr tiene canal de YouTube, si hay videos que no están ahí (y están en otro lado, claro), me avisan y los vamos linkeando, subiendo, relacionando, incorporando, o lo que corresponda.

Comentarios Imprimir

Armando un grupo de trabajo para CDPedia

Estoy armando un grupo para trabajar en CDPedia. Algo por un período corto de tiempo, pero semi-intensivo, que traiga tanto beneficios para las personas que participan, como para el proyecto en sí.

Es una especie de experimento, mitad técnico, mitad social.

CDPedia: la wikipedia offline

Digo que tiene beneficios para les participantes, porque pueden...

  • aprender Python nivel básico / intermedio, o mejorar el nivel que tienen
  • ganar experiencia de trabajo en grupo, tanto remoto como presencial
  • aprender herramientas como control de versiones, manejo de issues
  • conocer prácticas modernas de desarrollo (tests, pep8, git, colaboración grupal)
  • tener una experiencia de trabajo como un "profesional de primer nivel"

Todo esto tutelado/guiado por mí y muy probablemente por alguien más, en un ambiente amigable y seguro.

Los beneficios para el proyecto son claros, ¡gente trabajando en el mismo! Pero para ser puntuales, estoy tratando de conseguir:

  • modernización del código (virtualenvs, flake8, inglés)
  • hacer el proceso y el código más robusto
  • normalizar los logs
  • migrarlo a Python 3 (legacy python debe morir!)
  • bug fixing simple y relevación de pendientes

Digo que es por un período corto de tiempo porque es con objetivos puntuales, con la idea de cumplir con esos objetivos en un plazo determinado. Por ejemplo, tres meses. O cuatro, a lo sumo. La idea es arrancar a mediados de Marzo 2020.

Al mismo tiempo es semi-intensivo: la idea es comprometerse a trabajar unas pocas horas por semana en el proyecto. Y juntarse virtualmente y presencialmente algunas veces. Acá la palabra en clave es "compromiso".

E.T. -- CDPedia -- Casaaa...

Entonces, ¿tenés ganas de participar? El costo monetario es cero, ¡pero no es gratis! O sea, no hay que pagar nada, pero (ya debería ser obvio a esta altura) hay que trabajar. Comprometerse.

Puntualmente, te estarías comprometiendo a:

  • meterle entre 4 y 10 horas de trabajo por semana
  • tener disponibilidad para algunas reuniones: una grupal de una hora (virtual, via hangout) una vez por semana, en día de semana, alrededor de las 18 o 20 horas, una 1 a 1 conmigo, de 15 minutos (virtual, via hangout) una vez por semana, en día de semana, horario a coordinar con cada une, y una presencial una vez por mes, siempre un sábado, en CABA, mañana y tarde
  • comportarte bajo el código de conducta de Python Argentina
  • tener una cuenta de Telegram ya que la coordinación/interacción del grupo será por ese medio
  • escribir un par de párrafos al final de todo el proceso contando la experiencia

Detalle con respecto a horas por semana y disponibilidades: la idea es coordinar lo máximo posible los días que nos vengan mejor a todes, y obvio que tiene prioridad si hay algún viaje, exámenes de la facultad, etc. Otro detalle con respecto a la reunión grupal en CABA: la idea es tener (al menos parte de) los viáticos cubiertos, no que les implique un gasto.

El proceso de selección está en marcha: si te interesa por favor llená este form, que voy a hacer una selección muy puntual. No hay requerimientos específicos, o niveles que cumplir. Sí tenés que tener ganas. El grupo de trabajo sería pequeño, pero no dejes de anotarte si te interesa esta aventura.

Hay tiempo hasta el miércoles 26 de Febrero (inclusive), voy a comunicar los resultados unos días después.

Comentarios Imprimir

Muchas series (y algunas pelis)

Estuve viendo banda de series, no tantas películas. No sé bien por qué, tampoco importa demasiado.

Una que había visto casi toda pero me faltaba la última temporada era Game of Thrones. Es que habíamos vuelto a arrancarla con Moni, desde la primera, y llevó tiempo. A mí la última temporada, y el cierre en general, me parecieron correctos. No es el final del siglo, pero tampoco es la serie del siglo. O sea, el final está acorde con la serie. Entiendo que mucha gente quedó decepcionada (¿esperaban demasiado?), no fue mi caso.

Otra que vi entera fue True Detective. La primer temporada es genial, el laburo de Matthew McConaughey es deslumbrante. Las otras dos temporadas están muy bien, aunque no al nivel de la primera (y son historias independientes, pueden verlas por separado).

Continúo con una que tuvo mucha repercusión: Chernobyl. Me pareció super bien hecha. Escuché muchos comentarios sobre como "dejaba mal parado a los rusos" por el control de la información y eso. Para mí tiene sentido, y al respecto no creo que la URSS haya sido o sea peor que USA...

Las últimas dos que vi completas son más de ciencia ficción. Humans muestra como sería la convivencia con androides muy parecidos a nosotros, qué los hace o deja de hacer humanos, y cómo reaccionaría la sociedad toda. Counterpart nos cuenta sobre la situación de estar en contacto con un universo paralelo no del todo igual, pudiendo ir, venir, cambiar información. La primera es más personal, la segunda es más de espías, pero ambas muestras situaciones sociales hipotéticas. Recomiendo la primera, especialmente si la pregunta sobre qué es ser humano les es interesante. La segunda zafa, véanla si el factor de que sea de espías les suma.

Después sigo con Vikings. Ya vi todas las que salieron menos la última última temporada. Está bien. Es larga. Me molesta la estúpida dicotomía de "violencia sí sexo no". O sea, está bien mostrar como a uno le cortan la cabeza y la sangre salpica todo, pero está mal mostrar una teta incluso al amamantar, ni hablemos de desnudos eróticos, ¡o sexo!

También estoy viendo Dirk Gently's Holistic Detective Agency. Muy bizarra, muy divertida. La primera temporada es genial, acabo de arrancar la segunda y última.

Y para terminar, estoy con un clásico: The Sopranos. Ya terminé la tercer temporada. ¡Es muy buena! Un espectáculo como pinta cada personaje, y hay muchos que valen la pena. No sé bien por qué no la había visto antes, me la debía.

Series, muchas series

En fin, ¡películas!

  • 27: The Cursed Club: -0. Sabía que iba a ser bizarra, no decepciona en ese sentido; es divertida por partes, pero después por querer hacerla exagerada, es berreta. Notable lo MAL equalizada que está a nivel de sonido, todo lo que es efectos especiales, altísimo, todo lo que es diálogo, bajísimo, ¿cómo puede ser?
  • Ahora o nunca: +0. Simpática comedia de enredos.
  • Alita: Battle Angel: +0. No deja de ser una de "peleas entre robots", pero tiene todo un trasfondo interesante y está bien hecha.
  • Annihilation: +0. Esta buena la historia, el concepto base (nunca lo había leido), y la implementación de la peli en sí; un poco volada pero lo amerita.
  • Apprentice: -0. Debo dejar de darle oportunidades a pelis clase B argentinas :p
  • Future World: -1. Mad Max berreta.
  • Gun Shy: -1. No la terminé de ver, me aburrió bastante y me molestó el trato hacia Chile.
  • Hotel Artemis: +0. Violenta, futurista, intrigante. Está bueno como maneja la multiplicidad de historias. Algunos toques divertidos.
  • Impulse: +?. Es una serie! La anoté donde corresponde...
  • Incredibles 2: +1. Divertida, y con planteos interesantes. Muy buena continuación de la primera. Sin embargo no tiene mucho más para dar, creo, espero que no la quemen con mil continuaciones (como Toy Story).
  • The House with a Clock in Its Walls: +0. Super bizarra pero muy divertida, recomendada para chiques no tan chiques.
  • The Shape of Water: +1. Una hermosa canción de amor.
  • Tomb Raider: +0. Es lo que promete, una peli de acción. Pensé que la historia sería más o menos la misma que la del 2001, pero no, es como su precuela...
The Shape of Water

Y las nuevas anotadas para ver. Pocas, de nuevo pocas. ¿Aparecen pocas que me interesen, o me entero poco yo? Me sigue faltando una buena fuente de trailers...

  • The Platform: (2019; Horror, Sci-Fi, Thriller) A vertical prison with one cell per level. Two people per cell. One only food platform and two minutes per day to feed from up to down. An endless nightmare trapped in The Pit.::Chockys [D: Galder Gaztelu-Urrutia; A: Ivan Massagué, Zorion Eguileor, Antonia San Juan]
  • The Heist of the Century: (2020; Comedy, Crime) In 2006, a group of thieves performed what is considered one of the most famous and smart bank heists in the history of Argentina when they rob the Banco Río branch in Acassuso.::Binquin_Black [D: Ariel Winograd; A: Guillermo Francella, Diego Peretti, Luis Luque]
  • Joker: (2019; Crime, Drama, Thriller) In Gotham City, mentally troubled comedian Arthur Fleck is disregarded and mistreated by society. He then embarks on a downward spiral of revolution and bloody crime. This path brings him face-to-face with his alter-ego: the Joker.::Don Draper 101 [D: Todd Phillips; A: Joaquin Phoenix, Robert De Niro, Zazie Beetz]
  • Marriage Story: (2019; Comedy, Drama, Romance) Noah Baumbach's incisive and compassionate look at a marriage breaking up and a family staying together.::Netflix [D: Noah Baumbach; A: Adam Driver, Scarlett Johansson, Julia Greer]
  • Parasite: (2019; Comedy, Crime, Drama, Thriller) All unemployed, Ki-taek and his family take peculiar interest in the wealthy and glamorous Parks, as they ingratiate themselves into their lives and get entangled in an unexpected incident.::CJ Entertainment [D: Bong Joon Ho; A: Kang-ho Song, Sun-kyun Lee, Yeo-jeong Jo]
  • Black Widow: (2020; Action, Adventure, Sci-Fi) A film about Natasha Romanoff in her quests between the films Civil War and Infinity War. [D: Cate Shortland; A: Florence Pugh, Scarlett Johansson, Robert Downey Jr.]
  • Free Guy: (2020; Action, Adventure, Comedy, Sci-Fi) A bank teller discovers that he's actually an NPC inside a brutal, open world video game. [D: Shawn Levy; A: Taika Waititi, Ryan Reynolds, Jodie Comer]
  • Frequently Asked Questions About Time Travel: (2009; Comedy, Sci-Fi) While drinking at their local pub, three social outcasts attempt to navigate a time-travel conundrum.::Anonymous [D: Gareth Carrivick; A: Chris O'Dowd, Marc Wootton, Dean Lennox Kelly]

Finalmente, el conteo de pendientes por fecha:

(Jul-2014)    5   1
(Nov-2014)   22   7
(Feb-2015)   13  10
(Jun-2015)   15  13  11   1
(Dic-2015)   19  19  18   6   1
(May-2016)   26  25  23  21   9
(Sep-2016)       19  19  18  14   1
(Feb-2017)           26  25  23  21   9   1
(Jun-2017)               23  23  21  18   5
(Dic-2017)                   19  19  18  16   5   2
(May-2018)                       22  22  22  17   9
(Sep-2018)                           12  12  12  10
(Mar-2019)                               13  13  13
(Ago-2019)                                   10  10
(Feb-2020)                                        8
Total:      100  94  97  94  89  84  79  69  57  52
Comentarios Imprimir

Numeración de los contactos del teléfono

Hace rato me pasaba que cuando recibía llamadas en el celular, en la mayoría (no todos) de los casos me mostraba el número que me llamaba, pero no el contacto correspondiente (teniendo cargado ese número en mi lista de contactos, claro).

El otro día me pasó nuevamente, y me quejé públicamente, y me sugirieron que podía ser por la forma en que estaba anotado el número.

Yo había pensado en eso, pero como a los números los tenía cargado "bien" (entendiéndose por "bien" a lo que indica el PFNN), pensé que era otra cosa. Pero en ese hilo de Twitter me sugirieron una forma de anotar el número, que a priori no tiene sentido porque tenía números "de marcado" (como el 15, o el +, que no forman realmente parte del número), pero decían que funcionaba.

Hice varios experimentos y en efecto, para que el teléfono me reconociera el número entrante, tenía que escribirlo de formas particulares. Probé casi todo, y al final declaré ganador a los formatos +54 9 PFNN (para celulares) y +54 PFNN (para el resto), siendo PFNN el número "real sin detalles de marcado", y esos obviamente para numeración de Argentina.

Con ese formato tengo las ventajas de que el teléfono me reconoce el contacto del número entrante, y que al mismo tiempo yo puedo usar ese número para llamar al contacto, estando dentro o afuera del país.

Números, formas de marcado, formatos...

¿El problema? Obvio que no iba a corregir todos mis contactos a mano. Como los contactos del teléfono los tengo en una cuenta de Google, decidí hacer un pequeño script que lo haga automáticamente, no sin cierto pesar porque las APIs de Google dejan mucho que desear.

Bah, no es que las APIs en sí sean malas. A veces son complicadas o rebuscadas, pero no más. El inconveniente es que son muchas, van cambiando con el tiempo, y la mayoría de la documentación es pobre, está desactualizada, tienen ejemplos que no funcionan, etc.

Pero me puse, y luego de revisar mil páginas, pelearme un poco, leer código fuente, probar distintas alternativas, y eso, terminé haciendo este programín que efectivamente baja toda la info de mis contactos, procesa los números de teléfono, y cuando corresponde los vuelve a grabar en la nube.

Regla número 1: evitar en lo posible laburar a mano

Péguenle una mirada al código ese, y pruébenlo con el cuidado correspondiente, pero debería funcionar. Les dejo algunos consejos con respecto a esta API de contactos en particular, por si quieren hacer algo parecido...

Antes que nada, vayan a esta versión, que ya autentica con OAuth, porque la forma vieja (con usuario y clave) ya está apagada. Van a tener que crear un proyecto, y poner los client_id y client_secret correspondientes en el script, luego la primera vez que lo ejecuten van a tener que darle permisos a través del navegador (es bastante automático, no tienen que hacer nada raro), y las próximas veces va a reusar esos permisos.

Tengan en cuenta que ese permiso es en función del scope que elijan (sólo lectura, que es una buena forma de empezar teniendo la seguridad que no van a romper nada, o lectura/escritura). Si autentican con un scope y luego lo cambian, borren el auth_info.dat así el script autentica nuevamente con el scope cambiado.

Entonces, les decía que la API está descripta acá, pero está contada de forma más genérica acá. Ojo que faltan ejemplos de Python, y lo que muestra de "Protocolo" y de "Java" no se corresponden entre sí.

En ese sentido me sirvió mucho esta referencia de la API a nivel Python. Y ojo con los ejemplos que hay por ahí, incluso los más oficiales y actualizados que encontré tenían errores en los imports o en las funciones que llamaban.

En fin. Si van a hacer algo parecido, arranquen del programa que ya dejé andando, y modifiquen desde ahí. Que les aproveche.

Comentarios Imprimir