danigm's blog

Hace mucho tiempo andaba el hombre por el campo con los huevos colganderos, sin ropajes ni gallumbos. Este hombre no podía descansar, porque tenía que buscar comida todos los días y por la noche se tenía que defender de los depredadores.
Un buen día se levantó por la mañana y pensó: "oye, si en lugar de recoger todas las manzanas estas del manzano e ir a buscar otro, cojo estas semillas y me planto otro aquí al lado, podré levantarme más tarde". Y así lo hizo, y plantó
unos 20 manzanos cerca de su cueva, y así no tenía que levantarse tan temprano por la mañana para ir a buscar manzanas.
Otro día, al levantarse por la mañana, al buen hombre se le ocurrió otra gran idea: "ooooye, esto que he hecho con las manzanas lo puedo hacer también con los animales, los tengo aquí cerca, que no se puedan escapar, y cuando me apetezca
carne pues no tengo que irme a lo alto del monte a buscar las malditas cabras". Y así lo hizo, y al lado de su cueva montó un cerco para encerrar cabras.
Y así continuó la historia de avances y progresos, el hombre cada vez tenía que trabajar menos para tener comida en abundancia, de tal forma que con pocos días de trabajo tenía comida para todo un mes.
Y un maravilloso día, después de años de progreso, el hombre se levantó por la mañana y miró el reloj. Eran las 6:00 de la mañana, aún no había amanecido, y ya tenía que irse a trabajar, viajar durante una hora, trabajar durante ocho horas,
con hora y media o dos horas para comer (por supuesto), viajar otra vez de vuelta, y estar en casa después de doce horas, bastante cansado para hacer otra cosa que no sea dormir. Y en ese momento de lucidez que sólo ocurre justo antes de dormir o justo al levantarse, le vino un pensamiento a la cabeza: "Oye, hace ya algún tiempo inventé la agricultura y la ganadería entre otras cosas para no tener que estar todo el día para arriba y para abajo recolectando y cazando, y así tener más tiempo para hacer lo que me apetezca, ¿Qué ha pasado por el camino del progreso si ahora estoy peor que antes?". Pero llegaba tarde a trabajar, así que abandonó esa idea, y corrió para no perder el "tiempo".
--
Esta bonita historia por supuesto no es completa, no contempla todos los elementos implicados en el "problema", pero es algo que se me ha pasado por la cabeza un par de veces y quería compartirlo.
Siempre viene bien preguntarse por qué razón trabajamos tantas horas, sobretodo para la gente que no disfruta de su trabajo.
Y también está bien plantearse de vez en cuando cómo hemos llegado a este punto después de tanto "progreso". Yo creo que lo que le ocurrió a este buen hombre es que un día apareció un hombre con un palo y le dijo: "estos manzanos y estas cabras son míos, si quieres comer tendrás que recoger las manzanas para mí y mi familia, y matar esa cabra, despeyellarla y cocinarla para mí". Y así nació la nobleza y la clase obrera.
El problema es que han pasado generaciones, y los que hemos nacido con este "sistema" lo vemos como normal y lógico, "hay que trabajar para poder vivir" y aceptamos como obligación o necesidad el trabajo, cuando lo realmente necesario, las necesidades básicas, están ya cubiertas (o podrían estarlo), a nivel global, con muy poco esfuerzo, gracias a la tecnología y la ciencia.

Estaba yo viendo hoy una serie de imágenes de un blog y esta me llamó la atención:
La quería como fondo de escritorio, pero como no tenía el tamaño adecuado y tengo ordenadores con diferentes resoluciones la quería en svg.
Así pues me he puesto y he vectorizado algo parecido:

También he encontrado otra imagen similar, que en lugar de poner get a life pone grow up, y en lugar de verde es rojo, como era de suponer, y ya que estaba pues lo he vectorizado también:

Y ya que estaba, y como de vez en cuando me da por hacer un fondo de escritorio nuevo, y al final se acaban perdiendo entre los diferentes ordenadores que uso, pues he decidido montar un repositorio de svgs con los fondos de escritorio que voy haciendo.

Pablo Neira me ha pedido que haga un pequeño logo para el workshop de netfilter de este año, que se celebra en sevilla.
Ya dibujé el pingüino que se usó en el workshop del 2007
Aquí dejo el dibujo un poquito más grande:

El funcionamiento de la web puede parecer complejo, pero es todo lo contrario, es un protocolo sencillo que ha ido siendo ampliado o recubierto con otras tecnologías para darle más potencia y funcionalidad.
La web se basa principalmente en el protocolo HTTP, que es un protocolo cliente servidor, donde el cliente normalmente es un navegador que le pide al servidor un fichero y el servidor le contesta enviándole el fichero solicitado. Es un protocolo sin conexión, por lo que cada petición es independiente y en principio no tiene estado.
Estos ficheros que sirven los servidores suelen estar formateados de tal forma que los navegadores puedan representarlos, y para eso existe HTML (HyperText Markup Language). HTML es un lenguaje de marcas que sirve para dibujar las páginas webs. Con este lenguaje de marcas puedes hacer que el texto pase de ser un simple texto plano a un texto formateado, con encabezados, negritas, cursivas, colores, imágenes, enlaces, lo que es al fin y al cabo una página web.
Las marcas del lenguaje HTML están encerradas entre signos de mayor y menor (<, >) y en realidad es un XML, aunque no tiene por qué estar bien formateado.
Por lo tanto, para iniciarnos en el desarrollo web tan solo tendríamos que crear un fichero .html y servirlo a través de un servidor web:
<!-- index.html --> <html> <head> <title>Hola Mundo</title> </head> <body> Hola <strong>Mundo!</strong> </body> </html>
Si creas este fichero en tu propio ordenador y lo abres con cualquier navegador web, verás el resultado.
Los servidores web son simples programas que lo único que hacen es recibir peticiones de clientes (navegadores) y responder con el fichero solicitado.
Los servidores web más famosos son:
- Apache (http://apache.org/)
- Cherokee (http://www.cherokee-project.com/)
- Lighttpd (http://lighttpd/)
- nginx (http://nginx.org/)

Además de los lenguajes de programación normales y corrientes existen lenguajes de programación esotéricos creados para "divertirse" o de manera meramente educativa/científica, no con una orientación funcional.
Un lenguaje esotérico muy conocido es el brain fuck, cuyas primitivas son "><+-[]. y ,". Estos son todos los simbolos de los que dispone el lenguaje y con los que hay que escribir el programa.
No voy a explicar qué hace cada simbolo ni cómo, para eso está la wikipedia o la página oficial. Incluso hay tutoriales sobre brainfuck para aprender a programar las primitivas básicas de un lenguaje de programación con estos simbolos.
La cosa es que me ha dado por ahí y ayer me puse a programar algo. La idea era hacer un programita que pidiera dos números por teclado, y luego los sumara. Nada complicado.
El mayor problema con el que me he encontrado es a la hora de representar el resultado por pantalla cuando el número era mayor de 10, puesto que con brainfuck tienes que sacar por pantalla caracter a caracter.
Por supuesto este programa no suma números de más de dos dígitos, dado que la entrada se hace cáracter a carácter y parsear un 12 por ejemplo implicaría una complejidad inimaginable (quizás no tanto, pero eso requeriría unas cuantas horas más).
Aquí está el código:
<++++++++++[>++++++++++<-]><++[>+++++<-]>.<++++++ [>----------<-]>-.<+++[>+++<-]>.<<<<<<,>>>>>><<<< ,>>>>[-]<++++++++++[>++++++++++<-]><++[>+++++<-]> .<++++++[>----------<-]>.<+++[>+++<-]>-.<<<<<<<,< <<,>>><<<<[-]++++[>>>>------------<<<<-]++++[>>>> >------------<<<<<-]>>>>[>+<-]>>>[-]<<[>>+<<-]>>[ <+<+>>-]<<>>+<>>>[-]+<<<>>>>>[-]<<<<<>>>>[-]+++++ +++++[<<<<-+[>>>[-]<<<>>>>>+<<<<<-]->>>[<<<>-<>>> [-]]<<<>>>[-]+<<<>>>>>[<<<<<+>>>>>-]<<<<<>>>>-]<< <<<<<<<<[-]++++++++++++++++++++++++++++++++++++++ ++++++++++>>>>>>><<<<[-]++++++[>>>>++++++++<<<<-] >>>>.<<<<[-]++++++[>>>>--------<<<<-]>>>>[<<<<<<< [-]++++++++++++++++++++++++++++++++++++++>>>>>>>[ -]]<<<<<<<[>>>>>+<<<<<-]>>>>>.[-]<[-]++[>+++++<-] >.
¿Por qué brainfuck? ¿Estás loco o qué? No se, es divertido tratar de encontrar soluciones a problemas y si tienes que utilizar un lenguaje como este el reto es mucho mayor. Nunca viene mal ejercitar un poquiito las neuronas y recordar cosas de computación básica. Al fin y al cabo el universo podría reducirse a estos simbolos, eso sí, habría que escribir un montón.

Cuando un sistema de control de versiones nos da un conflicto en una mezcla suele ser un fastidio, porque eso quiere decir que toca hacer la mezcla a mano. Por suerte existen buenas herramientas que sirven para facilitar la tarea.
Yo como soy usuario de vim, pues suelo usar vimdiff para ver diferencias y mezclar de un fichero a otro.
Me acabo de hacer un script para cuando tengamos un conflicto en git poder abrir directamente las dos versiones de un fichero conflictivo, versión tuya y versión externa, a la vez en un vimdiff con un solo comando. Lo he llamado gitconflict:
#!/bin/bash git show :2:$1 > $1.ours git show :3:$1 > $1.theirs vimdiff $1.ours $1.theirs
El script este crea dos ficheros el .ours y el .theirs con las dos versiones correspondientes.
Y para usarlo:
$ gitconflict fichero_conflictivo

Ayer estuve haciendo algunas cosillas con gitpython y cairo para hacer unas gráficas chulas usando la información que nos ofrece un repositorio git. He creado un proyecto en gitorious con estos scripts.
Lo más chulo es el script gittimeline.py, que basandose en los commits y las estádisticas de estos commits muestra una galaxia de commits. Se van mostrando bolitas de colores que simbolizan a cada committer. El tamaño de la bola depende del número de cambios hechos y con el tiempo se van difuminando las bolas. Cuando un committer es regular, la bola que lo representa se va acercando al centro.
Aquí hay un vídeo de cómo se vería:
La forma de usar el script es la siguiente:
gittimeline.py path-to-repo [update-time-ms] [since-date]
Para repositorios grandes recomiendo usar el parámetro since-date para que no tarde una eternidad en empezar. La fecha se tiene que especificar con el formato 1970-01-01.

Desde principios de año estoy trabajando en yaco. Yaco es una pequeña empresa sevillana que se dedica a prestar servicios de consultoría y desarrollo de software libre y sobre todo desarrollo web con python tanto plone como django.
El funcionamiento de la empresa es parecido al de Emergya (empresa en la que estuve trabajando durante ocho meses) e incluso comparten una historia común, sin embargo tiene una serie de diferencias, por ejemplo emergya es prácticamente el doble de grande que yaco, y afronta casi todo tipo de proyectos, sin embargo yaco está más enfocada o especializada en el desarrollo de aplicaciones web.
Una empresa al fin y al cabo es un conjunto de empleados, y en esta empresa hay gente muy buena y muy inquieta, y por parte de la dirección se les permite pensar, opinar y desarrollarse. Un ejemplo de esto es el "día de proyectos personales" que es una iniciativa nueva de este año y que pretende brindar a los desarrolladores un día al mes para dedicar a desarrollar un proyecto propio. Es decir, que la empresa te dona parte de su tiempo para que lo dediques al proyecto software libre que a ti te parezca. Algo similar a lo que se hace en google, pero con menos recursos, por algo se empieza.
Pues bien, en principio voy a dedicar estos días de proyectos personales a seguir desarrollando sweetter y que no muera el proyecto. Mi idea principal es refactorizar todo el código, y corregir fallos que ahora que estoy desarrollando en django estoy descubriendo, y posteriormente surtir al proyecto con una serie de plugins útiles y empezar a buscarle rentabilidad o utilidad primero dentro de yaco, y después hacia nuestros clientes.
Y ya que estoy hablando de yaco, voy a contar las cosas que me gustan de trabajar aquí:
- Trabajo desarrollando en python y con software libre
- Hay gente con mucha experiencia e ideas interesantes, el equipo de trabajo es ideal y se puede trabajar de manera dinámica y ágil
- Los empleados están organizados, hay un delegado de personal que representa al conjunto de los empleados y todos conocen sus derechos
- Horario flexible y ajustable a tus necesidades
- La oficina está en el centro y puedo ir patinando
- La oficina es un lugar genial donde trabajar, está muy bien decorada, con las paredes pintadas con monigotes, hay una terraza, un sofá, en definitiva, se está como en casa
- Tenemos un futbolín y una wii en la oficina
- Hay comida y bebida gratuita en la oficina
- Cada vez que se consigue un proyecto nuevo hay desayuno gratis para todos, más conocido como campanazo, porque hay una campana que se toca cuando se consigue el proyecto.

De vez en cuando me da por grabar un vídeo de cómo dibujo con el inkscape y esas cosas, lo acelero, le pongo música y lo cuelgo en youtube. Pues bien voy a explicar cómo hago toda esa mierda, para cuando se me olvide, o por si alguien que esté aburrido lee estoy y le sirve de ayuda.
Grabación del vídeo
Para grabar lo que hago en mi escritorio utilizo una fantabulosa aplicación llamada gtk-recordmydesktop. Esta aplicación me genera un fichero out.ogv.
Conversión a avi y aceleración
El ogv está muy bien, pero si lo quieres subir a youtube o a algún sitio de estos es mejor convertirlo. Yo lo convierto a avi usando mencoder. Además acelero el vídeo para que no sea un tostón de 30min:
mencoder out.ogv -fps 250 -vf scale=640:375 -ovc lavc -o output.avi
Creación de cabecera
Para que el vídeo quede más bonito se le puede añadir una cabecera, una imagen con texto que salga antes del vídeo y que desaparezca con un fundido.
Para ello vamos a utilizar imagemagick, ffmpeg y mencoder.
Primero capturamos el primer frame del vídeo:
ffmpeg -i output.avi -vcodec png -vframes 1 -ss 00:00:00 -an -f rawvideo first.png
Luego con el gimp o con el editor que te de la gana, creamos la imagen de cabecera que vamos a introducir, del mismo tamaño que first.png (640x375). Recomiendo un texto claro y simple sobre fondo negro. Y a esta imagen la llamamos title.png.
Ahora ejecutamos el siguiente script en el mismo directorio donde están las imágenes title.png y first.png.
#!/bin/bash tmpname=tmpcrop.png ext=.png startimage=title.png endimage=first.png qual="100%" percent=100 counter=0 while (( percent > 0 )) do counter=$(($counter+1)) if [ $counter -lt 10 ] then n="0$counter" else n="$counter" fi composite -blend $percent -gravity center $startimage $endimage -quality $qual frame$n$ext percent=$(($percent-2)) done
Este script genera una animación de 50 frames de "fade out" de la imagen de cabecera hacia el primer frame, el fundido.
Ahora para que se pueda ver la cabecera, copiamos la imagen repetidas veces, unas 100 estará bien:
for i in $(python -c "print '\n'.join('%02d'%i for i in range(1,100))"); do cp title.png a$i.png ; done
Ahora borramos title.png y first.png y generamos un .avi a partir de todos los pngs que tenemos:
mencoder mf://*.png -mf fps=25:type=png -ovc lavc -lavcopts vcodec=mpeg4 -oac copy -o title.avi -ffourcc DX50
Todo junto, unir dos .avi
Para unir la cabecera con el vídeo usaremos ffmpeg y cat. Convertimos los dos vídeos a vídeos temporales mpeg:
ffmpeg -i output.avi -sameq main.mpeg ffmpeg -i title.avi -sameq title.mpeg
Y los vídeos mpeg se pueden unir con el comando cat:
cat title.mpeg main.mpeg > video.mpeg
Y lo volvemos a convertir a avi:
ffmpeg -i video.mpeg -sameq video.avi
Vamos a por el sonido
Ahora queremos añadirle una banda sonora, así que buscamos una canción bonita que vaya con nuestro vídeo y que dure algo más. Podemos ver la duración del vídeo reproduciéndolo con mplayer y pulsando oo.
El archivo de sonido se puede retocar con audacity para recortarlo, añadirle efectos de fadein fadeout al principio y al final, etc. Pero aquí voy a explicar como añadir el efecto de fadeout al final con sox, desde la consola.
Fadeout mp3 con sox
Para que quede bien el corte a la canción vamos a añadir el efecto de fundido en el sonido. Supongamos que tenemos la canción elegida y se llama soundtrack.mp3.
Lo primero es convertirla a wav para trabajar sobre ella:
lame --decode soundtrack.mp3 soundtrack.wav
Ahora supongamos que nuestro vídeo dura dos minutos y queremos que el fundido sea en los últimos 5 segundos:
sox soundtrack.wav st.wav fade t 0 120 5
El 120 son los dos minutos (en segundos) y el 5 son los 5 segundos de fundido.
El efecto fade con sox recibe cuatro parámetros:
fade [type] fade-in-length [stop-time [fade-out-length]]
Puedes ver más ejemplos y detalles sobre sox en su manual, man sox.
Ahora convertimos el wav a mp3:
lame st.wav
Añadir banda sonora. Adjuntar audio a video
Para finalizar vamos a unir el mp3 que hemos editado con el vídeo. Para ello vamos a utilizar mencoder:
mencoder video.avi -o final.avi -ovc copy -oac copy -audiofile st.wav.mp3
Y con esto y un bizcocho tendremos un vídeo genial para subir a youtube o a donde haga falta, y todo hecho desde la línea de comandos, por lo que podríamos crearnos un megascript que le metiera una cabecera y unos créditos a nuestros vídeos de manera automatizada.





