Ah, cierto que tenía un blog! Más de 2 años después de la última publicación escribo para contar que actualicé después de casi 3 años sin modificaciones una aplicación que hice en PyQT y que tiene una ínfima cantidad de usuarios que cada tanto me contactan.
Se trata de una aplicación para grabar TV usando mencoder. Una GUI que permite configurar los parámetros principales para generar el comando para capturar. No es nada de otro mundo pero a veces para lograr capturar con mencoder hay que recorrer varios foros y leer la man page hasta encontrar lo que se necesita.
En este caso me contactó un italiano para agregar algunos parámetros de configuración para capturar con xvid y x264. Además, como él usa un dispositivo diferente al mío, la lista de normas soportadas es diferente, y eso venía hardcodeado. Ahora se obtiene a través de mplayer, al igual que la lista de inputs y los codecs soportados.
Aproveché el intercambio de mails para pedirle que me ayude con la traducción a italiano así que eso también está incluido.
Son varios cambios, así que pasó de la versión 0.31 a la 1.0. Pero no era mi idea original. Quería que fuera la 0.4 pero cuando quise hacer un ebuild de esto para Gentoo, vi que la 0.4 no la tomaba como una versión posterior, y claro, 31 es mayor que 4, idiota. Había hecho todo mal, tendría que haber sido la 0.3.1.
Si bien el programa es en python y bastante simple, por lo tanto anda descomprimiendo el .tgz en cualquier lado, aproveché para generar un par de paquetes para otras distros. Hice un .rpm bastante rústico y generé un .deb a partir de ese usando alien.
Si alguien con conocimientos de empaquetado se ofrece para ayudarme a hacerlo bien, se lo agradecería. Sobre todo si sabe como hacer distribuible correctamente una aplicación en Python. En este caso simplemente copié todo a /opt/mtvcgui, aunque sé que no es lo mejor. De hecho algunas guías de empaquetado decían en negrita que no había que hacerlo. Viva la anarquía (?)
La aplicación está acá: http://code.google.com/p/mtvcgui/
lunes, 18 de junio de 2012
jueves, 29 de abril de 2010
Pedalera de guitarra con una distro live
Un amigo empezó hace unos días a armar una distro live con el propósito de usarla como pedalera de efectos para guitarra. La idea es proveer los programas necesarios, configurados, e instalados sobre un sistema preparado para ofrecer una baja latencia, que con la configuración por defecto de la mayoría de las distribuciones actuales no se logra.
Esta distro está basada en Debian Squeeze, con un kernel real-time y los programas necesarios para aplicarle efectos a la entrada de audio: Jack y Rackarrack.
Ya existe una primer versión de GNUGuitarINUX (geekismo y marketing no van de la mano :P), en estado prealpha en Sourceforge para los curiosos que quieran rockear un poco y ver de que se trata.
Hay que ejecutar algunos pasos manuales antes de usarla.
Luego de bootear y aparecer la consola para el usuario guitar:
Sigan el avance del proyecto que pinta muy interesante!
Esta distro está basada en Debian Squeeze, con un kernel real-time y los programas necesarios para aplicarle efectos a la entrada de audio: Jack y Rackarrack.
Ya existe una primer versión de GNUGuitarINUX (geekismo y marketing no van de la mano :P), en estado prealpha en Sourceforge para los curiosos que quieran rockear un poco y ver de que se trata.
Hay que ejecutar algunos pasos manuales antes de usarla.
Luego de bootear y aparecer la consola para el usuario guitar:
- Iniciar X manualmente, tipeando desde la consola el comando startx. Esto inicia Fluxbox. Este manejador de ventanas no tiene íconos ni barra de tareas. Para iniciar los programas se los tiene que seleccionar desde el menú que aparece al hacer click derecho con el mouse.
- Abrir JACK Control
- Opcionalmente configurarlo para obtener una mejor latencia (en mi caso lo dejé por default. Con chunks más chicos obtuve mejor latencia pero los datos eran muy pocos y el sonido generado no tenía sentido. Más cosas no probé)
- Abrir Rakarrack
- Volver al JACK Control, elegir el botón Conexiones y conectar las capturas del sistema con las entradas de Rackarrack.
- Prender el botón de iniciar del JACK Control
- Volver a Rackarrack y prender el botón para iniciar los efectos.
Sigan el avance del proyecto que pinta muy interesante!
viernes, 5 de febrero de 2010
¿Se puede leer sin subvocalizar?

Estas vacaciones después de mucho tiempo volví a agarrar un libro, leerlo y terminarlo. Mientras lo leía, y sin haberme fumado nada, me puse a pensar en por qué uno tiene que pronunciar mentalmente cada palabra que lee. Seguía leyendo y me reía porque escuchaba esa voz constantemente y nunca me había puesto a pensar en si había alguna forma de callarla y poder entender el texto igual.
Fue como a veces me pasa, que me pongo a pensar en por qué para llamar algún objeto se usa una palabra en particular, al punto que me resulta graciosa la palabra, caso de "garrafa" o "palangana", por ejemplo.
Lo que yo pensaba es que si puedo mirar el reloj y ver que las agujas marcan las nueve y cuarto, y puedo darme cuenta que son las nueve y cuarto sin decir "nueve y cuarto", algo similar debería pasar al mirar palabras.
La cuestión es que no sabía ni cómo buscar para encontrar alguna respuesta (el título de este post lo escribí después de haber buscado), y finalmente dí con un par de páginas que tratan el tema. Cómo eliminar la subvocalización.
Todavía no intenté ninguna de estas técnicas locas como tararear mientras se lee, pero aparentemente son todas técnicas de lectura rápida. Obvio :P, pero me refiero a esa lectura para estudiar mucho y sacar la idea principal. No se si uno logrará apreciar todo el texto, o sea que no me parece que sea para lectura placentera. Yo diría que comparándolo con el reloj sería como cuando uno mira rápido el reloj y le sirve para darse cuenta que está a horario, pero si alguien le pregunta en ese mismo momento qué hora es, tiene que mirar de nuevo el reloj y decodificar la hora... ¿Alguien tuvo alguna experiencia con esto?
domingo, 30 de agosto de 2009
Graphjam
Me pasaron una página que no conocía: graphjam.com. Un sitio donde los usuarios suben gráficos que tratan de ser graciosos, al estilo del famoso gráfico de la división de tiempos en el desarrollo web, pero no tan nerds. Los votan y comentan. Hay algunos muy buenos.
El sitio está junto con otros más populares como fail blog o lolcatz, pero nunca lo había visto.
Acá dejo algunos gráficos que me gustaron:
Temas tratados en una reunión:

Las últimas palabras:

Contenido de una pileta pública:

Miembros de la banda que consiguen chicas:

Qué se necesita según Los Beatles:

Contenido musical de MTV a lo largo del tiempo:

El calendario según The Cure:

Política:

Relevancia de los comentarios en sitios web:

Conocimientos de computación que tengo vs lo que piensa mi familia de ellos.
El sitio está junto con otros más populares como fail blog o lolcatz, pero nunca lo había visto.
Acá dejo algunos gráficos que me gustaron:
Temas tratados en una reunión:

Las últimas palabras:

Contenido de una pileta pública:

Miembros de la banda que consiguen chicas:

Qué se necesita según Los Beatles:

Contenido musical de MTV a lo largo del tiempo:

El calendario según The Cure:

Política:

Relevancia de los comentarios en sitios web:

Conocimientos de computación que tengo vs lo que piensa mi familia de ellos.
miércoles, 5 de agosto de 2009
Whitest Kids U' Know subtitulado
Here I go again de nuevo otra vez nuevamente. Ya le recomendé a medio mundo estos videos por mail, chat, facebook, etc. Así que ahora los recomiendo en el blog para llegar a la otra mitad del planeta :D
Los videos son de una serie de sketchs que se llama Whitest Kids U'Know y que estuve viendo a partir del video The Grapist, que encontré en el mensaje de estado de un contacto (¡grande flecox por el descubrimiento!)
Tienen 3 temporadas y están filmando la 4ta. De la primera hay un DVD.
El tipo de humor, no se... puede que no le guste a muchos. Tiene algo de humor negro, absurdo, etc. Yo diría que si les gusta Padre de familia, les va a gustar.
Acá dejo los que están subtitulados en youtube. En la página oficial se pueden ver muchos más.
The grapist
La compra de Billy
Call of Duty
Fake Puke
Clase de teatro
Reunión de trabajo
Slow Jerk (sin subtítulos)
Esta era la versión con subtítulos pero no anda en Argentina
Cubicle guy
Can't stop peeing
Test de embarazo
Los videos son de una serie de sketchs que se llama Whitest Kids U'Know y que estuve viendo a partir del video The Grapist, que encontré en el mensaje de estado de un contacto (¡grande flecox por el descubrimiento!)
Tienen 3 temporadas y están filmando la 4ta. De la primera hay un DVD.
El tipo de humor, no se... puede que no le guste a muchos. Tiene algo de humor negro, absurdo, etc. Yo diría que si les gusta Padre de familia, les va a gustar.
Acá dejo los que están subtitulados en youtube. En la página oficial se pueden ver muchos más.
The grapist
La compra de Billy
Call of Duty
Fake Puke
Clase de teatro
Reunión de trabajo
Slow Jerk (sin subtítulos)
Esta era la versión con subtítulos pero no anda en Argentina
Cubicle guy
Can't stop peeing
Test de embarazo
jueves, 2 de julio de 2009
Más hardware vintage
Como cada vez que vuelvo para mis pagos a la casa de mis viejos, aparte de socializar siempre hay algún rato para nerdear. Sobre todo porque allá tengo una buena cantidad de cachivaches como mi primera PC, que cada tanto saco a descarbonizar.
Esta vez puse de nuevo en marcha mi primer scanner. Un Witty Scan de mano, de 16 tonos de grises, con su plaquita ISA de 8 bits. Y quise dejarlo documentado a continuación:





Este tenía un programa para hacer gráficos muy simples desde el cual se escaneaba, que se llamaba Image 72.

Y un programa de reconocimiento óptico de caracteres que se llamaba AIOCR.






Y para terminar, siguiendo con el tema de los programas de imágenes viejos, un par de imágenes del Newsmaster II. Un programa con el que se podían hacer documentos muy llamativos, con gráficos y varias columnas muy fácilmente.


Y del inolvidable Banner Manía. Con el que las LX-810 pasaban horas chillando para imprimir carteles de varias páginas con las más diversas formas.







Y los que tuvimos alguna impresora matriz de punto con cinta color tardábamos hasta 4 veces más (subía y bajaba la cinta en cada línea para combinar los colores) pero teníamos unos hermosos carteles en color:

Por último, y nada que ver con nada, esta imagen del placón Sound Blaster que tuve que sacar de la máquina que usé, para que no conflictúe con el scanner, y ahora debe ser equivalente a un integrado en una placa madre. Y la calco de Playing Food es un detalle que sólo pueden apreciar los que tuvieron su infancia en los 80's rafaelinos :D

Update:
Un video escaneando. Para que Joaco vea que lo usé.
Esta vez puse de nuevo en marcha mi primer scanner. Un Witty Scan de mano, de 16 tonos de grises, con su plaquita ISA de 8 bits. Y quise dejarlo documentado a continuación:
Este tenía un programa para hacer gráficos muy simples desde el cual se escaneaba, que se llamaba Image 72.
Y un programa de reconocimiento óptico de caracteres que se llamaba AIOCR.
Y para terminar, siguiendo con el tema de los programas de imágenes viejos, un par de imágenes del Newsmaster II. Un programa con el que se podían hacer documentos muy llamativos, con gráficos y varias columnas muy fácilmente.
Y del inolvidable Banner Manía. Con el que las LX-810 pasaban horas chillando para imprimir carteles de varias páginas con las más diversas formas.





Y los que tuvimos alguna impresora matriz de punto con cinta color tardábamos hasta 4 veces más (subía y bajaba la cinta en cada línea para combinar los colores) pero teníamos unos hermosos carteles en color:

Por último, y nada que ver con nada, esta imagen del placón Sound Blaster que tuve que sacar de la máquina que usé, para que no conflictúe con el scanner, y ahora debe ser equivalente a un integrado en una placa madre. Y la calco de Playing Food es un detalle que sólo pueden apreciar los que tuvieron su infancia en los 80's rafaelinos :D
Update:
Un video escaneando. Para que Joaco vea que lo usé.
lunes, 22 de junio de 2009
mtvcgui 0.31
Retomé el experimento con PyQT y QTDesigner que había abandonado hace cerca de 6 meses, motivado por los mails con comentarios y sugerencias (¡y problemas!) de ¡3! personas que lo usaron. Además noté que aparece en ¡una página y un foro! :P
Corregí un par de problemas menores y le agregué la funcionalidad de ajustar brillo, contraste, matiz y saturación, y de ver esos cambios en la previsualización del canal a medida que se realizan. También, ahora se puede cambiar de canal y norma mientras se previsualiza.
Esto lo hago usando mplayer en modo esclavo (-slave). De esa manera recibe comandos desde la entrada estándar.
Por ejemplo, para seleccionar un canal, lo hago con
self.mplayer_instance.stdin.write('tv_set_channel %s\n' % str(channel))
donde mplayer_instance es un objeto creado con subprocess.Popen y el comando mplayer con sus argumentos.
En la página dice que hay que usar communicate() en lugar de stdin.write(), pero a mi no me sirvió, porque communicate se queda esperando que el proceso termine y leyendo su stdout, y no es lo que necesito hacer.
A lo mejor podría hacerlo desde un thread, pero... ¡bah!
Igual, no anda demasiado bien y no sé como solucionarlo. El video generado cada tanto se pone más lento y después se arregla solo, sin embargo no se reportan cuadros perdidos. Codifico con lavc(mpeg4) y le aplico los filtros de desentrelazado, etc, todo al vuelo. Podría ser que no da el CPU, pero no supera el 50%... Capaz que mencoder no es la mejor herramienta para capturar TV... :(
La GUI no debería consumir muchos recursos como para molestar en la codificación, salvo que esté haciendo algo muy mal (es posible). En teoría, lo único que se ejecuta mientras se captura es un timer cada 1 segundo, que hace un poll a la instancia de mencoder para ver si sigue viva.
El programa está en google code, github y kde-apps. ¿Para qué? :D
Corregí un par de problemas menores y le agregué la funcionalidad de ajustar brillo, contraste, matiz y saturación, y de ver esos cambios en la previsualización del canal a medida que se realizan. También, ahora se puede cambiar de canal y norma mientras se previsualiza.
Esto lo hago usando mplayer en modo esclavo (-slave). De esa manera recibe comandos desde la entrada estándar.
Por ejemplo, para seleccionar un canal, lo hago con
self.mplayer_instance.stdin.write('tv_set_channel %s\n' % str(channel))
donde mplayer_instance es un objeto creado con subprocess.Popen y el comando mplayer con sus argumentos.
En la página dice que hay que usar communicate() en lugar de stdin.write(), pero a mi no me sirvió, porque communicate se queda esperando que el proceso termine y leyendo su stdout, y no es lo que necesito hacer.
A lo mejor podría hacerlo desde un thread, pero... ¡bah!
Igual, no anda demasiado bien y no sé como solucionarlo. El video generado cada tanto se pone más lento y después se arregla solo, sin embargo no se reportan cuadros perdidos. Codifico con lavc(mpeg4) y le aplico los filtros de desentrelazado, etc, todo al vuelo. Podría ser que no da el CPU, pero no supera el 50%... Capaz que mencoder no es la mejor herramienta para capturar TV... :(
La GUI no debería consumir muchos recursos como para molestar en la codificación, salvo que esté haciendo algo muy mal (es posible). En teoría, lo único que se ejecuta mientras se captura es un timer cada 1 segundo, que hace un poll a la instancia de mencoder para ver si sigue viva.
El programa está en google code, github y kde-apps. ¿Para qué? :D
miércoles, 22 de abril de 2009
Videos recomendados por la gerencia artística II
Este video clip de la banda Weezer tiene casi un año pero recién ahora lo descubro. El tema se llama "Pork and beans". Imitan escenas de muchos videos que hicieron furor en internet, algunos por ser muy buenos, otros por ser muy malos. Abajo, una lista con los videos originales. La mayoría los saqué de acá, y el resto del artículo de la Wikipedia.
Videos:
00:00 - La habitación es de Canon en D con guitarra eléctrica de Lim Jeong-hyun. La forma de mostrar las diferentes grabaciones probablemente de One man band
00:16 - Gary Brolsma (Numa numa)
00:19 - Dramatic gopher
00:23 - El Afro Ninja
00:31 - Eepybird (Experimentos mezclando Coca Cola y Mentos)
00:38 - Guy catches glasses with face (Atrapa los lentes con la cara)
00:38 - GI Joe, al servicio público (versión gay de GI Joe)
00:48 - El récord de las 155 camisetas
00:58 - Star wars kid
00:59 - Chris Crocker (Leave Britney alone)
01:04 - All your base are belong to us
01:11 - Miss Teen South Carolina (A la mina le preguntan por qué 1/5 de los norteamericanos no saben marcar su país en el mapa)
01:24 - Psychotic Kids (En Argentina está bloqueado, pero acá lo pude ver)
01:26 - Judson Laipply (Evolution of dance)
01:30 - Tay Zonday (Chocolate rain)
01:39 - Kevin Federline
01:48 - Daft Hands (Unas manos con palabras y letras escritas que se van moviendo para formar la letra de la canción "Harder, better, faster, stronger" de Daft Punk)
01:54 - Daft Bodies (Lo mismo pero lo hacen unas minas con el cuerpo)
02:06 - kicesie
02:08 - ???
02:29 - Liam Kyle Sullivan - Shoes
02:37 - Sneezing Panda (Estornudo de un panda)
02:37 - UFO Haiti (hoax)
02:43 - Dancing Banana
02:46 - Ryan Wieber y Michael “Dorkman” Scott
02:53 - Will It Blend?
02:57 - Charlie the unicorn (buenísimo. ver más abajo)
03:00 - It’s Peanut Butter Jelly Time! (Dancing Banana con música)
Algunos de los videos originales no los conocía. El mejor de los que descubrí fue Charlie the Unicorn. Es genial, jaja, re limado. Acá dejo 4 videos subtitulados en español.
Las versiones subtituladas tienen menos calidad de video así que abajo dejo las originales sin subtítulos.
Originales, sin subtítulos:
Charlie The Unicorn
Charlie The Unicorn 2
Charlie The Unicorn 3
Charlie The Unicorn - Youtube Live
Para terminar, la sección tierna del post. Entre los videos relacionados estaba este, Charlie bit me - again. Un pendejito que el hermano lo muerde. Muy gracioso. El acento inglés que tiene es genial "Chorley bit mey. It really hoerts. It's still hoerteing!" Jajaja.
Este tambíen, como pronuncia boold-a! jajaja, el mejor.
No lo deja incrustar(?) acá el link
Por último, el falopero este:
Hasta la próxima.
Videos:
00:00 - La habitación es de Canon en D con guitarra eléctrica de Lim Jeong-hyun. La forma de mostrar las diferentes grabaciones probablemente de One man band
00:16 - Gary Brolsma (Numa numa)
00:19 - Dramatic gopher
00:23 - El Afro Ninja
00:31 - Eepybird (Experimentos mezclando Coca Cola y Mentos)
00:38 - Guy catches glasses with face (Atrapa los lentes con la cara)
00:38 - GI Joe, al servicio público (versión gay de GI Joe)
00:48 - El récord de las 155 camisetas
00:58 - Star wars kid
00:59 - Chris Crocker (Leave Britney alone)
01:04 - All your base are belong to us
01:11 - Miss Teen South Carolina (A la mina le preguntan por qué 1/5 de los norteamericanos no saben marcar su país en el mapa)
01:24 - Psychotic Kids (En Argentina está bloqueado, pero acá lo pude ver)
01:26 - Judson Laipply (Evolution of dance)
01:30 - Tay Zonday (Chocolate rain)
01:39 - Kevin Federline
01:48 - Daft Hands (Unas manos con palabras y letras escritas que se van moviendo para formar la letra de la canción "Harder, better, faster, stronger" de Daft Punk)
01:54 - Daft Bodies (Lo mismo pero lo hacen unas minas con el cuerpo)
02:06 - kicesie
02:08 - ???
02:29 - Liam Kyle Sullivan - Shoes
02:37 - Sneezing Panda (Estornudo de un panda)
02:37 - UFO Haiti (hoax)
02:43 - Dancing Banana
02:46 - Ryan Wieber y Michael “Dorkman” Scott
02:53 - Will It Blend?
02:57 - Charlie the unicorn (buenísimo. ver más abajo)
03:00 - It’s Peanut Butter Jelly Time! (Dancing Banana con música)
Algunos de los videos originales no los conocía. El mejor de los que descubrí fue Charlie the Unicorn. Es genial, jaja, re limado. Acá dejo 4 videos subtitulados en español.
Las versiones subtituladas tienen menos calidad de video así que abajo dejo las originales sin subtítulos.
Originales, sin subtítulos:
Charlie The Unicorn
Charlie The Unicorn 2
Charlie The Unicorn 3
Charlie The Unicorn - Youtube Live
Para terminar, la sección tierna del post. Entre los videos relacionados estaba este, Charlie bit me - again. Un pendejito que el hermano lo muerde. Muy gracioso. El acento inglés que tiene es genial "Chorley bit mey. It really hoerts. It's still hoerteing!" Jajaja.
Este tambíen, como pronuncia boold-a! jajaja, el mejor.
No lo deja incrustar(?) acá el link
Por último, el falopero este:
Hasta la próxima.
sábado, 4 de abril de 2009
CuñáaaAaAaaaAAaAaa!!!
Les dejo una selección de los mejores videos de dos personajes bizarrísimos de Sevilla. Costó armarla porque en general los chistes que cuentan son malísimos pero la gracia está en cómo lo cuentan, cómo se ríen entre ellos, y hay que reconocer que si tuvieran todos los dientes sería menos gracioso.
Se trata de "El Risitas" y "El Cuñao" (Peíto). Aparecían en los programas El Vagamundo y Ratones Coloraos de Jesús Quintero donde contaban chistes y anécdotas que no le causaban mucha gracia al conductor. Risitas era el que contaba los chistes generalmente y cuando el conductor no se reía, le decía cosas como "Esúuu, ¿que no te gustan los chistes?", "¿Tu no te ries?", "Tu no eres de aquí." Y el cuñao se reía de lo que sea mostrando su único diente.
Este es uno de los mejores (acá hay una especie de transcripción):
Este también está bueno (de paso aprendí los términos cateto=(aprox)boludo, jiñar=cagar)
El video de la anécdota de las paelleras es buenísimo por la manera en se tientan al final Risitas y el conductor. La risa es demasiado contagiosa. Creo que, salvando las astronómicas distancias, lo recomendaría junto con Always look on the bright side of life de Monty Python para pasar cualquier momento bajón. Pero es un poco largo para el internauta moderno, así que esta es la parte del final cuando se empiezan a reir. Lo que contaba antes era que estaba trabajando en un restaurant y lo mandaron a limpiar 20 paelleras, entonces las ató en la playa para que se limpien con la sal del agua. Pero a la mañana había subido la marea y encontró solo una paellera, y por ahí sigue:
Otros videos:
Anécdota de los sacos de cemento
Gafas antisolares
Cámara que no se quiere ir
Se trata de "El Risitas" y "El Cuñao" (Peíto). Aparecían en los programas El Vagamundo y Ratones Coloraos de Jesús Quintero donde contaban chistes y anécdotas que no le causaban mucha gracia al conductor. Risitas era el que contaba los chistes generalmente y cuando el conductor no se reía, le decía cosas como "Esúuu, ¿que no te gustan los chistes?", "¿Tu no te ries?", "Tu no eres de aquí." Y el cuñao se reía de lo que sea mostrando su único diente.
Este es uno de los mejores (acá hay una especie de transcripción):
Este también está bueno (de paso aprendí los términos cateto=(aprox)boludo, jiñar=cagar)
El video de la anécdota de las paelleras es buenísimo por la manera en se tientan al final Risitas y el conductor. La risa es demasiado contagiosa. Creo que, salvando las astronómicas distancias, lo recomendaría junto con Always look on the bright side of life de Monty Python para pasar cualquier momento bajón. Pero es un poco largo para el internauta moderno, así que esta es la parte del final cuando se empiezan a reir. Lo que contaba antes era que estaba trabajando en un restaurant y lo mandaron a limpiar 20 paelleras, entonces las ató en la playa para que se limpien con la sal del agua. Pero a la mañana había subido la marea y encontró solo una paellera, y por ahí sigue:
Otros videos:
Anécdota de los sacos de cemento
Gafas antisolares
Cámara que no se quiere ir
miércoles, 1 de abril de 2009
Perro, el perro.

Parece salido de un capítulo de Alejo y Valentina, jaja. Estaba afuera del Patio Olmos cuando esperábamos con mi hermano a otro amigo para ir al Cosquín Rock.
La otra noche lo encontré por Nueva Córdoba y me pareció que el collar decía 123456789 así que parece que los pibes lo tienen de juguete al pobre animal, jaja.
domingo, 29 de marzo de 2009
Python is my religion

Python es una religión: Tremenda reconstrucción de la Última Cena por los chicos de PyAr en el último PyCamp. No los conozco a todos personalmente pero sí a la mayoría. Son co-listeros de Python Argentina. Entre ellos, compañeros de trabajo, de la facu, de fiestas nerd en Córdoba, etc. Muy muy grossa foto.
miércoles, 11 de marzo de 2009
Admin Van Buuren
sábado, 7 de marzo de 2009
Limiting memory usage of a python script
I've been running recently some python and java experiments with important memory requirements on a machine shared with other people, some of them with the same needs on that machine.
There were no restrictions on resources usage by a user or a process, so controlled memory usage was the user's responsibility.
Java has a parameter to limit the amount of memory the virtual machine can use. If it exceeds that value, the machine exits and the running program fails. It is specified with java -Xmx value.
I couldn't find something similar for python so I procrastinated a bit writing a bash script to control the processes.
I made a cycle that monitored the values from /proc/meminfo and killed the running process if some limit was reached.
The problem with that solution was that my experiments were not just one program, but many, controlled by a bash script, so this solution would just kill the bash script and not the process doing the important memory usage. So I added some extra code borrowed from the web to kill also the subprocesses. That made the code longer and more complex, leading to this:
control_run.sh:
I tested it with a small python script that just consumes memory:
memory_consumer.py:
and some bash scripts to execute three instances concurrently:
memory_consumer_main.sh:
memory_consumer_child.sh:
we would run:
Another possibility I found was setting the memory limit with ulimit.
We can set it from the command line and enable it for the bash session, or incluide the statements in the first lines of a bash script.
That will limit the allowed memory for any process
for example:
There, we limited the available memory for a process to 40Mb.
Then,
While simple, the problem with this approach is that it will only kill the process exceeding the memory usage. If we are running just one isolated process, that's fine. But in my case, the batch would continue in an erroneous state and produce wrong results.
Any comment or suggestion, including "hey stupid, python has the option -blabla to do exactly that" will be appreciated.
There were no restrictions on resources usage by a user or a process, so controlled memory usage was the user's responsibility.
Java has a parameter to limit the amount of memory the virtual machine can use. If it exceeds that value, the machine exits and the running program fails. It is specified with java -Xmx value.
I couldn't find something similar for python so I procrastinated a bit writing a bash script to control the processes.
I made a cycle that monitored the values from /proc/meminfo and killed the running process if some limit was reached.
The problem with that solution was that my experiments were not just one program, but many, controlled by a bash script, so this solution would just kill the bash script and not the process doing the important memory usage. So I added some extra code borrowed from the web to kill also the subprocesses. That made the code longer and more complex, leading to this:
control_run.sh:
PROGRAM=$*
#Also kills process children, and their children, and so on
KILL_CHILDREN=1
#Minimum free memory available (in Kb.)
MEM_FREE_LIMIT=300000
#Minimum free swap (in Kb.)
SWAP_FREE_LIMIT=500000
#Run the program in background and get its PID
$PROGRAM &
PID=$!
#While the program is alive
ps $PID > /dev/null
while [ $? -eq "0" ]; do
MEM_FREE=$(grep MemFree: /proc/meminfo | egrep [0-9]+ -o)
#echo "Free Memory: ${MEM_FREE}"
SWAP_FREE=$(grep SwapFree: /proc/meminfo | egrep [0-9]+ -o)
#echo "Free Swap: ${SWAP_FREE}"
if [ "${MEM_FREE}" -le ${MEM_FREE_LIMIT} ] || [ "${SWAP_FREE}" -le ${SWAP_FREE_LIMIT} ]; then
if [ "${MEM_FREE}" -le ${MEM_FREE_LIMIT} ]; then
echo "free memory limit reached, exiting...";
else
echo "free swap limit reached, exiting...";
fi
if [ "${KILL_CHILDREN}" -eq 0 ]; then
echo "killing process with id $PID"
kill $PID
else
#code based on http://www.unix.com/unix-dummies-questions-answers/5245-script-kill-all-child-process-given-pid.html
KILL_PIDS=$PID
CHILDREN=`ps -ef| awk '$3 == '$PID' { print $2 }'`
while [ "$CHILDREN" != "" ]; do
KILL_PIDS="$KILL_PIDS $CHILDREN"
OLD_CHILDREN=$CHILDREN
CHILDREN=''
for i in $OLD_CHILDREN; do
CHILDREN="$CHILDREN `ps -ef| awk '$3 == '$i' { print $2 }'`"
done
done
echo "killing process with id $PID and its children"
for i in $KILL_PIDS
do
echo killing $i
kill $i
done
fi
exit 1;
fi
sleep 1
ps $PID > /dev/null
done
echo "program finished"
I tested it with a small python script that just consumes memory:
memory_consumer.py:
import time
a = range(100000)
while True:
a += range(100000)
print "printing something"
time.sleep(1)
and some bash scripts to execute three instances concurrently:
memory_consumer_main.sh:
#!/bin/sh
./memory_consumer_child.sh
memory_consumer_child.sh:
#!/bin/sh
python memory_consumer.py &
python memory_consumer.py &
python memory_consumer.py
we would run:
$./control_run.sh ./memory_consumer_main.sh
printing something
printing something
printing something
printing something
printing something
printing something
printing something
printing something
printing something
printing something
printing something
printing something
printing something
printing something
printing something
free memory limit reached, exiting...
killing process with id 9348 and its children
killing 9348
killing 9349
killing 9350
killing 9351
killing 9353
Another possibility I found was setting the memory limit with ulimit.
We can set it from the command line and enable it for the bash session, or incluide the statements in the first lines of a bash script.
That will limit the allowed memory for any process
for example:
$ ulimit -v 40000
$ ulimit -H -v 40000
There, we limited the available memory for a process to 40Mb.
Then,
$ python memory_consumer.py
printing something
printing something
printing something
printing something
Traceback (most recent call last):
File "memory_consumer.py", line 4, in
a += range(100000)
MemoryError
While simple, the problem with this approach is that it will only kill the process exceeding the memory usage. If we are running just one isolated process, that's fine. But in my case, the batch would continue in an erroneous state and produce wrong results.
Any comment or suggestion, including "hey stupid, python has the option -blabla to do exactly that" will be appreciated.
miércoles, 26 de noviembre de 2008
Experimentando con Qtdesigner y PyQt
El fin de semana estuve probando hacer algún programita con interfaz gráfica usando python y QT. Para eso usé QTDesigner para editar la UI, y PyQT4 para usar la librería QT desde python.
Seguí este tutorial: http://www.cs.usfca.edu/~afedosov/qttut/ que aunque está viejo (es para PyQT3) la idea es la misma y se lo puede adaptar con algunos ejemplos para PyQT4 que hay dando vueltas.
El resultado fue este programita para setear algunos parámetros de mencoder y utilizarlo para capturar TV.
http://code.google.com/p/mtvcgui/
Seguí este tutorial: http://www.cs.usfca.edu/~afedosov/qttut/ que aunque está viejo (es para PyQT3) la idea es la misma y se lo puede adaptar con algunos ejemplos para PyQT4 que hay dando vueltas.
El resultado fue este programita para setear algunos parámetros de mencoder y utilizarlo para capturar TV.
http://code.google.com/p/mtvcgui/
miércoles, 29 de octubre de 2008
Overclockeando la MSX
Todavía conservo mi primer computadora, una MSX Spectravideo SVI-728 que le compré a mi primo cuando se compró su XT.
Tenía solamente un intérprete de BASIC, con el que escribí mis primeras líneas de código (de ahí mis pésimas prácticas :P), y una lectora de cassettes, que usaba para cargar alguno de los cientos de juegos que tenía.
Cada tanto me agarra la nostalgia y me pongo a jugar juegos de esa epoca en emuladores en mi PC actual. Revisando una página encontré una utilidad para pasar a WAV los ROMs usados en los emuladores (los cassettes si se escuchan en un equipo de audio reproducen un sonido similar al de un modem dial up). Grabé un CD de audio con los mejores juegos generando el WAV al doble de bitrate del que se usaba en los cassettes y armé un cable para conectar un discman a la entrada de datos del teclado/motherboard/cpu/etc. A veces falla dando error de input/output, pero ajustando el volumen apropiadamente ahora se puede cargar un juego en la mitad de tiempo :D
Notar el Microsoft en la pantalla. Gracias Bill! Ahora odio tu Internet Explorer pero esta maquinola me trajo muchas horas de diversión! Todo bien con Stallman, pero por más que el Emacs tenga un tetris y tenga que hacer más o menos las mismas combinaciones de teclas para escribir un caracter que para saltar y patear en el Yie Ar Kung Fu, no se compara :P





Tenía solamente un intérprete de BASIC, con el que escribí mis primeras líneas de código (de ahí mis pésimas prácticas :P), y una lectora de cassettes, que usaba para cargar alguno de los cientos de juegos que tenía.
Cada tanto me agarra la nostalgia y me pongo a jugar juegos de esa epoca en emuladores en mi PC actual. Revisando una página encontré una utilidad para pasar a WAV los ROMs usados en los emuladores (los cassettes si se escuchan en un equipo de audio reproducen un sonido similar al de un modem dial up). Grabé un CD de audio con los mejores juegos generando el WAV al doble de bitrate del que se usaba en los cassettes y armé un cable para conectar un discman a la entrada de datos del teclado/motherboard/cpu/etc. A veces falla dando error de input/output, pero ajustando el volumen apropiadamente ahora se puede cargar un juego en la mitad de tiempo :D
Notar el Microsoft en la pantalla. Gracias Bill! Ahora odio tu Internet Explorer pero esta maquinola me trajo muchas horas de diversión! Todo bien con Stallman, pero por más que el Emacs tenga un tetris y tenga que hacer más o menos las mismas combinaciones de teclas para escribir un caracter que para saltar y patear en el Yie Ar Kung Fu, no se compara :P





martes, 28 de octubre de 2008
Mis primeros 0 bytes aportados al core de Plone
Como parte de las actividades locas de los viernes en menttes, esta vez, como hace ya un par de semanas, estuvimos tratando de resolver tickets para el "Plone Tune-Up". En este evento se tratan de solucionar problemas reportados al bug tracker de Plone.
Estuve trabajando en un problema javascriptoso que para variar, solo ocurría en Internet Explorer.
A un documento de Plone, se le puede activar una tabla de contenidos desde "Editar" -> "Configuración" y activar la TdC. Esto genera con javascript la tabla en base a los headlines del documento.
El problema reportado era que en IE7, los títulos que contenían una @ se transformaban dentro de la tabla en el texto del link hacia el headline. En realidad también ocurre con títulos que comienzan con urls, y en IE6 (lo pude reproducir en linux usando IEs4linux)
El javascript que generaba la tabla usaba JQuery, en particular las líneas que metían el texto y el enlace eran puramente JQuery. Parecía ser un bug en esta librería, pero este thread en su lista me demostró que en realidad era todo culpa de IE.
La tremenda solución consistió en cambiar el orden de dos líneas del código.
Screenshot con el problema:

Screenshot con el javascript modificado:

El ticket ya fue cerrado, "commiteado" y "mergeado":D
La verbosidad de este patch va perfecto con mi personalidad, pero igual espero poder aportar para el próximo tuneup algún parche un poco más interesante :)
Estuve trabajando en un problema javascriptoso que para variar, solo ocurría en Internet Explorer.
A un documento de Plone, se le puede activar una tabla de contenidos desde "Editar" -> "Configuración" y activar la TdC. Esto genera con javascript la tabla en base a los headlines del documento.
El problema reportado era que en IE7, los títulos que contenían una @ se transformaban dentro de la tabla en el texto del link hacia el headline. En realidad también ocurre con títulos que comienzan con urls, y en IE6 (lo pude reproducir en linux usando IEs4linux)
El javascript que generaba la tabla usaba JQuery, en particular las líneas que metían el texto y el enlace eran puramente JQuery. Parecía ser un bug en esta librería, pero este thread en su lista me demostró que en realidad era todo culpa de IE.
La tremenda solución consistió en cambiar el orden de dos líneas del código.
Screenshot con el problema:

Screenshot con el javascript modificado:

El ticket ya fue cerrado, "commiteado" y "mergeado":D
La verbosidad de este patch va perfecto con mi personalidad, pero igual espero poder aportar para el próximo tuneup algún parche un poco más interesante :)
lunes, 18 de agosto de 2008
Receta milenaria para preparar lupines.
El simpático nombre que elegí para este blog hace que mucha gente inocente se encuentre con código Python cuando en realidad está buscando cómo hacer los lupines como los hacía la abuela.
Para orientar a estos internautas, les traigo su pedido al pie de la letra.
A continuación, mi abuela Titina les explica como preparar lupines (para acompañar con cerveza, como este blog recomienda)

Paso 1: Poner los porotos lupines en una olla con agua y abundante sal gruesa (un pocillito de café, como muestra la foto), y dejarlos remojar por una noche.

(la censura era solo para probar el efecto. Muy profesional, jeje)
Paso 2: Poner a hervir y dejar a fuego lento por 2 horas.

Paso 3: Esperar a que enfríe, retirar el agua removiéndolos para que se se limpien y agregar nuevamente agua con sal. Esto ya puede hacerse en el envase que se quiera utilizar para almacenarlos en la heladera.
Paso 4: Poner el envase en la heladera, y 2 veces al día renovar el agua y la sal, durante 3 días.

Luego ya se los puede consumir. Se los puede ir probando para ver si están en el punto justo, y no están amargos.
Si no se los consume, se deben guardar en la heladera y cambiar el agua con sal una vez al día.

Si tienen dudas o quieren comentar cómo les fue, escriban un comentario. Titina lee y agradece todos los mensajes.
Para orientar a estos internautas, les traigo su pedido al pie de la letra.
A continuación, mi abuela Titina les explica como preparar lupines (para acompañar con cerveza, como este blog recomienda)

Paso 1: Poner los porotos lupines en una olla con agua y abundante sal gruesa (un pocillito de café, como muestra la foto), y dejarlos remojar por una noche.

(la censura era solo para probar el efecto. Muy profesional, jeje)Paso 2: Poner a hervir y dejar a fuego lento por 2 horas.

Paso 3: Esperar a que enfríe, retirar el agua removiéndolos para que se se limpien y agregar nuevamente agua con sal. Esto ya puede hacerse en el envase que se quiera utilizar para almacenarlos en la heladera.
Paso 4: Poner el envase en la heladera, y 2 veces al día renovar el agua y la sal, durante 3 días.

Luego ya se los puede consumir. Se los puede ir probando para ver si están en el punto justo, y no están amargos.
Si no se los consume, se deben guardar en la heladera y cambiar el agua con sal una vez al día.

Si tienen dudas o quieren comentar cómo les fue, escriban un comentario. Titina lee y agradece todos los mensajes.
Suscribirse a:
Entradas (Atom)
