Servidor HTTP simple con Python (actualizado)

Comenzaba marzo del 2011 cuando apunté un truco sobre como Crear un Servidor Web con una linea Python, que ahora 12 años y pico después, toca actualizar.

A estas alturas lo más probable es que estés usando una versión de Python superior a la 3.0 e incluso probable que sea superior a la 3.7. El módulo SimpleHTTPServer fue fusionado con el módulo http.server y éste se utiliza de la misma manera:
$ python -m http.server 8000
Donde 8000 es el puerto que desees emplear y también el que lanza por defecto el comando si no especificas otro.

Ahora bien, un truco muy útil que puedes añadir a este comando es especificar qué directorio funcionará como raíz del servidor, por ejemplo un subdirectorio de mi carpeta personal llamado «web»:
$ python -m http.server -d ~/web

Y por último, será útil poder dejar este comando corriendo por detrás sin que esto bloquee la terminal, para lo que añadiremos un símbolo & al final.
La terminal nos dirá el número de proceso, en este ejemplo el 1463, por lo que más adelante podremos terminarlo con:
$ kill 1463

Es un poco farragoso el hecho de que los mensajes de estado que va mostrando el servidor se entremezclan con el texto del shell, pero siendo una solución tan sencilla e inmediata, que funciona a las mil maravillas, vale la pena conocerla para echar mano de ella cuando necesitemos algo rápido y simple. Genial!

Anuncio publicitario

Reducir tamaño de PDF en MacOS

Tengo varios archivos PDF que se acercan o incluso superan el gigabyte de tamaño como resultado de escanear documentos de varias páginas. Son ficheros poco prácticos ya no solamente por su peso si no porque cargar semejante archivo en memoria hace que consultarlos sea un proceso más costoso de lo que sería deseable.

Hay una forma sin embargo de reducir el tamaño de archivo en MacOS empleando ColorSync, una de esas herramientas incluídas por defecto en el sistema y muy desconocidas para la mayoría de nosotros. Este programa se puede lanzar desde Launchpad/Otros.

En la ventana que se abre, debemos crear un nuevo filtro personalizado, pulsando el botón «+» y añadir un componente de efectos de imagen. Escogeremos la compresión de imagen y la configuraremos como se ve en la siguiente captura de pantalla:

Una vez hecho esto, podemos acudir al menú Archivo/Abrir o simplemente arrastrar el PDF que queramos reducir sobre el icono de ColorSync en el Dock y este se abrirá.

En la barra inferior podemos seleccionar el filtro que hemos creado y pulsar en aplicar.
Por último, podemos guardar el documento (sobreescribiendo el original) o acudir a Archivo/Guardar como para poder guardarlo con otro nombre.

Dependiendo del tipo de documento, los resultados serán más o menos efectivos. En archivos con muchas imágenes es donde notaremos mayor beneficio. He hecho algunas pruebas y estos han sido algunos resultados:
– Original 1,2 GB a 100 MB
– Original 586 MB a 98,6 MB
– Original 360 MB a 49 MB
– Original 360 KB a 36 KB
En general, para documentos con mezcla de textos, imágenes en B/N e imágenes en color, el tamaño final oscila entre un 60% o incluso un 10% del original.

Descargar una web completa

Existe una forma que permite descargar toda una web a una carpeta almacenada de forma local a través del comando wget. En MacOS este comando no viene de serie así que lo instalé a través de Homebrew:
$ brew install wget
En muchas distribuciones de Linux, sin embargo, viene ya con el sistema operativo.

Y ahora para descargar toda una web:
$ wget \
--recursive \
--no-clobber \
--page-requisites \
--html-extension \
--convert-links \
--restrict-file-names=windows \
--domains www.mipagina.com \
--no-parent \
http://www.mipagina.com/subdirectorio/html/

Donde las opciones son:
--recursive: descargar la página web completa.
--domains www.mipagina.com: no descargar nada que no pertenezca a este dominio.
--no-parent: no seguir enlaces fuera de la ruta /subdirectorio/html/.
--page-requisites: descargar todos los recursos necesarios (imágenes, CSS, etc.)
--html-extension: guardar archivos con extensión .html
--convert-links: modificar todos los enlaces para que funcionen de forma local.
--restrict-file-names=windows: modificar nombres de ficheros para que funcionen correctamente bajo Windows (si éste es tu SO).
--no-clobber: no sobreescribir archivos existentes (por si se corta la descarga y vuelves a ejecutar el comando, para que no baje cosas que ya tienes).

Aunque este truco le resultará familiar a todos los fans del intérprete de comandos, pocas veces lo he necesitado y quiero dejarlo por aquí apuntado para un futuro.

Transferir archivo a servidor mediante SCP

Hoy me he encontrado con la siguiente situación: quería transferir un archivo a desde un ordenador con Windows a mi Mac a través de la red local. Hay unas cuantas formas de hacerlo pero la primera que se me ha ocurrido ha sido mediante el protocolo SCP, que es suficientemente rápido y fácil como para solucionar el problema sin demasiadas complicaciones.

En primer lugar, hay que configurar el Mac para que podamos hacer login remoto (por SSH). Esto se hace activando la opción de «Sesión Remota» en la categoría «Compartir» de las Preferencias del Sistema:

Es importante que en esta pantalla hagamos clic sobre el símbolo «+» y añadir nuestro usuario de MacOS.
En el lado del Mac (que actuará como servidor) ya está todo listo. Vamos a Windows.

Un buen cliente de SCP es PSCP, del mismo desarrollador de la utilidad Putty. Basta con descargar el ejecutable necesario para tu plataforma ya que no requiere instalación:

Por comodidad, lo he descargado al escritorio, aunque si lo vas a usar habitualmente puede que te resulte más cómodo moverlo a otra ubicación que se encuentre en el PATH del Símbolo de sistema (p.ej. a C:\Windows\System32\).
Ahora en mi escritorio tengo el ejecutable y el archivo que quiero transferir:

Ya sólo queda ejecutar el comando que realizará la transferencia. Desde un intérprete de comandos, me posiciono en el Escritorio y lanzo la siguiente orden:
$ pscp -P 22 test.zip emilio@192.168.1.35:/Users/emilio

El flag -P establece el puerto de la conexión (por defecto el 22 para conexiones SSH), y después del nombre del fichero establecemos el destino: usuario «emilio» en la IP local de mi Mac, seguido de dos puntos y una ruta donde este usuario tiene permisos de escritura (por ejemplo, su carpeta personal). Si es la primera vez que ejecutas este comando, se te preguntará si confías en el host (y se mostrará su firma criptográfica):

Cabe resaltar que en lugar de la IP del Mac, puedo modificar el comando y referirme a él por su nombre de host local, e incluso que el destino sea otra carpeta como la de descargas:
$ pscp -P 22 test.zip emilio@MacBook-Pro:/Users/emilio/Downloads/

Las siguientes veces que te conectes a esta máquina no se te pedirá confirmar su clave criptográfica ya que Putty las almacena en el registro de Windows. Si quieres comprobarlas (o incluso eliminarlas) las encontrarás bajo la ruta:
HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys

En MacOS (y creo que también en Linux) tenemos ya por defecto disponible un cliente equivalente en el terminal, llamado «scp». El comando funciona con la misma sintaxis y de forma prácticamente idéntica. Las claves quedan luego almacenadas en este fichero:
~/.ssh/known_hosts

🙂