2014-04-28

Bindings extraños en python

El comportamiento de locals() en python es extraño. ¿Por qué no me muestra siempre todas las variables por las que clausura? (pero sí muestra algunas :-/). ¿Como hago para obtenerlas todas?

Abajo pongo el POC que muestra que no anda como quiero:

>>> def foo():
...   a = 1
...   def bar():
...     print locals()
...   bar()
... 
>>> foo()
{}

Como ven, no muestra a como posible variable.

En cambio, en este ejemplo, que debería tener el mismo comportamiento, sí muestra a como variable.

>>> def foo():
...   a = 1
...   def bar():
...     a
...     print locals()
...   bar()
... 
>>> foo()
{'a': 1}


¿Cómo hago para armar el diccionario de las variables que se pueden usar en una función en python?

Todo esto lo probé en una consola corriendo python 2.7.6.

Happy hacking,
Aureliano.

2014-04-15

Recuperando mi mongo en debian

Update: La máquina en la que hice esto es un debian. De todas maneras en ubuntu seguramente es muy parecido.

Chequeo el estado de mi server mongo en mi debian y me dice:
$ sudo service mongodb status
[FAIL] Checking status of database: mongodb apparently not running failed!


Entonces miro en /var/log/mongodb/mongodb.log y encuentro esta línea:
Unclean shutdown detected.
Please visit http://dochub.mongodb.org/core/repair for recovery instructions.

¿Hago lo que dice ahí de una? No. Porque el mongo en ubuntu corre con un usuario específico. Mejor hago
$ sudo -u mongodb mongod -f /etc/mongodb.conf  --repair

Espero un rato, y termina de correr el script. Después hago:

$ sudo service mongodb start
[ ok ] Starting database: mongodb.

Happy hacking,
Aureliano.

2014-04-11

Pipeando procesos en python

A veces uno quiere correr varios procesos en python y enchufar el standard output de un proceso con el stdin del siguiente. Esto sería equivalente a hacer en el shell:
$ prog1 param1 | prog2 param21 param22 | prog3

Para poder hacer algo así en python hice este método:
import subprocess
def pipe(*args):
    last_proc = None
    for command in args:
        in_file = last_proc.stdout if last_proc else tempfile.TemporaryFile()
        proc = subprocess.Popen(command, stdin=in_file, stdout=subprocess.PIPE)
        if last_proc:
            last_proc.stdout.close()
        last_proc = proc
        

    last_proc.communicate()

Para hacer lo mismo que el comando de arriba hay que hacer:
pipe(
  ("prog1", "param1"),
  ("prog2", "param21", "param22"),
  ("prog3",)
)

La única limitación es que no puedo procesar la salida de standard output del último proceso. 

Happy hacking,
Aureliano.

2014-04-08

scl y screen

En RedHat existe un mecanismo para tener en el mismo host diferentes versiones del mismo software que se activa corriendo desde línea de comando. Por ejemplo, para activar python27 (en vez del 2.7, default de la distro) hay que correr scl enable python27 bash.

El problema es que si después corrés screen, ese seteo no pasa en forma limpia al shell que corre adentro del screen. Por lo tanto, lo que hay que hacer es hacer el enable "adentro" del screen. Por ejemplo, para correr un bash en screen con soporte para python 2.7 hay que correr screen scl enable python27 bash

La idea de cómo hacer esto la saqué de la documentación de CentOS. Busquen "coreutils component" dentro de la página para ver el detalle.

Happy hacking,
Aureliano.

Hacer un pem con clave a partir de uno sin clave

Tengo un .pem sin clave que me sirve para acceder a un server y me parece demasiado inseguro. Entonces corro:

openssl rsa -des -in orig.pem -out con-clave.pem 

Me pide la clave y en con-clave.pem tengo el .pem con clave, así que puedo borrar el otro (pero lo pruebo antes por las dudas).

Happy hacking,
Aureliano

2014-04-07

Nombres para sandro

Estoy pensando los nombres para los subcomponentes de sandro. Voy a seguir la línea del primer intento y usar nombres de canciones de Sandro (compuestas o interpretadas por él) para nombrarlos.
Acá les tiro mis ideas:

  • rosa: sistema de templating.
  • tengo: persistencia.
  • ya: sistema de caché.
  • asi: unit-testing framework.
  • penumbras: el sistema de base. Carga módulos, integra con la JVM.
  • maniqui: mock objects.
  • aveDePaso: lib de promises.
  • camino: routing (la canción es "Por algún camino").
  • nadaMas: colección de helpers.
  • comoTeDire: adapter para poder correr cosas que no están hechas para sandro como, por ejemplo, libs hechas para el browser. 
  • alFinal: utilidades para hacer endpoints (la canción es "Al final, Corazón") 
  • comoLoHiceYo: Utilidad para armar la estructura estandarizada de un site. 
  • palabrasSinSentido: Utilidades para escribir documentación. 
  • heyhey: Logging
Voy a ir agregando cosas a la lista a medida que se me ocurran o me las sugieran.

Espero sus sugerencias, 
Aureliano.