Abrir automáticamente las pestañas de la última sesión en Firefox

Si cada vez que iniciamos Firefox, queremos volver a las pestañas de la sesión previa tenemos 2 opciones:

  • Presionar el botón Restaurar sesión previa, que se muestra en la página de Inicio
  • Abrir el menú Historial y luego seleccionamos la opción Restaurar sesión previa

Para automatizar esta acción procederemos de la siguiente forma:

  1. Abrir Herramientas
  2. Seleccionar Opciones
  3. Elegir la solapa General
  4. En el apartado Inicio, para la opción “Al iniciar Firefox” seleccionar “Mostrar las ventanas y pestañas de la última vez”
  5. Confirmar con “Aceptar”

Adicionalmente esto evita que al cerrar el navegador alerte por el cierre de múltiples pestañas, si está activada esa opción.

Anuncios

Procesar varios archivos por línea de comandos en Windows

Para aplicar un cierto acción a varios archivos desde la línea de comandos de Windows existe la instrucción forfiles.

En Windows 7, la invocación tiene los siguientes parámetros (todos son opcionales):

  • /P <PATH>: ruta sobre la cual buscar los archivos
    • Si no se especifica, se considera el directorio actual
  • /S: se procesan los subdirectorios del path recursivamente
  • /M <PATRON>: patrón de los archivos a considerar, pudiendo indicar nombre y extensión. Por ej: *.log
    • Si no se especifica, se considera *
  • /D  { [+] | – }{ dd/mm/aaaa | N }: selecciona archivos a partir de la fecha de última modificación de cada uno.
    • Si no se especifica el signo -, se considera por defecto +
    • -dd/mm/aaaa: fecha de última modificación anterior o igual a dd/mm/aaaa
    • +dd/mm/aaaa: fecha de última modificación posterior o igual a dd/mm/aaaa
    • -N: fecha de última modificación anterior o igual a la fecha actual menos N días
    • +N: fecha de última modificación posterior o igual a la fecha actual más N días
  • /C “<COMANDO>”: indica la acción a ejecutar sobre cada uno de los archivos que hayan sido seleccionados
    • Si no se especifica, se considera “cmd /c echo @file”
    • Si se desea utilizar un comando de CMD, deben estar precedidos por “cmd /c”
    • Variables disponibles en <COMANDO>
      • @file: nombre del archivo
      • @fname: nombre de archivo sin extensión
      • @ext: extensión del archivo
      • @path: ruta de acceso completa al archivo
      • @relpath: ruta de acceso relativa del archivo
      • @isdir: “TRUE” si es un directorio y “FALSE” si es un archivo
      • @fsize: tamaño del archivo en bytes
      • @fdate: última fecha de modificación del archivo
      • @ftime: última hora de modificación del archivo

 

Ejemplos:

forfiles /P C:\logs /D -20 /C "cmd /c del @path"

Borra los archivos del directorio logs de más 20 días desde su última fecha de modificación

forfiles /C "cmd /c if @isdir==TRUE echo @file"

Imprime por pantalla los directorios que se encuentren en la ruta actual

forfiles /P C:\Documents\ /S /M *.xlsx /C "cmd /c echo @fname - @fdate"

Muestra el nombre y fecha de última modificación de cada uno de los archivos de Excel dentro del directorio de documentos (y subdirectorios)

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.)

Acceder a Plex desde distintos dispositivos y ubicaciones

Si contamos con Plex funcionando en un equipo del hogar, sabemos que puede ser accedido desde otros dispositivos de la red local (LAN), y en ciertos casos de manera remota (Internet), mediante una aplicación instalada en el dispositivo de las provistas por Plex:

  • Plex Mobile App
    • Soporte para iOS, Android, Windows Phone 8, and Windows 8
    • 😦 Tiene costo en cada uno.
  • Plex for connected TVs and streaming devices:
    • Soporte para Chromecast, Roku, Google TV, Smart TVs
    • 😦 Algunas tienen costo.
  • Plex Home Theater on a dedicated computer
    • Soporte para Mac y Windows
    • 😦 No tiene soporte para Linux

Es por eso que existiendo la alternativa de utilizar un simple navegador web es muy buena ya que no nos obliga a instalar nada.

La desventaja es que debemos utilizar la dirección IP del equipo donde se proveen los contenidos. Para contrarrestarla basta definir un dominio de manerla local en cada uno de los dispositivos o bien, en el servidor DNS si es que disponemos de uno en la red local.

Ahora, hay 2 situaciones que pueden molestarnos:

situación 1: no poder acceder desde el exterior (léase Internet)

situación 2: tener que definir el dominio local en cada dispositivo (por no tener DNS local) para las personas en la red local

Para tratar la situación 1, podemos crear una cuenta en Plex, desde donde vinculamos nuestro servidor Plex local y podremos accederlo desde cualquier lugar navegando por la Web. Los pasos son:

  1. Acceder a la instalación local de Plex
  2. Abrir Ajustes (icono arriba a la derecha de una llave inglesa en cruz con un destornillador)
  3. Elegir la solapa Servidor
  4. Seleccionar la opción “Conectar” de las listadas a la derecha
  5. Ingresar los datos de nuestra cuenta en Plex y presionar Ingresar
    • Si no tenemos cuenta podemos crearla ahí mismo seleccionando “Regístrate”
  6. Veremos que indica “Conectado como NOMBRE USUARIO” y “Conectando con el servidor…”. Esperamos unos segundos
  7. Se informa “El servidor está mapeado al puerto xxxxxx”

Solo basta con acceder por web a https://plex.tv/ y al presionar LAUNCH, accederemos a nuestro Plex (Si seleccionamos SERVERS podremos ver los servidores PLEX vinculados con esa cuenta)

Pero esto:

  • no soluciona la situación 2
  • obliga a registrar una cuenta en Plex
  • no permite que personas sin cuenta accedan a mi Plex (y no quiero darles los datos de mi cuenta)

Una propuesta que trata todos estos puntos es la de implementar un proxy reverso con Apache. Recuerden seguir el instructivo para configurar un proxy reverso con Apache, utilizando un dominio externo configurado mediante un DDNS y realizando la redirección de puerto en el router de la LAN. El VirtualHost tendría esta estructura:

<VirtualHost *:<PUERTO_EXTERNO> >
  ServerName <DOMINIO_EXTERNO>

  #Configuracion Proxy Reverso
  ProxyRequests Off
  ProxyPreserveHost Off
  ProxyPass / http://<PLEX_IP>:<PUERTO_PLEX>/
  ProxyPassReverse / http://<PLEX_IP>:<PUERTO_PLEX>/
</VirtualHost>

De esta manera permitiría a cualquier persona que conozca el domino externo acceder a al Plex interno. Adicionalmente la persona debería agregar un /web al final de la URL para acceder correctamente a la interfaz web.

 

La protección mínima que podemos implementar (se podría llegar a utilizar HTTPS) es aplicar una autenticación básica al VirtualHost definido:

  <Location />
    AuthType Basic
    AuthName "Restricted area"
    AuthUserFile <PATH_PASSWORDS>/.htpasswd_plex
    Require valid-user
  <Location />

donde PATH_PASSWORDS es la ubicación donde guardamos el .htpasswd que hayamos creado para el acceso a Plex (similar a proteger un directorio con htaccess).

 

Para evitar que la persona deba escribir /web al final de la URL, podemos implementar una reescritura de la URL cuando corresponda de la siguiente manera:

  1. Activar el módulo rewrite de Apache
    1. En la ubicación donde instalamos Apache, abrir con un editor de textos el archivo: conf\httpd.conf
    2. Descomentar la línea: LoadModule rewrite_module modules/mod_rewrite.so
  2. Agregar al VirtualHost definido:
  RewriteEngine on
  RewriteCond %{REQUEST_URI} !^/web
  RewriteCond %{HTTP:X-Plex-Device} ^$
  RewriteCond %{QUERY_STRING} ^$
  RewriteRule ^/$ /web/$1 [R,L]

Estas directivas agregar /web/ cuando la URL no lo contenga, no sea un dispositivo Plex el que intenta conectarse y el querystring (pares de clave valor después de ?) sea vacío.

 

Estructura completa de VirtualHost

Esta es lstructura completa del VirtualHost para acceder a un Plex de una LAN mediante la implementación de un proxy reverso con Apache, autenticación básica y reescritura de URL para acceder a la interfaz web (sin especificar /web/)

<VirtualHost *:<PUERTO_EXTERNO> >
  ServerName <DOMINIO_EXTERNO>

  #Autenticacion
  <Location />
    AuthType Basic
    AuthName "Restricted area"
    AuthUserFile <PATH_PASSWORDS>/.htpasswd_plex
    Require valid-user
  <Location />

  #Configuracion Proxy Reverso
  ProxyRequests Off
  ProxyPreserveHost Off
  ProxyPass / http://<PLEX_IP>:<PUERTO_PLEX>/
  ProxyPassReverse / http://<PLEX_IP>:<PUERTO_PLEX>/
  
  #Agregar /web/ cuando corresponda
  RewriteEngine on
  RewriteCond %{REQUEST_URI} !^/web
  RewriteCond %{HTTP:X-Plex-Device} ^$
  RewriteCond %{QUERY_STRING} ^$
  RewriteRule ^/$ /web/$1 [R,L]
</VirtualHost>

Ejemplo completo de VirtualHost

<VirtualHost *:80 >
  ServerName plex.externo.com

  #Autenticacion
  <Location />
    AuthType Basic
    AuthName "Restricted area"
    AuthUserFile c:/passwords/.htpasswd_plex
    Require valid-user
  <Location />

  #Configuracion Proxy Reverso
  ProxyRequests Off
  ProxyPreserveHost Off
  ProxyPass / http://192.168.0.5:32400/
  ProxyPassReverse / http://19.168.0.5:32400/
  
  #Agregar /web/ cuando corresponda
  RewriteEngine on
  RewriteCond %{REQUEST_URI} !^/web
  RewriteCond %{HTTP:X-Plex-Device} ^$
  RewriteCond %{QUERY_STRING} ^$
  RewriteRule ^/$ /web/$1 [R,L]
</VirtualHost>

Basado en:

http://matt.coneybeare.me/how-to-map-plex-media-server-to-your-home-domain/

http://www.dbzoo.com/blog/plex_virtual_hosting

Configurar un proxy reverso o inverso en Apache

Si contamos con un servicio web (o más) en una LAN el cual es accedido desde Internet, podemos configurar un proxy reverso o inverso para ocultar los servidores que contienen realmente las aplicaciones web. En este caso, planteamos configurar un proxy reverso HTTP en Apache.

Para poder avanzar en esta solución hay 2 puntos a tener en cuenta:

Ahora sí vamos con los pasos:

1. Activar el módulo proxy

En la ubicación donde instalamos Apache, abrimo con un editor de textos el archivo: conf\httpd.conf y descomentamos las siguientes líneas:

LoadModule proxy_module modules/mod_proxy.so
....
LoadModule proxy_http_module modules/mod_proxy_http.so

2. Configurar un VirtualHost

Debemos crear un VirtualHost con la configuración básica actuar de proxy reverso:

<VirtualHost *:<PUERTO_EXTERNO> >
  ServerName <DOMINIO_EXTERNO>

  ProxyRequests Off
  ProxyPreserveHost Off
  ProxyPass /<PATH_EXT>/ http://<DOMINIO_INTERNO>:<PUERTO_INTERNO>/<PATH_INT>/
  ProxyPassReverse /<PATH_EXT>/ http://<DOMINIO_INTERNO>:<PUERTO_INTERNO>/<PATH_INT>/
</VirtualHost>

Analizamos cada una de las directivas:

<VirtualHost *:<PUERTO_EXTERNO> >

Define un VirtualHost. En lugar de * se podría indicar una dirección IP para que solamente se acceda al sitio a través de la misma y separado por dos puntos se indica el PUERTO_INTERNO donde se recibe la petición desde Internet

ServerName <DOMINIO_EXTERNO>

Indica el dominio donde se recibe la petición desde Internet

ProxyRequests Off

Evita que Apache funcione como un servidor proxy que realice forwarding (forward proxy server)

ProxyPreserveHost Off

No se utiliza el host que se indica en la petición que ingresa. Podría ser necesario en caso de que el servicio web lo requiera para evaluarlo de alguna manera.

ProxyPass /<PATH_EXT>/ http://<DOMINIO_INTERNO>:<PUERTO_INTERNO>/<PATH_INT>/

Realiza el mapeo del dominio externo a una url interna. El primer parámetro es un path dentro del DOMINIO_EXTERNO y el segundo es la correspondiente URL interna a la cual se convertirá.

Tip: si el primer parámetro termina con /, el segundo también debe hacerlo para evitar posibles errores en las construcciones de urls.

Ejemplo:

ProxyPassReverse /<PATH_EXT>/ http://<DOMINIO_INTERNO>:<PUERTO_INTERNO>/<PATH_INT>/

Ajusta la url de manera similar a ProxyPass pero en las redirecciones HTTP, dentro de las cabeceras: Location, Content-Location y URI. Es necesario para que funcione correctamente el proxy reverso, de lo contrario las redirecciones HTTP podrían saltarlo.

Ejemplo:

<VirtualHost *:80>
  ServerName externo.servicio.com

  ProxyRequests Off
  ProxyPreserveHost Off
  ProxyPass / http://interno.servicio.com:666/
  ProxyPassReverse / http://interno.servicio.com:666/
</VirtualHost>

En este caso podemos ver que Apache actuará como un proxy reverso para que cuando se acceda a http//externo.servicio.com:80/ se redirija la petición a http://interno.servicio.com:666/

3. Reiniciar Apache y probar

Una vez reiniciado el servicio de Apache podemos probar acceder a desde Internet al dominio externo (y al puerto externo), a partir de un navegador por ejemplo. Mediante DNS la petición se dirige hacia nuestro router LAN, el cual a través de la redirección de puertos la envía al equipo con Apache actuando de proxy reverso. Éste hace la conversión al dominio y puertos internos. La petición llega al servicio web interno correspondiente, quien finalmente la responde. Entonces esta respuesta sigue el mismo camino (pero ahora al revés) hasta mostrar la respuesta en el navegador. Las acciones de redirección de puertos y DNS no aplican en este sentido, pero la respuesta pasa por los dispositivos sabiendo a dónde debe dirigirse.

Embeber imágenes en MediaWiki sin subirlas

Cuando queremos embeber una imagen dentro de una página de MediaWiki, nos vemos forzados a subirla como un archivo y luego, en el contenido de la página ingresar:

[[File:Imagen.jpg]]

Pero si la imagen está disponible en una url podemos configurar la MediaWiki para que haga la inserción directamente desde allí (inline linking). Para ello debemos:

  • Abrir el archivo LocalSettings.php con un editor de textos
  • Ir al final y agregar la línea: $wgAllowExternalImages = true;
  • Guardar y cerrar

Ahora al editar una página podremos embeber una imagen desde una url con solo indicarla:

http://www.myownsite.com/imagen.jpg

Para mayor seguridad, podemos configurar Mediawiki de la siguiente manera:

$wgAllowExternalImages = false;

$wgAllowExternalImagesFrom = <URL_START> | array( <URL_START1>, <URL_START2>, ...) ;

Con esta configuración solamente se incrustan las imágenes cuya url comienza con URL_START o con algunas de las URL_STARTx indicadas. La posibilidad de indicar un conjunto de comienzos de url está disponible a partir de la versión 1.14.0.

Ejemplo:

$wgAllowExternalImages = false;

$wgAllowExternalImagesFrom = array( 'http://images.localdomain.com/', 'http://localhost/' );

Atajos para elementos anclados en la barra de tareas de Windows 7

Si usamos mucho los elementos anclados en Windows 7, podemos lanzarlos mediante un atajo de teclado:

  • Win + [1-9]: inicia la aplicación anclada en la posición [1-9] de izquierda a derecha
  • Win + 0: inicia la aplicación anclada en la posición 10

Si la aplicación ya esta abierta y no hay botones combinados, al soltar el número y volver a presionar, la misma se minimiza.

En caso de que los botones se muestren combinados:

  • al soltar el número y volver a presionar, se pasa por cada una de las ventanas de dicha aplicación.
  • al presionar y soltar rápidamente, la previsualización de las ventanas de la aplicación queda abierta y se puede pasar por ellas usando las flechas del teclado.

OBS: En Windows XP, esta combinación de teclas permitía ejecutar las aplicaciones que se encontraban en la barra de herramientas de Acceso Rápido

Tip adicional: Si hacen click del medio sobre un elemento de la barra de tareas, se abre una nueva ventana de la aplicación que corresponda (siempre que la aplicación soporte múltiples ventanas)

Botones combinados

Los elementos en la barra de tarea se pueden configurar para que se agrupen (combinen) cuando son de la misma aplicación. Para ver la configuración actual:

  1. Click derecho sobre la barra de tareas
  2. Elegir Propiedades
  3. En la solapa Barra de Tareas, ver el valor de “Botones de la barra de tareas”:
    • Combinar siempre y ocultar etiquetas: cada ventana se agrupa con las de la misma aplicación (un botón por cada aplicación)
    • Combinar si barra está llena
    • No combinar nunca: cada ventana genera un botón distinto en la barra de tareas