danigm's picture

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
[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.

danigm's picture

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.
TBO's picture

Estoy pensando en cómo implementar el sistema de deshacer/rehacer de TBO, y no se cuál sería la mejor forma de hacerlo.

Las dos opciones que estoy barajando son:

1. Guardar el estado. La idea es que antes de cada operación que se pueda deshacer se guarde el estado actual del documento en la lista de deshacer.

pros: creo que es fácil de implementar/mantener
contras: El coste en memoria puede ser considerable, y clonar el estado en cada operación puede ser computacionalmente costoso.

2. Guardar la operación y su inversa. La idea es que antes de cada operación que se pueda deshacer se guarde la operación a realizar junto con su inversa en la lista de deshacer.

pros: Menor coste tanto en memoria como de calculo.
contras: Pueden existir operaciones cuya inversa sea muy compleja.

Me decanto por la segunda opción, pero lo mismo debería mirar un poco el código de gimp o inkscape un poco para ver qué es lo que hacen.

TBO's picture

Hoy me he puesto y he grabado un vídeo del estado actual de TBO para mostrar un poco su funcionamiento. Aquí está el vídeo:

danigm's picture

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:

  1. 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:

  1. 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.

  1. #!/bin/bash
  2. tmpname=tmpcrop.png
  3. ext=.png
  4. startimage=title.png
  5. endimage=first.png
  6. qual="100%"
  7.  
  8. percent=100
  9. counter=0
  10. while (( percent > 0 ))
  11. do
  12. counter=$(($counter+1))
  13. if [ $counter -lt 10 ]
  14. then
  15. n="0$counter"
  16. else
  17. n="$counter"
  18. fi
  19. composite -blend $percent -gravity center $startimage $endimage -quality $qual frame$n$ext
  20. percent=$(($percent-2))
  21. 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:

  1. 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:

  1. 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:

  1. ffmpeg -i output.avi -sameq main.mpeg
  2. ffmpeg -i title.avi -sameq title.mpeg

Y los vídeos mpeg se pueden unir con el comando cat:

  1. cat title.mpeg main.mpeg > video.mpeg

Y lo volvemos a convertir a avi:

  1. 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:

  1. 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:

  1. 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:

  1. 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:

  1. 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.

TBO's picture

TBO gantt

Según este diagrama que me da la forja de rediris parece que voy cumpliendo la planificación :D

TBO's picture

Aunque escriba poco en el blog, el desarrollo de TBO está siendo continuo y fluido. Me he puesto unos objetivos básicos en la forja de rediris con fechas y todo, y por ahora voy cumpliendo.

Si todo va bien, la versión 0.9 estará lista para finales de marzo.

También se puede seguir el desarrollo desde mi rama git

Voy a poner aquí el log del subversion para que se vea el avace:

Herramienta de texto (sin funcionalidad)
10 files changed, 236 insertions(+), 1 deletions(-)
Borrado de objetos y selección corregida
4 files changed, 35 insertions(+), 15 deletions(-)
Ojos, bocas y nuevos cuerpos
19 files changed, 1465 insertions(+), 112 deletions(-)
Rotación de objetos.
4 files changed, 138 insertions(+), 12 deletions(-)
Mejorados algunos detalles de interfaz
5 files changed, 13 insertions(+), 12 deletions(-)
Ya se pueden mover/redimensionar los monigotes :D
5 files changed, 267 insertions(+), 28 deletions(-)
Ya se pintan los monigotes en las viñetas!!
10 files changed, 166 insertions(+), 5 deletions(-)
Todo listo para añadir monigotes a las viñetas
1 files changed, 4 insertions(+), 17 deletions(-)
Unselect tool, liberando memoria y esas cosas
10 files changed, 58 insertions(+), 6 deletions(-)
Añadidos eventos sobre monigotes y bien escalados
1 files changed, 29 insertions(+), 3 deletions(-)
Monigotes en la herramienta de monigotes
1 files changed, 36 insertions(+), 6 deletions(-)
Mejoras visuales en las herramientas doodle y selector
2 files changed, 5 insertions(+), 5 deletions(-)
Tool Area scrollable & fondo & scroll drawing area
2 files changed, 18 insertions(+), 4 deletions(-)
Arreglado GtkWarging del action_group
1 files changed, 8 insertions(+), 5 deletions(-)
Plantillas de monigotes con un expander
3 files changed, 135 insertions(+), 76 deletions(-)
Buscando plantillas de doodle en el fs
1 files changed, 65 insertions(+), 0 deletions(-)
Ejemplo de uso de gmarkup.
3 files changed, 126 insertions(+), 0 deletions(-)
Mejor sistema de llamadas a eventos herramientas
16 files changed, 371 insertions(+), 111 deletions(-)
Herramienta de dibujado de monigote (no funcional)
17 files changed, 323 insertions(+), 35 deletions(-)
Añadida la vista detalla de viñeta
6 files changed, 128 insertions(+), 21 deletions(-)
Herramientas avanzadas del selector
2 files changed, 94 insertions(+), 26 deletions(-)

GECO's picture

A raíz de este párrafo, hablando sobre GECO:

"Al haber sido desarrollado como software libre permite que cualquier otra persona con la misma necesidad pueda utilizar este desarrollo, e incluso permite que cualquier empresa que lo vea rentable lo venda, ya sea como servicio o como producto."

Me han hecho una serie de preguntas a las que respondo cortésmente:

"¿Es eso cierto? Quiero decir: ¿Consentirías que una empresa se aprovechase de tu trabajo para hacer negocio vendiendo Geco como producto?"

Sí, es totalmente cierto, al ser software libre, cualquiera, incluso una empresa puede hacer negocio vendiendo GECO.

"Te lo digo porque creo que lo normal sería que si lo has desarrollado como software
libre le asociases una licencia "libre" de modo que eso asegurase que nadie tuviera que pagar por usar el producto y menos a alguien que no fuera su autor (en este caso tú mismo)."

La licencia GPL, que es la que tiene este proyecto en concreto, no impide su venta. Lo único que implica, es que si alguien hace alguna modificación o mejora sobre el código y lo vende, debe ofrecer el código de las mejoras, puesto que esta licencia es vírica y obliga a que todo desarrollo basado en este software siga siendo software libre.

Que sea software libre no implica que tenga que ser gratis, sino que los usuarios tienen todas las libertades sobre el código, pueden ejecutarlo para cualquier propósito, pueden estudiar el código y modificarlo, pueden redistribuir copias y también pueden distribuir copias del programa modificado.

Por tanto, si una empresa o particular coge GECO, y consigue venderlo, incluso sin hacer ninguna modificación al código, está en su completo derecho. Lo que sí es verdad es que tendrán que respetar la GPL y ofrecer el código fuente a sus clientes, al ser GPL no pueden coger el código y cerrarlo.

danigm's picture

Para todos aquellos que añoran el sol amarillo y brillante en estos días de lluvia he realizadoo este dibujo:

TBO

A disfrutar.

danigm's picture

Poco a poco, día a día, nos van quitando cosas por las que alguien luchó para que tuvieramos. Yo (y supongo que mi greneración) he crecido en un mundo de abundancia, de derechos, donde no he tenido que trabajar hasta los veintipico años, donde no he tenido que compartir cama con ningún hermano, e incluso he tenido habitación propia. Pensamos que siempre ha sido así, que la guardia civil ha tratado a la gente con respeto y nunca ha pegado una paliza a alguien por estar en el lugar equivocado y preguntar después.

Todo eso es muy bonito, y es nuestro mundo, lo que hemos conocido. En el colegio hemos estudiado historia. Pero la historia que se estudia es impersonal, son guerras, reyes, conflictos y eventos que quedan registrados en los periodicos, pero no sabemos cómo vivieron nuestros padres, cómo vivieron nuestros abuelos. Por conseguir qué derechos lucharon, no tenemos ni idea de cómo vivian y nos dedicamos a decir que antes se vivía mejor.

Escuchando a los mayores, pidiendo que nos cuenten historias, aprenderemos de dónde venimos, y qué es lo que tenemos, por qué han luchado y qué es lo que deberíamos defender con nuestra vida porque muchos murieron para el mundo fuera hoy un poco mejor y a nosotros nos arrebatan poco a poco, día a día, sin que nos demos cuenta, los derechos fundamentales.

Miro la sociedad de hoy en día y veo un problema grande, están separando al pueblo. Nos están volviendo a unos contra otros, desconfiados, todos son el enemigo, el mundo es muy peligroso, no salgas de tu casa, no hables con extraños, todo el mundo quiere engañarte. El hombre como individuo no tiene ningún poder contra nada, es facilmente silenciable y se puede comprar con dinero. Sin embargo, cuando nos reunimos, cuando nos asociamos, cuando no somos un hombre, sino un grupo de personas, el poder es infinito, es imparable, no se puede silenciar a un grupo, ni se puede comprar.

Es por eso que debemos hablar, asociarnos, formar grupos de gente con los mismos intereses para luchar contra el "poder".

Muchas veces he pensado que yo era la única persona que pensaba que las consas estaban mal, y seguramente a muchísima gente se le habrá pasado por la cabeza, pero al pensar que estamos solos no podemos hacer nada, sin embargo si escuchas un poco, si cuentas tus pensamientos, te das cuenta de que mucha más gente comparte lo mismo que tú y entonces sentirás esa sensación de poder, de valor, que da la "manada", el saber que tus palabras están respaldadas por más personas.

Aprende de tus mayores, organízate para defender tus derechos, porque firmes un contrato no eres esclavo de nadie, es simplemente un acuerdo de prestación de servicios. El paro no es el problema, el problema es el hambre.

Nunca he pasado hambre, nunca he temido por mi vida, así que no me hables de crisis ni del fin del mundo, que todavía queda mucho para eso.