gUsLA: Grupo de Usuarios de Software Libre de la Universidad de Los Andes

Un grupo de compañeros de estudio y mi persona por fin hemos iniciado una serie de actividades para formar el Grupo de Usuarios de Software Libre de la Universidad de Los Andes.

El día de hoy, hicimos entrega de una carta al Consejo de Escuela de Ingeniería de Sistemas, solicitando un aval académico para lograr llevar a cabo las siguientes actividades:

  • Charlas.
  • Festivales de instalación.
  • Atención al usuario.
  • Otras actividades de naturaleza académica.

Esta solicitud la hicimos ya que consideramos necesaria la creación de un Grupo de Usuarios que se encargue de:

  • Difundir y promover el Software Libre en la Universidad de los Andes.
  • Difundir las bases filosóficas detrás del modelo del Software Libre.
  • Demostrar la calidad técnica del Software Libre.
  • Demostrar a los usuarios finales cuan fácil es utilizar GNU/Linux.
  • Fomentar el intercambio de conocimientos en Talleres, Foros, Charlas y/o encuentros con grupos de usuarios de otras latitudes.
  • Adaptación al proceso de cambio fomentado por el ente público (decreto 3390).

En este momento hemos contactado a ciertos profesores que han mostrado interés en la iniciativa, la idea es involucrar a todas aquellas personas relacionadas con la Universidad de Los Andes.

En resumen, el objetivo principal que pretende alcanzar nuestro grupo es: El estudio, desarrollo, promoción, difusión, educación, enseñanza y uso de sistemas operativos GNU/Linux, GNU/Hurd, FreeBSD, y de las herramientas libres que interactúan con estos, tanto en el ámbito nacional como en el internacional. Es importante resaltar en este instante que No se perseguirán fines de lucro, ni tendremos finalidades o actividades políticas, partidistas ni religiosas; seremos un grupo apolítico, abierto, pluralista y con fines académicos.

Personalmente, debo agradecer a José Parrella por haberme facilitado un borrador del documento constitutivo/estatutario del Grupo de Usuarios de Linux de la Universidad Central de Venezuela (UCVLUG), lo hemos utilizado como base para formar el nuestro, aunque será discutido por ahora en una lista privada de estudiantes y profesores que han manifestado interés en participar.

Esperamos con ansiedad la decisión del Consejo de Escuela de Ingeniería de Sistemas.

Decisión del Consejo de Facultad de la Universidad de Los Andes

Según informa la profesora Flor Narciso en un comunicado, el Consejo de Facultad de la Universidad de Los Andes en una sesión ordinaria llevada a cabo el día de ayer, 13 de Junio de 2006, se aprobó la reprogramación del semestre.

Esta noticia toma por sorpresa a muchas personas, me incluyo, imagínense tener que asistir a clases cinco sábados seguidos para lograr culminar las actividades el día 21 de Julio de 2006, por supuesto, debemos agradecerles a todos esos revolucionarios que generaron caos en la ciudad por esta decisión del Consejo de Facultad, en verdad, ¡muchas gracias!.

Los días 17, 24 de Junio y los días 1, 8 y 15 de Julio las clases se dictarán en el mismo horario, correspondiente a los días Lunes, Martes, Miércoles, Jueves y Viernes respectivamente.

La fecha que corresponde a la finalización de las evaluaciones queda para el día 21 de Julio de 2006.

Todas asignaturas con proyectos, en mi caso 4, la entrega de los mismos será realizada el día 4 de Septiembre de 2006.

Las notas definitivas serán dadas a conocer en el intervalo comprendido del 4 al 8 de Septiembre de este mismo año.

Ya para culminar, en definitiva, citando al profesor y amigo Richard Márquez: Se pasaron…

XXXII Aniversario EISULA

Según lo manifiesta la profesora Flor Narciso en un comunicado, el día de mañana, 14/06/2006, se celebrará una misa conmemorativa del XXXII Aniversario de la Escuela de Ingeniería de Sistemas a las 9:00 a.m. en la Sala de Reuniones de la Escuela.

Además, en el horario comprendido de 4:00 a 6:00 p.m. se llevará a cabo el seminario titulado Técnicas Emergentes en Automatización Industrial a cargo de los ingenieros Jesús Durán, Lisbeth Pérez y Jorge Vento.

El seminario se realizará en el Auditorio A de la Facultad de Ingeniería de la Universidad de Los Andes.

Están todos cordialmente invitados a participar en estas actividades.

El algoritmo de Dijkstra en Perl

Hace ya algunos días nos fué asignado en la cátedra de Redes de Computadoras encontrar el camino más corto entre dos vértices de un grafo dirigido que no tuviese costos negativos en sus arcos, para ello debíamos utilizar el algoritmo de Dijkstra. Además de ello, debía presentarse el grafo y la ruta más corta en una imagen, para visualizarlo de mejor manera.

Cuando un profesor te dice: No se preocupen por la implementación del algoritmo de Dijkstra, utilice la que usted prefiera, pero les agradezco que la analicen. Además, pueden utilizar el lenguaje de programación de su preferencia. Estas palabras te alegran el día, simplemente eres feliz.

Por algunos problemas que tuve con algunos módulos en Python, no lo hice en dicho lenguaje de programación, no vale la pena explicar en detalle los problemas que se me presentaron.

Lo importante de todo esto, es que asumí el reto de realizar la asignación en un lenguaje de programación practicamente nuevo para mí, aunque debo reconocer que la resolución no me causó dolores de cabezas en lo absoluto, a continuación algunos detalles.

En primer lugar, formularse las preguntas claves, ¿existe algún módulo en Perl que implemente el algoritmo de Dijkstra para encontrar el camino más corto?, ¿existe algún módulo en Perl que implemente GraphViz?

En segundo lugar, buscar en el lugar correcto, y cuando hablamos de Perl el sitio ideal para buscar es search.cpan.org, efectivamente, en cuestión de segundos encontre los dos módulos que me iban a facilitar la vida, Bio::Coordinate::Graph, para encontrar la ruta más corta entre dos vértices en un grafo y GraphViz, para pintar el grafo.

En tercer lugar, verificar en tu distro favorita, Debian, si existe un paquete precompilado listo pasa ser usado, para GraphViz existe uno, libgraphviz-perl, así que para instalarlo es tan fácil como:

# aptitude install libgraphviz-perl

Para instalar el módulo Bio::Coordinate::Graph, primero debía debianizarlo, eso es tan sencillo como hacer.

# dh-make-perl --build --cpan Bio::Coordinate::Graph

Luego debe proceder a instalar el fichero .deb que se generó con dh-make-perl, para lograrlo hago uso del comando dpkg, eso es todo. Por cierto, acerca del comando dh-make-perl ya había hablado en la entrada Perl: Primeras experiencias.

Encontrando el camino más corto

Según dice la documentación del módulo Bio::Coordinate::Graph debemos hacer uso de un hash de hashes anónimos para representar la estructura del grafo, en ese momento recordé algunas palabras que José Luis Rey nos comentó en la primera parte del curso de Perl, vale resalta la siguiente: Si usted no utiliza un hash, no lo está haciendo bien.

my $hash = {
		'6' => undef,
		'1' => {
			'2' => 1
			},
		'2' => {
			'6' => 4,
			'4' => 1,
			'3' => 1
			},
		'3' => {
			'6' => 1
			},
		'4' => {
			'5' => 1
			},
		'5' => undef
	};

Algo que es importante saber es que en Perl las estructuras de datos son planas, lo cual es conveniente. Por lo tanto, vamos a tener que utilizar referencias en este caso, pero luego nos preocuparemos por ello. Ahora solo resta decir que, la estructura hecha a través de un hash de hashes es sencilla de interpretar, las llaves o keys del hash principal representan los vértices del grafo, ahora bien, las llaves de los hashes más internos representan los vértices vecinos de cada vértice descrito en el hash principal, el valor de los hashes más internos representa el peso, distancia o costo que existe entre ambos vértices, para aclarar la situación un poco: El vértice 2, tiene como vecinos a los vértices 3, 4 y 6, con costos de 1, 1 y 4 respectivamente. Puede ver una muestra del grafo resultante.

De manera alternativa puede utilizar un hash de arrays para representar la estructura del grafo, siempre y cuando todos los costos entre los vértices sean igual a 1, este método es menos general que el anterior y además, este tipo de estructura es convertida a un hash de hashes, así que a la final resulta ineficiente.

Una vez definida la estructura del grafo corresponde crear el objeto, esto es realmente sencillo.

my $graph = Bio::Coordinate::Graph->new(-graph => $hash);

Lo que resta es definir el vértice de inicio y el vértice final, yo los he definido en las variables $start y $end, luego de ello, debemos invocar al método shortest_path, de la siguiente manera:

my @path = $graph->shortest_path($start, $end);

En el array @path encontraremos los vértices involucrados en el camino más corto.

Pintando el grafo

Una vez hallado el camino más corto entre dos vértices dados en un grafo dirigido con un costo en los arcos siempre positivos, lo que resta es hacer uso del módulo GraphViz, hacemos uso del constructor del objeto de la siguiente manera:

my $g = GraphViz->new();

Usted puede invocar al constructor con distintos atributos, para saber cuales usar le recomiendo leer la documentación del módulo.

Ahora bien, yo quería distinguir aquellos vértices involucrados en el camino más corto de aquellos que no pertenecían, así que lo más sencillo es generar una lista de atributos que será usada posteriormente. Por ejemplo:

my @shortest_path_attrs = (
				color => 'red',
			);

Una vez definidos los atributos, debemos generar cada uno de sus vértices y además, establecer los arcos entre cada uno de ellos. Para ello haremos uso de los métodos add_node, add_edge.

foreach my $key (keys %$hash){
	$g->add_node($key);
	foreach my $neighbor (keys %{$hash->{$key}}){
		$g->add_edge($key => $neighbor, label => $hash->{$key}->{$neighbor});
	}
}

El bloque de código anterior lo que hace es agregar cada uno de los vértices que se encuentran en el hash que representa la estructura del grafo, para cada uno de estos vértices, se añade cada uno de los arcos que lo conectan con sus vecinos, nótese el manejo del operador flecha (->) para desreferenciar las referencias al hash de hashes anónimos.

Una vez construidos los nodos y sus arcos, ¿cómo reconocer aquellos que pertenecen al camino más corto?, bueno, toda esa información la podemos extraer del array que hemos denominado @path.

for (my $count=0; $count < = $#path; $count++){
	$g->add_node($path[$count], @shortest_path_attrs);
	$g->add_edge($path[$count] => $path[$count+1], @shortest_path_attrs) unless ($count+1 > $#path);
}

Según dice la documentación del módulo GraphViz todos los atributos de un vértice del grafo no tienen que definirse de una sola vez, puede hacerse después, ya que las declaraciones sucesivas tienen efecto acumulativo, eso quiere decir lo siguiente:

$g->add_node('1', color => 'red');

Es equivalente a hacer las siguientes declaraciones sucesivas.

$g->add_node('1');
$g->add_node('1', color => 'red');

Lo que resta por hacer en este instante es exportar el objeto creado, puede crear por ejemplo un PNG, texto sin formato, PostScript, entre otros.

Yo decidí generar un fichero PostScript:

$g->as_ps("dijkstra.ps");

Por supuesto, les dejo una muestra de los resultados. Los vértices cuyo borde es rojo, son aquellos involucrados en el camino más corto desde el vértice inicio al vértice final, los arcos que marcan la ruta más corta también han sido coloreados.

Como siempre, todas las recomendaciones, comentarios, sugerencias son bienvenidas.

WordPress 2.0.3

WordPress Matt Mullenweg anunció hace pocos días la disponibilidad de la versión 2.0.3 para WordPress, la versión más reciente hasta ahora de la serie estable 2.0.

Características en la versión 2.0.3

En esta nueva versión se puede observar.

  • Mejoras en cuanto al rendimiento.
  • Mejora en el sistema que permite importar entradas o posts desde Movable Type o Typepad.
  • Mejora en cuanto al manejo de los enclosures 1 para podcasts 2.
  • Corrección de errores de seguridad.

Se corrige el error de seguridad que permitía la inyección de código PHP arbitrario si se encontraba activo el registro libre de usuarios, era necesario desmarcar la casilla de verificación Cualquiera puede registrarse para subsanar el error, dicha casilla puede encontrarla en el área administrativa bajo OpcionesGeneral.

Si lo desea, puede apreciar la lista completa de las correcciones realizadas para esta versión, algunas de las que llamaron mi atención fueron la #2463 y el #2548, en ambas correcciones se aprecia la optimización en cuanto al rendimiento de WordPress.

Pasos para actualizar desde la versión 2.0.2 a 2.0.3

  1. Eliminar el contenido de la carpeta /wp-admin.
  2. En caso de utilizar el directorio /wp-includes/languages, debe respaldarlo. (Opcional).
  3. Eliminar el contenido de la carpeta /wp-includes.
  4. Eliminar todos los ficheros del directorio raíz de tu instalación de WordPress, excepto el fichero de configuración, wp-config.php.
  5. Descargar y descomprimir la nueva versión de WordPress.
  6. Restaurar las carpetas /wp-admin y /wp-includes. En caso de haber realizado el paso 2, recuerda restaurar también la carpeta /wp-includes/languages.
  7. Restaurar los ficheros del directorio raíz de tu instalación de WordPress.
  8. En el paso anterior, no es necesario colocar los ficheros wp-config-sample.php, license.txt, ni el readme.html, bien puedes eliminarlos si gustas.
  9. Ingresa en el área administrativa, proceda a actualizar la base de datos.

Eso es todo, como siempre, recuerde que es recomendable eliminar los ficheros install.php y upgrade.php, los cuales se encuentran en el directorio /wp-admin

Después de actualizar a la versión 2.0.3

Aún después de actualizar WordPress, existen algunos comportamientos extraños. Cuando usted edita un comentario aparecerá un cuadro de dialogo que le preguntará si está seguro de realizar dicha acción, de igual manera sucede si usted intenta editar un enlace o un usuario, entre otras cosas.

Si usted quiere deshacerse de esos comportamientos extraños, le recomiendo instalar el plugin WordPress 2.0.3 Tuneup, los errores que corrige este plugin hasta su versión 0.3 son: #2760, #2761, #2764, #2776, #2782.

De acuerdo al roadmap de WordPress se espera que la versión 2.0.4 esté lista para el día 30/06/2006.

  1. Un enclosure es una manera de adjuntar contenido multimedia a un feed RSS, simplemente asociando la URL del fichero a la entrada particular. Esta característica es de vital importancia para la difusión del podcasting.[regresar]
  2. Mayor información acerca del podcasting[regresar]

StarDict: El diccionario que buscaba

Leyendo el ejemplar #14 de la revista Tux Magazine me encuentro con un interesante artículo, Learning Foreign Languages with jVLT and StarDict, la segunda aplicación descrita en dicho artículo, StartDict, llamó mi atención, así que a continuación se dará una breve revisión de la aplicación en cuestión.

¿Qué es StarDict?

StarDict es un diccionario internacional multiplataforma escrito en Gtk2, puede ser utilizado sin conexión a la web.

Características

Búsqueda de patrones

Usted puede buscar patrones de cadenas o caracteres usando comodines, por ejemplo, podrá usar el comodín * para buscar una cadena arbitraria, el resultado puede ser vacío, mientras que con el uso del comodín ? buscará una coincidencia con un carácter arbitrario. e.g. Suponiendo que tiene instalado el diccionario InglésEspañol, al buscar el patrón hell? encontrará como resultado la traducción de hello, mientras que con el uso del patrón hell* encontrará todas aquellas posibles coincidencias que comiencen con la cadena hell, hell (infierno en inglés), hell (suerte en noruego), los resultados encontrados dependerá de los diccionarios que haya instalado.

Búsqueda difusa

Si usted por casualidad no recuerda exactamente como deletrear una palabra, podrá intentar realizar dicha búsqueda desde StarDict, éste utilizará el algoritmo de la Distancia de Levenshtein 1. Para utilizar esta característica simplemente comience la búsqueda con el carácter /, e.g., suponga que tiene instalado el diccionario EspañolInglés, usted cree que la palabra acero realmente se escribe así: asero, simplemente introduzca en el formulario la cadena /asero, obtendrá el resultado deseado.

Búsqueda por palabras seleccionadas

Scan SelectionSi usted desea activar esta característica, deberá marcar la casilla de verificación que se encuentra en la parte inferior izquierda de la ventana principal de la aplicación. StarDict automáticamente buscará palabras o frases que usted haya seleccionado en cualquier aplicación, esto incluye navegadores, OpenOffice.org, etc., usted obtendrá un cuadro de dialogo que le mostrará la definición acerca de la palabra seleccionada.

Manejo de diccionarios

Manejo de diccionariosStarDict le permite activar (desactivar) aquellos diccionarios que necesite (no necesite), también puede establecer el orden de búsqueda en los distintos diccionarios instalados. Todo lo anterior podrá realizarlo desde la sección Manage Dictionaries (Recurso: Imagen).

¿No encuentra lo que necesita?

StarDict le permite realizar búsquedas en la web, solo deberá seleccionar el botón de búsqueda en Internet y escoger cualquiera de las 10 opciones actuales de búsqueda.

Ahora bien, seguramente esta aplicación resultará útil para muchas personas, si usted es uno de ellos y está interesado en instalarlo, es muy sencillo.

¿Cómo instalar StarDict?

Si usted es tan afortunado como yo, debe estar usando Debian, así que simplemente tendrá que hacer:

# aptitude install stardict

Ahora bien, si usted utiliza por ejemplo, Ubuntu, también puede instalarlo fácilmente, ¿cómo?, en primer lugar debe activar el repositorio universe (recuerde actualizar la lista de paquetes disponibles), posteriormente debe hacer:

$ sudo aptitude install stardict

Si usted utiliza otra distribución de GNU+Linux o es usuario de Windows, lea la documentación de la página oficial del proyecto, lamento informarle que este artículo es una revisión breve de la aplicación StarDict.

¿Cómo instalar diccionarios?

Primero que nada, debe descargar los diccionarios que necesite, para ello le recomiendo ir a la página de Descarga de Diccionarios del proyecto.

Una vez que haya descargado los diccionarios, debe proceder como sigue:

tar -C /usr/share/stardict/dic -x -v -j -f  \\
diccionario.tar.bz2

Personalizando la aplicación

Preferencias Ya para finalizar, usted puede personalizar la aplicación desde la sección de preferencias, desde ella podrá modificar el comportamiento del programa.

Una característica de StarDict que puede resultar realmente molesta es cuando se encuentra activo el modo Scan, es decir, toda palabra o frase resaltada con el ratón generará un cuadro de dialogo con la definición de dicha palabra o frase, si usted desea controlar este comportamiento, le recomiendo activar las siguientes casillas de verificación:

  • Only do scanning while modifier key being pressed.
  • Hide floating window when modifier key pressed.

Las casillas de verificación previamente mencionadas podrá encontrarlas bajo la sección DictionaryScan Selection.

Si usted esta inconforme con las opciones de búsqueda en Internet, puede agregar las que usted desea desde la sección Main WindowSearch Website.

  1. El algoritmo de la Distancia de Levenshtein o la distancia de edición entre dos cadenas, se refiere al número mínimo de operaciones necesarias para transformar una cadena en otra, bajo éste algoritmo se considera una operación a la inserción, eliminación o substitución de un carácter. Para mayor información le recomiendo leer el artículo Levenshtein Distance, in Three Flavors.[regresar]

Perl y su poderío

Al igual que José, considero que el hilo de discusión Borrar línea X de un archivo es bastante interesante, este hilo fué discutido en la lista de correos técnica 1 del Grupo de Usuarios de Linux de Venezuela (VELUG), el problema planteado 2 consistía en eliminar un registro completo, en donde se pasara como argumento el primer campo (tal vez el identificador) de dicho registro.

Suponga que el fichero tiene la siguiente estructura:

 :( 123
	... # otros campos
)

 :( 234
	... # otros campos
)

 :( 456
	... # otros campos
)

Se dieron soluciones en lenguajes como Bash y C 3 y ciertas en Perl, éstas últimas son las que llaman mi atención, vamos por partes 4.

José propuso lo siguiente:

#!/usr/bin/perl -n
$deadCount = 7 if ($_ =~ /${ARGV[0]}/);
--$deadCount if ($deadCount);
print unless ($deadCount);

El programa debe ejecutarse así:

$ perl script.pl archivo 123

Este programa hace el trabajo, pero al final emitirá un error porque cree que el argumento 123 es otro fichero, y por supuesto, no lo encuenta.

Mi solución fue la siguiente:

perl -ne 'print unless /:\\(123/../\\)/' input.data > output.data

Por supuesto, en este caso solamente estaría eliminando el registro cuyo primer elemento es 123, funciona, pero genera un problema al igual que el hecho por José, se deja una línea de espacio vacía adicional en los registros, cuando el separador de los grupos de datos debe ser una 5 línea en blanco, tal cual como apunto Ernesto Hernández en una de sus respuestas.

Otro apunte realizado por el profesor Ernesto, fué que las soluciones presentadas hasta el momento de su intervención fué el análisis de fondo que estabamos haciendo, el problema no consistía en procesar cada una de las líneas, el trabajo en realidad consistía en analizar un registro multilínea (o párrafo), en términos más sencillos, cada grupo de datos (registros) está separado por una línea en blanco.

El profesor continuaba su excelente explicación diciendo que el problema se reduce al analizarlo de esta manera en lo siguiente:

…si se cuenta con un lenguaje de programación que está preparado para manejar el concepto de “registro” y puede definir el separador de registro como una línea en blanco, simplemente se trata de ignorar aquellos registros que tengan la expresión regular (X, donde X es la secuencia de dígitos que no nos interesa preservar.

La solución presentada por el profesor Ernesto fue:

perl -000 -i -ne 'print unless /\\(XXX/' archivo

En donde se debe sustituir las XXX por los dígitos cuyo bloque no nos interesa conservar.

De este hilo aprendí cosas nuevas de Perl, en realidad estoy comenzando, muchos pensarán que este código es críptico, por ello considero conveniente aclarar algunas cosas.

Lo críptico de un código no es inherente a un lenguaje particular, eso depende más del cómo se programe.

En este caso particular una sola línea de código nos proporciona mucha información, evidentemente para comprender dicho contenido es necesario leer previamente cierta documentación del lenguaje, pero ¿quien comienza a programar en un lenguaje en particular sin haber leído primero la documentación?, la respuesta parece lógica, ¿cierto?.

La existencia de opciones predefinidas y maneras de ejecutar el interprete de Perl permiten enfocarse únicamente en la resolucion de tareas, cero burocracia.

Un ejemplo de lo mencionado en el párrafo anterior es el siguiente, un bucle lo puedo reducir con la opción de ejecución -n del interprete Perl, simplemente leyendo un poco perlrun6 nos enteramos del asunto, eso quiere decir que podemos reducir a una simple opción de ejecución del interprete de Perl todo esto:

#!/usr/bin/perl
while(<>){
#...
}

¿Qué es ese operador que parece un “platillo volador” 7 (null filehandle)?, bueno, lea perlop, en especial la sección I/O Operators.

La opción -i me permite editar (reescribir) in situ el fichero que vamos a procesar, en el caso de no añadir una extensión no se realizara un respaldo del fichero, el fichero original se sobreescribe. Mayor detalle en perlrun.

Lo que si no sabía hasta ahora, es lo explicado por el profesor acerca de los párrafos (registros multilínea) en Unix, la opción -0 tiene un valor especial, el cual es 00, si este valor es suministrado hace que Perl entre en “modo párrafo”, en pocas palabras, se reconoce una línea en blanco como el separador de los registros.

El resto del código es solo manejo de una sencilla expresión regular, se asume que el lector conoce algo del tema, solo indica el registro que queremos ignorar.

Así que podemos concluir lo siguiente, Perl no es críptico, asumiendo que el programador ha leido suficiente documentación acerca del lenguaje en cuestión, evitamos la burocracia y atendemos el problema de raíz en el menor tiempo posible.

La solución que propone Perl con el lema Hay más de una manera de hacerlo, es ofrecerle al programador libertad en su forma de expresarse, ¿acaso todos hablamos el mismo idioma?, ¿acaso debemos seguir las malas prácticas que intenta difundir el maligno Java?, coartar el pensar del programador y obligarlo a hacer las cosas al estilo Java, ¿dónde queda la imaginación? 8, ¿paso a ser un lujo?.

A todos los que lo deseen, les invito a participar en la lista de correos técnica (l-linux) del Grupo de Usuarios de Linux de Venezuela (VELUG), les recomiendo leer detenidamente las normas de uso antes de inscribirse en la lista.

  1. l-linux es la la lista de correos para Consultas Técnicas sobre Linux y Software Libre en VELUG[regresar]
  2. Quien inicio el hilo de discusión fue José Luis Bazo Villasante[regresar]
  3. ¿Con intención de autoflagelación?[regresar]
  4. Diría Jack El Destripador[regresar]
  5. No dos, ni tres, …[regresar]
  6. man perlrun, perlrun se incluye en la documentación de Perl, en sistemas Debian lo encontramos en el paquete perl-doc, para instalar simplemente hacer ejecutar el comando aptitude install perl-doc como superusuario[regresar]
  7. Según nos conto José Luis Rey, el profesor Ernesto Hernández le llama así de manera informal[regresar]
  8. De hecho, se dice que, un programador experto en Java está muy cerca de convertirse en un autómata[regresar]

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.

Amigas se unen a la blogocosa

Así como lo indica el título de esta entrada, dos mujeres muy importantes en mi vida, se unen a la blogocosa, la primera, mi novia Ana Rangel, la segunda es mi querida amiga Gaby Márquez, ambas comparten conmigo estudios en la carrera de Ing. de Sistemas en la Universidad de Los Andes, espero que realmente inviertan tiempo a esta tarea. Estaré atento a sus artículos y trataré de darles ánimo.

Ana y Gaby, bienvenidas a la blogocosa.

¡Maldito Spam!, nos invade

Según las estadísticas del plugin Akismet para el día de hoy, solamente 7.961 de 523.708 son comentarios, trackbacks o pingbacks válidos, mientras que el resto es Spam, eso quiere decir que aproximadamente el 1.5% es aceptable, el resto es escoria.

Seguramente alguno de mis 3 lectores en este instante se estará preguntando como funciona Akismet, en la sección de respuestas a preguntas frecuentes podrá resolver esta interrogante.

When a new comment, trackback, or pingback comes to your blog it is submitted to the Akismet web service which runs hundreds of tests on the comment and returns a thumbs up or thumbs down.

No sé que estara sucediendo con dichas pruebas últimamente, puesto que en los comentarios de mi blog han aparecido muchos trackbacks escoria. Ante el abrumador aumento (se puede observar que el aumento es prácticamente exponencial según las estadísticas proporcionadas en sitio oficial de Akismet) del spam, muchos han decidido cerrar sus comentarios, solo basta darse una vuelta por technorati bajo el tag spam y ver las acciones de algunos.

No puedo negar que el funcionamiento de Akismet en general es excelente, de hecho, antes de probar Akismet contaba con 2 ó más alternativas para combatir el spam, después de probarlo, no fue necesario mantener ningún otro plugin, pero creo que bajo esta situación es necesario comenzar a evaluar otras posibilidades que ayuden a Akismet.

Algunas de las cosas que podemos hacer bajo WordPress son las siguientes:

Mejorar nuestras listas de moderación o listas negras

En el área administrativa, bajo OpcionesDiscusión, sección Moderación de comentarios, colocar una lista de palabras claves que aparezcan en estos comentarios escoria. Algunos de ellos no tienen sentido, otros te felicitan por tu trabajo, por ejemplo: Good design, Nice site, todo ese conjunto de palabras clave deben incluirse, si le gusta ser radical incluya dichas palabras clave en la sección Lista negra de comentarios, tenga cuidado si decide elegir esta última opción.

Desactivar los trackbacks

En mi caso, Akismet ha fallado en la detección de trackbacks escoria, por lo tanto, si usted quiere ser realmente radical, puede cerrarlos.

Para desactivar las entradas futuras puede ir a OpcionesDiscusión, y desmarcar la casilla de verificación que dice Permitir notificaciones de enlace desde otros weblogs (pingbacks y trackbacks).

Ahora bien, a pesar de que la oleada de spam está atacando entradas recientes, podemos asegurarnos de cerrar los trackbacks para entradas anteriores ejecutando una sencilla consulta SQL:

UPDATE wp_posts SET ping_status = 'closed';
Moderar comentarios

Puede decidir si todos los comentarios realizados en su bitácora, deberán ser aprobados por el administrador, está acción quizá le evite que se muestren trackbacks escoria en su sitio, pero no le evitará la ardua tarea de eliminarlos uno por uno o masivamente. Si quiere establecer está opción puede hacerlo desde OpcionesDiscusión, en la sección de Para que un comentario aparezca deberá marcar la casilla de verificación Un administrador debe aprobar el comentario (independientemente de los valores de abajo)

Eliminar un rango considerable de comentarios escoria

Esta solución la encontre después de buscar la manera más sencilla de eliminar cientos de mensajes escoria desde una consulta en SQL.

En primer lugar debemos ejecutar la siguiente consulta:

SELECT * FROM wp_comments ORDER BY comment_ID DESC

En ella debemos observar el rango de comentarios recientes y que sean considerados spam. Por ejemplo, supongamos que los comentarios cuyos ID‘s están entre los números 2053 y 2062 son considerados spam. Luego de haber anotado el rango de valores, debe proceder como sigue:

UPDATE wp_comments SET comment_approved = ’spam’ WHERE comment_ID BETWEEN 2053 AND 2062

Recuerde sustituir apropiadamente los valores correspondientes al inicio y final de los comentarios a ser marcados como spam. Debe recordar también que los comentarios marcados como spam no desaparecerán de su base de datos, por lo tanto, estarán ocupando un espacio que puede llegar a ser considerable, le recomiendo borrarlos posteriormente.

Utilizar plugins compatibles con Akismet

En la sección de respuestas a preguntas frecuentes de Akismet podrán resolver esta interrogante.

We ask that you turn off all other spam plugins as they may reduce the effectiveness of Akismet. Besides, you shouldn’t need them anymore! :) But if you are investigating alternatives, we recommend checking out Bad Behavior and Spam Karma, both which integrate with Akismet nicely.

Ya había probado con anterioridad Bad Behavior, de hecho, lo tuve antes de probar Akismet y funcionaba excelente, ahora, falta probar como se comporta al combinarlo con Spam Karma 2. Las instrucciones de instalación y uso son sencillas.

Referencias: