Introducción a pruebas de rendimiento sobre aplicaciones Web con Multi-Mechanize (Parte I)

Corey Goldberg, autor de la herramienta para pruebas de rendimiento Pylot, anunciaba a mediados del mes de febrero de este año que estaba trabajando en un nuevo framework para este mismo tipo de pruebas, al que denominó Multi-Mechanize. Pero parece lógico preguntarse: ¿por qué otra herramienta?, Corey argumentaba que el diseño de Pylot está bastante limitado debido al hecho que los casos de pruebas deben establecerse en forma declarativa, vía XML, llegando a la conclusión que era necesario un lenguaje de scripting para la definición de los casos de pruebas, además, la mejora en la concurrencia de las mismas.

Multi-Mechanize es un framework orientado a pruebas de rendimiento y carga en sitios Web. Este framework permite la ejecución simultánea de scripts en Python por medio de un motor multi-proceso, multi-hilo para reproducir secuencias de comandos y generar usuarios virtuales de manera concurrente, todo esto con el fin de establecer carga en contra de un sitio o servicio Web.

Una de las grandes ventajas de Multi-Mechanize es que ofrece la posibilidad de incluir en los scripts el poderoso módulo mechanize (derivado de WWW::Mechanize en Perl) junto con el lenguaje de programación Python. Permitiendo crear scripts de pruebas que simulan la actividad de usuarios virtuales de manera rápida y sencilla, estos scripts generarán peticiones HTTP para navegar o enviar solicitudes de forma inteligente un sitio o servicio Web.

Los resultados se almacenan en formato CSV o en una base de datos, junto con el informe en formato HTML que contiene las estadísticas y gráficos.

Un ejemplo de la capacidad de reportes que ofrece Multi-Mechanize puede verla en http://code.google.com/p/multi-mechanize/

Requisitos

Multi-Mechanize requiere Python 2.x (2.6 o 2.7), si desea generar gráficos a partir de las pruebas, debe instalar Matplotib y sus dependencias, mayor información vea la página de Preguntas de Uso Frecuente

De manera adicional necesitará el módulo mechanize.

La instalación de los requisitos en Debian GNU/Linux y derivados es tal como se describe a continuación:

# aptitude install python-mechanize python-matplotlib

Almacenamiento de datos de prueba y resultados en Bases de Datos

Opcionalmente, los resultados pueden ser almacenados en una base de datos. Para ello debe agregar la opción results_database en el fichero de configuración config.cfg, el cual define la cadena de conexión a la base de datos.

El almacenamiento en base de datos requiere tener instalado previamente SQLAlchemy

Algunos ejemplos de conexión a bases de datos son los siguientes:

SQLite sqlite:///dbname
MySQL mysql://user:password@localhost/dbname
PostgreSQL postgresql://user:password@host:port/dbname
MS SQL Server mssql://mydsn

Tenga en cuenta que el soporte de SQLite es nativo en Python. Por lo tanto, no es necesario su instalación y configuración.

Para mayor información sobre el soporte a base de datos vea Database Storage

Instalando Multi-Mechanize

Puede descargar el proyecto Multi-Mechanize desde http://code.google.com/p/multi-mechanize/downloads/list

Una vez descargado el proyecto Multi-Mechanize, descomprima y vaya a la raíz del proyecto y ejecute desde la línea de comandos:

$ python multi-mechanize.py default_project

Este comando ejecutará el proyecto de prueba incluido en la distribución de Multi-Mechanize, el proyecto de prueba generará datos aleatorios.

NOTA: Se le recomienda analizar los scripts incluidos en projects/default_project/test_scripts/

Comenzando con Multi-Mechanize

Para iniciar, usted puede usar el directorio default_project que incluye la distribución de Multi-Mechanize. Si usted necesita manejar múltiples proyectos, solo cree un directorio al mismo nivel de default_project para cada uno de los proyectos, se le recomienda mantener la misma estructura del proyecto por omisión. Recuerde que se necesita especificar el proyecto que ejecutará desde la línea de comandos.

Cada proyecto debe contener lo siguiente:

config.cfg
Fichero de configuración, establezca sus opciones de prueba.
test_scripts
Directorio de almacenamiento de scripts de sus usuarios virtuales.
results
Directorio para el almacenamiento de los resultados. Acá encontrará subdirectorios cuyos nombres son una estampa de tiempo y son creados por cada ejecución de las pruebas y contiene datos en formato CSV, un sumario en formato HTML e imágenes en formato PNG.

Formato del fichero de configuración

Cada proyecto contiene un fichero config.cfg donde debe definir la configuración para una prueba.

A continuación se le muestra un fichero de configuración que muestra todas las opciones posibles de configuración:

[global]
run_time: 300
rampup: 300
console_logging: off
results_ts_interval: 30
results_database: sqlite:///projects/default_project/results.db
post_run_script: python projects/default_project/foo.py

[user_group-1]
threads: 30
script: example_mock.py

[user_group-2]
threads: 30
script: example_mock.py

Opciones globales

run_time
Duración de la prueba en segundos
rampup
Duración en segundos de la rampa de usuarios (hilos)
console_logging
Activar/Desactivar el registro a la salida estándar
results_ts_interval
Intervalos de las series de tiempo para el análisis de los resultados expresadas en segundos.
results_database
Cadena de conexión a base de datos (opcional)
post_run_script
script que será invocado después de la culminación de la prueba (opcional)

Grupos de usuarios

threads
Número de hilos/usuarios virtuales
script
Script del usuario virtual a ejecutar.

Para mayor información sobre el formato del fichero de configuración consulte: Config File.

En la segunda parte de este artículo mostraré algunos ejemplos con casos de pruebas que se ejecutarán sobre una instalación de Trac.

Mejoras en el comportamiento a la hora de eliminar un ForeignKey

Logo de Django Cuando un objeto referenciado por una clave foránea (ForeignKey) es eliminado, Django por omisión emula el comportamiento de la sentencia SQL ON DELETE CASCADE y también se elimina el objeto que contiene el ForeignKey.

A partir de la versión 1.3 de Django el comportamiento descrito en el párrafo anterior puede ser sobreescrito al especificar el argumento on_delete. Por ejemplo, si usted permite que una clave foránea pueda ser nula y usted desea que sea establecida a NULL cuando un objeto referenciado sea eliminado:

user = models.ForeignKey(User, blank=True, null=True, on_delete=models.SET_NULL)

Los posibles valores para el argumento on_delete pueden encontrarse en django.db.models:

CASCADE
Eliminación en cascada, el comportamiento por omisión.
PROTECT
Prevee la eliminación del objeto referenciado al lanzar una excepción del tipo: django.db-IntegrityError.
SET_NULL
Establece la clave foránea a NULL, esto solo es posible si el argumento null es True.
SET_DEFAULT
Establece la clave foránea a su valor por omisión, tenga en cuenta que un valor por omisión debe ser establecido.
SET()
Establece el valor del ForeignKey indicado en SET(), si una función es invocada, el resultado de dicha función será el valor establecido.
DO_NOTHING
No tomar acciones. Si el gestor de base de datos requiere integridad referencial, esto causará una excepción del tipo IntegrityError.

A continuación un par de ejemplos de esta nueva funcionalidad:

# models.py
from django.db import models

class Author(models.Model):
    nickname = models.CharField(max_length=32)

    def __unicode__(self):
        return self.nickname

class Post(models.Model):
    author = models.ForeignKey(Author, blank=True, null=True, on_delete=models.SET_NULL)
    title = models.CharField(max_length=128)

    def __unicode__(self):
        return self.title

Nuestra sesión interactiva con el API sería similar a la siguiente:

$ python manage.py shell
>>> from ondelete.models import Author, Post

>>> Author.objects.all()
[]
# Creamos el autor
>>> author = Author(nickname='milmazz')
# Guardamos el objeto en la base de datos al usar de manera explícita el método save()
>>> author.save()

# Obtenemos el autor en base a su id
>>> Author.objects.get(pk=1)
<Author: milmazz>

# Creamos par de artículos
>>> article1 = Post(author=author, title="Article 1")
>>> article1.save()

>>> article2 = Post(author=author, title="Article 2")
>>> article2.save()

>>> for article in Post.objects.all():
     print("%s by %s" % (article.title, article.author))
Article 1 by milmazz
Article 2 by milmazz

# Eliminamos el autor
>>> author.delete()

>>> for article in Post.objects.all():
    print("%s by %s" % (article.title, article.author))
Article 1 by None
Article 2 by None

Un segundo ejemplo, ahora haciendo uso del valor SET() en el argumento on_delete:

# models.py
from django.db import models
from django.contrib.auth.models import User

def get_superuser():
    return User.objects.get(pk=1)

class Post(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET(get_superuser))
    title = models.CharField(max_length=128)

    def __unicode__(self):
        return self.title

Nuestra sesión interactiva con el API sería similar a la siguiente:

$ python manage.py shell
>>> from ondelete.models import Post
>>> from django.contrib.auth.models import User

>>> User.objects.all()
[<User: milmazz>]
# Creamos un nuevo usuario
>>> author = User(username='milton')
# Guardamos el objeto en la base de datos,
# de manera explícita al invocar el método save()
>>> author.save()
# Vista de los usuarios registrados en la base de datos
>>> User.objects.all()
[<User: milmazz>, <User: milton>]

# Creamos par de artículos
>>> article1 = Post(user=author, title="Article 1")
>>> article1.save()

>>> article2 = Post(user=author, title="Article 2")
>>> article2.save()

>>> for article in Post.objects.all():
     print("%s by %s" % (article.title, article.user))
Article 1 by milton
Article 2 by milton

# Eliminamos el usuario 'milton'
>>> author.delete()

>>> for article in Post.objects.all():
    print("%s by %s" % (article.title, article.user))
Article 1 by milmazz
Article 2 by milmazz

Pylint: Análisis estático del código en Python

Básicamente el análisis estático del código se refiere al proceso de evaluación del código fuente sin ejecutarlo, es en base a este análisis que se obtendrá información que nos permita mejorar la línea base de nuestro proyecto, sin alterar la semántica original de la aplicación.

Pylint es una herramienta que todo programador en Python debe considerar en su proceso de integración continua (Ej. Bitten), básicamente su misión es analizar código en Python en busca de errores o síntomas de mala calidad en el código fuente. Cabe destacar que por omisión, la guía de estilo a la que se trata de apegar Pylint es la descrita en el PEP-8.

Es importante resaltar que Pylint no sustituye las labores de revisión continua de alto nivel en el Proyecto, con esto quiero decir, su estructura, arquitectura, comunicación con elementos externos como bibliotecas, diseño, entre otros.

Tome en cuenta que Pylint puede arrojar falsos positivos, esto puede entenderse al recibir una alerta por parte de Pylint de alguna cuestión que usted realizó conscientemente. Ciertamente algunas de las advertencias encontradas por Pylint pueden ser peligrosas en algunos contextos, pero puede que en otros no lo sea, o simplemente Pylint haga revisiones de cosas que a usted realmente no le importan. Puede ajustar la configuración de Pylint para no ser informado acerca de ciertos tipos de advertencias o errores.

Entre la serie de revisiones que hace Pylint al código fuente se encuentran las siguientes:

  • Revisiones básicas:
    • Presencia de cadenas de documentación (docstring).
    • Nombres de módulos, clases, funciones, métodos, argumentos, variables.
    • Número de argumentos, variables locales, retornos y sentencias en funciones y métodos.
    • Atributos requeridos para módulos.
    • Valores por omisión no recomendados como argumentos.
    • Redefinición de funciones, métodos, clases.
    • Uso de declaraciones globales.
  • Revisión de variables:
    • Determina si una variable o import no está siendo usado.
    • Variables indefinidas.
    • Redefinición de variables proveniente de módulos builtins o de ámbito externo.
    • Uso de una variable antes de asignación de valor.
  • Revisión de clases:
    • Métodos sin self como primer argumento.
    • Acceso único a miembros existentes vía self
    • Atributos no definidos en el método __init__
    • Código inalcanzable.
  • Revisión de diseño:
    • Número de métodos, atributos, variables locales, entre otros.
    • Tamaño, complejidad de funciones, métodos, entre otros.
  • Revisión de imports:
    • Dependencias externas.
    • imports relativos o importe de todos los métodos, variables vía * (wildcard).
    • Uso de imports cíclicos.
    • Uso de módulos obsoletos.
  • Conflictos entre viejo/nuevo estilo:
    • Uso de property, __slots__, super.
    • Uso de super.
  • Revisiones de formato:
    • Construcciones no autorizadas.
    • Sangrado estricto del código.
    • Longitud de la línea.
    • Uso de <> en vez de !=.
  • Otras revisiones:
    • Notas de alerta en el código como FIXME, XXX.
    • Código fuente con caracteres non-ASCII sin tener una declaración de encoding. PEP-263
    • Búsqueda por similitudes o duplicación en el código fuente.
    • Revisión de excepciones.
    • Revisiones de tipo haciendo uso de inferencia de tipos.

Mientras Pylint hace el análisis estático del código muestra una serie de mensajes así como también algunas estadísticas acerca del número de advertencias y errores encontrados en los diferentes ficheros. Estos mensajes son clasificados bajo ciertas categorías, entre las cuales se encuentran:

Refactorización
Asociado a una violación en alguna buena práctica.
Convención
Asociada a una violación al estándar de codificación.
Advertencia
Asociadas a problemas de estilo o errores de programación menores.
Error
Asociados a errores de programación importantes, es probable que se trate de un bug.
Fatal
Asociados a errores que no permiten a Pylint avanzar en su análisis.

Un ejemplo de este reporte lo puede ver a continuación:

Messages by category
--------------------

+-----------+-------+---------+-----------+
|type       |number |previous |difference |
+===========+=======+=========+===========+
|convention |969    |1721     |-752.00    |
+-----------+-------+---------+-----------+
|refactor   |267    |182      |+85.00     |
+-----------+-------+---------+-----------+
|warning    |763    |826      |-63.00     |
+-----------+-------+---------+-----------+
|error      |78     |291      |-213.00    |
+-----------+-------+---------+-----------+

Cabe resaltar que el formato de salida del ejemplo utilizado está en modo texto, usted puede elegir entre: coloreado, texto, msvs (Visual Estudio) y HTML.

Pylint le ofrece una sección dedicada a los reportes, esta se encuentra inmediatamente después de la sección de mensajes de análisis, cada uno de estos reportes se enfocan en un aspecto particular del proyecto, como el número de mensajes por categorías (mostrado arriba), dependencias internas y externas de los módulos, número de módulos procesados, el porcentaje de errores y advertencias encontradas por módulo, el total de errores y advertencias encontradas, el porcentaje de clases, funciones y módulos con docstrings y su respectiva comparación con un análisis previo (si existe). El porcentaje de clases, funciones y módulos con nombres correctos (de acuerdo al estándar de codificación), entre otros.

Al final del reporte arrojado por Pylint podrá observar una puntuación general por su código, basado en el número y la severidad de los errores y advertencias encontradas a lo largo del código fuente. Estos resultados suelen motivar a los desarrolladores a mejorar cada día más la calidad de su código fuente.

Si usted ejecuta Pylint varias veces sobre el mismo código, podrá ver el puntaje de la corrida previa junto al resultado de la corrida actual, de esta manera puede saber si ha mejorado la calidad de su código o no.

Global evaluation
-----------------
Your code has been rated at 7.74/10 (previous run: 4.64/10)
If you commit now, people should not be making nasty comments about you on c.l.py

Una de las grandes ventajas de Pylint es que es totalmente configurable, además, se pueden escribir complementos o plugins para agregar una funcionalidad que nos pueda ser útil.

Si usted quiere probar desde ya Pylint le recomiendo seguir la guía introductoria descrita en Pylint tutorial. Si desea una mayor ayuda respecto a los códigos indicados por Pylint, puede intentar el comando pylint --help-msg=CODIGO, si eso no es suficiente, le recomiendo visitar el wiki PyLint Messages para obtener una rápida referencia de los mensajes arrojados por Pylint, organizados de varias maneras para hacer más fácil y agradable la búsqueda. Además de encontrar explicaciones de cada mensaje, especialmente útiles para aquellos programadores que recién comienzan en Python.

Referencias

FeedJack: Ya está disponible

Ya había comentado acerca de ésta aplicación en la entrada FeedJack: Un Planet con esteroides, resulta que hace pocos días Gustavo Picón anunció la salida de la versión 0.9.6 bajo licencia BSD. Algunas de las características más resaltantes de esta aplicación son:

Soporte de virtual hosts
Esto quiere decir que desde la misma instalación y la misma Base de Datos e interfaz de administración, se manejan múltiples planetas. Si hay feeds en común estos se bajan una sola vez para optimizar recursos.
Temas (Themes)
Cada sitio (virtual host) puede tener temas distintos.
Soporte de folcsonomías (etiquetas o tags)
Muy popular en las aplicaciones de la Web 2.0, se ha optimizado el algoritmo.
Generación de páginas o feeds por folcsonomías
Ejemplo: http://www.chichaplanet.org/tag/django/
Generación de páginas o feeds por miembros
Ejemplo: http://www.chichaplanet.org/user/1/
Generación de páginas o feeds de una categoría en especial de un miembro particular
Ejemplo: http://www.chichaplanet.org/user/1/tag/django/
Generar un feed general.
Ejemplo: http://www.chichaplanet.org/feed/
Histórico de entradas
Entre muchas otras cosas. La principal ventaja frente a Planet es el soporte de un histórico de entradas o posts, por el uso de una Base de Datos.

Para conocer los detalles acerca de los requerimientos, el proceso de instalación, configuración y la modificación de los temas lea con detenimiento la entrada Feedjack – A Django+Python Powered Feed Aggregator (Planet).

Ya que le he quedado un poco mal a Gustavo con la ayuda que me pidio en cuanto al desarrollo de un tema (theme) para FeedJack, invito a mis dos ó tres lectores a colaborar con el proyecto.

Por mi parte solo me queda felicitar a Gustavo Picón por el estupendo trabajo que ha realizado. Además, amigo, aprovecho el momento para decirte que cuentas con mi ayuda para el desarrollo de un theme, solo dame tiempo mientras me desocupo de las actividades en la Universidad, estas últimas semanas han estado muy ocupadas. Entre las asignaturas: Redes de Computadoras, Programación Paralela y Distribuida, Compiladores (menos mal al profesor de Inteligencia Artificial no le ha dado por colocarnos un parcial), si a eso le sumas, el estudio de Haskell y Alex, están contribuyendo sistemáticamente en mi demencia.

Breve reseña del FLISOL 2006, Capítulo Mérida-Venezuela

Al llegar a eso de las 9:30 a.m. (hora local) estaban transmitiendo el video Trusted Computing (subtítulos español), un excelente video en donde nos muestran cuan peligroso puede ser la “mala interpretación” que tiene la industria acerca del concepto “Trusted Computing”, modelo en el cual la industria no le permite a los usuarios (comunidad) elegir entre lo que ellos consideran malo o nó, el problema es que ya deciden por tí, simplemente porque la industria no confía en nosotros.

Después de mostrar el video, Hector Colina, uno de los coordinadores del evento, procedió a dar la bienvenida a los asistentes al II Festival Latinoamericano de Instalación de Software Libre, capítulo Mérida, Venezuela. De inmediato, Hector continúo hablando y nos sorprendió con una charla denominada Software Libre y Libre Empresa, en donde nos hablaba de la interesante filosofía detrás del modelo de Software Libre, algunos piensan equivocadamente que bajo el esquema de Software Libre no se es posible generar ganancias, se demostró que es posible hacerlo. También hablo sobre las ventajas técnicas que brinda el Software Libre frente al Software Privativo.

Posteriormente se dió comienzo a las demostraciones de LTSP (Linux Terminal Server Project) por parte de José David Gutierrez, quien también coordinó el evento y es miembro de la Cooperativa AndiNuX, no recuerdo en este instante cuales eran las características que poseía el servidor, pero recuerdo que el cliente sobre el cual se hizo la demostración tenía apenas 40 MB de RAM (sí, leyo bien, 40 MB) y se logró levantar el entorno de escritorio KDE y ejecutar algunas aplicaciones, José comentaba que los requisitos mínimos de memoria RAM eran 16, mientras que lo óptimo erán 32 MB de RAM, así que amigo, si usted esta leyendo esto, no bote su potecito (equipo de bajo recursos de hardware), bajo el esquema de Software Libre podemos recuperarlo, quizá podría donarlo y regalarle una sonrisa a un niño que reciba educación en una escuela con pocos recursos.

Posteriormente comenzaron a colocar algunos videos a los asistentes, entre los cuales recuerdo haber visto Revolution OS, en paralelo, se realizaba el proceso de instalación desde tempranas horas de la mañana, al final de la jornada se lograron contabilizar más de 20 máquinas a las cuales se instaló GNU/Linux, incluyendo potecitos de 32 MB de RAM hasta máquinas de escritorio con procesadores de 64 bits, por supuesto, a una que otra portátil también se le instaló GNU/Linux, además, se regalaron CDs de Debian, Ubuntu, entre otros.

En la tarde el profesor Francisco Palm comenzó su charla Carpintería del Software Libre: un enfoque desde el lenguaje de Programación Python, en ella se nos hace reflexionar acerca de nuestra realidad actual en Venezuela, presentamos poca penetración de internet en nuestra sociedad. Bajo el esquema de Software Privativo, no se le brinda apoyo a la comunidad, no se presenta una innovación alguna.

El profesor Palm también converso sobre puntos interesantes acerca de la Ingeniería de Software Libre, como la Fundación Apache, Debian o Mozilla no presentan certificaciones y no les importa éste hecho en particular, puesto que su desarrollo es robusto, de hecho, muestran como funcionan por dentro. Entre otras cosas bastante interesantes.

Enseguida comenzaron otra charla 2 pupilos del profesor Palm, Diego Díaz y Freddy López, en donde se expuso el Proyecto SIGMA: Soluciones Libres para el mundo Científico, en esta charla pudimos observar una serie de demostraciones del sistema estadistico R. El proyecto SIGMA resulta de una iniciativa de los miembros de la Escuela de Estadística y el Instituto de Estadística Aplicada y Computación (IEAC) de la Universidad de Los Andes.

Sin mucho receso, Leonardo Caballero comenzó su charla acerca de Desarrollo Web con Mozilla FireFox, aca se explicó acerca de las extensiones que resultan muy útiles al desarrollador de páginas web, como por ejemplo, la extensión Web Developer, de manera adicional, se demostró cuan personalizable (desde utilizar temas hasta incluso simular comportarse como otro navegador) puede ser Firefox para un usuario particular, desde extensiones para el clima (ForecastFox) hasta herramientas de blogging.

Particularmente, para el desarrollo web utilizo más extensiones de las que mencionó Leonardo, entre ellas puedo mencionar: CSS Validator, ColorZilla, entre otras. Prefiero no continuar mencionando la lista de extensiones que poseo, se supone que sea una breve reseña, quizá en otro artículo hablaremos acerca de las extensiones de Firefox.

Un poco más tarde, el licenciado Axel Pizzi, quien pertenece a la agencia de traducción y servicios lingüisticos translinguas, conversó acerca del uso de herramientas CAT (Computer aided Translation) bajo el esquema de Software Libre, simplemente se mostraba las bondades de la traducción asistida por computadora, es una manera de traducir contenido en donde el ser humano (traductor) utiliza software diseñado para brindar soporte y facilitar ésta ardua tarea.

Algo nervioso se encontraba Jesús Rivero (no confundir con neurogeek, ok?), pues se estaba haciendo tarde para su charla, Cooperativismo y Software Libre, en donde Jesús mostró como el esquema de desarrollo colaborativo es sumamente útil en las Cooperativas.

Y ya para finalizar la jornada, comence mi charla sobre Desarrolo Web en Python utilizando el framework Django, a manera de introducción, comence a hablar del lenguaje de programación Python, sus bondades, que empresas le utilizan actualmente y que proyectos han desarrollado, entre dicha lista se incluyen las siguientes: Google, Yahoo!, empresas farmacéuticas (AstraZeneca) de gran escala mundial, Industrial Light & Magic (sí, esa misma que está pensando, es la empresa iniciada por George Lucas en el año de 1.975, la encargada de los efectos especiales de la saga “Star Wars”, no solo eso, en su lista se incluyen películas como “Forrest Gump”, “Jurassic Park”, “Terminator 2”, entre otros).

Posteriormente comence a adentrarme ya en el tema que me interesaba, Desarrollo Web, en mi caso particular, hable sobre como utilizar el framework Django, desde la instalación del framework, la instalación de PostgreSQL (recomendada) y del adaptador a dicha base de datos en python, psycopg, hasta la construcción de la aplicación. Para mayor detalle acerca de esta presentación solo esperen un próxima entrada, quisiera ampliar algunos tópicos para dejarlos un poco más claros.

Si desean ver algunas fotos que logré tomar del II Festival Latinoamericano de Instalación de Software Libre (FLISOL), Capítulo Mérida – Venezuela, pueden revisar el set de fotos FLISOL 2006 de mi cuenta en flickr.

Debo confesar que estaba bastante nervioso al principio porque era mi primera charla. Espero que todo haya salido bien y les haya gustado.

Bueno, finalizamos las actividades como a las 7:30 p.m. (hora local), luego de ello ayudamos a los muchachos a acomodar las cosas y guardarlas en las oficinas de Fundacite Mérida.

Desde mi punto de vista, ha sido una grata experiencia, cualquier corrección a la reseña es bienvenida, pido disculpas si he dejado a alguien por fuera, esta reseña no estaba anotada en ningún medio escrito, solo he comenzado a describir las situaciones que recuerdo, lo más seguro es que olvide algún detalle importante, andaba un poco distraído instalando Debian y Ubuntu en el Festival.

Por supuesto, cualquier corrección, crítica constructiva acerca de la charla que dí se los agradecería, todo sea por mejorar dicho material y publicarlo, por supuesto, manteniendo una licencia libre.

FeedJack: Un Planet con esteroides

FeedJack es una mejora hecha por Gustavo Picon (a.k.a. tabo) del muy conocido Planet, la mejor muestra de la funcionalidad de este software se puede apreciar en el planeta peruano ChichaPlanet.

Gustavo Picon, autor del reemplazo del Planet en Django, afirma que el código fuente todavía no está disponible, pero piensa hacerlo público bajo el esquema de código abierto tan pronto logre depurarlo un poco y redacte cierta documentación, coincido con el autor cuando éste afirma que: si un software no posee documentación, no existe.

FeedJack ofrece algunas características que le dan cierta ventaja sobre el Planet, algunas de ellas son:

  • Maneja datos históricos. Por lo tanto, usted puede leer entradas antiguas.
  • Realiza un análisis más exhaustivo de las entradas, incluyendo sus categorías.
  • Es capaz de generar páginas de acuerdo a las categorías de las entradas.
  • Brinda soporte al sistema de folcsonomías (etiquetas), opción muy popular en la Web 2.0.
  • Utiliza el lenguaje de plantillas de Django

Mayor información y detalle en la entrada Django powered chicha planet with feedjack, de Gustavo Picon.

Charla sobre el lenguaje de programación Python

La ingeniera Andrea Muñoz me notifica que el día Jueves 23 de Febrero se estará llevando a cabo la charla Carpintería del Software Libre, un enfoque desde el lenguaje de programación Python, en donde el ponente será el profesor Francisco Palm, seguramente estará muy interesante.

La cita es el día 23 de Febrero, a las 8:30 a.m. en el Núcleo La Hechicera, Facultad de Ingeniería, Nivel Patio, Ala Sur, Labtel II, Estado Mérida (Venezuela).

La invitación es realizada por el Consejo de Computación Académica (CCA) de la Universidad de Los Andes, gracias al espacio que ofrecen para la difusión del Software Libre, “Jueves Libre”

Desgraciadamente hasta ahora no puedo asistir a la charla, debo presentar un examen de Ingeniería del Software el mismo día, a la misma hora. Trataré de hablar con Jesús Molina o Andrea Muñoz para ver si puede grabarse en algún medio permanente esta charla.

Clientes BitTorrent

Desde mi punto de vista Azureus es un cliente BitTorrent que cae en los excesos, aparte de ello es demasiado lento y por si fuera poco consume una gran cantidad de recursos del sistema.

Si usted es usuario de Ubuntu Linux, seguramente estará preguntándose, ¿por qué buscar un cliente BitTorrent si Breezy incluye uno? , bueno, si le soy sincero, ese cliente apesta, tiene muy pocas opciones.

En los siguientes párrafos veremos dos alternativas, que desde mi punto de vista tienen ciertas virtudes, las cuales muestro a continuación.

  • No caen en los excesos.
  • Son rápidos.
  • No consumen gran cantidad de recursos del sistema.
  • Ofrecen muchas opciones.

Sin mas preámbulos, les presento a Rufus y freeloader, clientes BitTorrents alternativos de gran envergadura.

FreeLoader

Freeloader, es un manejador de descargas escrito en Python y brinda soporte a torrents.

Para instalar freeloader debemos seguir los siguientes pasos en Breezy.

sudo aptitude install python-gnome2-extras python2.4-gamin

Seguidamente diríjase al sitio oficial de freeloader y descargue las fuentes del programa, para la fecha en la cual se redactó este artículo la versión más reciente de este programa es la 0.3.

wget http://www.ruinedsoft.com/freeloader/freeloader-0.3.tar.bz2

Luego de haber descargado el paquete proceda de la siguiente manera:

$ tar xvjf freeloader-0.3.tar.bz2
$ cd freeloader-0.3
$ ./configure
$ make
$ sudo make install

Recuerde que para poder compilar paquetes desde las fuentes necesita tener instalado previamente el paquete build-essential

Rufus

Rufus es otro cliente BitTorrent escrito en Python.

Vamos a aprovecharnos del hecho que existe una versión estable (0.6.9) compilada * para Breezy, los pasos son los siguientes:

$ wget http://strikeforce.dyndns.org/files/breezy/rufus.0.6.9/rufus_0.6.9-0ubuntu1_i386.deb
$ sudo dpkg -i rufus_0.6.9-0ubuntu1_i386.deb

* Esta versión ha sido compilada por strikeforce, para mayor información lea el hilo Rufus .deb Package.

Python Sidebar

Para aquellos que al igual que yo comienzan en el mundo de la programación en Python, siempre es recomendable tener un acceso rápido y sencillo a la documentación de referencia, esto es posible realizarlo a través de la utilidad Python Sidebar.

Además, con Python Sidebar, podrá realizar búsquedas en sitios relacionados con Python y listas de correo.

Esta herramienta está disponible para la familia de navegadores de la Fundación Mozilla.