Guardar notas y subrayados de Kindle

El dispositivo Kindle permite subrayar textos de los libros y adicionalmente escribir notas y establecer marcadores. Los mismos se almacenan en un archivo de texto plano llamado “Mis recortes.txt” o “My clippings.txt”, dentro del directorio “documents”. El formato en que se encuentran los datos si bien es claro, no permite organizarlos de manera simple fuera del dispositivo ni consultarlos posteriormente. Por otro lado, si bien podemos hacer un respaldo de este archivo, no podemos hacerlo de manera incremental.

Hace tiempo descubrí el sitio Clippings.io que brinda una interfaz muy cómoda para trabajar con los subrayados, marcadores y anotaciones de Kindle. Les enseño cómo:

  1. Acceder a https://www.clippings.io/
  2. Iniciar sesión
  3. Pueden crearse una cuenta gratuita si lo poseen una
  4. Presionar “Import”
  5. Presionar “Click to upload”
  6. Conectar el Kindle a la computadora
  7. Seleccionar el archivo “Mis recortes.txt” o “My clippings.txt”, dentro del directorio “documents”.
  8. Cerrar con Close, el mensaje que indica la cantidad de registros agregados

Nos encontramos entonces con todos los registros y podemos realizar las siguientes acciones sobre cada uno:

  • Marcarlo como favorito
  • Modificarlo
  • Agregar una nota
  • Borrarlo
  • Agregarle etiquetas

Todo esto permite luego aplicar filtros y hacer búsquedas, de manera que contemos con toda esta información organizada y lista para ser consultada.

Para finalizar, podemos exportar a planillas de cálculo Excel, PDF, archivos de texto plano y documentos de Word con cierto grado de configuración. Si también tenemos cuenta en Evernote, podemos integrarlas para generar notas a partir de los registros en Clippings.io

Anuncios

Exportar todo el contenido de una MediaWiki en HTML

Necesitaba poder tener todas las páginas de una MediaWiki en formato HTML en un directorio, con sus imágenes, para poder usarlo como un respaldo navegable del estado actual de esa wiki. Encontré la extensión DumpHTML y la implementé tal como se indica:

  1. Descargar el archivo tar.gz de la extensión para la versión de MediaWiki instalada
  2. Descomprimir su contenido en el directorio extensions

Exportar el contenido

La acción se realiza desde la línea de comandos, ejecutando:

php <MEDIAWIKI_PATH>/extensions/DumpHTML/dumpHTML.php -d <DESTINATION_DIR> --image-snapshot

lo que dejará en el directorio DESTINATION_DIR todo el contenido listo para ser navegado.

  • El parámetro –image-snapshot, asegura la copia de las imágenes subidas

Configuraciones

Se pueden indicar otros parámetros para

  • -k <SKIN>: utilizar un skin en particular. El contenido respaldado apunta dicho skin en la wiki , por lo que requiere que esté en funcionamiento y sea accesible para que el skin sea visualizado correctamente.
    • Si no se especifica o bien si se indica el skin “offline”, se utiliza un skin básico disponible dentro del contenido respaldado.
  • –munge-title <ALGORITHM>: utilizar un algoritmo para transformar los nombres de páginas y archivos cuando contienen caracteres no soportados por el entorno desde el que se accederá al contenido.
    • md5: se transforman los nombres a partir de aplicarles MD5 (útil si existen caracteres UTF8)
    • windows: se quitan los caracteres no soportados en nombres de archivos en Windows ( /\*?”<>| )

Inconvenientes

No pude hacer que se exporte el thumbnail de cada imagen, que se visualizan en la página de la imagen.

En la versión 1.19 de MediaWiki me sucedieron 2 cosas:

En la primer ejecución, obtuve el error "Default users are not allowed to read, please specify (--group=sysop)". Pude solucionarlo agregando a la invocación

--group=user

Había realizado la exportación indicando el skin monobook, pero no se visualizaba correctamente y pude observar que se intentaban obtener los estilos desde "http://localhost/load.php?...". Pude solucionarlo estableciendo la url de la wiki en una variable de configuración de LocalSettings.php:

$wgServer = 'http://www.dominio-wiki.com';

y volviendo a exportar para que se apuntara correctamente al skin.

Respaldar preferencias y datos de la sesión de Firefox en Windows

Me sucede cada cierto tiempo que debido a un reinicio espontáneo del equipo, un corte de luz o un cuelgue de Firefox, se pieden o bien las preferencias del navegador o bien los datos de la sesión: principalmente las pestañas abiertas y los grupos de pestañas!

Como me gusta Firefox y quiero seguir usándolo, busqué la forma de respaldar esta información y poder recuperarla en caso de fallo. A continuación les presento el contenido del script para realizar esta tarea (tomando como base un script de respaldo en Windows), el cual pueden programar para que se ejecute por ejemplo en cada inicio de sesión en Windows.

Obs: Debemos conocer la ubicación del perfil de Firefox para poder avanzar.

Estructura del script

@echo off
for /f "tokens=1-3 delims=/- " %%a in ('date /t') do set FECHA=%%c%%b%%a
for /f "tokens=1-2 delims=: " %%a in ('time /t') do set HORA=%%a%%b

copy <PATH_FIREFOX_PROFILE>\sessionstore.js <PATH_BACKUP>\sessionstore-%FECHA%-%HORA%.bak
copy <PATH_FIREFOX_PROFILE>\pref.js <PATH_BACKUP>\sessionstore-%FECHA%-%HORA%.bak

Entonces tendremos en PATH_BACKUP una copia de los archivos sessionstore.js (datos de la sesión) y pref.js (preferencias) del perfil de Firefox, renombrados con extensión bak y con la fecha y hora en que se copiaron.

Para no tener que ir cada cierto tiempo a eliminar las copias viejas, podemos hacer que el script lo haga automáticamente borrando los archivos .bak de más de N días desde su última modificación, agregando al final:

forfiles /P <PATH_BACKUP> /M *.bak /D -<N> /C "cmd /c del @path"

Donde N indica la cantidad de días previos a la fecha actual, lo cual determina una fecha tope. Se seleccionan los archivos cuya fecha de última modificación sea menor o igual a esa fecha tope.

Atención: Si el script no se ejecuta por mucho tiempo es posible que eliminemos las únicas copias de las que disponemos!

Ejemplo:

@echo off
for /f "tokens=1-3 delims=/- " %%a in ('date /t') do set FECHA=%%c%%b%%a
for /f "tokens=1-2 delims=: " %%a in ('time /t') do set HORA=%%a%%b

copy C:\Profiles\Firefox\q7v2je1d.default\sessionstore.js <PATH_BACKUP>\sessionstore-%FECHA%-%HORA%.bak
copy C:\Profiles\Firefox\q7v2je1d.default\pref.js D:\firefox_backups\sessionstore-%FECHA%-%HORA%.bak

forfiles /p D:\firefox_backups\ /M *.bak /D -90 /C "cmd /c del @path"

De esta forma cada vez que se ejecute el script estaremos respaldando las preferencias e información de la sesión de Firefox y automáticamente borrando los archivos copiados de más de 90 días (cada par ocupa menos de 350 Kb.)

Obtener el dump de una base de datos MySQL

Ya sea para mover el contenido de una base de datos de un lugar a otro como para generar un respaldo de la misma, es necesario obtener un dump que contenga tanto la estructura como los datos.

Para ello, desde la línea de comandos (recuerden que pueden agregar la ruta del ejecutable mysqldump a la variable Path en Windows):

mysqldump -u <USUARIO> -p [<OPCIONES>] <NOMBRE_DB> > dump.sql

a continuación se nos solicitará la clave de dicho usuario:

Enter password: ********

De esa manera obtendremos el conjunto de sentencias SQL que permitirán a futuro la restitución del contenido mediante la importación del dump a una base de datos Mysql

Opciones

Las opciones que se utilizan por defecto más importantes se detallan a continuación. Les recomiendo que cuando indiquen omitir una característica lo recomendable es agregar la opción al final de la lista para asegurarse que se aplica y no es revertida por otra opción que se indique después.

--comments, -i

Registrar información adicional como la versión del programa, el servidor y el host.

Omitir con --skip-comments.

--set-charset

Agrega la sentencia SET NAMES <default_charset>.

Omitir con --skip-set-charset.

--quote-names, -Q

Poner entre comillas los identificadores (nombres) entre backticks (`) o comillas dobles (“).

Omitir con --skip-quote-names.

--tz-utc

Permite que los campos TIMESTAMP se guarden y recuperen entre servidores con diferentes zonas horarias, estableciendo el timezone de la conexión a UTC y agregando la sentencia SET TIME_ZONE=’+00:00′ al dump. De lo contrario, se usarían las zonas horarias del servidor origen y destino en cada operación, lo que modificaría los valores si fueran distintas.

Omitir con --skip-tz-utc.

--triggers

Incluye los triggers. Tener cuidado si se restituye en un servidor que no soporta múltiples triggers por evento, cuando se hayan dado el caso al generar el dump.

Omitir con --skip-triggers

--opt

Es la combinación de las siguientes opciones:

--add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset

Omitir con --skip-opt.

--add-drop-table

Agrega la sentencia DROP TABLE antes de cada sentencia CREATE TABLE.

--add-locks

Encierra el dump de cada tabla entre sentencias LOCK TABLES y UNLOCK TABLES

+ La restitución es más rápida.

--create-options

Incluye las opciones de tabla específicas de Mysql en las sentencias CREATE TABLE. (No pude encontrar precisamente cuáles son)

--disable-keys, -K

Encierra las sentencias INSERT de cada taba con sentencias /*!40000 ALTER TABLE tbl_name DISABLE KEYS */; y /*!40000 ALTER TABLE tbl_name ENABLE KEYS */;

+ Acelera la importación dado que los índices se crean luego de que todas las filas se insertan (solo para índices que no sean UNIQUE de tablas MyISAM).

--extended-insert, -e

Utiliza BULK INSERT (una sentencia con múltiples listas en VALUES) en lugar de una sentencia INSERT por cada registro.

+ El dump es más chico y las inserciones se hacen más rápido (considerar el valor de la variable max_allowed_packet)

--quick, -q

Fuerza a que obtengan de a una las filas de cada tabla en lugar de traelas todas juntas y procesarlas en memoria, antes de escribir el dump.

+ Útil para las bases de datos grandes

--lock-tables, -l

Bloquea todas las tablas de cada base de datos a la vez antes de hacer el dump. Utiliza un READ LOCAL para permitir inserciones concurrentes en tablas MyISAM. Para tablas transaccionales como InnoDB es mejor usar --single-transaction ya que no requiere bloquear las tablas.

Omitir con --skip-lock-tables.

Hacer un script de respaldo de archivos en Windows

Para poder respaldar todo el contenido de un directorio en un archivo dentro de otra unidad, disco o directorio, podemos crear un script de línea de comandos:

Crear el archivo ejecutable

  1. Abrir un editor de textos de nuestra preferencia (puede ser el Bloc de notas)
  2. Escribir los comandos para realizar cada una de las acciones deseadas
  3. Guardar el archivo con extensión .bat (ejemplo: respaldo.bat)

Desactivar el “eco” de los comandos

Cuando se ejecuta cada uno de los comandos, los mismos se repiten en la línea de comandos por defecto. Para evitar esto debemos comenzar el script con:

@echo off

Obtener la fecha y hora de ejecución

En las variables FECHA y HORA almacenamos sendos datos:

for /f "tokens=1-3 delims=/- " %%a in ('date /t') do set FECHA=%%c%%b%%a
for /f "tokens=1-2 delims=: " %%a in ('time /t') do set HORA=%%a%%b

Generar nombre del archivo de respaldo

Con la fecha y la hora, generamos un nombre de archivo  y lo almacenamos en la variable BACKUP_FILE

set BACKUP_FILE=Contenido_%FECHA%%HORA%.zip

Comprimir los datos

En esta parte se puede utilizar cualquier aplicación que permita comprimir por línea de comandos. Yo les propongo que usen 7zip que es gratuito. Tenemos que especificar la ubicación del archivo de respaldo primero y luego el directorio con el contenido a respaldar:

7zip.exe a -tzip "c:/backups/BACKUP_FILE" "c:/Contenido/"

Registrar log

El registro de log es opcional, pero si vamos a planificar la ejecución del script es conveniente registrarla para poder consultar después si se realizó o no correctamente.

Establecemos el nombre y la ubicación del log relativo a la ubicación en que se encuentre el script de backup. Les propongo generar un log por día y no por ejecución:

set BACKUP_LOG_FILE=logs/Contenido_%FECHA%.log

Al principio del script indicamos el inicio del respaldo con la fecha y hora:

echo. >> %BACKUP_LOG_FILE%
echo Inicia respaldo >> %BACKUP_LOG_FILE%
echo %FECHA% %HORA% >> %BACKUP_LOG_FILE%

Modificamos la línea donde hacemos la compresión para que los resultados de la misma vayan al log

7zip.exe .... >> %BACKUP_LOG_FILE%

Al final del script indicamos el fin del respaldo con la fecha, hora y el archivo de log generado:

echo. >> %BACKUP_LOG_FILE%
echo Fin respaldo >> %BACKUP_LOG_FILE%
echo %FECHA% %HORA% >> %BACKUP_LOG_FILE%
echo Log file: %BACKUP_LOG_FILE%

OBS: El comando “echo.” solamente guarda en el log una línea vacía.

Programar ejecución

Teniendo el script, cada vez que lo ejecutemos, se generará un backup (y un log si así lo decidimos). Para que este backup se ejecute automáticamente hay que programar la ejecución del script en Windows o en Linux.

Script completo

Les dejo el contenido del script completo para que lo puedan copiar y usar como base para generarse el propio:

@echo off

for /f "tokens=1-3 delims=/- " %%a in ('date /t') do set FECHA=%%c%%b%%a
for /f "tokens=1-2 delims=: " %%a in ('time /t') do set HORA=%%a%%b

set BACKUP_FILE=Contenido_%FECHA%%HORA%.zip
set BACKUP_LOG_FILE=logs/Contenido_%FECHA%.log

echo. >> %BACKUP_LOG_FILE%
echo Inicia respaldo >> %BACKUP_LOG_FILE%
echo %FECHA% %HORA% >> %BACKUP_LOG_FILE%

7zip.exe a -tzip "c:/backups/BACKUP_FILE" "c:/Contenido/" >> %BACKUP_LOG_FILE%

echo. >> %BACKUP_LOG_FILE%
echo Fin respaldo >> %BACKUP_LOG_FILE%
echo %FECHA% %HORA% >> %BACKUP_LOG_FILE%
echo Log file: %BACKUP_LOG_FILE%