Canonical Voices

What Bitácora de Vuelo talks about

facundo


El siguiente es el análisis de todos los gastos durante el primer año al auto que compramos con Moni el año pasado, un Sandero Stepway 1.6.

La idea es poder ver cuanto cuesta tener y mantener un auto mediano, y cuales son los rubros que más impactan en ese valor.

Los gastos están separados en distintos rubros, algunos fijos y otros variables (en función del kilometraje). Estos rubros son los que yo uso para llevar mi contabilidad casera, por eso los tengo separado así.

Los rubros son:

  • Estacionamiento: no pago cochera fija por mes (ni en casa (y yo laburo en casa), ni cuando Moni va a trabajar), así que este gasto es el estacionamiento cada vez que voy a Capital o parecido, más alguna que otra fichita de parquímetro.
  • Seguro: el auto tiene seguro contra terceros completo en La Caja a través del Automóvil Club Argentino (ACA), pero aparte de ese costo, acá incluyo el mismo valor que yo guardo como "autoaseguro" (que es un yeite que me rinde más que pagar directamente un seguro más caro). En otras palabras, el valor este es mitad para "el seguro", mitad para un "sobre" en el que guardo plata para gastos que el seguro cubriría si fuese más alto.
  • Patente: eso, la patente, tener en cuenta que el auto está anotado en Provincia de Bs As.
  • Mantenimiento: principalmente el ACA por mes y algún que otro lavado del auto, ya que como el auto es nuevo y está en garantía no tengo gastos de mecánico (pero justamente por esto, acá están incluidos los gastos de los dos servicios, de 10 y 20 mil kilómetros); un detalle es que los primeros tres meses del auto no pagué el servicio ACA porque me los bonificaron al tomar el seguro.
  • Nafta: más claro echale nafta: los gastos de ídem; ojo con sacar algún rendimiento a partir de este valor, ya que el gasto de nafta está afectado muchas veces por el descuento del ACA o de pagar con la tarjeta el domingo.
  • Peajes: los gastos de peajes automáticos en Capital y Gran Buenos Aires, pero no los correspondientes a los peajes en ruta (porque esos los pago en efectivo y los considero como gastos de los viajes mismos, casi siempre vacaciones).

Autito

A esos rubros, le agrego lo que es la amortización de la compra del auto en sí, considerando el valor que pagué en su momento, y que el auto se amortizaría en cinco años (teniendo en cuenta un valor residual chico).

En este año, que al auto le hicimos 23742 km, los gastos fueron:

  Estacionamiento: $ 3761.25
  Seguro:          $ 4457.00
  Patente:         $ 2545.20
  Mantenimiento:   $ 3539.00
  Nafta:           $11641.92
  Peajes:          $ 1281.69
  Amortización:    $14300.00

El gasto total en este año (considerando gastos fijos y variables) es de $41526, lo cual da $3461 por mes: $2070 de gastos fijos ($878 sin contar la amortización), y $1390 de gastos variables.

El costo total por kilómetro es de $1.76. Este valor es interesante porque toma en cuenta todos los gastos fijos, más variables, más el costo de comprar el auto (teniéndolo cinco años y luego vendiéndolo), y me da la pauta que (en mi caso!) conviene tener auto que moverme en remis.

Otra conclusión interesante es que la nafta representa el 28% del costo total total del auto, ¡nada despreciable!

Pueden ver los cálculos en este PDF, pero si quieren les dejo el notebook ipython que armé, para que jueguen con él (lo bajan y hacen ipython notebook costoauto1.ipynb).

Es interesante por si quieren ver por ejemplo el costo total por kilómetro si le hacen mucho menos recorrido (por ejemplo, porque viven en Capital y se moverían en subte), y de ahí comparar si les conviene tener el auto o usar remises; o agarrar las cuentas y sumarle un valor de estacionamiento fijo, etc. Y obvio, para actualizar el precio de compra que hoy es más que el año pasado...

Read more
facundo

LocoLander


En el último sprint internacional que fui en el laburo se me ocurrió una idea a la que le fui dando forma. Se la he contado a varias personas, y la encontraron interesante.

Es un proyecto donde la idea es dar un servicio gratis a la comunidad de software libre. Esto va más allá que Python, pero si lo podemos hacer desde PyAr para toda la comunidad, no estaría nada mal.

Estoy contando acá entonces de qué va el proyecto, y también voy a poner algo de esto en la página del PyCamp, a ver si genera tracción para ser laburado este Junio.


Contexto

La idea surge de una necesidad en particular. Una gran idea dentro de un proyecto de software es "la revisión por pares" (peer review). En ese contexto, cuando uno escribe el código de un cambio, ese código no va directamente al trunk (main, o head, o lo que sea) del proyecto, sino que uno termina el branch, y lo propone a revisión.

Entonces vienen los "pares" y revisan el código, a veces sugieren mejoras (a veces desaprueban totalmente los cambios, puede pasar) y uno tiene que hacer cambios posteriores, a veces lo aprueban sin más trámite, etc. El punto es que en determinado momento el cambio está listo para ser integrado a trunk (main, head, etc.). La acción de "meter el cambio en trunk" se la denomina muchas veces como landear (el código aterriza en el branch principal del proyecto).

¿Cómo se landea un branch? Bueno, hay formas y formas. Pero la más correcta, o completa, o la que está realmente buena hacer es....

  1. agarrar el trunk más reciente, y mergear los cambios del branch en cuestión
  2. si no hubo conflicto, correr los tests de integración del proyecto, y cualquier serie de pruebas (por ejemplo, verificadores de código como lint o pychecker).
  3. si todo estuvo bien, landear el código (esto es, commitear los cambios al trunk)


¿Cual es el problema de esta secuencia? Uno solo: es mucho trabajo. Entonces, o nadie lo hace, o el que lo hace termina tardando mucho en hacerlo. Y ambas situaciones son malas.

¿Por qué malas? En el primer caso, donde no se hace toda la secuencia, se corre el riesgo de meter en trunk código que rompe el mismo, o que no cumple con los estándares de calidad del proyecto. En el segundo caso, el tardar es malo para la colaboración: (me ha pasado que) a veces alguien externo al proyecto sugiere un cambio y escribe el código, y los desarrolladores del proyecto ven que está todo bien, pero demoran todos estos pasos, y finalmente el resultado es que los cambios propuestos tardan semanas en entrar a trunk, lo cual sólo sirve como desmoralizador de la gente que quiere ayudar.

Ahora, imagínense que uno, como desarrollador del proyecto, pudiera decir "este branch está aprobado, está listo para entrar en trunk", y viniera un bot al ratito, y ejecutase todos esos pasos que indiqué yo antes.

LocoLander


El proyecto

En detalle, lo que LocoLander haría es armar un entorno donde uno luego registraría su proyecto, el cual sería revisado de tanto en tanto, y si hay un branch para landear, se realizarían todos estos pasos automáticamente.

Para lograrlo, se levantaría una máquina virtual con un determinado sistema operativo instalado, se instalarían las dependencias que el proyecto necesite (y declare), se copiaría trunk y se le incorporaría los cambios del branch a probar, se correrían luego todos los tests y verificaciones, y finalmente si todo está como corresponde, se meterían esos cambios en trunk.

Algunas consideraciones:

- Configuración para el uso: Cuando se quiera usar LocoLander, se deberá dar de alta el proyecto en la página de LocoLander, autenticando de alguna manera para luego poder ver los resultados de cada intento de merge, etc., indicando qué otras personas pueden ver esa información, e ingresando algunos datos del proyecto en sí.

- Entorno para el proyecto: La idea es que el proyecto lo declare y que el entorno se arme solo en función de las necesidades de cada proyecto. Por ejemplo, que instale un Ubuntu Precise, más estos cuatro paquetes con apt-get, más estos dos con easy_install. Esta información viviría en un archivo especial del proyecto, que LocoLander leería en el momento del armado del entorno. Toda la salida a stdout/stderr de esta etapa quedaría logueada para poder revisarse.

- Ejecución de las pruebas: LocoLander, una vez armado el entorno y con el código brancheado, ejecutaría un archivo puntual (que también está indicado en el archivo de configuración antedicho). Ese archivo puede correr las pruebas unitarias y cualquier control sobre el proyecto, pero la idea es que termina con el resultado en ok o en error, y esto determina si el branch está listo para mergearse a trunk o no. Como en el caso anterior, toda la salida de stdout/stderr estaría disponible para el usuario.

- Repositorios: Aunque tenemos mucha variabilidad en el cómo usarlos, la intención es que LocoLander sea multi-repositorio. O sea que trabaje con Launchpad, GitHub, BitBucket, etc. El trabajo de soportar varios varía más que nada en función de las determinades capacidades que tiene cada repositorio y qué API presenta para no tener que andar scrapeando HTML o haciendo cosas locas para laburar autenticado.

- Autenticación de LocoLander: Esto depende del repositorio en sí, pero en general sería así: LocoLander tendría un usuario en cada repositorio, y si uno quiere usarlo todo lo que tiene que hacer a nivel autenticación es "incorporarlo como colaborador", o "darle permisos de commit en el proyecto", o lo que corresponda en cada repositorio. Lo que no se haría de ninguna manera es poner en el sitio de LocoLander tokens de autenticación de los distintos repositorios. De esta forma, los riesgos de seguridad son mínimos: LocoLander no posee datos críticos de nadie, y el dueño de cualquier proyecto puede en cualquier momento sacarle los permisos de commit a LocoLander.

- Elección de qué branch está listo para intentar mergear: Este punto también depende de cada repositorio. Por ejemplo, en Launchpad, cuando se hace un "merge proposal", el mismo tiene un "estado" que cualquiera con derecho de commit puede poner como "Aprobado", entonces LocoLander revisaría eso. Hay otros repositorios que no son tan completos, pero siempre se puede solucionar con algún texto especial en los comentarios que se dejan. Creo que este es el punto de más variabilidad.

- Previniendo abusos del código que se ejecuta: Un detalle importante en el funcionamiento de LocoLander es que hace muchas cosas él mismo (levantar una VM en particular, instalarle paquetes, etc), pero en algún momento ejecuta código que está en el branch. O sea, le está dando el control a alguien más. ¿Qué podemos hacer para evitar abusos (que la máquina no se ponga a mandar spam, o que no sea un nodo de seti@home...) Creo que el punto crítico acá es que en el momento de tomar el control el proceso potencialmente maligno no pueda acceder a internet para nada, ni a ningún recurso fuera de la máquina virtual en sí. Después se pueden poner condiciones de uso, cortar los procesos que están corriendo más de N minutos, o revisar periódicamente lo que parezca raro, pero creo que ya cortando la posibilidad de conectarse a cualquier lado se está restringiendo bastante la posibilidad de mal uso.

- Recursos necesarios: ¿Qué máquina se necesita para que esto corra? Mi idea es que no mucha. Quizás el más crítico es la memoria: hay que levantar una VM y ejecutar un proceso adentro que debería disponer de al menos unos centenares de megas para correr. Y también se necesita bastante disco (para guardar snapshots de muchas VMs, principalmente), pero cualquier VPS medio pelo da mucho disco. A nivel de velocidad de la máquina en sí, no me jode mucho: si los tests tardan en correr, alpiste.

Creo que cubrí todos los puntos importantes a la hora de definir el proyecto, pero si alguien tiene una duda, es bienvenido a preguntar.

Read more
facundo

Actualizaciones


Estos días hice dos releases rápidos.

El primero fue de LauncherPosta, porque resulta que en Ubuntu Raring crasheaba mal. O sea, no tiraba un traceback: crasheaba.

¿Lo peor? Es un problema de la librería PyGtk, de cómo está implementado para Gtk 3. ¿Lo peor más peor de todos los peores? Es por diseño, y les parece bien que crashee a la mierda en lugar de tirar un traceback decente (miren el bug que abrí y lo que me respondieron).

En fin, esto refuerza lo que les decía que Gtk3 me gustaba menos y menos y me estoy pasando a Qt.

BTW, de LauncherPosta liberé la versión 1.0, con el casi único cambio de soportar mejor el toqueteo de la configuración del systray bajo Unity (un pedazo de código que luego les compartiré más separadamente).

El segundo release fue de Enjuewemela.

Hace rato que no sacaba una versión del jueguito. Es que aunque le había hecho un montón de correcciones, había un gran feature que estaba esperando: el replayer.

¿Qué es el replayer? Es un modo de ejecución de Enjuewemela que le decís que te reproduzca un juego anterior (le tenés que pasar el log que generó la jugada), y podés ir viendo exactamente el juego que hiciste, avanzando y retrocediendo con las flechas. Esto más que nada lo hice porque era necesario para poder detectar algunos crashes raros, y porque era divertido de hacer, :)

Los cambios más interesantes para esta versión 0.5, aparte de la habilidad de "re-jugar un log", son:

- Alienta cuando hay múltiples coincidencias
- Cambia el tablero cuando cambia de nivel
- Múltiple fondos
- Correcto manejo de los highscores
- Otras pequeñas mejoras y un montón de correcciones.

La verdad es que estoy un poco harto de Enjuewemela. Hay que ponerle un montón de laburo para "hacerlo más lindo" al juego, y la verdad es que "hacerlo lindo" no es algo que me divierta.

Así que creo que sacaré un gran último feature, y luego creo que lo paso a mantenimiento, porque tengo otros proyectos bastante más interesantes para empujar.

Ya los comentaré por este mismo canal. Stay tuned.

Read more
facundo

Vela


Esta foto la saqué en un monasterio tibetano, en un viaje que hice con motivo de una capacitación de Python para un programa que necesitaban para calcular un nombre.

Vela

O quizás la saqué en un patio de Paternal, en un cumpleaños. Ponele.

Read more
facundo

Migrando Encuentro a PyQt


Este no es un post sobre Encuentro precisamente, sino sobre la experiencia de migrar Encuentro a Qt.

O, mejor dicho, a PyQt. ¿Qué es PyQt? Sencillo: una capa de unión para poder usar Qt desde Python. ¿Y qué es Qt? Qt es una biblioteca multiplataforma para desarrollar aplicaciones con interfaz gráfica. En otras palabras, una biblioteca para hacer las ventanas, botones, y todo eso que arma la interfaz gráfica de un programa de escritorio.

Con esa descripciones no tendríamos diferencia entre PyQt/Qt y PyGtk/Gtk, que es lo que usaba Encuentro hasta ahora. Entonces, ¿por qué migrar?

Son varias las razones... pero principalmente porque empaquetar PyGtk en un .exe es un dolor de muelas, y eso llevó a que la última versión que corre en windows es la que no funciona porque cambió todo el backend web (cuando los videos pasaron de ser hosteados por Encuentro a estar en Conectate). En otras palabras: la última versión de Encuentro que corre en windows no sirve para nada, y básicamente es culpa de Gtk.

Otras razón de menor importancia es que no me gustó como Gtk evoluciona. El futuro del framework es Gtk3, y ya estuve tirando código para usarlo, y lo que usé me gustó menos que Gtk2, así que me pareció un buen momento de cambiar. Finalmente, es una buena excusa para aprender Qt, ;)

Qt

En fin. La migración ya está terminada, pude hacer en Qt todo lo que tenía que hacer en función de la interfaz de Encuentro. ¿Qué me pareció? Bueno, las sensaciones son varias.

Me gustó Qt, mucho más cuadradito, más pytónico especialmente en la versión 4 que es la que yo estoy usando. Aunque la mayoría del código es muy similar, hay varias cosas que son más sencillas que en Gtk, aunque no todas, y hay bordes que limar.

(En este punto quiero aclarar que en ningún punto usé Qt Creator, el constructor gráfico de interfaces, sino que hice todo todo a mano, lo cual me permitió meterme bien adentro del framework y aprender mucho de su estructura subyacente.)

Un ejemplo de borde sencillo: no se puede saber si una señal está conectada o no. Entonces, por ejemplo, yo tengo un botón que muta de función, y a veces tiene que tener una señal conectada, y a veces otra (para que al hacer click haga una cosa u otra; en particular en el contexto de Encuentro: que el botón dispare la descarga del episodio, o la reproducción). Cuando el contexto cambia y se hace la revisión del estado del botón, no puedo decirle que desconecte cualquier señal que tenga, o preguntar qué señal tiene y desconectarla, tengo que (a mano) guardar en algún lado la señal que había conectado antes para desconectarla y conectar la nueva que corresponda.

Un ejemplo de algo complicado de hacer en Qt (que en Gtk es trivial): QTreeWidget no soporta HTML en el texto. Esto es, la habilidad de insertar tags para cambiar el tipo de texto (en el caso de Encuentro, yo lo necesito para resaltar en amarillo el fondo de las letras que coinciden con lo que el usuario ingresó en el campo de filtrar). Finalmente lo pude hacer, adaptando un ejemplo que Roberto Alsina encontró en la web, pero lo hace más lento, le agrega pequeños glitches que aunque no me joden, no deberían estar, y me mete a mí código oscurísimo que no es ni cerca de fácil de debuguear.

Por último, la integración con Twisted no es trivial. Hay cosas que en Encuentro están hechas con Twisted que podrían hacerse con herramientas más propias de Qt, sí, pero en este caso de migración, ya estaban hechas en Twisted y mi idea era aprovecharlas. Pero tuve que meter en el proyecto todo un módulo de integración y levantar la aplicación y cerrarla de una manera no trivial (y que me costó tiempo y sudor hacer que funcione correctamente, especialmente la parte de cerrar la aplicación, porque tuve que apagar los hilos de Twisted a mano).

La conclusión es que Qt me gustó bastante, y aunque extraño algunas cositas de Gtk, seguramente mis nuevos proyectos estarán usando PyQt.

Read more
facundo

¡Hola Malena!


La fecha original (esa que se calcula desde el principio del embarazo) para el nacimiento de Malena era por alrededor del veintipocos de Abril.

Más entrados en los meses del embarazo, y ya viendo que iba a cesárea por el tamaño que venía Male y el historial de alta presión de Moni, se fijo la fecha para el 5 de Abril.

Sin embargo, llegando a fin de Marzo, al ver que todo venía muy bien, decidimos pasar esa fecha una semanita más. Que sea el 12.

Este martes pasado, 9 de abril, Moni fue a un control y tenía alta presión, y le dijeron "te quedás". Yo cerré (operativamente) mil cosas de emergencia, y salí corriendo.

A las 18:51 nació Malena (por cesárea), pesando 3766g (150g más que Felipe) y midiendo 50cm (dos cm más larga que el hermano).

Malena

Yo estuve en el parto, como la otra vez, y fue todo más o menos igual, desde mi punto de vista. Todos los partos son distintos, sin embargo, para la madre.

Sí, también era una cesárea, pero era la segunda. Y los dolores son diferentes, las cositas que pasan son distintas, etc. Moni estuvo el primer día con mucho dolor y con un pico de alta presión por ese motivo, pero luego de alguna intervención especializada, todo volvió a su correcto cauce.

Male se prendió bastante bien a la teta (lo cual fueron excelentes noticias luego del baile que tuvimos con Felu por tener succión aplanada), y aunque las primeras 36h estuvo muy molesta por cólicos, se la nota algo pancha :)

Hablando de Felu... él se quedó con mi vieja estos días, y el primer día lo trajeron a que la conozca. Aunque siempre tuvo muy buena relación con "la panza", estábamos curiosos de cómo iba a resultar el "primer encuentro".

La verdad, estuvo genial. Entró preguntando por Male, y aunque paró un segundo para darle a la madre un ramo de rosas que le habían comprado, su atención fue para la hermana. Se sentó en la cama y la miraaaba, :).

Ya es hermano mayor :D

Y la tocaba, medio bruto porque obviamente todavía no sabe tocar a un bebé, pero la acariciaba y le hacía mimos. Y preguntaba... ¿por qué llora? ¿por qué abre y cierra los ojos? ¿por qué hace tal ruido? etc. O directamente daba órdenes: "mamá, dale la teta a Male que llora".

Lo importante es que estuvo muy cariñoso, nada celoso (vamos a ver cómo evoluciona esto cuando la vea "ocupar espacios" en casa), y se portó bien todo el tiempo. Incluso en el momento de irse, que se fue con sus abuelos sin problema (nosotros teníamos la preocupación de si iba a querer irse "sin Moni").

Volviendo a Male y estos días en la clínica... por suerte los grandes dolores del primer día pasaron rápido, el miércoles estuvo mucho mejor, y hoy jueves la verdad es que estuvimos bastante tranquilos, incluso con algunas visitas.

Male y Moni

Nos queda mañana viernes, y suponemos que el sábado a la mañana estaremos yendo a casa. Moni y Male están muy bien, así que mañana recibiremos más visitas y nos prepararemos para el gran segundo cambio en la dinámica de familia, estar los cuatro en casa :D

Read more
facundo

Linux Containers


A nivel de máquinas virtuales de uso genérico (por lo tanto descartando ScummVM o cosas similares) siempre me manejé con VirtualBox. Aunque ahora es de Oracle y no lo miro con buenos ojos, siempre funcionó bastante bien (sin pedirles cosas demasiado locas) y es una buena manera de tener un Windor corriendo aunque uno esté todo el día en Linux (por ejemplo, para poder hacer facturas en la AFIP, la puta que los parió).

Incluso, cuando laburaba en Ericsson, que me obligaban a usar Windor, tenía un VMWare con un Ubuntu instalado (un Gutsy, o un Hardy, creo... cuanta agua bajo el puente!) que me servía para cuando tenía que hacer cosas serias a nivel de red, o para el caso cualquier cosa divertida.

Pero nunca había encontrado una forma piola de tener máquinas virtuales de Linux bajo Linux. Y con "piola" me refiero a que funcione bien y que sea relativamente fácil de armar.

Y acá entra LXC.

Linux container

Aunque LXC no es propiamente dicho una "máquina virtual" (es más bien un "entorno virtual"), igual permite la ejecución de un linux que no se mezcla a nivel de configuraciones ni de paquetes instalados ni de lo que uno puede romper del sistema con la máquina que uno tiene.

¿Para qué se puede usar? En mi caso lo uso mucho en el laburo, ya que mi máquina de desarrollo es un Ubuntu Quantal, pero los sistemas que corren en los servers son bajo Precise o Lucid (entonces tengo un container para cada uno). Y también los tengo pensado usar para probar instalaciones desde cero (por ejemplo, al armar un .deb por primera vez, probar de instalarlo en una máquina limpia).

¿Cómo se arma y usa un contenedor? Luego de instalar los paquetes necesarios (sudo apt-get install lxc libvirt-bin), la creación de un contenedor es bastaaaaante simple (de acá en adelante reemplazar en todos lados el "mi-lxc" por el nombre que ustedes quieran para el contenedor):

    sudo lxc-create -t ubuntu -n mi-lxc -- -r precise -a i386 -b $USER

Desmenucemos. El -t es el template a tomar, y el -n es para el nombre que le vamos a dar. A partir de ahí vemos un "--", lo que significa que el resto son opciones para el template propiamente dicho. En este caso, que use el release Precise, la arquitectura i386, y mi mismo usuario.

Lo maravilloso de esto es que el container, adentro, tiene mi usuario, porque el home es compartido! Y con esto todas las configuraciones de bash, vim, ssh, gnupg, etc, con lo cual "hacer cosas" adentro del lxc es directo, no hay que configurar todo (pero, al mismo tiempo, podemos "romper" el home desde adentro del container, ojo al piojo).

Para arrancar el container podemos hacer

    sudo lxc-start -n mi-lxc

Y esto nos va a dejar con el prompt listo para loguear, y acá alcanza con usar los propios usuario y password. Una vez adentro, usamos el container como si fuera una máquina nuevita.

Todo muy lindo, pero igual me gustan hacerle algunas configuraciones que hacen el uso aún más directo y sencillo. Y estas configuraciones, a nivel de sistema, son basicamente para que podamos entrar al container más fácil, y usar desde adentro aplicaciones gráficas.

Para entrar más fácil, tenemos que tener Avahi configurado. Más allá de instalarlo (sudo apt-get update; sudo apt-get install avahi-daemon), hay un detalle a toquetear.  Adentro del lxc, abrir el archivo /etc/avahi/avahi-daemon.conf y aumentar bastante el rlimit-nproc (por ejemplo, de 3 a 300).

Con esto ya estamos listos para entrar fácil al container. Lo podemos probar en otra terminal; hacer:

    ssh mi-lxc.local

Lindo, ¿no?. Pero también está bueno poder forwardear los eventos de X, así podemos levantar aplicaciones gráficas. Para eso tenemos que tocar lo siguiente en el host (o sea, no en el container sino en la máquina "real"): editar /var/lib/lxc/mi-lxc/fstab y agregarle la linea:

    /tmp/.X11-unix tmp/.X11-unix none bind

En el container, tenemos que estar seguros que /tmp/.X11-unix exista, y reiniciarlo luego de estas configuraciones.

También necesitamos setear DISPLAY. Esto yo lo mezclé en el .bashrc, poniendo algo también para que cuando entro por ssh me cambie el color del prompt (incluso, poniendo distintos colores a distintos containers). Lo que estoy usando es:

    if [ `hostname` = "mi-lxc" ]; then
        export PS1='\[\e[1;34m\]\u@\h:\w${text}$\[\e[m\] ';
        export DISPLAY=:0
    fi

Para terminar, entonces, les dejo los tres comandos que más uso en el día a día con los containers, más allá de la instalación en sí: levantar el container (fíjense el -d, que lo levanta como un demonio, total nos conectamos por ssh); conectarnos (fíjense el -A, para que forwardee la conexión del agente de autenticación); y finalmente apagar el container:

    sudo lxc-start -n mi-lxc -d
    ssh -A mi-lxc.local
    sudo lxc-stop -n mi-lxc

Que lo disfruten.

Read more
facundo

Palabras que sustentan


Me encantó este pedacito de la editorial de Eduardo Aliverti para su programa Marca de Radio (que pueden escuchar ahí en la web, o leer acá en Página 12, se las recomiendo).

Ojo que, como él mismo dice, estas palabras son de Julio Rudman....

Dice un poco antes haber recordado que los nombres son sustantivos; es decir, palabras que sustentan. Y dice un poco después que pensó en Evita, el Che, Fidel, Cristina, Evo, Rafael, Lula, Dilma, Hugo o Comandante, Pepe, Néstor. (...) Nadie nombra al presidente Sebastián o Juan Manuel. "¿Alguien recordará al presidente Fernando, o Arturo, o Eduardo, o (...)"? Imposible frenarse y no agregar si la historia nombrará a Mauricio, o a George, o a Mariano, o a Angela, o a Silvio. "La cuestión –termina Rudman– es que estos pueblos del sur del sur han hecho propios los nombres propios de sus dirigentes; los han comunizado (...)."

Read more
facundo


Finalmente terminé de armar todo para liberar al mundo la versión traducida al español del tutorial de Python 3.

Realmente había terminado de traducirlo hace un par de semanas. Pero (aunque la generación del HTML fue bastante directo), generar el PDF me trajo bastante problemas.

Por un lado, el PDF generado por inkscape para los headers bonitos que tenemos es incorrecto en algunos detalles, así que tuve que meter un hack en el proyecto pdfrw para evitar que explote con ese problema. Luego habían problemas con páginas en blanco al final de capítulos que tuvieran footnotes, así que metí un workaround en rst2pdf para que reportlab no la cague al generar el PDF. Y dos o tres detalles más, pero menores (gracias Roberto Alsina por toda la ayuda en este bardo). Todos los parches (para poder reproducir la generación de algo copado) están en el README del proyecto.

También tuve que renovar el cómo presentábamos el tutorial, porque ahora tenemos el mismo para las versiones 2 y 3 de Python. Entonces ahora puse que la URL principal del tutorial apunte a un HTML muy bonito (gracias Rodrigo Bistolfi) que te deja elegir si querés ir qué versión del tutorial, tanto en Python 2 o 3, como en su formato: HTML o PDF. También reformulé la página del tutorial dentro del sitio de PyAr.

En fin. Disfruten y pásenlo.

Read more
facundo

El árbol fluorescente


En otra edición de "cosas que hice hace tiempo y me resultaron útiles ahora", les presento un proyecto que nació hace cinco años y medio de una charla de PyAr.

Como explico en este post, para jugar un rato con un amigo hice un árbol Trie, que luego de algunas optimizaciones degeneró en algo que llamé "Fucked Trie".

Este árbol para guardar palabras y buscarlas por prefijo de forma muy muy rápida resultó ser lo que necesitaba en el laburo un par de semanas atrás, pero con un cambio: ahora cada palabra tenía que guardar cierta metadata (que luego se obtendría al buscar).

Entonces, agarré el código original, lo modifiqué un poco, y armé este proyecto nuevo que se llama Fluorescent Trie (porque Fucked quedaba muy fuerte para un proyecto, vissste).

Fluorescent trie

Características de este árbol:

- Está pensando para mantenerlo en memoria: ocupa poco, y carga rápido

- Las búsquedas son por prefijo: O sea, entrando con "foo" encuentra "foo" y todo lo que empieza por "foo". No encuentra "grafoo".

- Las búsquedas son extremadamente rápidas (en el orden de los 10-4 segundos).

- Cada palabra tiene un payload que puede ser cualquier cosa.

Si lo necesitan para algo, aprovechen.

Read more
facundo

A la caza de la laptop perdida


Hace un año y medio que me quiero comprar una laptop nueva. No es que la necesite, pero la empresa ya me dió la plata para renovarla y debería hacerlo.

Hace un año y medio más o menos que también entró en vigencia toda esa loca restricción para las importaciones.  Ojo, no es que no se importen laptops, se importan y muchas. Pero son para el mercado masivo, y las características de máquina que yo quiero/necesito para trabajar no son las más comunes.

En fin. Estuve largo tiempo buscando qué máquina comprar acá, en Argentina. No encontré. Tomé la decisión de comprarla en USA, aunque los putos no me venden con teclado latinoamericano (ya los vamos a terminar de conquistar, falta poco).

Y el teclado es una de las características que más me importan de la máquina (sí, ya sé, muchos no pueden entender esto, pero gustos son gustos, y comentarios acerca de esto lo dejan en /dev/null que después veo).

Es más: a pesar del teclado y todo, casi compro la máquina afuera: una Lenovo; pero a Lenovo no le gustaba mi tarjeta (putos!), y cuando me prestaron una tarjeta no les gustó a dónde la quería mandar (putos ** 2!).

Obviamente, hay mil opciones más que Lenovo, pero en el sitio de este fabricante me dejaban elegir los componentes, y en otros lados no. Además, yo sabía que el teclado y la pantalla de la Lenovo estaban bien (que son las principales formas de interacción con la máquina). En fin, no iba a comprar una máquina "más o menos" en ebay o newegg, porque en general estás comprando algo que no sabés exactamente qué, y no las podés ver/tocar antes.

Decidí mandar a cagar a Lenovo, y cualquier compra en USA. Me sugirieron Uruguay, o Chile. Chile está lejos, pero si la podía comprar en Uruguay, es un paseo ir a buscarla. Llamé a una casa de computación que me recomendaron, charlé largo rato, mandé mail... y nunca me contestaron. Ok, cero onda. El que sigue.

Por otros temas, terminé yendo un par de veces a Garbarino y Frávega. Y estuve revisando las notebooks que tenían, y habían un par que no estaban nada mal, que me gustaba la pantalla, teclado, en general estaban bastante bien, sólo cortas de memoria. Y comentando esto a un amigo, me animó a ir a Galería Jardín para ver si se conseguían esas máquinas con más memoria.

Hace una semana fui finalmente a Galería Jardín, y estuve paseando tipo hora y media. Entré a alrededor de unos quince locales a preguntar por la máquina que quería, y el punto en común que encontré fue lo gracioso de las caras de las personas que me atendían.

Es que ponían muy buena cara cuando entraba al negocio, yo les decía que estaba buscando una laptop, y sonreían muy amistosamente. Entonces les tiraba la primera: "Quiero 8 GB de RAM". En ese punto, se les notaba que revisaban mentalmente las máquinas disponibles, buscaban en su memoria, perdían un poco la sonrisa... en fin, descartaban gran parte de la oferta que tenían.

Ahí, les tiraba la segunda: "Quieron una pantalla de entre 12 y 13.5 pulgadas". Ahí la sonrisa volvía, pero una sonrisa nerviosa, evidenciando que la oferta se caía a casi nada. Y muestra de esto, es que ya se empezaban a mover para ir a la computadora o papeles para encontrar lo que coincidiría con mis dos pedidos.

Y ahí nomás, antes de que empiecen a buscar, les tiraba la tercera: "Y quiero teclado latinoamericano". Ahí ya los polarizaba en dos respuestas. En el 80% de los casos, me decían "no, ahí me terminaste de matar, no tengo nada". En pocas ocasiones, por otro lado, me decían "teclado español", yo les decía "no, latinoamericano", y me contestaban "es lo mismo". Ahí yo ya les ponía cara de "flaco, ponete una verdulería", les decía con tono triste "no, no es lo mismo", y me iba.

Pero a veces me ofrecían algo. Y ese algo fue en dos o tres ocasiones la Samsung Ultrabook, un par de veces la Asus Zenbook, una Sony, y una Dell.

La Sony no me gustaba estéticamente (y para sus características, un poco cara). La Dell era una Latitude muy ladrillo, pero buenas prestaciones (especialmente a nivel batería), pero salía $13500; descartada. Y la Asus también salía como 11 o 12 lucas, las razones del precio que me indicaban era porque tenía un disco SSD, mientras que (me decían) la Samsung Ultrabook no tiene un disco separado SSD, sino un "caché de 24GB".

La última escala del paseo la hice por un local de Samsung muy muy cheto, en el cual mostraban dos ultrabooks, una serie 5 y una serie 9. Ahí también me indicaron que la serie 5 "es más barata porque no tiene disco SSD sino un cache", y que la serie 9 también está 11 o 12 mil pesos porque tiene el disco SSD separado, además de otros detalles.

En fin. No quería gastar tanta plata, así que me decidí por la Samsung Ultrabook NP530U3C-A01AR.

Samsung Ultrabook

Como la gran mayoría, viene con 4GB de RAM, pero en el local me la subían a 8GB. Precio final (IVA incluído): $7000 (en Previus).

La compré este último viernes, pero como tenía otras cosas que hacer luego, recién la probé el sábado a la mañana. Ya había visto que para que el BIOS reconozca el pendrive con el instalador de Ubuntu había que toquetear algunas cosas. Yo lo primero que hice fue meterme en el BIOS, sí, pero para curiosear. Realmente no tuve que cambiar nada más que el orden de booteo (que tenía primero al rígido).

Así que sin haber booteado nunca en el windor (por cábala, viste) me puse a instalar el Ubuntu. Le dije al instalador que quería customizar las particiones, y ahí vi que realmente la máquina tiene DOS discos, uno "clásico" (de esos que tienen platitos magnéticos que giran, un HDD), y otro de silicio (o sea, los denominados SSD).

Dudé qué instalar dónde, busqué un poco y esto que encontré me pareció bien. Basicamente: "/" en el SSD entero, y en el disco de platos un swap de 6GB, "/var" con 20GB, y el resto para "/home".

Particionado durante la instalación

Si miran con cuidado van a ver que le pifié a las cantidades: puse los valores en MB en lugar de GB... por suerte el particionador se avivó y me dijo que necesitaba más espacio en "/var" que lo que estaba poniendo, así que me di cuenta del error y lo corregí.

El único detalle que hay que tener cuidado (que yo le pifié) es que el disco marcado como boot tiene que ser el HDD (aunque barra esté en el SSD), porque el BIOS sólo bootea del primero. Nada importante.

En fin, luego de instalar un rato, y que baje las actualizaciones y eso, ya tenía mi notebook nueva con Ubuntu Quantal.

Contento con la renovación, :)

Read more
facundo

Películas, arrancamos 2013


Varias películas vistas en esta etapa (incluyendo algunos clásicos que no estaban anotados acá, como Back to the future), pero la cantidad de nuevas que aparecieron que pintan interesante son más...

  • Don't be afraid of the dark: +1. Muy bien hecha, y el tema es interesante. Cada vez me gusta más Guillermo del Toro como director...
  • Edge of Darkness: +0. Un poco flojo el tema, pero bien llevada la trama. El personaje es interesante y todo, a pesar de Mel Gibson.
  • Extraordinary measures: +1. Muy buen tema de la película, muy buen laburo de Ford y Fraser la zafa. Igual, acá lo que vale es la historia, y está muy bien.
  • In my sleep: -0. Buena historia, aunque podría ser más profunda en detalles, pero muy malas actuaciones.
  • Leaves of grass: -0. Parte de la historia está buena, pero no llega realmente a construir nada potable, como que son varias potenciales historias que no se llegan a tratar realmente.
  • Los abrazos rotos: +0. Nada del otro mundo, pero es una historia entretenida, dinámica, y bien contada.
  • Love and other drugs: +1. Muy interesante la historia, me esperaba una peli pasatista pero es bien profunda, aunque no aburre ni es dramática al pedo.
  • Machete: +0. Muy bizarra, típica película de Robert Rodriguez, con todo el coctel: mexicanos, armas, sangre, y chicas lindas. A mí me gustó, pero si no te gustan este tipo de películas, ni te acerques.
  • Predators: -0. Nada realmente nuevo.
  • Rango: +1. Muy divertida, y estoy seguro que si conocés de películas "del oeste" vas a encontrar mil referencias a las mismas (pero gusta más allá de que las conozcas o no).
  • Splice: +1. Me sorprendió, no esperaba que esté tan buena. Estuve todo el tiempo esperando golpes bajos que no venían, y se sucedían giros inesperados super interesantes. No apta para "conceptualmente impresionables".
  • The ghost writer: -0. La historia está bien, pero todo muy predecible. Y las actuaciones hasta ahí.
  • The hobbit: An Unexpected Journey: +1. Obviamente conocía la historia, pero me gustó mucho cómo está contada.
  • The switch: -0. Tiene sus momentos interesantes, pero es una peli romántica medio pelo. No la salvaJeff Goldblum, y Jennifer Anniston cada vez la tengo más y más como indicadora de película mediocre.


Estas son las que anoté a futuro... hay de todo, viene bien variadito el asunto:

Read more
facundo

Launcherposta 0.9


Una nueva versión de este programa que es básicamente un ayudante para lanzar aplicaciones que uno lanza seguido (como poner launchers en el panel, pero como eso no existe más en Unity...).

La principal novedad es que ahora hay una manera muy fácil de buscar las aplicaciones instaladas en el sistema para agregarlas en el menú (en el diálogo de agregar una entrada, hay un botón que muestra todas las aplicaciones con sus iconos).

También muestra un mensaje de error (no sólo el código) cuando hay un error al ejecutar algo, ahora tiene una man page, y algún que otro detalle.

Supongo que esta es la última versión del programa, ya que tiene toda la funcionalidad que buscaba y no hay ningún bug abierto.

Más info, cómo descargarlo, etc., en la página del proyecto. Enjoy.

Read more
facundo

Pequeño paseo matinal


El domingo pasado fuimos a Plaza Francia a buscar alguna cosita puntual que no puedo develar, pero también servía de paseo de domingo con la familia.

Un bardo para estacionar, más que nada porque los carteles son confusos, pero llegamos, Felipe jugó un buen rato en un árbol que es increíble de grande, y paseamos por la feria un rato.

Moni y Felu en el árbol

Bueno, no paseamos tanto porque a los diez minutos de caminar encontramos el mismo puesto al que otros años le compramos cosas similares, estuvimos un rato ahí eligiendo, y nos volvimos.

Me gustan mucho estos paseitos, :)

Read more
facundo

CDPedia 0.8


Luego de bastante laburo las últimas semanas, estoy muy contento de anunciar (de mi parte y de Python Argentina) que está en la calle la versión 0.8 de CDPedia, un proyecto que permite acceder a la información de la Wikipedia en castellano sin necesidad de una conexión a Internet.  Se puede descargar libremente de la red y grabar a CDs, DVDs o memorias USB para repartirla sin restricciones.

La CDPedia funciona en cualquier computadora, ya sea que tenga Linux, MacOS o Windows como sistema operativo, y esta última versión incluye contenido de Wikipedia a Diciembre de 2012.

Para mayor información e instrucciones para la descarga, visitar la página del proyecto.

Logo


Esta versión trae las siguientes novedades:

  • Renovamos completamente la generación del ejecutable para Windows, se deberían tener muchísimos menos problemas para usar la CDPedia en ese entorno.
  • Al extraer las páginas de Wikipedia, se les hace un análisis para evitar los artículos vandalizados (en este caso, se baja una versión más antigua, pero correcta).
  • El servidor interno ahora es multiusuario, lo que simplifica enormemente instalar CDPedia en un servidor y que sea accedida desde distintos clientes.
  • Ahora se incluyen en los discos todas las páginas de las categorías, no sólo la primera.
  • Actualizamos el contenido a Diciembre 2012.
  • Varias mejoras a la hora de la generación de discos y tarballs, así como también en la calidad del código.

Si tenés discos disponibles, hacé algunas copias de CDPedia para regalar a tus familiares y amigos, a la biblioteca de tu barrio, o a la escuela de tus hijos. ¡Difundí CDPedia!

Read more
facundo

Videoclips


Les había comentado en otra oportunidad que estaba bajando automáticamente un montón de videoclips, por torrent.

A ese proceso siguió uno de buscar en You Tube también los videos según la música que tenía. Y cuando tuve todo en el disco, los fui viendo, eligiendo uno de entre tantos si tenía varias versiones para el mismo video, y también corrigiéndolos: sacando principios y finales cuando tenían ruidos raros o molestos, o cambiándoles el factor de forma si estaban estirados para arriba o a lo ancho.

Obviamente todo esto no fue un proceso rápido, y es por eso que me casi llevó un año, :p.

Para administrarlos prolijos, me hice un programita que me arma un reporte de todos los videos, indicando intérprete, tema, la duración, cuanto pesan, y el formato, más info de la parte de video y del audio.

Quedó lindo. Ahora a pasarlos al disco del WDTV y disfrutarlos en la tele...

Read more
facundo

Tratando de colaborar


Hace alguna semanas ví un tuit sobre la posibilidad de ayudar con la revista on line Hackers & Developers, un magazine digital de distribución mensual sobre Software Libre, Hacking y Programación.

La revista está interesante, y se nota que le ponen un montón de laburo atrás. Entonces, me pareció copado ayudar. Lamentablemente no tengo tiempo en ponerme a escribir artículos desde cero (habrán notado cuanto participé en otras iniciativas como PET, la revista de Python Argentina... más allá de algo puntual, no tuve tiempo tampoco de escribir nada nuevo).

Pero, hay algo que sí me da el tiempo y es revisar algún que otro artículo. O sea, agarrar un artículo de Python y asegurarme que esté (a nivel de Python, no de castellano) correcto.

Entones mandé un mail a la cuenta a la que uno se podía postular: "(...) Me gustaría ser *revisor* de cualquier artículo que tenga que ver con Python.".

Me contestaron que gracias por mi contacto, que "... estamos buscando profesionales que deseen incorporarse al Staff permanente de HDMagazine, como columnistas/redactores.  Si estás interesado en sumarte como redactor, por favor, no dudes en hacérnoslo saber."

O sea, no les gustó mi propuesta. Quise ser revisor, me dijeron que no, que estaban buscando otra cosa.

Todo bien.

Hoy me acordé de eso y tuiteé que me había postulado como revisor y me habían rechazado.

Me contestaron desde que la revista "no es un grupo de satisfacción de deseos personales" (publicamente) y hasta me trataron de mentiroso y malintencionado (en privado), lo cual más allá de que uno lo relativice, no deja de doler.

En fin. Mejor enfocar energías en quienes lo merecen.

Read more
facundo


Y digo que es un regalo para las fiestas porque esta versión trae algunas cosas interesantes.

Por un lado, ¡hay un nuevo backend! Cuando actualicen los contenidos van a ver que pueden descargar programas del Banco Audiovisual de Contenidos Universales Argentino (gracias Gonzalo!),

Por otro lado, rediseñamos la GUI en el último sprint. Ahora tenemos un sector a la derecha con la imagen del programa (gracias Diego!) y la descripción (más un botón de acción). Y también hay una cola de descargas, donde se muestra lo que se está descargando, lo que ya terminó (y cómo), y lo que está encolado para después.

Los programas terminados ahora se ponen de otro color, y son fáciles de filtrar porque hay un checkbox que hace que se muestren sólo esos.

También hay un mejor manejo de las cancelaciones, más logging, y otras pequeñas mejoras y correcciones.

Como siempre, las formas de instalarlo, toda la info, y etc, en la página del proyecto.
   
¡¡Feliz fin de año!!

Read more
facundo

Cortando mal


Una de las cosas que repito mucho en mi charla de Entendiendo Unicode es que "siempre, siempre, siempre, hay que procesar los textos estando en unicode, no en bytes, porque se pueden obtener resultados inesperados".

Acabo de encontrar un caso de estos. Lo interesante es que es un caso que no había visto nunca.

Estoy agregando a mi programa Encuentro un nuevo backend: BACUA. Bueno, ya casi está (gracias a la ayuda de Gonzalo Martinez), el tema es que había una página que tenía problemas de unicode. Me puse a investigar, y resulta que el problema es que se estaba decodificando con el encoding incorrecto.

Se intentaba decodificar con UTF-8, pero como fallaba, se decodificaba con otra cosa, y algunas palabras quedaban mal.

Empecé a ver en detalle, y resulta que la página está toda bien codificada en UTF-8, excepto una parte. La linea "molesta" es esta:

'          <h5 class="sinopsis_cat">Los Ludomatic, banda de m\xc3\xbasica infantil exitosa en los a\xc3\xb1os 80, se re\xc3\xbane luego de veinte a\xc3\xb1os para ver que sus vidas no son como lo hab\xc3\xadan imaginado tiempo atr\xc3\xa1s. Toni, Becca, Marco, Lupe y Ren\xc3 ...</h5><br/>\r\n'

Como pueden ver, está toda casi bien, en utf8... por ejemplo, dice "Los Ludomatic, banda de música", y ahí vemos que la "ú" está bien codificada en utf8 como 0xC3 0xBA. El problema está al final, en el último nombre. Seguramente debía decir "Toni, Becca, Marco, Lupe y René", pero está cortado (con el agregado de los tres puntos, para indicar continuación).

Y está cortado mal.

Obviamente, si los que generaron la página hubiesen procesado el texto como unicode, se hubiese cortado antes de la é o después de la é. Pero no, lo manejaron como bytes, donde la é codificada como utf8 es 0xC3 0xA9. Y por mala suerte el corte cayó en el medio de esos dos bytes. Y quedó el 0xC3 suelto, que no es utf8 válido.

Y bueno. Eso. Recuerden: Siempre hay que procesar los textos como Unicode.

Read more
facundo

Extrapolando la realidad


Con el tiempo me fui dando cuenta que disfruto muchísimo las historias de ciencia ficción donde el autor agarra algo ya de por sí interesante de la realidad, lo extrapola para otro lado, y le agrega una historia copada alrededor.

Esto hace que si yo ya conocía las bases reales de la historia, disfrute mucho la extrapolación y las posibilidades que se desprenden. Y si no las conocía, tuve contacto con las mismas y es una excusa para aprender.

Por ejemplo, tomemos algo interesante de la realidad sobre lo cual estaba leyendo el otro día: un teorema de incompletitud de Kurt Gödel que básicamente dice que en cualquier teoría siempre hay enunciados que no se pueden probar como verdaderos o falsos a partir de los axiomas de la misma teoría. O sea, no se puede demostrar toda la teoría, completamente, desde adentro.

Una extrapolación de esto (totalmente fuera de lo que dijo Gödel, ya entrando en terrenos propios de la ciencia ficción) es que viviendo dentro de un Universo no se puede llegar a conocer toda la física que explique el funcionamiento de ese Universo. Por ejemplo, los fantasmas, el alma, o lo que pasa adentro de un agujero negro: existen y funcionan con reglas físicas del Universo, pero estas reglas no son deducibles/encontrables a menos que al Universo se lo estudie de afuera.

A eso le agregamos toda una historia, posiblemente que involucre comunicación entre científicos entre dos Universos distintos (mediante mediums o interlocutores paranormales!), lo escribimos bonito e interesante, y tenemos un libro.

Y la parte complicada es esta última.

Ideas de historias copadas tiene cualquiera. Armar un buen libro, interesante y lindo de leer, es otro tema.

Read more