Ir al contenido principal

This is my blog, more about me at marianoguerra.github.io

🦋 @marianoguerra.org 🐘 @marianoguerra@hachyderm.io 🐦 @warianoguerra

500 posts intrascendentes...

...de un blog intrascendente.

si seniores, pensar que hace varios anios cree este blog cuando mi hermano se compro su primera camara compacta para postear fotos*.

el experimento no duro mucho  y empece a variar entre informacion interesante, rants de odio hacia el software :P, la etapa de postear screenshots de mi desktop, la etapa de quotear y repostear cosas y ahora que es simplemente un log de lo que considero vale la pena eternizar para cuando este viejo y solo y ya me haya leido todos los mails y chats de gmail en orden cronologico (?) y me ponga a ver que pavadas decia "cuando era joven".

al menos vino ian curtis y nos tomamos una pepsi


* mi hermano ahora labura de fotografo en berlin, para que se den una idea del paso del tiempo, pasen y vean que bonitas fotografias: http://kaig-hu-arg.com/

...then you win...

recien leo esto:

http://www.zdnet.com/blog/open-source/linux-snickers-at-microsofts-victory-declaration/9405

habla de que exceptuando desktops, linux es la fuerza mayoritaria en cloud, servers, mobile y 2da en tablets.

y que como el desktop esta en salida* linux es la fuerza dominante o el segundo en casi todos los segmentos.

esto me hizo acordar dos cosas:



y que por estas epocas hace 10 anios instalaba por primera vez linux en mi maquina :)

feliz decada linux

ahora hay que ponerse a ver cual es el sistema operativo que destrone a linux, no vaya a ser que se quede dormido en los laureles

a la espera del proximo rey**, viva la diversidad :)

* si ya se, tiene para rato
** que el nuevo rey sea libre

me gane una mochila un libro y un titulo de ingeniero en sistemas

dia de regalos, se anunciaron los ganadores del spawnfest y gane en la categoria "" por qrly

el premio es una mochila de erlang solutions y un libro de Erlang OTP in action (IRL!)

la UTN por haber aguantado 6 anios asistiendo a sus aulas le entrego a mi viejo por cuestiones geograficas (el E5 no llega hasta Inglaterra todavia) un titulo de ingeniero en sistemas de informacion.

demasiados premios para un dia

mlog, logging for human beings

siempre empiezo un modulo y empiezo a poner prints, pienso "tendría que usar logging", pero el hecho de no poder recordar como se configura un logger y tanta verbositud hace que siempre termine usando prints.

peor cuando tengo que cambiar a logging tengo que leer la documentación y termino haciendo copy paste del código de los ejemplos.

para eso cree un wrapper que me hace la vida mas simple en mis casos de uso simples.

pego acá parte del readme del modulo (en ingles por fiaca a traducirlo).

si les gusta el código esta acá:

https://github.com/marianoguerra/doodles/tree/master/python

si ven algún error, problema o tienen alguna observación para hacer son bienvenidos, nunca termino de entender el modelo de logging ya sea en python o en java (el único que entiendo es console.log y console.error de js :D)

acá va un ejemplo de uso:



import time

import mlog

# create a logger for the console with default logging level, default format
# and default everything (but nice defaults)
log = mlog.console()
# log some stuff
log.info("hey!")
log.warn("warning...")
log.error("something went wrong! (no it didn't just testing log.error)")

# add a file handler to the logger we where using (see how I pass the logger?)
# if I don't pass the logger instance I get a brand new logger that is
# unrelated to the last one, but in this case I add a handler to the one I have
mlog.file("mlog.log", logger=log)

# log some more stuff
log.debug("I'm on a file now!")
log.info("of course I'm on both")

# who wants file loggers without rotation?
# I give you a nice notation to specify the rotation policy
# add this handler to the logger I already have
mlog.file("every-minute.log", when=mlog.every(1, mlog.MINUTE), logger=log)

log.info("im on a file that rotates every minute")

# give time so it rotates
time.sleep(65)

log.info("65 seconds passed!")

# this is a new logger not related with the others
# change the module name so it's not in the same hierarchy
# as the other ones
other_log = mlog.file("unrelated.log", name="test_mlog_1")

# log something
other_log.info("unrelated logger is unrelated")
running it produces the following output (and files):

$ python test_mlog.py

[2011-08-12 11:44:30,491] test_mlog INFO: hey!
[2011-08-12 11:44:30,491] test_mlog WARNING: warning...
[2011-08-12 11:44:30,491] test_mlog ERROR: something went wrong! (no it didn't just testing log.error)
[2011-08-12 11:44:30,492] test_mlog INFO: of course I'm on both
[2011-08-12 11:44:30,492] test_mlog INFO: im on a file that rotates every minute
[2011-08-12 11:45:35,491] test_mlog INFO: 65 seconds passed!

$ ls
README.rst mlog.log test_mlog.py
every-minute.log mlog.py unrelated.log
every-minute.log.2011-08-12_11-44 mlog.pyc

$ cat mlog.log
[2011-08-12 11:44:30,491] test_mlog DEBUG: I'm on a file now!
[2011-08-12 11:44:30,492] test_mlog INFO: of course I'm on both
[2011-08-12 11:44:30,492] test_mlog INFO: im on a file that rotates every minute
[2011-08-12 11:45:35,491] test_mlog INFO: 65 seconds passed!

$ cat every-minute.log
[2011-08-12 11:45:35,491] test_mlog INFO: 65 seconds passed!

$ cat every-minute.log.2011-08-12_11-44
[2011-08-12 11:44:30,492] test_mlog INFO: im on a file that rotates every minute

$ cat unrelated.log
[2011-08-12 11:45:35,495] test_mlog_1 INFO: unrelated logger is unrelated

csv table to rst table -- python <3

update: roberto alsina sabe! :D hay una directiva no muy conocida en reST que permite hacer lo que hice (csv-table), y anda muy bonito en el wiki de github, dejo el codigo abajo porque es codigo python muy bonito :P

problema, documentar estructura de tablas sql en algun lado

preferiblemente:

  * formato editable con editor de texto
  * versionable
  * facil de escribir y bonito de leer

la forma mas facil de escribir es algo asi como un csv, pero la forma mas facil de leer es algun formato tabular, el wiki de github soporta varios markup pero el markup para tablas siempre es un perno, asi que elegi escribir un conversor de csv a tablas restructured text.

el resultado esta aca



ejemplo:

$ cat personas.csv                                           

dni, nombre, apellido, observacion
1, bob, esponja, vive en una pinia debajo del mar
2, patricio, estrella, amigo de bob que perno seria tener que escribir el markup para una columna tan larga no?
$ python csv2table.py personas.csv > tablas.rst
$ echo >> tablas.rst
$ python csv2table.py personas.csv "Personas con titulo (la tabla no las personas)" >> tablas.rst
$ rst2html tablas.rst > tablas.html

resultado rst (si, rompi todos los estilos de la tierra):

=== ========= ========= ========================================================================================= 

dni nombre apellido observacion
=== ========= ========= =========================================================================================
1 bob esponja vive en una pinia debajo del mar
2 patricio estrella amigo de bob que perno seria tener que escribir el markup para una columna tan larga no?
=== ========= ========= =========================================================================================

Personas con titulo (la tabla no las personas)
==============================================

=== ========= ========= =========================================================================================
dni nombre apellido observacion
=== ========= ========= =========================================================================================
1 bob esponja vive en una pinia debajo del mar
2 patricio estrella amigo de bob que perno seria tener que escribir el markup para una columna tan larga no?
=== ========= ========= =========================================================================================


resultado html:

dni nombre apellido observacion
1 bob esponja vive en una pinia debajo del mar
2 patricio estrella amigo de bob que perno seria tener que escribir el markup para una columna tan larga no?

Personas con titulo (la tabla no las personas)

dni nombre apellido observacion
1 bob esponja vive en una pinia debajo del mar
2 patricio estrella amigo de bob que perno seria tener que escribir el markup para una columna tan larga no?