Los #leyendo de @brucknerite

Ya llevo un tiempo acumulando los enlaces que voy leyendo y a los que considero interesante dar algo de difusión en una cuenta de Delicious. Hasta ahora iba publicando esos enlaces a través de mi Twitter usando el servicio de dlvr.it, que me permitía sacarlos poco a poco de acuerdo con unas reglas un poco complejas, pero pensadas para no abrumar a nadie con mis píos:

  • Como máximo un enlace cada 15 minutos.
  • Si hay más de un enlace en cola, saca primero el más antiguo.
  • Como máximo 100 enlaces al día (nunca llego a esta cifra, afortunadamente).
  • Solo se publican entre las 8 y las 22 horas.

dlvr.it, además, añade el hashtag #leyendo a estos enlaces, para que sea más fácil localizarlos (¡o filtrarlos!) en el timeline. Como guinda, se conecta con Karmacracy para reducir los enlaces a través de su servicio de «acortador social» y se asegura de que lo generado cabe en un tuit, recortándolo si es preciso —pero salvando el enlace, que es lo importante de todo este circo.

leyendo_twitterA estas alturas mis #leyendo tienen un puñado de seguidores, pero ya sabéis cómo es Twitter: palabras que se lleva el viento. Para evitar eso, he preparado un pequeño experimento…

Mediante un plugin compilador de RSS en el blog (la versión gratuita de RSS Digest, de Sam Charrington, modificada a mi gusto), mi objetivo es reunir los #leyendo en un artículo que se publicará automáticamente solo cuando haya un número suficiente de enlaces a mostrar. De momento estoy ajustando parámetros: la idea es no abrumar el blog con estos «artículos automáticos», y al mismo tiempo aprovechar el material para dar a brucknerite un poco de más de vida.

¿Solo enlaces? ¡No! Delicious permite anotar las capturas con una descripción. Ese pequeño texto, que uso en ocasiones como un comentario sobre lo que estoy leyendo, no sale en los #leyendo de Twitter debido a las limitaciones de espacio. Sin embargo, aquí podréis verlo sin problemas.

¿Qué os parece el invento? La primera recopilación de #leyendos ya está publicada; su aspecto gráfico en portada es ligeramente diferente del resto de los artículos —más simplificado. Y todavía no he terminado con los cambios… No me gusta comprometer a nadie, pero espero vuestros comentarios. Aunque sea un insulto. Algo que no sea el silencio más doloroso. Ay.

Unas notas para la actualización de Google Reader

“Actualización” es un eufemismo muy informático. Lo que ha ocurrido con Google Reader, uno de los lectores de noticias (feeds) más populares, a principios de esta semana es más bien una transformación. A peor. No entraré en consideraciones estéticas aunque el nuevo diseño, gastando espacio vertical como un Cadillac de los sesenta engullía combustible, daña la usabilidad en plataformas pequeñas —los netbooks, hoy, siguen teniendo pantallas de 600 puntos de altura. Me limitaré a comentar cómo la eliminación de las características de red social han impactado mi vida cotidiana en una plataforma completamente distinta, Twitter. ¡Con lo que me quejé de ellas algo después de que las incorporaran en la prehistoria… hace dos años! Continue reading “Unas notas para la actualización de Google Reader”

Aviación… ¿expañola?


No hay como el mes de agosto para encontrar bromas en Google Earth. Pero a cada uno lo suyo: los datos de redes de transporte reflejados en Google son aportados, generalmente, por los transportistas. Lo que indica que la broma surge de entre las paredes de Metro de Madrid. ¿Será una señal, un menxaje xecreto de su dueña (de un cuarto, para ser exactos), doña “Experanza”? ¿Quién quiere realmente dextruir Expaña?

Por cierto, muy interesante el GTFS. Competencia para TransXChange; otro acrónimo de tres letras con cuatro letras para aprender.

Pipes con entrada

¿Para qué sirve un pipe con entradas de datos, si hay que ir a la página de Pipes para introducir los datos a mano? Hemos visto que podemos pasar nuestros valores a través de una URL (con un GET de HTTP); esto nos permite la automatización necesaria para añadir un elemento más a la cadena.

Vamos a preparar un bookmarklet sencillo. Un bookmarklet es una URL de protocolo javascript: que contiene código ejecutable (escrito en… Javascript, claro). Huelga decir que lo probaré en Firefox, y si funciona en Explorer 😉 pues mejor que mejor. Allá va.

javascript:
    void(
        q0=prompt('BOE-Búsqueda en título:','igualdad')
    );
    if(q0)
        location.href='http://pipes.yahoo.com/pipes/pipe.run?
        _id=sOW2lOvS2xGGAgtA1vC6Jw&_render=rss&titulo='+
        escape(q0)

El código del bookmarklet se escribe todo en una misma línea, pero lo presento dividido e indentado para que se vea mejor la estructura. Además de presentarlo en una sola línea se procura que quede lo más comprimido posible (como un Perl one-liner) para encajar en la limitación de longitud de una URL en un favorito… alrededor de 2000 caracteres en Explorer (otros no tienen esas limitaciones).

Se trata de un código muy sencillo, en el que podríamos añadir más variables y llamadas a prompt para introducir más parámetros de entrada; lo fundamental es escapar, es decir, realizar un URL encoding mediante la función escape, el valor de lo introducido en las cajas de entrada a la hora de componer la URL (línea location.href). Aquí está, para añadirlo a los favoritos: bookmarklet BOEv2.

¿El BOE por RSS? (4ª parte)

Los parámetros de entrada de un pipe determinan, de un modo automático, la interfaz que Yahoo generará para acceder a él. Pero, ¿qué ocurre si queremos usar el pipe sin abrir su página correspondiente en el navegador?

La respuesta es a la vez obvia y brillante: ¡podemos pasar los parámetros en la URL del pipe, como un método GET! Eso significa que si la URL de nuestro pipe es:

http://pipes.yahoo.com/pipes/pipe.info
?_id=sOW2lOvS2xGGAgtA1vC6Jw

… Podremos concatenar (usando el nombre que dimos antes al parámetro de entrada):

&_render=rss&titulo=igualdad

para pasar un valor para el parámetro de entrada titulo, sin tener que pasar por la interfaz de Yahoo. En realidad estamos pasando otro parámetro dentro de la query: _render, con valor “rss”, además de nuestro parámetro. Esto le indica a Pipes que genere salida en forma de fuente RSS, y no una interfaz HTML convencional. La URL completa sería esta.

Naturalmente, si tuviéramos más módulos de entrada de datos en nuestro pipe, pasar los correspondientes valores a través de la URL sería tan sencillo como concatenar más parámetros con “&” en el formato “nombre=valor”. Sólo deberemos tener la precaución de escapar los valores que queramos pasar (formalmente, aplicarles un URL encoding).

Esto, claro, me da una idea…

¿El BOE por RSS? (3ª parte)

And now, for something completely the same!

Una característica interesante de Pipes es que dispone de módulos de entrada. Éstos permiten introducir datos en el flujo de un pipe. Los hay de varias clases:

  • URLs (URL Input).
  • Números (Number Input).
  • Ubicaciones geográficas (Location Input).
  • Texto (Text Input).
  • Fechas (Date Input).

Usaremos uno de los más sencillos (el de texto) para darle vidilla al pipe que creamos antes. Para empezar, podemos clonarlo. En la pantalla de edición, basta con pulsar el botón Save a Copy. Así no romperemos nada. Sobre la copia, añadimos un módulo Text Input y lo configuramos con los valores:

  • Name: “titulo”. Este es el nombre del parámetro de entrada que estamos creando.
  • Prompt: “Palabra a buscar”. Aparecerá como nombre del módulo, y en su ejecución a través de la interfaz de Pipes.
  • Position: (en blanco, no es necesario). Determina el orden de aparición del parámetro en la interfaz de Pipes al ejecutar el programa, en el caso de que haya varios.
  • Default: “igualdad”. El valor por defecto del parámetro. Así empezó esta historia.
  • Debug: “ley”. Un valor para probar en la pantalla de edición. Buscando en el BOE, la palabra ley asegura muchas respuestas.

Conectamos la salida del Text Input con la entrada del valor del parámetro llamado dato[1] (no la del mismo parámetro, que si no la liamos) del primer URLBuilder. Sabemos que es ése y no otro porque hemos mirado la URL de búsqueda del BOE y, más o menos, la entendemos… ¡Y ya está! Podemos probar nuestro pipe, tras guardarlo y (opcionalmente) publicarlo aquí.

¿El BOE por RSS? (2ª parte)

En la entrada anterior observamos que RSSxl, como scraper, es un tanto limitado. Existen opciones mucho más avanzadas (y complejas), pero requieren disponer de acceso a un servidor, con lo que perdemos la ventaja fundamental de RSSxl: es online y no requiere configuración ni conocimientos especiales.

Pero introduzcamos una nueva herramienta, también online: Pipes, de Yahoo. En resumen, Pipes es un remezclador de fuentes RSS, aunque se le adivina mucho potencial. Verdad es que nada de lo que, hoy por hoy, se puede hacer con Pipes es imposible de otra forma; lo que consigue es una bajada espectacular de la barrera de entrada. Dicho de otro modo, con Pipes manipular fuentes RSS queda al alcance de cualquiera con curiosidad y dos dedos y medio de frente. Justo lo que necesitaba.

Aquí hay una explicación más detallada, y un ejemplo, cortesía de Microsiervos. Y ahora vamos con la receta.

Pipes va de unir módulos que hacen cosas con tubos (¿no era obvio?). Es un poco de filosofía Unix aplicada a la Web 2.0. Necesitaremos:

  • Dos módulos URLBuilder.
  • Un módulo Fetch.
  • Un módulo Regex.
  • El Pipe Output, que ya sale por defecto (representa el resultado final).

Ponemos en juego el primer URLBuilder. En su campo base, pegamos la URL de búsqueda que habíamos obtenido en el BOE usando la página de búsqueda avanzada (ésta). Inmediatamente, los diferentes componentes de la query aparecen desglosados en Query elements dentro del módulo, y separando nombres de valores. Reservamos.

Añadimos ahora el segundo URLBuilder. En su campo base, pegamos la URL que obtuvimos en el episodio anterior pulsando Generate RSS en RSSxl. Obtenemos el mismo resultado que en el caso anterior: los componentes de la parte de query se separan automáticamente. Nos interesa el parámetro pageurl, y el circulito que se ve a la derecha de su valor.

Las flechas rojas indican los extremos de la conexión que hay que hacer. El parámetro pageurl tendrá que tener como valor [url], es decir, la dirección completa que sale del primer URLBuilder.

Ahora insertamos el módulo Fetch, y lo conectamos con la salida del segundo URLBuilder. Éste es más fácil, ya que sólo hay una forma de hacer la conexión. Colocamos el módulo Regex y le prestamos un poco de atención.

Con la salida de Fetch ya tenemos la fuente RSS construida como en el episodio anterior. Lo que vamos a hacer con Regex es corregir el problema de los enlaces de los elementos RSS, que vimos que no funcionaban tal y como quedaban generados por RSSxl. Si miramos el elemento <link> de la fuente RSS generada, y lo comparamos con el valor que tendría que tener (el valor del atributo href del enlace “Más…” de los resultados de la búsqueda en el BOE), observamos que podemos obtener el segundo a partir del primero por medio de una expresión regular y una sustitución.

Las expresiones regulares son uno de los instrumentos más poderosos para el tratamiento y transformación de información textual que existen. También son complejas y dolorosas, sobre todo cuando se empieza con ellas. En este caso, usaremos Regex para sustituir en los elementos link de la fuente RSS aquello que encaje con la expresión:

search.php?.*(doc.php.*$)

Por:

$1

Si estás leyendo esto, no lo entiendes y tienes el más mínimo interés en la programación, te recomiendo que aprendas a manejar expresiones regulares. Hasta en los casos sencillos pueden resolver problemas que de otro modo serían difícilmente tratables (y desde luego, de un modo elegante y terso). La expresión que he usado se puede leer como:

Busca el texto “search.php?” seguido de un número indeterminado de caracteres, y terminado con “doc.php” y otra cadena de 0 a n caracteres. Guarda desde “doc.php” hasta el final en un registro numerado, que usaremos en la sustitución como $1.

Terminamos conectando la salida de Regex con Pipe Output. Sólo queda guardar el pipe que hemos creado y publicarlo si queremos. El que hemos creado aquí está disponible como BOEv1, y la fuente RSS que genera es ésta.