A Fire Upon the Deep
|
|
|
Esta es tal vez la cosa más obvia que no todo el mundo ve: para hacer cosas hay que hacerlas. La manera de escribir software libre es escribir software que es libre. Para ir a Alaska hay que irse. A Alaska. Para escribir, hay que escribir. Para hacer música, hay que tocar música. Para hacer pan, hay que hacer pan.
¿Va a estar siempre bueno ese pan? ¿Vas a escribir siempre cosas interesantes? ¿Vas a llegar a Alaska? No. Vas a fracasar.
Pero si no hacés cagadas primero, no hay manera de hacer cosas mejores después. Creo que fue Amadeo Carrizo el que dijo de un arquero joven "No es malo, falta que le hagan dos, trecientos goles más para que sea bueno".
Tengo un largo historial de fracasos. Tengo una corta lista de éxitos. Sepan disculpar.
Así que lo voy a retomar. Voy a dedicarle unas 4horas por semana.El plan es:
Juntar parches que están juntando tierra en el issue tracker
Arreglar algunos bugcitos
Hacer un release con 1) y 2)
Y por supuesto:
No abandonarlo de nuevo
Mientras tanto, acá hay algo interesante de lo que recién me enteré. Dimitri Christodoulou hackeó rst2pdf para que soporte la directiva raw:: html
.
Eso, amigos, es tan loco que lo tengo que robar (con el crédito correcto, etc :-)
Y Dimitri, o cualquier otro que quiera hacer algo copado con rst2pdf, ¡avisen! ¡Les doy commit!
Yo estaba el otro día tratando de hacer cosas de shell scripting con python (como parte de un setup.py monstruo) y me molestaba que en shell es muy fácil hacer esto:
cd foo
bar -baz
cd -
O esto:
pushd foo
bar -baz
popd
O esto:
(cd foo && bar -baz)
Y en python tenia que hacer esto, que es largo y feo:
cwd = os.getcwd()
try:
os.chdir('foo')
os.system('bar -baz')
finally:
os.chdir(cwd)
Cuando en realidad quiero esto:
with os.chdir('foo'):
os.system('bar -baz')
Por supuesto, eso no está. Entonces, pregunté, como se hace eso? Y tuve varias respuestas:
Usá Fabric:
with cd("foo"): run("bar")
No es difícil:
class DirContextM(object): def __init__(self, new_dir): self.new_dir = new_dir self.old_dir = None def __enter__(self): self.old_dir = os.getcwd() os.chdir(self.new_dir) def __exit__(self, *_): os.chdir(self.old_dir)
Es más fácil:
from contextlib import contextmanager @contextmanager def cd(path): old_dir = os.getcwd() os.chdir(path) yield os.chdir(old_dir)
Está bueno, agreguémoslo a path.py path.py
Mejor atrapar excepciones:
@contextmanager def cd(path): old_dir = os.getcwd() os.chdir(path) try: yield finally: os.chdir(old_dir)
Aprendí como hacer context managers, sobre contextlib, sobre fabric y sobre path.py. Nada mal para 15 minutos :-)