Logo de Torre de Babel
Portada Libros Artículos Perfil Scholar

Últimas publicaciones: VB 2012, ASP.NET 4.5, Office 2013 ...

Actualización y mantenimiento del ordenador y dispositivos digitales Manual avanzado Excel 2013

El año al que ahora quedan poco más de seis semanas ha sido intenso para el que suscribe. Desde su inicio he estado inmerso en la elaboración de varios libros que han ido publicándose durante los últimos meses, así como avanzando en mi campo de investigación y obteniendo algunos frutos prometedores.

El primer libro de esta serie trata sobre el mantenimiento de los ordenadores y, en menor medida, otros dispositivos como pueden ser tabletas y móviles. Trastear con el hardware es algo que siempre me ha gustado y durante la redacción de este libro intenté transmitir esa afición, mostrando lo fácil que es mantener en perfecto orden de funcionamiento nuestro ordenador y, si lo necesitamos, también cómo actualizarlo.

Sobre desarrollo para la plataforma .NET publiqué hace ya meses un manual de Visual Basic 2012, y más recientemente otro centrado en el desarrollo de aplicaciones web usando ASP.NET 4.5 y MVC 4, la implementación para ASP.NET del patrón arquitéctonico MVC. También sobre desarrollo web, pero con PHP en el servidor y para clientes heterogéneos entre los que se incluyen dispositivos móviles iOS y Android, trata la guía de HTML5 Builder, una de las últimas herramientas de Embarcadero.

Los otros cuatro libros que he publicado últimamente tratando sobre varias de las aplicaciones incluidas en Office 2013, tales como Excel, Word y Access. Son guías y manuales dirigidas a usuarios con prácticamente cualquier nivel de conocimientos y que muestran cómo obtener el mejor provecho de estas herramientas.

En la sección Libros puedes encontrar información ampliada sobre cada uno de estos libros. Los índices de contenido completos por el momento no están disponibles, trataré de subirlos cuanto antes.

Además de libros, y ya en mi campo de investigación, se han publicado mis dos últimas aportaciones a congresos internacionales. Estos trabajos son Alternative OVA Proposals for Cooperative Competitive RBFN Design in Classification Tasks, publicado por Springer en la serie Lecture Notes in Computer Science (actas 12th International Work-Conference on Artificial Neural Networks), y A First Approach to Deal with Imbalance in Multi-label Datasets, publicado también por Springer en la serie Lecture Notes in Artificial Intelligence (actas 8th International Conference on Hybrid Artificial Intelligent Systems).

Guía práctica de Excel 2013 Manual imprescindible Access 2013
Manual imprescindible Visual Basic 2012 La guía de HTML5 Builder
Manual imprescindible Word 2013 Manual imprescindible ASP.NET 4.5/MVC 4

Publicado el 14/11/2013

Intercambio de datos entre Excel y R (III) - El paquete xlsx

En las dos entregas anteriores sobre este tema se han descrito procedimientos dirigidos a intercambiar información entre Excel y R, en el primer caso usando el portapapeles y en el segundo mediante archivos CSV/DIF como intermediarios. El primer enfoque es adecuado cuando el usuario de R y Excel es la misma persona y usa ambas aplicaciones en el mismo equipo, mientras que el segundo permite compartir información entre distintos equipos y usuarios, por ejemplo enviando los archivos a un servidor compartido o por correo electrónico.

A pesar de la sencillez del proceso, descrito en la segunda entrega, no todos los usuarios de Excel están preparados (o dispuestos) a exportar sus datos a CSV para enviárselos a un tercero o a importar datos de un archivo cuyo formato no conoce y que, a priori, podría darle problemas, por ejemplo si la configuración regional de Excel altera los separadores de decimales y miles. Afortunadamente R, como herramienta de código abierto que es, dispone de infinidad de paquetes para todo tipo de tareas, entre ellas la lectura y escritura directa de hojas de cálculo en formato XLSX (el usado por Excel desde las versión 2007).

En CRAN (el repositorio de paquetes R) podemos encontrar múltiples paquetes para trabajar con hojas de cálculo Excel desde R. Uno de ellos es el paquete xlsx, con el que también puede trabajar con hojas de versiones previas de Excel. Para instalar este paquete no tenemos más que facilitar su nombre a install.packages desde la consola de R. Si la configuración del repositorio es correcta, se descargará el paquete y también sus dependencias, quedando instalados y listos para usar. Las funciones indicadas a continuación dependen de que se haya cargado el paquete en la actual sesión de R, para lo cual ejecutaremos library(xlsx) al inicio.

Si la tarea a realizar consiste en enviar a una hoja de cálculo Excel la información que tenemos almacenada en un data.frame de R (u otra estructura de datos), la función a usar es write.xlsx. Los parámetros imprescindibles son dos: el conjunto de datos a escribir y el nombre del archivo en que reside la hoja de cálculo (argumento filename. Además también son de uso habitual los parámetros siguientes:

  • sheetName: Nombre de la hoja del libro en que se introducirán los datos. Ha de ser un nombre único, no debe haber otra hoja con ese nombre en el libro Excel en caso de que estén añadiéndose datos a un libro existente. Por defecto toma el valor Sheet1.
  • append: Por defecto toma el valor FALSE, provocando que la función cree un libro con el nombre indicado por filename eliminándolo si ya existiese. Si es TRUE el libro debe existir y al mismo se añadirá una hoja con los nuevos datos.
  • col.names y row.names: Determinan si se escribirán en la hoja los nombres asociados a las columnas y las filas del data.frame. Por defecto ambos parámetros toman el valor TRUE.
En la imagen siguiente puede verse un ejemplo de uso de esta función. En él se agregan a un libro existente tres nuevas hojas, con los nombres de tres meses, y datos hipotéticamente correspondientes a las ventas diarias. En la imagen de más abajo puede verse el libro tras abrirlo en Excel.

La función complementaria a la anterior, mediante la que podemos leer desde R información almacenada en un libro Excel sin necesidad de tener instalada esta aplicación, es read.xlsx. El primer argumento será en este caso el nombre del archivo donde está almacenada la información, siendo obligatorio indicar un número de hoja con el parámetro sheetIndex o bien su nombre con el parámetro sheetName. Sin más parámetros la función leerá todo el contenido de la hoja indicada, generará un data.frame incluyendo títulos de columnas y lo devolverá. En caso de que nos interese leer un conjunto concreto de celdillas, no la hoja completa, recurriremos a los parámetros colIndex y rowIndex para especificar qué columnas y qué filas han de recuperarse. Estas no tienen necesariamente que ser contiguas. En el ejemplo de la imagen siguiente se recupera la primera fila y las filas 23 a 32.

Por defecto la función read.xlsx evaluará las fórmulas que pudieran existir en la hoja de cálculo, almacenando en el data.frame el resultado que produzcan. Dando el valor TRUE al parámetro keepFormulas se anulará la evaluación, obteniendo en su lugar el texto de la fórmula.

Con esta tercera entrega concluyo, al menos por el momento, el tema de la importación/exportación de datos entre R y Excel.


Publicado el 7/4/2013

Intercambio de datos entre Excel y R (II) - CSV y DIF

Cuando R y Excel no se ejecutan en la misma máquina, o el volumen de datos es demasiado grande como para usar el portapapeles con comodidad, una vía alternativa para intercambiar datos consiste en recurrir a formatos de archivo cuya finalidad es precisamente esa: facilitar el intercambio de información entre aplicaciones. Entre dichos formatos, dos de los más conocidos son CSV (Comma-Separated Values) y DIF (Data Interchange Format).

El formato CSV, como su propio nombre indica, utiliza comas para separar los valores y se estructura como una serie de filas (registros) con columnas de longitud variable. Los valores no numéricos pueden ir o no entrecomillados y en los numéricos el separador decimal es el punto. En algunos países europeos se usa la coma como separador decimal y el punto y como para separar unos valores de otros. Es importante destacar que Excel utiliza el punto y coma como separador incluso cuando su configuración establece que el separador decimal es el punto y, por tanto, podría usarse la coma según dicta el formato estándar CSV. Asumiendo que trabajamos con los mismos datos mostrados en la entrada anterior a esta, el archivo CSV generado por Excel tendría el siguiente contenido:

;Mean;Desv;Mean;Desv;Mean;Desv;Mean;Desv;Mean;Desv
Method 1;0.0168;0.0002;0.9764;0.0059;347.1082;2.3381;0.7448;0.006;0.0245;0.0033
Method 2;0.0167;0.0002;0.977;0.0059;347.192;1.5445;0.7451;0.0065;0.0245;0.0045
Method 3;0.0167;0.0003;0.9748;0.0075;346.793;2.4845;0.7434;0.0109;0.0264;0.0057
Method 4;0.0167;0.0002;0.9764;0.0069;347.2316;2.337;0.746;0.008;0.0236;0.0038
Method 5;0.0167;0.0002;0.973;0.0068;347.1902;2.1718;0.7452;0.009;0.0263;0.0041
Method 6;0.0167;0.0003;0.9726;0.0084;347.0992;2.6537;0.7436;0.01;0.0268;0.0056
Method 7;0.0168;0.0003;0.9736;0.0084;347.3674;1.4827;0.7451;0.0056;0.0253;0.0036
Method 8;0.0167;0.0001;0.9752;0.0096;347.6234;2.6344;0.7457;0.012;0.025;0.0067
Method 9;0.0167;0.0002;0.974;0.0078;347.8062;1.8226;0.7443;0.006;0.0254;0.0039
Method 10;0.0167;0.0002;0.9754;0.0049;347.6574;2.1976;0.7459;0.0083;0.0242;0.0032
Method 11;0.0167;0.0002;0.9732;0.0109;348.0798;1.3106;0.7461;0.0053;0.0243;0.004
Method 12;0.0166;0.0002;0.9696;0.0085;347.2472;1.6961;0.7441;0.0085;0.0271;0.0039
Method 13;0.0166;0.0002;0.97;0.0071;347.1204;1.9556;0.7441;0.0066;0.0271;0.0043
Method 14;0.0166;0.0002;0.971;0.0068;347.6144;1.7622;0.7462;0.0065;0.0254;0.0036
Method 15;0.0166;0.0002;0.9686;0.0077;347.8932;1.779;0.7444;0.0072;0.0271;0.0037

El formato DIF fue diseñado a principios de la década de los 80 del siglo pasado expresamente para facilitar el intercambio de datos entre hojas de cálculo, usándose por entonces en Visicalc y Lotus 1, 2, 3 y habiendo llegado hasta Excel y FreeOffice Calc. Se trata de un formato más descriptivo y, en consecuencia, menos compacto que CSV. A continuación se muestra parte del mismo contenido anterior pero en formato DIF:

TABLE
0,1
"EXCEL"
VECTORS
0,16
""
TUPLES
0,11
""
DATA
0,0
""
-1,0
BOT
1,0
""
1,0
"Mean"
1,0
"Desv"
1,0
"Mean"
1,0
"Desv"
1,0
"Mean"
1,0
"Desv"
1,0
"Mean"
1,0
"Desv"
1,0
"Mean"
1,0
"Desv"
-1,0
BOT
1,0
"Method 1"
0,0.0168
V
0,0.0002
V
0,0.9764
V
0,0.0059
V
0,347.1082
V
0,2.3381
...

Lo interesante es que ambos formatos pueden ser utilizados a la hora de intercambiar datos entre Excel y R, que es el objeto de esta entrada. Partamos del supuesto en el que los datos están en Excel, posiblemente en el ordenador del usuario que los ha generado, y queremos transferirlos a otra máquina en la que trabajamos en R. El primer usuario debe guardar los datos en formato CSV o DIF y enviarnos el archivo resultante, para ello debe dar los pasos siguientes:

  1. Crear un nuevo libro Excel, en blanco, o en su defecto una nueva hoja en el libro actual.
  2. Copiar en el nuevo libro/hoja los datos que desea enviar.
  3. Utilizar la opción Guardar (o Guardar como si hemos creado una nueva hoja en lugar de un nuevo libro) para abrir el cuadro de diálogo del mismo nombre.
  4. Desplegar la lista Tipo y elegir el formato deseado: CSV o DIF, tal y como se muestra en la imagen siguiente.
  5. Pulsar los botones Aceptar y de los dos cuadros de diálogo que aparecerán a continuación, confirmando que deseamos guardar únicamente el contenido de la hoja actual y que deseamos mantener el formato elegido a pesar de que se pierdan características del libro.

Al guardar en cualquiera de estos dos formato Excel escribirá en el archivo de destino todo el contenido de la hoja actual, no la selección que tuviésemos hecha. Por ello es preciso el paso previo en que se crea una hoja auxiliar (o un nuevo libro) y se copia en ella la información a exportar. Esa hoja, lógicamente, puede ser eliminada al final. Si esta operación vamos a realizarla a menudo lo más cómodo es registrar una macro de Excel con todos los pasos, partiendo desde la copia al portapapeles de la selección actual e incluyendo la inserción de la nueva hoja, pegado de los datos, selección de la opción Guardar como y establecimiento del formato de exportación. De esta forma en adelante solo habrá que ejecutar la macro, que puede ser asignada a una cierta combinación de teclas, tras haber marcado el rango de celdillas a exportar.

Una vez que tenemos la información en el archivo CSV/DIF llega el momento de importarla a R. Para leer un CSV tenemos a nuestra disposición múltiples funciones: read.csv, read.csv2, read.delim y la más genérica read.table. Vamos a concentrarnos en las dos primeras que son las que más se ajustan a lo que necesitamos en este momento. Ambas precisan como parámetro indispensable el nombre del archivo a leer y por defecto asumen que habrá una primera línea con los encabezados: los títulos de las columnas. La diferencia fundamental es que la primera asume que el formato sigue el estándar CSV: se usa el punto para decimales y la coma como separador de valores, mientras que la segunda está preconfigurada para el formato que suele usarse en algunos países europeos: coma para decimales y punto y coma como separador de valores. Si el formato que tenemos que leer no es ninguno de estos dos, como ocurre en nuestro caso que utiliza el punto para los decimales pero separa los valores con punto y coma, podemos usar cualquiera de las dos incluyendo los parámetros dec y/o sep para indicarlo. En la imagen siguiente puede verse cómo se ha usado read.csv para obtener el contenido del archivo en un data.frame.

Para importar en R el contenido de un archivo en formato DIF recurriemos a la función read.DIF. Si la estructura del archivo se ajusta estrictamente al estándar, solamente habrá que facilitar el nombre del archivo y se obtendrá como resultado un data.frame con los datos. En el caso de Excel, no obstante, hay una diferencia importante: el orden en que se entregan filas y columnas está invertido, siendo necesario agregar el parámetro transpose dándole el valor TRUE (por defecto es FALSE) tal y como se aprecia en la siguiente imagen.

Supongamos ahora que el sentido de transferencia de la información se invierte: tenemos un data.frame en R con datos que necesitamos enviar a alguien que los tratará con Excel. Para ello lo primero que haremos será generar el archivo CSV, sencillamente usando la función write.csv con dos parámetros: el data.frame que contiene los datos y el argumento file indicando el nombre del archivo de destino. También podemos usar write.csv2 para cambiar los separadores de decimales y valores, o bien incluir los parámetros dec y sep indicados anteriormente. El resultado será un archivo CSV que enviaremos al destinatario.

Excel puede abrir directamente archivos CSV, de hecho suele ser la aplicación establecida por defecto para abrir ese tipo de archivos en sistemas Windows. El contenido del archivo se llevará a una nueva hoja en un nuevo libro, a partir de la celdilla A1. Sin embargo, a menos que los separadores sean los que espera Excel, puede ocurrir que lo que obtengamos sean unas líneas de texto en lugar de los datos debidamente almacenados en sus celdillas con el formato que corresponda. Además, es probable que no queramos los datos en un nuevo libro sino que nos interese agregarlos en una hoja ya existente. En estos casos reproduciremos los pasos siguientes:

  1. Colocamos el cursor en la posición de la hoja a partir de la cual deseemos colocar los datos que van a importarse (la esquina superior izquierda del rango resultante).
  2. Abrimos la pestaña Datos de la Cinta de opciones y hacemos clic en la opción Obtener datos externos -> Desde texto.
  3. En el cuadro de diálogo que se abre seleccionamos el archivo CSV que contiene los datos a exportar.
  4. Se pone en marcha el Asistente para importar texto, cuyo primer paso nos permite elegir entre datos delimitados (con un separdor) o de ancho fijo. La opción marcada por defecto será la primera, por lo que hacemos clic en Siguiente.
  5. En el segundo paso es donde tendremos que configurar el separador de valores, desmarcando el que aparece por defecto (Tabulación normalmente) y marcando Coma o Punto y coma según el caso. En la parte inferior de la ventana podremos apreciar cuál es el resultado que se obtendría según la configuración establecida actualmente.

  6. En el tercer paso del asistente podemos configurar el formato aplicado a cada una de las columnas de valores. En caso de que el separador de decimales no sea el adecuado, según la configuración que se haya establecido en Excel, usaremos el botón Avanzadas para abrir un pequeño cuadro de diálogo en el que podremos indicar explícitamente cuál es el separador decimal.

Una vez llegado al última paso del asistente podremos elegir el destino de los datos, por defecto será la posición actual en la hoja, y completar el proceso de importación. Ya tenemos el contenido del data.frame de R en la hoja de cálculo.

Un último apunte en relación a la importación/exportación usando archivos CSV/DIF, especialmente si se utilizan ordenadores distintos y sistemas distintos: en caso de que haya columnas con textos es importante que la codificación de caracteres empleada sea la misma al importar que al exportar. Todas las funciones R mencionadas aceptan el parámetro fileEncoding, con el que podemos indicar la codificación al leer o escribir. En Excel al importar datos, con el procedimiento descrito antes, el primer paso del asistente permite elegir la codificación en la lista Origen del archivo.


Publicado el 30/3/2013

Intercambio de datos entre Excel y R - El portapapeles

Microsoft Excel es una de las herramientas más usadas por parte de los denominados power users (usuarios con conocimientos por encima del usuario medio) a la hora de resumir, analizar y representar gráficamente todo tipo de datos, generalmente con el objetivo de extraer información útil a partir de ellos. Personalmente es una aplicación que comencé a usar en la versión 95, después de haber trabajado durante años en DOS con Paradox, las hojas de cálculo de Open Access y Symphony y el mítico Lotus 1,2,3. Desde la versión 2000 hasta la 2013 he escrito una docena de libros sobre Excel, siendo una herramienta que uso prácticamente a diario para distintas tareas.

A pesar de la potencia de Excel, que incluye la posibilidad de definir nuevas funciones escritas en lenguaje VBA y el desarrollo de aplicaciones sobre esta herramienta desde Visual Studio, hay ocasiones en las ciertas tareas sencillamente resultan demasiado arduas. Aquí es donde entra en escena el lenguaje R, empleado por miles de usuarios, especialmente estudiantes de ciencias, investigadores y científicos de múltiples ramas. R es un lenguaje funcional e interpretado que, de manera interactiva, permite operar sobre listas, vectores y matrices de datos de manera extremadamente sencilla. Gran parte de su versatilidad estriba en la inmediatez para aplicar cualquier operación sobre todos los elementos de una de esas estructuras (o partes de ellas) en un solo paso, así como en la extensa biblioteca de paquetes (CRAN) disponibles para resolver prácticamente cualquier problema que se nos ocurra (obviamente siempre circunscrito al campo del análisis de datos).

Son muchos los casos en que tengo información en Excel que me sería más fácil procesar con R y, en ocasiones, ocurre lo contrario. Imagino que no seré la única persona que tenga la necesidad de exportar datos desde Excel a R, o viceversa, y por ello voy a compartir aquí los métodos que he venido utilizando hasta ahora, comenzando por el portapapeles que fue el primero que usé aunque ahora ya no lo haga.

Si ejecutamos R y Excel en la misma máquina uno de los recursos más inmediatos para compartir información es el portapapeles. Copiar un rango de celdillas desde Excel al portapapeles, o pegarlo, es una acción simple: basta con seleccionarlo y usar los habituales atajos de teclado Control+C y Control+V, respectivamente. En R podemos pegar en la consola los datos copiados desde Excel, pero esto no los almacenará en ninguna variable. Aunque existe una función readClipboard para la lectura genérica de datos del portapapeles (introducir ?readClipboard en la consola para obtener ayuda sobre la misma), en este caso no nos resultaría de utilidad porque Excel por defecto copia los datos al portapapeles como líneas de texto, separando el contenido de cada celdilla con un tabulador. Lo que necesitamos, por tanto, es una función que tenga en cuenta que los datos están delimitados por un separador, en este caso el tabulador, y que además diferencie entre la primera fila, que suele contener títulos de las columnas, y el resto, que contendrán los datos propiamente dichos. Esa función es read.delim y el único parámetro que necesita es la cadena "clipboard".

El procedimiento a seguir para llevar datos desde Excel a R mediante el portapapeles consta de dos pasos:

  1. Seleccionamos en Excel los datos, incluyendo títulos, y los copiamos al portapapeles.
  2. Introducimos en la consola de R el comando rango <- read.delim("clipboard"), asumiendo que deseemos guardar los datos en la variable rango. Esta será un data.frame, basta con escribir su nombre para obtener el contenido.

Las dos imágenes siguientes muestran el procedimiento descrito.

En este momento podríamos trabajar con los datos desde R, realizando el procesamiento que necesitemos.

La transferencia de datos en sentido inverso, desde un data.frame de R a una hoja de Excel, se completa con los dos pasos siguientes:

  1. Copiamos el contenido del data.frame de R al portapapeles, usando para ello la función write.table(variable, "clipboard", sep="\t", row.names=F). A diferencia de read.delim, que asume por defecto que el separador de datos usado es el tabulador, la función write.table no aplica separador alguno, por ello es necesario indicarlo explícitamente con el parámetro sep. En cuanto al parámetro row.names, al que asignamos el valor FALSE, comunica a la función si debe o no incluir los nombres de fila del data.frame (en la imagen anterior pueden verse en la primera columna, como una secuencia de números generada automáticamente).
  2. Desde Excel obtenemos los datos sencillamente colocándonos en la celdilla de destino y pegando desde el portapapeles.

La ventaja de usar el portapapeles para intercambiar información entre Excel y R es que no es necesario usar archivos intermedios ni tampoco la instalación de paquetes adicionales en R. La principal desventaja, aparte del hecho de que requiere que las dos aplicaciones se ejecuten simultáneamente en la misma máquina, estriba en que no es un medio cómodo cuando el volumen de los datos es considerable. Imaginemos las veces que tendríamos que repetir los pasos anteriores para copiar el contenido de una decena de hojas de un libro Excel a una lista de data.frames (además en la práctica podría no ser posible, ya que la cantidad de información que puede copiarse en el portapapeles es limitada). En posteriores entradas explicaré otros métodos más eficientes en este sentido.


Publicado el 26/3/2013

Nuevas funciones en Excel 2013: SERVICIOWEB y FILTROXML

El nuevo Excel 2013 incorpora múltiples opciones nuevas en la interfaz de usuario, pero también hay novedades menos obvias como son el medio centenar de funciones añadidas a la ya extensa biblioteca con que contaba este producto. Muchas de esas nuevas funciones extienden categorías ya existentes: para operar con fechas, manipular textos, etc. También se ha creado una nueva categoría: la de las funciones web.

La función SERVICIOWEB permite recuperar en una celdilla información ofrecida por un servicio web. Toma como único parámetro el URL completo, incluyendo los parámetros que pudiesen necesitarse, y al calcularse lo que hace es ponerse en contacto con el servicio, enviando la solicitud facilitada, y almacenar en la celdilla la respuesta que se obtenga. En la imagen inferior puede verse parte del resultado obtenido cuando se usa esta función para acceder a la lista de últimos artículos publicados en el conocido sitio Slashdot.

En principio esto podría no parecer excesivamente interesante para un usuario de Excel. Alojar un documento XML completo en una celdilla no es precisamente la vía más cómoda para interpretar la información que contiene. Aquí es donde entra en escena la función FILTROXML, también nueva en Excel 2013. Su objetivo es tomar un documento XML, haya sido obtenido con SERVICIOWEB o no, y extraer la información obtenida a partir de una consulta XPath. XPath es un sencillo lenguaje de consulta. Puedes encontrar una introducción rápida al mismo en W3Schools.com.

FILTROXML es una función de tipo matricial. Esto significa que no devuelve un único resultado sino un conjunto de resultados. Por ello no se introduce individualmente en una celdilla, sino en un rango de celdillas que es preciso seleccionar de antemano. Una vez marcado el rango, escribimos la fórmula y pulsamos Control-Mayúsculas-Intro para introducir cada uno de los resultados en una celdilla del rango.

Asumiendo que tenemos en una celdilla de la hoja de cálculo el resultado antes devuelto por la función SERVICIOWEB, podríamos usar la expresión XPath //item/title para obtener el título de todas las entradas y colocarlo en las celdillas del rango seleccionado, como se ve en la imagen siguiente.

De manera similar podríamos obtener el enlace que nos llevaría a la noticia correspondiente a cada título, cambiando la consulta XPath anterior por //item/link. El resultado podríamos colocarlo una columna más a la derecha, de forma que cada título tuviese a continuación el enlace que le corresponde. De esta forma sería muy sencillo unir ambos datos, con la función HIPERVINCULO, para tener en la hoja de cálculo una lista de títulos que, a su vez, son enlaces que abrirían la entrada completa. Es lo que se ha hecho en la imagen siguiente.

Las celdillas en las que se han usado las funciones SERVICIOWEB y FILTROXML podrían trasladarse a otra hoja del mismo libro, dejando en la hoja con la que trabajaría el usuario solamente la lista de hipervínculos. Esta se actualizaría automáticamente al recalcular el libro o bien a demanda, pulsando F9, de forma que popdemos tener siempre la lista de últimas noticias sin necesidad de abandonar Excel y abrir el navegador web. Obviamente este es solo un ejemplo demostrativo, las aplicaciones prácticas de la obtención de información desde un servicio web y extracción de datos concretos son mucho más interesantes que la inserción de un feed en una hoja de cálculo.


Publicado el 15/2/2013

Libros: SQL Server, Windows 8, Windows Server 2012

Manual avanzado Windows Server 2012 Windows 8 registro y configuración Manual imprescindible SQL Server 2012

Desde el pasado verano de 2012 he estado inmerso en la redacción de varios libros (aún continúo en ello), una tarea que me absorbe casi por completo hasta el punto de andar bastante desaparecido de las redes sociales y también de este sitio.

Algunos de esos libros ya han llegado a las librerías. Desde octubre está disponible el Manual imprescindible de SQL Server 2012, dedicado a la última versión del RDBMS de Microsoft. En noviembre apareció el Manual imprescindible de Windows 8, registro y configuración, un libro que va más allá de la mera introducción al nuevo sistema operativo de Microsoft para equipos de sobremesa y portátiles, adentrándose en en los procedimientos de personalización, configuración y automatización. Ya en enero, hace apenas una semana, ha visto la luz el Manual avanzado de Windows Server 2012, en el que trato muchas de las novedades más interesantes de este sistema operativo para servidores, con un enfoque especialmente dirigido a pequeñas y medianas empresas.

En la sección Libros puedes encontrar, como es habitual, información adicional sobre cada uno de estos libros, incluyendo el índice de contenidos completo, número de páginas y precio.

En las próximas semanas Anaya Multimedia irá lanzando algunos títulos más que ya he terminado, dedicados a la actualización y el mantenimiento de ordenadores o el lenguaje Visual Basic 2012, y me encuentro trabajando en este momento con Excel 2013. El resultado estará disponible en breve.


Publicado el 21/1/2013

Código del libro Programación con Delphi 5

De vez en cuando recibo por correo electrónico consultas de lectores que me sorprenden, no por el hecho en sí de que un lector me plantee alguna cuestión, que es algo que sucede con bastante frecuencia, sino cuando compruebo que libros que escribí hace mucho tiempo siguen siendo útiles a alguien.

Este es el caso de una persona que hace unos días me pedía el código fuente del libro Programación con Delphi 5, ya que había perdido el CD que incluía este libro que se publicó hace más de 12 años y que lleva una década descatalogado. He añadido a la ficha del libro un enlace a un archivo comprimido en el que está el código fuente de todos los ejercicios desarrollados a lo largo de sus casi 1200 páginas, a fin de que esté al alcance no solamente de este lector sino de cualquier otro interesado.


Publicado el 14/12/2012

Configuración de un cluster con Ubuntu y SGE

Los centros de cálculo utilizados por corporaciones empresariales, centros de investigación e instituciones similares utilizan desde hace años la configuración en cluster como alternativa al más tradicional mainframe, conectando un gran número de nodos entre sí para poder ofrecer así una potencia de cálculo igual o superior a la que se tendría con un big iron. Las personas que necesitan trabajar con este tipo de configuraciones lo hacen normalmente de forma remota o bien a través de un nodo que actúa como cabecera del cluster, facilitando las operaciones de supervisión y administración.

Actualmente cualquier persona con unos conocimientos algo por encima de lo que podría considerar "básico" puede montarse su propio cluster en casa, aunque personalmente creo que esta posibilidad tiene especial interés para los programadores. Seguramente muchos preguntarán "¿para qué quiero yo un cluster en casa?". Cualquiera que necesite ejecutar tareas con una alta demanda de potencia de proceso, programas que pueden emplear horas, días o semanas trabajando con unos datos para generar resultados, pueden beneficiarse de este tipo de configuración dividiendo la tarea original en otras más pequeñas (siguiendo la máxima del divide y vencerás) que pueden ser ejecutadas en paralelo en varias máquinas. Más allá de la utilidad práctica e inmediata, no obstante, para los que siempre buscamos aprender y experimentar sencillamente no es necesario buscar una respuesta a la anterior pregunta. Si puedo hacerlo, ¿por qué no voy a hacerlo? 8-)

Para poder configurar un cluster necesitamos utilizar, lógicamente, una combinación de hardware y software, a saber:

  • Ordenadores: Dos o más máquinas que actuarán como nodos del cluster. No es necesario que sean equipos muy potentes, en mi caso he usado cuatro máquinas que tenía con poco uso, portátiles antiguos con entre 2 y 4 Gbytes de memoria RAM. Dado que la idea es mantenerlos en funcionamiento ininterrumpido durante mucho tiempo, cuanto más reducido sea su consumo menor será también el gasto energético, de ahí mi elección de usar ordenadores portátiles con poca potencia.
  • Conmutador: Las máquinas del cluster necesitarán comunicarse continuamente y precisan para ello un canal de alta velocidad, de forma que las máquinas no tengan que estar esperando para poder acceder a datos compartidos o recibir comandos. En este entorno doméstico lo ideal es utilizar un conmutador o switch de tipo Gigabit Ethernet, con su correspondiente cable a cada máquina.
  • SAI: Si realmente vamos a usar el cluster para ejecutar procesos de cierta importancia, no solamente como experimentación, nos vendrá bien contar con un sistema de alimentación que evite la caída en caso de un corte eléctrico momentáneo.
  • Sistema operativo: Todas las máquinas del cluster ejecutarán el mismo sistema operativo, normalmente con una configuración idéntica para así evitar fallos de compatibilidad y poder ejecutar un mismo programa en cualquiera de los nodos sin ningún problema. Aunque podrían uitlizarse otros, la mejor opción para montar un cluster en la actualidad es GNU/Linux. En mi caso he utilizado Ubuntu.
  • Sistema de supervisión y gestión del cluster: Sobre el sistema operativo será necesario agregar el software que facilite la supervisión del cluster y su administración, de forma que la carga de trabajo pendiente se distribuya de manera automática entre las máquinas disponibles. Hay varias opciones a nuestra disposición, entre las que yo he optado por SGE (Sun Grid Engine) simplemente porque es un software que conozco al haberlo usado en los clusters de varias universidades.

La instalación del hardware no requiere ningún comentario adicional: basta con conectar los equipos a la fuente de alimentación, por una parte, y al conmutador Ethernet que les permitirá comunicarse, por otra. A la hora de configurar el software, por el contrario, sí es necesario tener en cuenta algunos detalles importantes.

Configuración del sistema operativo

No voy a entrar aquí en el proceso de instalación de Ubuntu en los ordenadores, es realmente sencillo y en la web hay disponible infinidad de información al respecto. Sí es importante, como indiqué antes, que se instale la misma versión y para la misma arquitectura (x86 o x64) en todas los nodos para así evitar posteriores problemas de configuración. En cuanto a la configuración IP, aunque podría usarse DHCP aconsejo que se asigne a cada máquina una dirección IP fija y que se utilice el mismo archivo /etc/hosts en todas ellas para facilitar la comunicación.

De los nodos que componen el cluster uno ha de operar como coordinador (maestro), supervisando la carga de trabajo de los demás y decidiendo cómo se distribuye la cola de tareas pendientes. Esta máquina será también la que ofrezca el almacenamiento compartido en disco del cluster, haciendo así posible que todas las máquinas operen con el mismo programa y sobre los mismos datos sin necesidad de copiarlos en cada una de ellas. Si este nodo maestro es una máquina poco potente y con escasa memoria puede dedicarse exclusivamente a esta tarea, pero de lo contrario puede tener una personalidad dual: actuando como nodo maestro del cluster pero también como nodo de ejecución. El resto de las máquinas del cluster serán únicamente nodos de ejecución.

En el nodo maestro crearemos el directorio que alojará los programas y datos a usar en el cluster. Para que el resto de nodos tengan acceso a ellos habremos de dar los pasos siguientes:

  • Instalar nfs-kernel-server y portmap en el nodo maestro. Agregar al archivo /etc/exports el directorio creado antes y ejecutar exportfs -a
  • Instalar en los demás nodos nfs-common, crear el directorio donde queremos montar el espacio compartido y montarlo con sudo mount IP_maestro:/directorio_compartido directorio_montaje. En la captura inferior aparte de montar el espacio compartido se ha hecho una prueba, comprobando que estaba vacío, a continuación creando un archivo de texto desde un nodo y comprobando desde otro que podía accederse al mismo.
  • Para evitar tener que ejecutar los comandos de exportación (nodo maestro) y montaje (nodos de ejecución) tras cada reinicio podemos actualizar el archivo /etc/fstab de cada máquina.
Instalación y configuración de SGE

Completada la configuración del sistema llega el momento de instalar SGE, el software que se encargará de la gestión y administración de colas de trabajo en el cluster. En el nodo maestro ejecutaremos sudo apt-get install gridengine-master gridengine-qmon gridengine-common gridengine-client gridengine-exec, en el resto de nodos el comando a usar será sudo apt-get install gridengine-client gridengine-exec. Durante la instalación aparecerán cuadros de diálogo como el de la imagen siguiente solicitando algunos datos. Dejamos los valores propuestos por defecto salvo para el nombre de la máquina maestra que, como es lógico, será el del nodo configurado con ese perfil.

Tras reiniciar las máquinas, a fin de poner en marcha los demonios encargados de los servicios de SGE, llega el momento de configurar el cluster desde un punto de vista lógico. Para ello, en el nodo maestro, ejecutaremos sudo qmon y usaremos las siguientes opciones de este programa:

  • Host Configuration: Para establecer el nombre del nodo maestro y los nodos de ejecución.
  • User Configuration: Definiendo los usuarios que podrán enviar trabajos al cluster.
  • Queue Control: Estableciendo las colas de trabajo que existirán y las máquinas asociadas.

En un cluster pequeño, como el propuesto, lo normal es que tengamos una sola cola y que estén vinculadas a ella todos los nodos. De esta manera los usuarios podrán enviar sus ejecuciones a dicha cola y SGE se encargará de distribuir el trabajo entre todas las máquinas. Cuando se trabaja con un cluster de mayor tamaño es habitual contar con varias colas, por ejemplo dependiendo de la cantidad de memoria o la potencia de proceso de las máquinas, agrupándolas de forma que los trabajos se envíen a los nodos más adecuados a cada necesidad.

La guía de usuario de Grid Engine de Oracle ofrece una introducción al uso de este software y detalla el uso de qmon y otras utilidades.

Ejecución de tareas

Una vez que el cluster esté en funcionamiento llega el momento de aprovecharlo. Los trabajos se lanzarán siempre desde el nodo maestro, indicándole mediante un script el nombre del trabajo, la cola a que debe enviarse y el programa que es necesario ejecutar. Dicho guión se facilita a SGE mediante el comando qsub. Un ejemplo de guión podría ser el siguiente:

Podemos crear tantos script como necesitemos y enviarlos uno tras otro con qsub a la cola de ejecución. También existe la posibilidad de que un mismo guión genere una lista o array de tareas. En cualquier caso, tras enviar los trabajos podemos comprobar su estado mediante el comando qstat que, entre otras cosas, mostrará cuáles de nuestras tareas están ejecutándose, indicando en qué máquinas, y cuáles están aun en espera. Con el comando qhost se obtiene información sobre el estado de los nodos: carga de trabajo de cada una, memoria en uso y disponible, etc. En la wiki How to Use Sun Grid Engine podemos encontrar información sobre esos y otros muchos comandos de SGE. Obviamente también podemos consultar la documentación que se instala con dicho software.

Lógicamente SGE cuenta con muchos otros comandos, hay más parámetros de configuración y multitud de detalles relativos a la preparación de scripts de ejecución de tareas, pero sobre todo ello es fácil encontrar información en la web una vez que se sabe qué es lo que hay que buscar. La finalidad de este artículo ha sido esbozar el procedimiento general y facilitar algunas referencias útiles que permitan a cualquiera montar su propio cluster.


Publicado el 19/9/2012

Iniciar Windows 8 en el escritorio clásico en lugar de la pantalla Inicio

Windows 8 aun no está disponible para el público en general, pero en las últimas dos semanas ya han podido probar la versión definitiva del nuevo sistema operativo de Microsoft los suscriptores a TechNet, MSDN y DreamSpark, entre otros. Incluso hay una versión de evaluación que nos permite probar la edición Enterprise durante 90 días.

En este breve periodo de tiempo son muchos los usuarios que se muestran descontentos con la nueva interfaz de usuario y, sobre todo, el hecho de que al iniciar sesión nos encontremos con la denominada pantalla Inicio en lugar del escritorio clásico. Tanto es así que han comenzado a proliferar pequeños programas que fuerzan a Windows 8 a iniciarse en el escritorio, así como ciertos trucos, algo rebuscados y con condicionantes, que persiguen el mismo efecto.

Personalmente no me desagrada que al iniciar Windows 8 aparezca la mencionada pantalla Inicio, si bien es cierto que la mayoría del software que utilizo a diario en la actualidad se ejecuta sobre el escritorio clásico. Basta con usar el atajo Win+D y ahí está el escritorio, hay pocas cosas más simples. No obstante he buscado la manera de automatizar esa operación. Generalmente en cuanto cambio al escritorio lo primero que hago es abrir el Explorador de archivos, ¿por qué no ejecutar automáticamente ese programa al iniciar sesión?

Estando en la pantalla Inicio escribo programar tarea y elijo la única opción que aparece como resultado de la búsqueda para abrir el Programador de tareas. En una rama en la que tengo mis tareas programadas abro el menú contextual y elijo Crear tarea básica:

Tras asignar un nombre a la tarea (y una descripción si se quiere) llego al paso en el que hay que elegir el desencadenador que ejecutará la tarea. Elijo Al iniciar sesión:

En el paso siguiente del asistente se elige la tarea a realizar cuando se detecte el evento desencadenante. En este caso la opción será Iniciar un programa:

Podemos ejecutar cualquier programa o script, estableciendo la carpeta en la que deberá iniciarse y los parámetros adicionales. En este caso basta con introducir explorer.exe:

En el último paso del asistente revisamos que todos los parámetros sean correctos y creamos la tarea haciendo clic en Finalizar.

He probado este método en dos máquinas distintas, cerrando e iniciando sesión varias veces, y el resultado siempre es el mismo: la pantalla Inicio no llega a aparecer, en su lugar se muestra en primer plano el Explorador de archivos sobre un fondo uniforme y, pasado 1 ó 2 segundos (supongo que dependerá de la velocidad de cada sistema), aparece el fondo del escritorio y la barra de tareas.

El programador de tareas es un componente básico de Windows que siempre está en funcionamiento, teóricamente no es posible desactivarlo, por lo que la tarea definida debería ejecutarse en cada inicio de sesión. En cualquier caso, tras realizar estas pruebas, eliminaré esta tarea programada para seguir accediendo a la pantalla Inicio. Sobre gustos …


Publicado el 28/8/2012

Bases de datos independientes en SQL Server 2012

Como muchos otros RDBMS, Microsoft SQL Server cuenta con una base de datos de sistema en el que almacena parámetros generales no asociados a una base de datos concreta sino al propio servidor de datos: el idioma predeterminado, las cuentas de usuario, la meta-información que describe los objetos de cada base de datos, etc.

Esa configuración compartida crea una dependencia en las bases de datos respecto del servidor en que han sido generadas, lo cual añade algunas dificultades para su traslado a otro servidor. Es algo a lo que nos enfrentamos habitualmente cuando se quiere mover una solución desde el servidor en el que ha estado desarrollándose al que se utilizará definitivamente en explotación. En muchos casos se escoge la vía de regenerar en el nuevo servidor todos los objetos de la base de datos original mediante la ejecución de un guión (script).

Entre las novedades que incorpora SQL Server 2012 encontramos una que, al menos en parte, facilita esa operación de traslación entre servidores. Su nombre: bases de datos parcialmente independientes. La idea básica: almacenar en la propia base de datos la información de configuración que le afecta, en lugar de llevarla a la base de datos del sistema. Concretamente se conservarán en la base de datos la meta-información que describe su estructura, un conjunto de parámetros de configuración asociados al idioma y también los usuarios que pueden trabajar con ella.

Por defecto las bases de datos parcialmente independientes están deshabilitadas en una nueva instalación de SQL Server 2012. Para activar su uso tendremos que:

  • Abrir el Management Studio, la herramienta de administración fundamental de SQL Server 2012.
  • Seleccionar el nodo asociado al servidor y hacer clic sobre él con el botón secundario del ratón.
  • Elegir la opción Propiedades para abrir una ventana con ese mismo nombre.
  • Abrir la página Avanzado y localizar la sección Contención.
  • Desplegar la lista asociada a la opción Habilitar bases de datos independientes y cambiar su valor de False a True.

Estando habilitada esta característica, cada vez que creemos una nueva base de datos podremos elegir en la opción Tipo de contención de su página Opciones el elemento Parcial. Esto creará una base de datos parcialmente independiente conteniendo, como se ha indicado antes, la información que la describe y otros parámetros asociados. Parte de ellos podrán personalizarse en la sección Contención de esa misma página de parámetros.

El paso siguiente sería crear las cuentas de los usuarios con acceso a la nueva base de datos. En lugar de emplear las cuentas integradas de Windows, lo cual haría depender la base de datos de la máquina en que está ejecutándose en ese momento, optaremos por crear cuentas de tipo Usuario SQL con contraseña, facilitando un nombre y una contraseña en lugar de simplemente escoger entre las cuentas existentes en el sistema.

Al conectar con una base de datos independiente será necesario cambiar el tipo de autenticación por defecto en la página Inicio de sesión del Management Studio, eligiendo Autenticación de SQL Server. Esto nos permitirá introducir las credenciales de una de las cuentas creadas en el paso previo, almacenadas en la base de datos, en lugar de usar una cuenta de usuario de Windows. El resultado será que podremos trabajar con la base de datos incluso después de haberla llevado a un nuevo servidor, a pesar de que en éste no existan las mismas cuentas de usuario y la configuración de idioma sea distinta.


Publicado el 15/8/2012

Configuración avanzada de la apariencia en Windows 8

A pesar de que en Windows Vista y Windows 7 la introducción de los denominados Temas visuales ha permitido a los usuarios ajustar la apariciencia del sistema según sus preferencias, somos muchos los que, habiendo utilizado el sistema operativo de Microsoft desde hace muchos años, seguimos recurriendo a la opción Configuración avanzada de la apariencia... para ajustar manualmente los atributos de cada elemento individual de la interfaz.

En Windows 7 encontramos dicha opción en la ventana Color y apariencia de las ventanas (véase imagen inferior) y da paso a un cuadro de diálogo (siguiente imagen debajo de la anterior) que prácticamente no ha cambiado en la última década y que los más experimentados reconocerán de inmediato.

La interfaz de Windows 8 pone el acento en la simplicidad y sencillez de uso. Hay una nueva aplicación Metro con el título Configuración, se abre con la opción Configuración>Cambiar configuración de PC del panel de accesos o Charms (anclado al margen derecho de la pantalla), que centraliza los parámetros de ajuste más usuales y con la que poco podemos cambiar de la apariencia, más allá de las imágenes de fondo. El Panel de control de toda la vida sigue estando ahí, por lo que podemos abrirlo y seguir cambiando los parámetros que necesitemos.

En realidad la anterior es una verdad a medias en algunos casos. En la imagen inferior puede verse cómo la ventana Color y apariencia de las ventanas se ha simplificado al extremo, no existiendo opción alguna que nos permita acceder al cuadro de diálogo mencionado anteriormente. Esto es algo que descubrí ayer a raíz de una consulta que me realizaron por Twitter.

La primera solución que se me ocurrió fue abrir el registro y buscar la sección en la que se almacenan estos parámetros avanzados de apariencia en Windows 7. La respuesta: HKCU\Control Panel\Desktop\WindowMetrics. El contenido de esta clave es prácticamente idéntico en Windows 7 y Windows 8 Release Preview, por lo que es fácil suponer que los parámetros avanzados siguen utilizándose a pesar de que no haya un cuadro de diálogo como el de Windows 7 que permita modificarlos fácilmente.

La interpretación de los valores no resulta sencilla a menos que uno esté acostumbrado a trabajar con números hexadecimales, algo habitual entre los programadores. No obstante, cualquier usuario de Windows 7 puede tomar la configuración que tenga en su sistema actual exportando esa clave del registro a un archivo y, a continuación, importándola en el nuevo Windows 8. Es un método que funciona, pero cabe preguntarse si hay alguna vía más fácil.

Dado que lo que tenemos en este momento es una Release Preview de Windows 8, podría pensarse que el cuadro de diálogo de marras sigue estando en el sistema pero, sencillamente, Microsoft por el momento no ofrece opción alguna para abrirlo. ¿Seguirá estando en el mismo sitio que en Windows 7? Cuando en esta versión del sistema utilizamos la opción Configuración avanzada de la apariencia… lo que hace Windows es ejecutar lo siguiente:

Incluso en sistemas de 64 bits se utilizan Rundll32 para abrir la DLL Shell32.dll, encargada de ejecutar el código de Desk.cpl, una aplicación del Panel de control, con los parámetros que indican que ha de abrirse el modo avanzado del cuadro de diálogo.

Si en Windows 8 ejecutamos ese mismo comando sencillamente se abre la ventana de personalización de colores mostrada más arriba. Esto me hace sospechar que realmente el cuadro de diálogo de ajustes avanzados ha desaparecido en esta Release Preview, no está sencillamente oculto. En mi opinión esto reduce las probabilidades de que en la versión final de Windows 8 dicha opción esté presente, por lo que habría que quedarse con la manipulación del registro como única alternativa. Cuando podamos probar la RTM saldremos de dudas.


Publicado el 26/7/2012

Introducción a Yahoo! Pipes

La empresa precursora de la catalogación de contenidos en Internet, Yahoo!, te ofrece un servicio gratuito con el cual podrás construir elaborados resultados a partir de uno o más feeds RSS, Atom o RDF. Actualmente la práctica totalidad de los sitios web que se renuevan con cierta frecuencia, como los que ofrecen noticias de actualidad, las bitácoras y las de muchas empresas, disponen de un servicio que facilita los nuevos contenidos, en versión completa o abreviada, en los formatos RSS, Atom o RDF. De esta forma es posible obtenerlos de manera agregada, con aplicaciones específicas, sin necesidad de visitar cada una de las páginas de forma individual. El resultado es un ahorro de tiempo y la obtención de los contenidos que interesan o, al menos, que proceden de los sitios que interesan. Es habitual que mediante nuestro lector RSS estemos suscritos a múltiples feeds de diferentes temas que nos interesen, obteniendo la suma de contenidos de todos ellos. Con Yahoo! Pipes es posible ir un paso más allá, siendo la agregación de contenidos solamente una de sus posibilidades. Lo más interesante son los filtros y el hecho de que el resultado obtenido de una fuente puede ser utilizado para buscar contenidos en otra.

Yahoo! Pipes es una aplicación tipo AJAX, lo que significa que solamente necesitarás de tu navegador para ejecutarla. Basta con introducir el URL http://pipes.yahoo.com e iniciar sesión, utilizando para ello las credenciales de Yahoo! si cuentas con ellas. Tendrás un usuario y una contraseña si, por ejemplo, utilizas Yahoo! Groups. De lo contrario, no tienes más que registrarte en ese mismo momento, es un proceso gratuito, sencillo y rápido.

La aplicación consta funcionalmente de dos partes bien diferenciadas: un diseñador de Pipes, que aprenderás a utilizar si lees el resto de este artículo, y un motor que ejecuta esas Pipes para ofrecerte el resultado que generen. Una Pipe es una tubería, de ahí que hagamos referencia a ellas en femenino.

El diseñador facilita la construcción de las Pipes a partir de una serie de componentes prefabricados, que irás colocando sobre una superficie y conectando entre sí mediante la técnica de arrastrar y soltar. Cada componente tiene una finalidad concreta: recuperar el contenido de una fuente, ordenar las entradas, unir entradas de varios feeds, traducir los contenidos, filtrarlos, etc.

La ejecución de una Pipe llevará a cabo todas las tareas establecidas en el diseño, generando un resultado que será el que se muestre en el navegador. En el sitio de Yahoo! Pipes hay infinidad de diseños hechos por otros usuarios, diseños que pueden ser tanto ejecutados como clonados para crear otros a partir de ellos, modificándolos o ampliándolos.

Para ejecutar una Pipe no tendrás más que elegirla, de la lista que se ofrece en el propio sitio antes indicado, como harías clic en cualquier hipervínculo. La ejecución del diseñador, por el contrario, exige que nuestro navegador tenga unas ciertas características. Si utilizas Mozilla Firefox o Internet Explorer 7 o posterior no tendrás ningún problema, pero algunas antiguas versiones de navegadores, como Opera, no son capaces de ejecutar correctamente esta aplicación AJAX o, dicho de otra forma, la aplicación no está diseñada para funcionar adecuadamente en ese navegador.

Lo primero que debes hacer, por tanto, es abrir tu navegador, ir a Yahoo! Pipes, hacer clic en el enlace Sign in que está en la parte superior derecha de la página e introducir tu nombre de usuario y contraseña para iniciar sesión. A partir de este momento ya puedes tanto examinar diseños de otros usuarios como crear los tuyos propios. Estos últimos estarán siempre accesibles en el apartado My Pipes.

Tuberías y aplicaciones

El concepto de tubería o (pipe) procede del sistema operativo UNIX. La denominación procede de la analogía clara entre un canal de comunicación, que envía los resultados que produce un programa hasta la entrada de otro, y una tubería que conecta esos mismos dos elementos, trasladando lo que sale de uno hasta otro. Ese proceso puede repetirse, de forma que la salida del segundo programa puede ser a su vez, mediante otra tubería, utilizada como entrada por un tercer programa.

Yahoo! Pipes traslada este mecanismo de comunicación entre procesos a la web, pero básicamente no hay diferencias respecto al funcionamiento de una serie de programas conectados entre sí mediante tuberías. La diferencia más obvia es que no es necesario utilizar una línea de comandos para escribir los nombres de los programas y conectarlos, porque esta tarea se efectúa visualmente desde el diseñador de Pipes.

Un comando Unix como cat temp1 temp2 | sort -n | head -5, asumiendo que los archivos temp1 y temp2 almacenan temperaturas de dos días de un cierto lugar, daría como resultado las cinco temperaturas más bajas. El comando se compone de tres partes conectadas entre sí mediante el símbolo de tubería de Unix, de forma que la salida de cat se lleva hasta sort y la de este programa hasta head.

Noticias arcaicas

Una vez que tienes una idea general de cómo funciona Pipes, lo que más te interesará será aprender a utilizar esta aplicación para hacer tus propios diseños. Comenzarás con un caso bastante sencillo, en el que vas a agregar las noticias de dos sitios que visitas habitualmente para obtenerlas combinadamente en una misma página. A continuación, en pasos posteriores, aprenderás a establecer el orden en que aparecen las entradas resultantes y a filtrarlas.

Los sitios seleccionados están relacionados con la paleontología, evolución y temas similares. Lo primero que tienes que hacer es ir a esas páginas, o cualesquiera otras que visites con asiduidad, y localizar el enlace que te facilita el feed de noticias en formato RSS, Atom o RDF. Anota el URL, para utilizarlo después en Pipes, o bien cópialo al portapapeles y de esta forma podrás pegarlo directamente cuando lo necesites.

A continuación inicia sesión en Yahoo! Pipes, haz clic en el enlace My Pipes y a continuación selecciona la opción Create a pipe. Si es la primera vez que utilizas Pipes posiblemente el diseñador te invitará a que veas cómo están construidos algunos ejemplos, todos ellos en inglés. Haz clic en el botón OK que hay en la parte inferior de la ventana de bienvenida, de esta forma te encontrarás ante el editor de Pipes.

El editor de Pipes

El núcleo de Yahoo! Pipes lo forma el editor o diseñador que facilita la composición y manipulación de los flujos de contenidos. Este editor, como se aprecia en la figura inferior, divide el espacio de trabajo en varios paneles. En la parte superior se disponen dos grupos de botones que facilitan tareas que irás conociendo poco a poco.

El panel de la izquierda contiene los distintos módulos o componentes que puedes usar en los diseños, agrupados según su funcionalidad. El grupo abierto por defecto es Sources, en el que se encuentran los módulos encargados de obtener los contenidos desde Yahoo! Search, Google, Flickr o cualquier otro lugar que te interese. La parte inferior de este mismo panel contendrá una descripción del módulo que se encuentre seleccionado en el editor.

La zona central del editor, que muestra el mensaje drag modules here, será tu superficie de trabajo. Sobre ella irás colocando los módulos, moviéndolos a donde te interese y estableciendo las conexiones adecuadas entre ellos.

Debajo de la superficie del diseñador está el área de depuración, en la que aparecerán mensajes diversos a medida que trabajes sobre el proyecto. Al probar la Pipe, por ejemplo, en esta zona se indicará el número de entradas recuperadas y sus títulos.

Fíjate en que los distintos paneles del editor están separados entre sí por unos bordes que puedes ajustar según necesites, ampliando o reduciendo el espacio asignado a cada zona. Por regla general, especialmente cuando tus diseños empiecen a ser de cierta complejidad, siempre necesitarás el mayor espacio posible en la superficie de trabajo, para poder ir colocando los módulos y conectándolos entre sí.

Un elemento imprescindible en el diseño de cualquier Pipe será el módulo, o módulos puesto que pueden ser varios, que aporte el contenido sobre el que se trabajará para generar el resultado. Estos módulos se encuentra en el grupo Sources y se caracterizan porque establecen una comunicación con un servidor remoto, efectúan una solicitud y almacenan la respuesta obtenida para su posterior tratamiento.

De los módulos de contenido existentes cuatro de ellos son de carácter específico, en el sentido de que están preconfigurados para trabajar sobre un cierto servicio: Yahoo! Search, Yahoo! Local, Google Base y Flickr. Con ellos es posible efectuar una búsqueda en la web, localizar viviendas, trabajos o imágenes, respectivamente. Estos módulos, al ser introducidos en un diseño, solicitan directamente el tipo de bien que quiere localizarse, la distancia a la que debe encontrarse de un punto, el número de imágenes a obtener, etc. Muchos de esos datos se pueden introducir manualmente, en los recuadros de texto dispuestos a tal fin, o bien se recuperados de otros módulos.

Recuperación de las entradas

Partiendo de la superficie vacía que se obtiene al iniciar un nuevo proyecto, lo primero que vas a hacer es recuperar las entradas de las bitácoras en que estás interesado. Para ello recurrirás al módulo Fetch que, a diferencia de los restantes del grupo Sources, es de tipo genérico, por lo que permite obtener contenidos de cualquier fuente. Haz clic sobre el botón Fetch para agregar el módulo al diseño.

Los componentes de Pipes aparecen como pequeñas ventanas flotantes sobre la superficie de trabajo, con un título y sus botones para minimizar y cerrar. Puedes colocarlos donde quieras sencillamente arrastrándolos, como harías con cualquier ventana. Observa que al mismo tiempo que el módulo Fetch ha aparecido otro llamado Pipe Output. Éste será el encargado de recoger los resultados del diseño y enviarlos al navegador.

En principio el módulo Fetch tiene un apartado en el que puede introducirse el URL del que se obtendrán las entradas. Según se indicó antes, puedes copiarlo en el portapapeles desde la página original y pegarlo aquí. Puesto que te interesa recuperar noticias de dos sitios, tendrás que hacer clic en el botón que muestra un icono con el signo +, a la izquierda del título URL, para añadir un nuevo URL. Repite la operación para añadir tantas fuentes como quieras.

Conexión de los módulos

En este momento tu diseño se compone de dos módulos, uno que recupera los contenidos y otro que es el encargado de enviar el resultado al navegador, pero no existe conexión alguna entre ellos. Si ejecutases la Pipe en este momento, por tanto, no obtendrías nada.

Todos los módulos de Yahoo! Pipes cuentan con uno o más puntos de conexión, en unas ocasiones de entrada, situados en la parte superior, y en otros de salida, colocados en la parte inferior de la ventana que representa al módulo. Hay otros conectores, de menor tamaño, que aparecen en el interior de las ventanas y que hacen posible que campos como el URL del que se obtendrán los contenidos, que ahora has escrito manualmente, puedan ser obtenidos de otros módulos.

La conexión entre dos módulos cualesquiera, o para ser más exactos entre dos conectores, se lleva a cabo mediante la técnica de arrastrar y soltar. En este caso puedes colocar el puntero del ratón sobre el conector que hay en la parte inferior del módulo Fetch, pulsar el botón principal y, sin soltarlo, desplazar el puntero hasta el conector de Pipe Output. Dicho conector aparecerá como iluminado al acercar el puntero del ratón. Al soltar verás cómo se establece la conexión.

Con los pasos dados hasta ahora ya tienes completado tu diseño, no hay más que guardarlo y comprobar que, en efecto, genera el resultado que buscabas. Haz clic en el botón Save que hay en la parte superior derecha del editor. Verás aparecer una ventana flotante en la que se solicita el nombre de la nueva Pipe, escríbelo y haz clic de nuevo en Save. Tu diseño ya está guardado.

El nombre que hayas dado a tu proyecto aparecerá ahora como título de la página actual del editor, en sustitución del anterior untitled. Además, a la derecha de esa pestaña ahora verás que se muestra un enlace con el título Pipe Preview. Utilízalo para ver el resultado que genera esta Pipe. Deberías ver una página en la que aparece el título de la Pipe, una serie de opciones, el diseño simplificado en el margen izquierdo y los contenidos recuperados. Desde esta página puedes modificar el diseño, utilizarlo como base para otros, publicarlo para que puedan acceder al mismo otros usuarios, etc.

Filtros y operadores

En este primer diseño te has limitado a tomar contenidos de dos o más sitios y obtenerlos conjuntamente en una página propia, algo sencillo pero que ya te ahorrará el tener que visitar individualmente cada uno de esos sitios. Yahoo! Pipes, sin embargo, puede hacer mucho más por ti. El conjunto posiblemente más potente de módulos que ofrece Yahoo! Pipes se encuentra en el grupo Operators, con componentes que permiten ordenar las entradas, unir entradas de varios módulos fuente, eliminar los elementos repetidos, filtrar las entradas para bloquear o permitir las que cumplan ciertos criterios, traducir las entradas a otros idiomas, etc.

Aunque puedes partir de un nuevo diseño para probar algunos de estos módulos, en los pasos siguientes continuaremos con el proyecto anterior, sobre el que efectuaremos cambios discretos para adecuar el resultado que genera. Concretamente vas a establecer el orden en que deben aparecer las entradas, así como a establecer un filtro que elimine aquellas que traten temas que no te interesan.

Los filtros de Yahoo! Pipes, como los de Unix, son pequeños programas que actúan a modo de embudos o máquinas de transformación. Sobre un filtro se vuelca un contenido, que puede proceder de cualquier otro módulo, sobre el que va a trabajarse para producir una salida o resultado. El trabajo puede consistir en cambiar el orden de las entradas, eliminar aquellas en las que se encuentra un cierto texto, modificar el propio contenido de las entradas, etc.

En ocasiones dichos programas no son tan pequeños. El módulo BabelFish, por ejemplo, es capaz de traducir la entrada que se le facilite entre decenas de idiomas, generando un resultado que se puede enviar directamente al módulo de salida o bien ser procesado con anterioridad en otros módulos.

En el apartado Documentation de Yahoo! Pipes, concretamente en el URL http://pipes.yahoo.com/docs/modules, puedes encontrar una descripción detallada de cada uno de los módulos que puedes usar.

Puesto que vas a cambiar la Pipe que habías creado anteriormente, deberás volver a abrirla en el editor de Yahoo! Pipes. También puedes optar por clonar dicho diseño y crear otro nuevo a partir de él. Una opción más, interesante cuando los proyectos comienzan a ser complejos, consiste en utilizar como un módulo más, Pipes que se hayan creado con anterioridad. De todas estas opciones, en nuestro caso vamos a optar por la modificación directa dada la extrema sencillez del diseño.

A fin de ordenar y filtrar las entradas que se recuperen mediante el módulo Fetch, será necesario interrumpir la conexión directa que hay entre dicho módulo y el Pipe Output. De lo contrario no podrías intercalar otros módulos entre ellos. Para cortar una conexión haz clic sobre uno de los conectores, da igual que sea un extremo u otro de la tubería. Verás que aparece un icono con el dibujo de unas tijeras. Haz clic sobre él y la conexión desaparecerá.

Cambiar el orden de las entradas

Según que el flujo de entradas obtenido mediante módulos como Fetch proceda de una fuente RSS, Atom o RDF, cada entrada constará de unos ciertos campos entre los que suelen encontrarse el título, la fecha de publicación, una descripción o un hipervínculo asociado. Los valores de cualquiera de esos campos pueden ser utilizados para cambiar el orden de las entradas o bien para filtrarlas.

El módulo encargado de ordenar las entradas es Sort y, como el resto de operadores de Yahoo! Pipes, lo puedes encontrar en el grupo Operators. Haz clic sobre este componente y colócalo en tu diseño, entre el módulo Fetch y el módulo Pipe Output, estableciendo las conexiones adecuadas para que los contenidos recuperados por el primero pasen por Sort y de éste vayan a la salida.

Una vez establecida la conexión, en la lista de la izquierda del módulo Sort aparecerán los campos por lo que es posible ordenar. No tienes más que abrirla y seleccionar el que te interese. En la lista de la derecha puedes elegir entre un orden ascendente, de menor a mayor, o bien descendente, de mayor a menor.

En caso de que te interese, puedes ordenar el flujo de entradas por más de un campo. Para ello haz clic en el icono que hay a la izquierda de Sort by y verás cómo aparece una segunda fila con las mismas dos listas que acabamos de explicarte. De esta forma es posible, por ejemplo, ordenar las entradas por fecha y, dentro de cada fecha, alfabéticamente por título.

Filtrado de las entradas

Por regla general no siempre te interesarán todas las noticias procedentes de un cierto sitio, aunque la temática de éste sí te guste. Es más, puede darse el caso de que ciertos contenidos concretos no te interesen lo más mínimo, por lo que podrías ahorrar tiempo si se eliminasen durante el proceso llevado a cabo por Pipes. Para ello no hay más que agregar un filtro y definir las reglas apropiadas.

El modulo que necesitas en este caso es Filter, que puedes colocar antes o después de ordenar las entradas obtenidas con Fetch. Si lo pones antes, de forma que la salida de Fetch vaya a Filter y la de éste a Sort, eliminarás lo que no te interesa antes de proceder a ordenar las entradas, por lo que será necesario menos tiempo para efectuar la ordenación.

Un filtro consta de una o más reglas que determinarán qué entradas se permiten o se bloquean. En la primera lista del módulo Filter tendrás que elegir entre Block: bloquear las entradas, o Permit: permitir las entradas, que cumplan los criterios que definirás a continuación. Suponiendo que no quieras obtener en los resultados las entradas en cuyo título se haga referencia a un cierto tema, elige el elemento Block.

En la lista items that match tendrás que elegir entre all o any. Si eliges all se eliminarán aquellas entradas para las que se cumplan todas las reglas indicadas debajo. De esta forma podrías, por ejemplo, bloquear las noticias que contengan una cierta palabra en el título y, además, la fecha sea anterior a una dada. Con la opción any se eliminaría la entrada en el momento en que se cumpla cualquiera de las reglas, en dicho ejemplo cuando contuviese el término en el título, fuese anterior a la fecha indicada o ambas.

Cada regla se compone de uno de los campos con que cuentan las entradas, un operador y un valor de referencia. El operador puede comprobar si el campo contiene o no contiene un cierto texto, si su valor es superior o inferior a un valor determinado o incluso utilizar una expresión regular. En la imagen puedes ver cómo se ha configurado el módulo Filter para evitar las noticias que contengan en su título el término diseño inteligente.

Hechos todos estos cambios, no tienes más que volver a guardar el diseño y ejecutar la Pipe para comprobar el resultado.

Además de módulos para recuperar contenidos de distintas fuentes y para filtrar dichas entradas, Yahoo! Pipes cuenta con muchos otros como podrás ver en el panel izquierdo del diseñador.

Los componentes del grupo User inputs permiten solicitar por teclado, antes de iniciar la recuperación de contenidos, la introducción de un número, un texto, una fecha o un URL, datos que pueden ser utilizados a continuación para, por ejemplo, componer un URL de búsqueda mediante el módulo URLBuilder. De esta forma la Pipe no genera siempre el mismo resultado, sino que éste dependerá de los datos introducidos por el usuario.

El módulo String Concatenate, en el grupo String, facilita la concatenación de cadenas, mientras que Date Formatter se encarga de convertir fechas en datos textuales.

El equipo de Yahoo! Pipes sigue trabajando en el desarrollo de otros módulos, de hecho el producto actualmente (en el momento en que se escribió este artículo) se encuentra en fase de beta. Recientemente se ha añadido el módulo Regex para la evaluación de expresiones regulares. Posiblemente cuando hagas tus primeros diseños con Yahoo! Pipes ya existan módulos adicionales a los mencionados en este artículo.


Publicado el 5/10/2011

Histórico
Curso de shaders

Torre de Babel - Francisco Charte Ojeda - Desde 1997 en la Web