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 l-linux es la la lista de correos para Consultas Técnicas sobre Linux y Software Libre en VELUG del Grupo de Usuarios de Linux de Venezuela (VELUG), el problema planteado por quien inicio el hilo de discusión, José Luis Bazo Villasante, 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 ¿Con intención de autoflagelación? y ciertas en Perl, éstas últimas son las que llaman mi atención, vamos por partes Diría Jack El Destripador.

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 No dos, ni tres, … 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 perlrunman 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 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”, según nos conto José Luis Rey, el profesor Ernesto Hernández le llama así de manera informal (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? De hecho, se dice que, un programador experto en Java está muy cerca de convertirse en un autómata, ¿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.

4 min read

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: http://www.chichaplanet.org/tag/django/
  • Generación de páginas o feeds por miembros: http://www.chichaplanet.org/user/1/
  • Generación de páginas o feeds de una categoría en especial de un miembro particular: http://www.chichaplanet.org/user/1/tag/django/
  • Generar un feed general: 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).

1 min read

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.

~1 min read

¡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 Opciones -> Discusió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 Opciones -> Discusió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 Opciones -> Discusió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:

3 min read

Actualizado Planeta #ubuntu-es

El hecho de haber dejado de utilizar ubuntu, como lo he manifestado en entradas anteriores, no implica que deba dejar de lado a los amigos del canal #ubuntu-es en el servidor Freenode, además, tampoco debo dejar de cumplir mis deberes de administrador del Planeta #ubuntu-es, por ello, he realizado los siguientes cambios:

  • Se actualiza WordPress a su versión 2.0.2.
  • Se actualiza el plugin FeedWordPress, basicamente este plugin es un agregador de contenidos Atom/RSS.
  • Ahora el dominio principal del Planeta #ubuntu-es es http://www.ubuntuchannel.org/, aunque se han establecido reglas de redirección en el fichero .htaccess para hacer el cambio lo menos traumático posible.

Aún faltan muchos detalles, en este preciso instante no puedo resolverlos debido a un viaje que debo realizar fuera del estado dentro de una hora, el lunes cuando regrese a casa continuare la labor, mientras tanto, le agradezco que si percibe algún error en el nuevo sitio o tiene alguna sugerencia en particular, por favor deje un comentario en esta entrada.

Para quienes deseen suscribirse al Planeta #ubuntu-es, el URI del feed ha cambiado a http://www.ubuntuchannel.org/feed/. Para aquellas personas que estaban suscritas, este cambio no debería afectarles, puesto que se han establecido reglas de redirección.

Si deseas ser miembro, por favor envia un mensaje a través de la sección de contacto del Planeta #ubuntu-es.

1 min read