Adentrándose en Unix


Trasteando Gource

Posted in Comunidad por Noelia en 16 mayo 2010
Tags: , , ,

Hola de nuevo:

En la última entrada comenté un poco por encima un programita muy curioso y subí un vídeo de lo que mostraba al pasarle el repositorio de WikiUNIX. Este programa se llama Gource y para el que no lo leyera en la entrada anterior, sirve para generar una animación para visualizar el desarrollo de proyectos a partir de la información administrada por el sistema de control de versiones.

Gource soporta directamente Git, Bazaar y Mercurial, por lo que sólo tenéis que ejecutarlo desde la raíz del repositorio y listo. Sin embargo, como ya comenté había que utilizar trucos para que tirara en Subversion (no es que sea muy fan de este sistema de control de versiones, pero en la forja de RedIRIS no hay más remedio). Uno de esos trucos era utilizar un script, pero antes de esto había que llamar a svn para guardar los logs del repositorio, y pensé: “Pues hacer esto completamente automático es facilillo”, así que he retocado el script que ya estaba hecho para tener que ejecutar una única orden:

#!/usr/bin/python
# -*- coding: utf-8  -*-
## Copyright (c) 2010 Noelia Sales Montes (noelia.salesmontes@gmail.com)
## Copyright (c) 2009 Cameron Hart (cam@bitshifter.net.nz)
## All rights reserved.
##
## Redistribution and use in source and binary forms, with or without
## modification, are permitted provided that the following conditions
## are met:
## 1. Redistributions of source code must retain the above copyright
##    notice, this list of conditions and the following disclaimer.
## 2. Redistributions in binary form must reproduce the above copyright
##    notice, this list of conditions and the following disclaimer in the
##    documentation and/or other materials provided with the distribution.
## 3. The name of the author may not be used to endorse or promote products
##    derived from this software without specific prior written permission.
##
## THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
## IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
## OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
## IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
## INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
## NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
## THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
"""
Python script that converts the XML output of the svn log command into a
format that can be read by the gource custom log format option and execute
gource to show the animation.
"""

import sys
import os
import time
import getopt
import re
from xml.etree import ElementTree

__clean__ = False
__verbose__ = False
__filter_dirs__ = False
# width x height
__size__ = "800x600"
# seconds per day
__time__ = "1"
__usage__ = """
USAGE: svn-gource.py [--help] [--clean] [--verbose] [--filter-dirs]
[--size WIDTHxHEIGHT] [--time SECONDS-PER-DAY]
"""
# regular expression for matching any file with an extension
__extn_prog__ = re.compile(".*/?[^/]+\.[^\.]+$")

def reverse(data):
    """Returns the log entries in reverse."""
    for index in range(len(data)-1, -1, -1):
        yield data[index]

def verb(message):
    """Prints in verbose mode."""
    if __verbose__ == True:
        print message

def process_xmltree(__xmltree, logfile):
    """Prints the log file converted into the gource format in a new log file.
    """
    if os.path.exists(logfile):
        os.remove(logfile)
        verb("Removing %s" % logfile)

    verb("Translating %s" % logfile)

    for logentry in reverse(__xmltree.getiterator("logentry")):
        datetext = logentry.find("date").text

        # svn xml logs always use UTC
        timestamp = (time.mktime(time.strptime(datetext[:-8],
                                               "%Y-%m-%dT%H:%M:%S")))
        # a bit of a hack to get it into local time again...
        #timestamp = timestamp - time.timezone

        #author might not exist
        try:
            author = logentry.find("author").text
        except:
            author = ""

        __f = open(logfile, "a")

        # output all affected files
        for pathentry in logentry.getiterator("path"):

            # apply directory filtering strategy
            if __filter_dirs__ and not re.match(__extn_prog__,pathentry.text):
                continue;

            # join output
            __f.write( "|".join(("%d" % int(timestamp),
                               "%s" % author.encode("utf-8"),
                               "%s" % pathentry.get("action"),
                               "%s" % pathentry.text.encode("utf-8"), "\n")))

        __f.close()

def print_usage(message):
    """ Prints the script's usage """
    sys.stderr.write(__usage__)
    if message:
        sys.exit('\nFATAL ERROR: ' + message)
    else:
        sys.exit(1)

if __name__ == "__main__":
    try:
        __opts__, __args__ = getopt.getopt(sys.argv[1:],
                                           'hvcfs:t:', ['help',
                                                        'verbose',
                                                        'clean',
                                                        'filter-dirs',
                                                        'size',
                                                        'time'])
    except getopt.GetoptError:
        print_usage('Invalid arguments.')

    for (opt, val) in __opts__:
        if opt in ('--help', '-h'):
            print_usage(None)
        elif opt in ('--clean', '-c'):
            __clean__ = True
        elif opt in ('--verbose', '-v'):
            __verbose__ = True
        elif opt in ('--filter-dirs', '-f'):
            __filter_dirs__ = True
        elif opt in ('--size', '-s'):
            __size__ = val
        elif opt in ('--time', '-t'):
            __time__ = val

    verb('  OPTIONS:')
    verb('Size = %s' % __size__)
    verb('Seconds per day = %s\n' % __time__)

    os.popen("svn log --verbose --xml > project.log")

    __XMLTREE = ElementTree.parse("project.log")

    process_xmltree(__XMLTREE, "project-gource.log")

    verb('Calling gource... Showing the animation.')

    os.popen("gource -%s -s %s --log-format custom project-gource.log" %
             (__size__, __time__))

    if __clean__:
        verb("Removing log files.")
        os.remove("project.log")
        os.remove("project-gource.log")

Os comento un poco por encima qué opciones tiene el script:

  • –help, -h: Típica ayuda.
  • –verbose, -v: Modo chivato, por si queréis ver qué va haciendo (tengo costumbre de ponerlo por facilitarme el testeo…).
  • –clean, -c: Una vez finalizada o cancelada la animación, borra los ficheros de log utilizados, en este caso “project.log” y “project-gource.log”. De todas formas, se fuerza el borrado de “project-gource.log” antes de generarlo de cero, para asegurar que no se guarda nada raro de alguna ejecución anterior.
  • –filter-dirs, f:
  • –size, -s ANCHOxALTO: Esta opción recibe el tamaño de la ventana que generará gource. Atención que tanto el ancho como el alto se pasan en un mismo argumento, separados únicamente por una “x”. Si no se utiliza esta opción, se tienen por defecto 800×600.
  • –time, -t: Número de segundos por día que tomará la animcación. Si no se utiliza esta opción, se tiene por defecto 1 segundo por día.

Bueno, lo único que tenéis que hacer es guardarlo en “svn_gource.py” y ejecutarlo desde la raíz del repositorio pertinente (si tenéis varios repositorios, os resultará más cómodo tenerlo en el directorio padre de éstos y ejecutarlo desde dentro) con un simple:

python svn_gource

Yo suelo ejecutarlo usando las opciones:

python svn_gource -s 1200×600 -t 0.1 -v -c

A ver si puedo habilitar la subida de ficheros “especiales” al wiki para facilitar la descarga de los scripts.

Un saludo a todos, unixeros 😉

PD: Para cualquier duda, problema, comentario, … acerca del script podéis utilizar los comentarios del blog o escribir en la página de discusión del script en el wiki directamente.

Anuncios

Taller de Bots en Wikipedia

Posted in Comunidad por Noelia en 13 marzo 2010
Tags: , , ,

Hola a todos:

El próximo lunes 15 de marzo de 18:00 a 20:00 impartiré un taller de “Programación de bots para MediaWiki” según el programa oficial de las V Jornadas de Software Libre y Conocimiento Abierto. En el taller se pretende hacer una introducción a la utilización de pywikipedia para el desarrollo de bots para MediaWiki.

Es un tema muy interesante y que me ha resultado muy útil en este proyecto, sobre todo a la hora de realizar tareas repetitivas en wikiUNIX. Aprovecho para agradecer la ayuda prestada en este sentido a Emilio J. Rodríguez, ya que me ha ayudado desde el principio del proyecto y además es el que ha aportado el contenido de la presentación.

Recordad, en el Aula Informática 2-09 de 18 a 20 el próximo lunes. ¡No olvidéis inscribiros!

Un saludo a todos, unixeros 😉

Proyecto Fin de Carrera presentado

Posted in Comunidad,Documentación,WikiUnix por Noelia en 26 febrero 2010
Tags: , , ,

Hoy, día 26 de febrero de 2010 a las 10 de la mañana, he presentado WikiUNIX ante el tribunal de Proyecto Fin de Carrera. Puedo afirmar que ya soy Ingeniera Técnica en Informática de Sistemas (extraoficialmente, falta un papel sellado donde esté escrito).

Ya que la etapa-PFC del proyecto ha llegado a su fin, he subido toda la documentación y todos los documentos utilizados a las secciones de ficheros y documentos de la forja “Doc & Code”.

Podéis acceder a los documentos publicados en PDF así como a ficheros comprimidos tar.gz que contienen (además del sistema de control) todos los códigos en LaTeX de cada uno de los documentos generados por separado. Esto incluye:

Como siempre, todos los códigos están liberados bajo licencia libre, por lo que podéis trastearlos tanto como queráis.

Saludos, unixeros!

Colaboración entre proyectos

Posted in Comunidad,CUSL por Noelia en 31 enero 2010
Tags: , ,

Buenas a todo el mundo:

Son casi las 2 de la mañana. No tengo ganas de hacer nada más del proyecto, al menos hasta que descanse un ratillo. Solo me queda el blog o pasearme un rato por twitter. Así que vamos a darle algo de vidilla a esto.

Últimamente he estado bastante productiva en cuanto a diseño gráfico se refiere. Tampoco he hecho grandes obras ni soy una experta ni nada de eso, pero soy de esas personas que disfrutan como un niño pequeño cuando se pone a trastear el Inkscape por ejemplo.

A nivel personal, me desestresa ponerme a trastear programas de este tipo, pero además este año estoy dando rienda suelta a esta faceta gracias a algunos compañeros, algunos de ellos del CUSL. Llevamos una relación un tanto simbiótica: uno hace el logo de otro, otro hecha un cable con una duda de Python, un tercero pide opinión acerca de cómo enfocar un problema que le da un grave dolor de cabeza,… y así todos los días.

Antes que nada me gustaría darle las gracias a esos compañeros (y amigos xD) que me aguantan todos los días y que siempre aportan todo lo que pueden y más. Bueno voy a dejar el momento emotivo para otro día…

Lo que os quería enseñar es parte de esa colaboración entre proyectos o lo que es lo mismo la parte gráfica que me han permitido desarrollar de esos proyectos, algunos actuales y otros de hace más tiempo. Os comento los proyectos en el orden en que he ido colaborando con ellos:

  • Resistencia en Cádiz:1812 Este fue el primer proyecto del cual pude hacer algo de este estilo. Está siendo desarrollado por Pablo Recio y podéis encontrar su blog aquí (también está enlazado en el blogroll). Creé los siguientes elementos
Favicon-1812

Favicon 1812

pieza_1812

Pieza 1812

  • Learning WX Gracias a este proyecto desarrollado por Rosa María Durante, he podido hacer también muchos diseños, tanto para el proyecto en general, como para la aplicación previa que acaba de explicar en esta entrada de su blog. Una pequeña muestra de lo que he diseñado es:
Logo Learning WX

Logo Learning WX

Descarga WxTutorial!

Icono Descarga

Ver imagen WxTutorial!

Icono Imagen

Icono Test

Icono Test

Flecha WxTutorial!

Icono Flecha Genérica

Ejercicios WxTutorial!

Icono Ejercicios

  • AVBOT También tuve la oportunidad (al fin… más vale tarde que nunca) de diseñar el logo de AntiVandalBOT, proyecto desarrollado por Emilio José Rodríguez y que tuvo muchísimo éxito. Yo me ofrecí hace unos meses (bastantes meses) a diseñar algo para el proyecto; sin embargo, yo y mi imaginación lenta no llegamos a hacer nada productivo. Hace un mes o así se me encendió la bombilla y surgió esto (podéis encontrar otra versión del logo en la página principal del BOT en la Wikipedia):
Logo AVBOT

AVBOT

Además he hecho algunas cosillas más (tampoco demasiadas) en mis ratos libres, que podéis encontrar aquí. Espero seguir subiendo alguna más cada cierto tiempo, para no dejar el pasatiempo de lado.

Todas las imágenes subidas y las que se encuentran en el album están liberadas bajo Creative Commons Attribution ShareAlike.

Un saludo a todos, unixeros 🙂

Screencast con XVidCap

Posted in Comunidad por Noelia en 23 diciembre 2009
Tags: , ,

Hola de nuevo:

No lo comenté el otro día, pero entre la reunión con los compañeros del CUSL y lo que charlo por ahí, tengo bastantes ideas sobre post interesantes/útiles que podría añadir… Otra cosa es que tenga tiempo para hacerlo 😛

Total, que una de las ideas era incluir un post acerca de cómo realizar un screencast para aquellos que les pueda ser útil realizar un pequeño vídeo de su aplicación (nunca se sabe cuando pueden fallar las cosas y tener uno de estos puede salvarte la vida muchas veces).

He probado unos cuantos programas, pero me quedo con XVidCap porque personalmente es el más simple, el que mejor funciona en mi equipo y con el que mejor me llevo, además de ser software libre. También andan por ahí otros como record-my-desktop, pero no terminan de convencerme. Así que, empiezo con la mini-guía:

(more…)

Encuentro de participantes del CUSL en Cádiz

Posted in Comunidad,CUSL por Noelia en 18 diciembre 2009

Buenas a todos:

Retomo el blog con nuevas energías para comentar la reunión/encuentro de participantes del CUSL que tuvo lugar ayer por la tarde en Cádiz. La reunión comenzó con la exposición de Manuel Palomo Duarte, hablando de forma general acerca de lo que implica el concurso en sí, los períodos de finalización tanto en la convocatoria local como en la nacional, etc.

Luego llegó el turno de presentar los proyectos locales. Aunque no estábamos todos los representantes de los 21 proyectos, se comentó algo de todos. Ahí empezaron a escucharse detalles interesantes, conforme iban presentándose los proyectos y alguien puntualizaba alguna mejora o alguna cuestión curiosa. A mí me tocó la última (es lo que tiene que tu proyecto empieze por “w”…) y (tras cantarme el cumpleaños feliz… Rosa ya te cogeré :P) comenté por encima de qué iba WikiUNIX (la verdad que ni me acuerdo de qué dije…).

Por cierto, he de agradecer a Antonio García el comentario acerca de la nueva versión de VirtualBox: en la última versión (no recuerdo cual es exactamente, pero es la que viene en la distribución Ubuntu 9.10), han incluido un “sistema de exportación e importación de servicios virtualizados”. Ya lo he comprobado (funciona perfectamente) e intentaré agregar una entrada en blog para este detalle curioso. Parece ser que me puede facilitar mucho la vida 🙂

A continuación expusieron 3 de los finalistas/ganadores de años anteriores: Antonio García Domínguez con su proyecto XMLEye, Emilio José Rodríguez Posada con AntiVandal BOT y Francisco Javier Vázquez Púa con Libgann. Personalmente me gustaron mucho las presentaciones: no eran tan estrictas como suele ser habitual, puesto que el ambiente era más distendido, y además pudimos escuchar de boca de los propios protagonistas consejos e ideas interesantes y también qué les aportó participar en el CUSL.

Y por fin llegó el turno de la mesa redonda, la charleta, la discusión, el flame… (ah no! que eso solo es en la lista de correo :P). Creo recordar que no éramos más de 15 o 20 personas, pero todos (o casi todos, no me fijé exactamente) intervinimos en la conversación en algún punto. No recuerdo una discusión igual (en el buen sentido): pasamos por toda la temática imaginable relacionada ya no con el CUSL sino con la comunidad y la informática en general, pero siempre respetando tanto los turnos (en la medida de lo posible) y a los compañeros.

Me lo pasé muy bien la verdad… Sobre todo por encontrar compañeros afines a mi forma de pensar y la filosofía que implica el software libre, porque para nosotros al menos sí es una forma de vida y se demostró ayer. Sólo me queda de nuevo agradecer a todos los asistentes ese ratillo agradable que pasamos y por mi parte espero que no sea la última: hablando con algunos compañeros, nos parece interesante hacer alguna reunión de este tipo de vez en cuando, aunque sea solo para ver cómo van los proyectos y encontrar opiniones más diversas (así no molestamos a los mismos de siempre que tienen que estar cansados ya :P).

Un saludo a todos, unixeros y compañeros del CUSL.