sábado, 19 de octubre de 2019

Yahoo! Groups desaparecerá en unos días. ¡Descárgate tus grupos!

Tal y como suena: un desastre.

Yahoo! Groups ha sido durante más de dos décadas (no olvidemos que comenzó como un servicio llamado Onelist que Yahoo adquirió tras su fusión con eGroups) un punto de encuentro de miles de personas que, mucho antes de que las famosas redes sociales lo inundasen todo, compartían interminables e interesantes charlas que podían indistintamente leerse vía web o usando nuestro email estándar.

Ahora, tras 23 años, un pedazo de historia de Internet (y por tanto del conocimiento universal) va a desaparecer para siempre: Yahoo! (actualmente propiedad de Verizon) ha anunciado que antes de final de año será eliminado todo el contenido acumulado en Yahoo! Groups desde la era de Onelist. Esto incluye todos los mensajes, links, adjuntos y las útiles secciones de archivos que cada grupo albergaba.

El calendario parece que es el siguiente: desde el próximo 28 de octubre (¡eso es dentro de diez días!) ya no se podrá subir nuevo contenido. El 14 de diciembre, todo el contenido será eliminado. Para colmo, Yahoo! parece que no provee ningún mecanismo tan fantástico como el que tienen las cuentas de Google para descargar selectivamente todo lo que nos interese, algo que vino muy bien cuando eliminaron la versión de consumo de Google+.

Pero, tranquilidad. Hay solución.

Bueno, o algo parecido. Por desgracia, Yahoo! no ha publicado nunca una API para el producto Yahoo! Groups, lo que significa que no hay demasiadas herramientas que puedan automatizadamente explotar los datos almacenados en los distintos grupos. Las (escasas) utilidades disponibles se conectan consumiendo la propia UI web lo que, además de mucho más difícil de implementar, es menos eficiente y menos tolerante a cambios en el producto.

A pesar de todo, hemos seleccionado algunas opciones que pueden dar una solución (parcial) al inminente problema (e incomprensible tragedia).

Opción 1: descargar tus datos desde la cuenta Verizon/Yahoo!

Cuando antes dijimos que no se puede hacer una descarga masiva al estilo de las cuentas de Google, no dijimos toda la verdad. Si bien en esencia es cierto que no podemos rescatar toda la valiosa información de los grupos, podemos al menos rescatar el material propio, es decir, aquellos mensajes redactados por nosotros o aquellos archivos que hubiésemos subido.

Para ello basta con ir al panel de control de la cuenta Yahoo! en https://yahoo.mydashboard.oath.com (nos pedirá iniciar sesión) y buscar, abajo del todo, la opción "Solicitar una descarga":

para a continuación marcar el producto que necesitamos:


Tras confirmar la dirección de email en el siguiente paso, se nos enviará un link (puede tardar horas o días según el tamaño) desde el que podremos descargar un archivo comprimido con el material.

Sin embargo, esta funcionalidad se nos antoja insuficiente, especialmente si somos administradores de algún grupo y no queremos que se pierda nada (algunos grupos son realmente valiosas fuentes de información que hoy en día no se encuentra en ningún otro rincón de Internet), ya que el contenido que descargamos directamente de Yahoo! es exclusivamente el que hayamos generado nosotros mismos (que es en muchos casos el menos interesante).

Por este motivo, proponemos una 

Opción 2: usar el script "yahoo-groups-backup "

Esta opción permite descargar localmente mucho más material: todos los mensajes (tanto propios como ajenos) así como todos los archivos subidos al grupo. Sigue sin ser una solución perfecta, ya que no parece descargar el apartado de links ni el de fotos, pero al menos permite rescatar el grueso de la información relevante.

Sin embargo, no va a ser un camino de rosas: esta aplicación es de esos programas que encanta desarrollar a los informáticos nerd fanáticos del Python y de Linux con una absoluta carencia de empatía con el usuario final.

El script, que podía haberse desarrollado de una manera mucho más sencilla tecnológicamente plantea de entrada unos requisitos previos de software bastante pomposos, así como una usabilidad anti-usuario (valga la contradicción) que obliga a realizar todas las operaciones en modo consola y no permite fácilmente administrar el material descargado.

Paso 1: instalamos Python

Si tu ordenador es un Mac, casi que puedes saltarte este paso porque lo más probable es que Python venga ya instalado en tu versión de macOS. En caso de ser cualquier otro sistema "tipo-Unix" dependerá de qué distribución se trate pero, es muy probable que también venga preinstalado o que baste con invocar a tu gestor de paquetes favorito (por ejemplo apt-get install python3.7 para distribuciones basadas en Debian, o lo propio con Yum para distribuciones basadas en RedHat).

En caso de Windows, basta con descargarse la versión instalable del siguiente enlace:


y seguir los pasos de la instalación por defecto. Debemos asegurarnos que la variable de entorno PATH queda correctamente actualizada con la ruta de los binarios.

Paso 2: instalamos MongoDB

Cuando antes dije que esta aplicación era absolutamente user-unfriendly me refería a cosas como esta. Para hacer un cliente web que descargue unos datos, tener que requerir Python y hasta una instancia local de MongoDB me parece desproporcionado y que rompe por completo con la norma de usar siempre la mínima complejidad necesaria al diseñar una solución software. Pero el problema es que la forma de hacer las cosas actual (y de esto la consultoría tiene mucho de culpa, de eso hablaremos otro día) es así de horrible.

Al grano: sí, lo habéis leído bien. Hay que instalar localmente MongoDB (¿para cuándo un icono facepalm en Blogger, señores de Google?). Podéis descargarla de aquí y seguir los pasos de instalación (recomiendo no complicarse la vida y hacer una "full install"):


Paso 3: descargamos el driver usado por el script


Este driver (usado mediante Selenium tal y como en los tests automatizados típicos de un desarrollo con filosofía devops hace las veces de cliente web "headless" del cual extraer, a través de manipulación del DOM, la información que queremos (recordemos que no hay una API al uso de Yahoo! Groups). En este caso la instalación consiste en copiar el ejecutable a cualquier ruta que esté en la variable de entorno PATH. En el caso de Windows, una manera sencilla es copiarlo a la propia carpeta de instalación de Python ya que probablemente no le vais a dar ningún otro uso.

Lo podéis descargar de aquí:


Paso 4: instalamos el script "yahoo-groups-backup"

El script original se ha quedado desfasado y tenía varios bugs que lo hacen inservible para nuestros propósitos. Por eso vamos a utilizar un fork creado a partir del original que soluciona algunos problemas. Lo podemos encontrar en https://github.com/hrenfroe/yahoo-groups-backup y podemos descargarlo con cliente Git o bien descargar el archivo zip y descomprimirlo a algún lugar del disco duro. Importante: el subdirectorio donde descomprimamos el script, para evitar potenciales problemas, debería tener permisos de escritura para todos los usuarios.

Una vez descomprimido, y asumiendo que ya está instalado Python, hay que entrar desde el intérprete de comandos de vuestra elección al subdirectorio del script y ejecutar lo siguiente para su instalación:

pip install -r requirements.txt

Esto provocará que se instalen las dependencias necesarias en Python para que el programa funcione.

También necesitamos editar el archivo settings.yaml.template para configurar las credenciales de acceso de nuestra cuenta de Yahoo! con la que accederemos a los grupos:

        login: micuenta@yahoo.es
        password: mipassword

Paso 5: descargamos un grupo

Ya con todo configurado, solo queda empezar a descargar material (recordemos, solo mensajes y archivos, pues el script no soporta otros elementos como la lista de links del grupo).

Para ello tenemos que ejecutar desde dentro del mismo subdirectorio donde esté el script, el siguiente comando:

./yahoo-groups-backup.py scrape_messages --driver chrome nombre_grupo

si estamos en sistemas tipo Unix, o bien lo siguiente en caso de Windows:

yahoo-groups-backup.py scrape_messages --driver chrome nombre_grupo 

Breve explicación: el primer comando es obviamente el script. El parámetro scrape_messages es para indicar que queremos descargar todos los mensajes. Se puede sustituir por scrape_files si lo que queremos es descargar los archivos alojados en el grupo. Obviamente el parámetro nombre_grupo es el nombre o identificador que el grupo tiene dentro del producto de Yahoo! Groups.

Consideraciones finales


Parece ser que el script tiene algunos problemas (algunos derivados del driver Chromium para Selenium). Iremos actualizando la entrada con aquellos issues y las soluciones que vayan apareciendo. También podéis compartirlas en los comentarios.







jueves, 27 de septiembre de 2018

¿Tú también odias las pestañas del nuevo Google Chrome? Lee esto

Hace ahora 10 años, Google lanzó el que pronto se convertiría en el navegador más usado del mundo, logrando lo que parecía imposible que es desbancar al todo poderoso (y nada estándar) Internet Explorer de Microsoft; un navegador que nació defectuoso y cuyo único mérito fue formar parte del sistema operativo Windows a partir de su versión 95.

Hasta la llegada de Chrome, vimos desfilar variados navegadores que arraigaron más (Netscape, Firefox) o menos (Opera) y que mejoraban las deficiencias de Internet Explorer de uno u otro modo. Chrome sin embargo llegó para mejorar de un plumazo las deficiencias de todos los anteriormente citados y además ofrecer un vertiginoso motor Javascript escrito íntegramente en lenguaje ensamblador y que se convertiría en la piedra angular del nuevo paradigma web.

Una de las cosas que me gustó más en su momento y que lo diferenciaba de otros navegadores era su estética y el diseño de sus pestañas con forma trapezoidal. Por entonces la alternativa era el malogrado Firefox pero cuyo aspecto visual dañaba la retina.

Actualización ¿innecesaria?

Pero si has llegado hasta aquí es porque precisamente te molesta el aspecto que tiene el nuevo Google Chrome tras la última actualización, en la que incomprensiblemente se vuelve al aspecto precámbrico que caracteriza a Firefox:


Por suerte para ti y para mí los desarrolladores de Google han dejado una puerta trasera para configurar el aspecto de los tabs.

Para ello solo hay que abrir dentro de Chrome el siguiente enlace interno:


que nos dará acceso a la pantalla de configuración interna del navegador donde podemos "trucarlo" con cientos de opciones ocultas. En la barra de búsqueda de arriba buscad el texto "UI Layout" y aparecerá la siguiente configuración:



La opción default es la que viene ahora seleccionada por defecto y que muestra esas pestañas tan espantosas. Si deseamos volver a nuestras queridas pestañas de Chrome, basta con seleccionar Normal y reabrir el navegador, y.... et voilà!



Los otros valores del desplegable permiten acceder a variantes de los estilos enfocadas en dispositivos táctiles, convertibles, etc. ¡Pruébalas!

miércoles, 24 de febrero de 2016

Algoritmo para búsquedas con comodines (wildcards)

Recientemente andaba yo enredado en un proyecto personal de poca trascendencia pero que me obligó a hacer una implementación completa de un sistema de archivos FAT a bajo nivel.

La FAT es un sistema de archivos muy simple para los estándares de hoy y la implementación fue muy fácil y rápida.

Sin embargo, en el proyecto además se necesitaba agregar algunas funciones típicas de sistemas operativos de sabor Microsoft, entre ellas la habitual búsqueda por comodines o wildcard. Pues esto, que parece una tontería, me tuvo filosofando para su implementación más tiempo que casi el resto de la implementación.

Se me ocurrieron diferentes acercamientos al problema de interpretar una cadena cualquiera que usase el comodín asterisco (*) para sustituir una subcadena cualquiera y el interrogante (?) para sustituir cualquier carácter coincidente en esa posición. Pensé en aplicar mis oxidados conocimientos de autómatas y lenguajes, o también una simple rutina al estilo amateur a base de recorrer las cadenas con un bucle e ir contando caracteres e intentando cuadrarlo todo usando código spaghetti.

Pero finalmente opté por la implementación más sencilla y elegante, si bien no la más eficiente: convertir los viejos comodines de tipo DOS a expresiones regulares de las que hoy en día se usan para todo. Cualquier lenguaje de programación moderno permite el uso de regex cuyo parseo es transparente para el programador.

sábado, 14 de noviembre de 2015

Ejecución de aplicaciones antiguas en Windows 7 y 10

En un acto de torpeza premeditada de Microsoft (otro más), las nuevas versiones de Windows, desde la 7 en adelante, no soportan correctamente ciertas aplicaciones antiguas. Algo que ya sabíamos.

Sin embargo, muchas de ellas no han dejado de funcionar debido a las notorias diferencias de arquitectura entre Windows 98/NT/2000/XP, sino simplemente a que ellos lo han decidido así, eliminando bibliotecas esenciales como la MSVBVM50.DLL, la MSVBVM6.DLL, etc. que no son más que los run-times necesarios para aplicaciones escritas en Visual Basic anterior a la era .NET.

Aunque parezca increíble, existen comercialmente muchas aplicaciones escritas en dicho lenguaje y aún más en compañías que hacen desarrollo de software para uso interno.

Para colmo, la descarga en Internet de dichos archivos se ha vuelto cada vez más difícil y arriesgada; Microsoft ha eliminado dicho contenido online (si probáis el enlace de la MSVBVM50 os llevará a una página en blanco) y el resto de opciones son descargas de webs que intentan instalarte algún sypware o algún otro software comercial haciéndote creer que estás descargando lo que buscabas.

miércoles, 11 de noviembre de 2015

X-Files y Poltergeists. Cuando Windows está maldito

Hace poco me encontraba con uno de esos problemas de resolución aparentemente imposible en una máquina Windows Server 2008 de 64 bits.

En ocasiones, la información y soporte que Microsoft dan al respecto son tremendamente pobres y a veces incluso dicha información es confusa o inexacta.

Tal fue el asunto que me tuvo ocupado con la susodicha máquina hasta casi el borde de la desesperación. Sin pistas, sin ningún otro caso descrito similar en ningún foro, la cosa pintaba mal. Sería el típico caso en que la mayoría de administradores de sistemas habrían optado por reinstalar todo el sistema operativo. Pero en mi caso, eso no era una opción.

De hecho, nunca me ha parecido una opción. Reiniciar o reinstalar vendría a suponer, en la analogía de un médico, amputar una pierna porque no se esforzó lo suficiente en encontrar la causa que le provoca el dolor al paciente.

Así que vamos allá. La solución fue usar la fuerza bruta en un modo en el que se pueden solucionar otras muchas complicaciones en Windows. 

jueves, 17 de julio de 2014

Problema firmando el GDB (The GNU Project Debugger) en Mac OS X

Buenas tardes,

andábame yo inmerso en un fantástico proyecto cross-platform desarrollado en Lazarus (el famoso clon del mítico Delphi, que ya por fin funciona y es usable) cuando se me ocurrió probar el tema de las múltiples plataformas instalando el IDE en el Mac.

La instalación de Lazarus  es sencilla en principio (como cualquier otra aplicación de Mac). El problema es que hace falta tener instaladas las "command-line tools" y parece ser que en Xcode 5.0 no es tan trivial como parece.

Pues bien, el principal problema es que hay que instalar el debugger de GNU (es decir, la herramienta gdb) y hay que firmarla con un certificado.

Siguiendo las guías oficiales me encontré con algunos escollos que no estaban bien aclarados, y que una vez resueltos, comparto con todo el mundo por si os ocurre también. Las guías en cuestión son:


y


Podéis seguir sin problema paso a paso ambos manuales. Pero al llegar a la parte de cómo crear un certificado y cómo firmar el ejecutable del debugger, hay que tener en cuenta dos detalles que no se dicen:

Para poder crear el certificado con el asistente siguiendo los mismos pasos, antes tenéis que desbloquear la opción de crear certificados de tipo system. Si no, simplemente no os saldrán las opciones correctas en el asistente (sólo unas parecidas) y estaréis perdidos al intentar seguir los pasos del manual. Para ello tenéis que desbloquear la herramienta de acceso a las claves y certificados:



Una vez realizado ese paso ya podéis usar el asistente para la creación del certificado exactamente en los mismos términos que explica la guía.

Si todo ha salido bien, el siguiente paso es firmar el ejecutable gdb siguiendo los pasos de la guía. Esos pasos son correctos y hay que seguirlos. Sin embargo, no se nos avisa de que para que Lazarus reconozca al ejecutable del debugger como un programa firmado, hay que, o bien reiniciar el sistema (innecesario y exagerado) o bien escribir el siguiente comando en la terminal (como root):

killall taskgated

Tras esto, volved a abrir Lazarus y ya debería dejaros compilar y debuguear sin problemas.


jueves, 14 de marzo de 2013

Creación de un Virtual Appliance para control de Internet con VMware (parte 4)

<< Artículo anterior

Continuamos esta serie de artículos sobre el "appliance virtual" basado en Squid. Ahora ha llegado el turno de la integración con redes y dominios basados en Windows y en Active Directory. El primer paso a seguir es instalar SAMBA en nuestro FreeBSD.

Como en otras ocasiones ejecutamos sysinstall y buscamos la instalación del paquete adecuado:

Configure → Packages → net → samba34-3.4.9_1

(Obviamente el número de versión del paquete dependerá del resto de versiones de cada instalación).

Necesitamos el siguiente cambio de permisos al archivo de configuración smb.conf para garantizar que el usuario squid (usado para correr el servicio) es capaz de abrir la configuración de Samba:

domingo, 10 de marzo de 2013

"Se busca Cliente Cisco VPN"

He detectado que en ocasiones algunos usuarios del cliente Cisco VPN se quejan de que éste "desaparece" en su versión de Windows.

El síntoma principal es que si abres el icono del cliente (el de forma de candado) o alguno de los atajos a los perfiles (archivos PRF), no se abre la ventana de conexión ni se inicia el proceso, en los respectivos casos.

Normalmente esto se debe a que por alguna razón hay un servicio parado. Pero antes veamos cómo está compuesto el cliente VPN de Cisco.

domingo, 24 de febrero de 2013

Creación de un Virtual Appliance para control de Internet con VMware (parte 3)

<< Artículo anterior

Una vez que tenemos nuestro sistema operativo base, el FreeBSD, montado y actuando como router y firewall básico es el momento de seguir con el siguiente paso: la instalación del proxy-caché, el afamado SQUID. Estamos ante uno de esos productos que, además de ser open-source y gratuitos, son la mejor opción del mercado para realizar sus funciones, por lo que una vez más se demuestra que los productos gratuitos no tienen por qué ser necesariamente inferiores a sus competidores comerciales.

Aunque en el momento de escribir este tutorial, la versión estable en producción es la 3.3, me he basado en la versión 2.7.9, no por nada en especial, simplemente porque es el paquete que venía en la ISO de FreeBSD que teníamos por aquí a mano y que hemos usado de base para el proyecto.

viernes, 22 de febrero de 2013

Creación de un Virtual Appliance para control de Internet con VMware (parte 2)

<< Artículo anterior

En el anterior artículo habíamos sentado las bases sobre el appliance que queremos construir: las funcionalidades, la intrastructura y el software y herramientas necesarias.

El siguiente paso es describir el planteamiento de manera más concreta y comenzar con la instalación básica del sistema operativo base y de los paquetes mínimos necesarios.

La red


Desde el punto de vista de la red local, este esquema representa la filosofía del proyecto:

martes, 19 de febrero de 2013

Creación de un Virtual Appliance para control de Internet con VMware (parte 1)

Esta es la primera entrega de varios artículos que voy a publicar en los próximos días mostrando un caso práctico de creación de un appliance virtual para controlar el acceso a Internet de una compañía usando exclusivamente software gratuito.

La guía que vamos a desarrollar podría perfectamente valer para crear un appliance tradicional basado en un equipo headless cualquiera; además no es necesario un equipo de extremada potencia por lo que es la excusa perfecta para reutilizar cualquier PC al que íbamos a dar matarile. Sin embargo, he escogido el formato de máquina virtual porque así de paso nos aprovechamos de las distintas ventajas de usar una plataforma como VMware para usos que no siempre son tan conocidos o habituales.

lunes, 18 de febrero de 2013

Arranque diferido de servicios en servidores y estaciones Windows

En muchas ocasiones, algunos errores muy comunes en los sistemas operativos de Microsoft se deben a que algunos servicios arrancan de manera asíncrona, pero sin embargo tienen dependencias entre ellos para poder funcionar. Hay veces que dichas dependencias están ya preconfiguradas por defecto (el típico servicio que no puedes pararlo sin parar antes otros cuatro dependientes de él); pero otras veces las dependencias no están incluídas en la configuración de los servicios, y cuando el servicio dependiente se adelanta a su dependencia, empiezan a producirse todo tipo de problemas.

Varios de estos típicos errores suelen darse en los servidores que son controlador de dominio, especialmente cuando el servicio DNS local se retrasa más de la cuenta. Dado que el DNS es parte del corazón de la infraestructura Active Directory, si dicho servicio no está levantado a tiempo afectará a otros servicios y funciones (sobre todo cuando es necesario interrogar al DC acerca de detalles de la infaestructura, resolver nombres internos, etc.).

Reinicio de servicios en ESXi

Aunque la familia de productos VMware es en general extremedamente eficiente y estable, en ocasiones el hipervisor no está exento de comportamientos imprevistos.

En al menos una o dos ocasiones he experimentado problemas que requerían reiniciar la máquina física conteniendo al hipervisor, y cuando se trata de un sistema en el cuál no hay cabina externa de almacenamiento de las máquinas virtuales, ni vMotion, ni otras facilidades para conseguir alta disponibilidad, pues es un problema porque hay que hacer una parada de todos los servidores virtualizados dependientes de ese host.

Problemas de este tipo suelen ser los que tienen síntomas como: