Páginas de error 404 personalizadas en Pelican

Cuando comencé mi aventura con el generador de contenido estático Pelican cometí muchas equivocaciones, por eso al principio me aparecian muchos errores 404 de páginas o recursos no encontrados.

Al principio, el servidor web me mostraba una página de error genérica, pero lo mejor es ofrecer una página personalizada que ofrezca algún tipo de ayuda.

En mi caso, puse un enlace al archivo general donde están enlazados todos los artículos del sitio y un cuadro de búsqueda.

Pero vámonos por pasos.

Crear la página personalizada

Edición del archivo 404.md

En la carpeta content / pages de mi proyecto hice un archivo con el nombre 404.md con un contenido muy similar a este:

Title: Archivo no encontrado
Status: hidden
Save_as: 404.html

El artículo solicitado no pudo ser localizado.

Tal vez quiera revisar el [Archivo general](https://centaurodelnorte.com/archivo.html).

Noten los encabezados, son importantes.

Informar al servidor web

Ahora hay que informarle al servidor web que existe una página personalizada para mostrar cuando existan estos errores.

Si estan usando un servidor web Apache o similar (en mi caso uso el servidor LiteSpeed ). Para eso hay que modificar el archivo .htaccess (o crearlo si no existe) y agregar esto:

# Error 404
ErrorDocument 404 /404.html

Con eso será suficiente.

Un tip adicional

Esto lo descubrí un poco a la mala. El archivo .htaccess no se genera automáticamente en Pelican a menos que así lo configuren.

Para eso, hice un archivo llamado htaccess.txt en la carpeta content / assets con todas las modificaciones que le he hecho a mi archivo .htaccess (incluyendo la anterior).

En el archivo de configuración de Pelican me encontré con el diccionario EXTRA_PATH_METADATA y agregué el archivo htaccess.txt como se muestra a continuación.

EXTRA_PATH_METADATA = {
    'assets/robots.txt': {'path': 'robots.txt'},
    'assets/favicon.ico': {'path': 'favicon.ico'},
    'assets/htaccess.txt': {'path': '.htaccess'},
}

De esa forma toma el contenido del archivo htaccess.txt y lo copia correctamente como un archivo .htaccess en la carpeta output del proyecto.

Y lo seguirá haciendo cada vez que genere el contenido estático de mi sitio.

¿Le han dado un vistazo a Pelican? en estos días de tanta amenaza informática vale la pena considerar este tipo de herramientas.

¡Hasta la próxima!.

Convertir archivos JPG a WebP con Python

Ahora les quiero compartir un pequeño programa en Python para convertir archivos JPG a WebP.

Primero que nada les ofrezco una disculpa a mis 4 lectores, con la depresión de la pandemia no dan muchas ganas de escribir, pero esto ya está durando mucho y no se puede estar tanto tiempo preocupado, lo que sigue es un proceso de adaptación a la nueva realidad y ni modo ¡A darle átomos!

Decidí dejar de estar ocioso y aprender una nueva habilidad. Desde hace tiempo me ha estado haciendo ojitos Pelican un generador de sitios web que utiliza Python (¡Obvio!).

Migrar este blog sería algo en exceso complicado (aunque no lo descarto), por eso decidí hacer pruebas con algo más pequeño, mi otro blog Centauro del Norte.

Las ventajas son muchas, el sitio generado no requiere una base de datos, tienes un mayor control de todos los aspectos del sitio, carga mucho más rápido, aunque eso si, requiere de más conocimientos técnicos.

WebP el formato gráfico de Google

Durante la migración quise probar algo nuevo, cambiar todos los archivos de JPG a WebP. En general son archivos más pequeños, aunque he tenido resultados mixtos en este punto. Dicen que tienen una carga más rápida y aparentemente es cierto. Lo he probado en Chrome y con Firefox y las imágenes aparece como de rayo.

Sin embargo, convertir las imágenes no era algo sencillo. WordPress guarda todas las imágenes en una carpeta que se llama uploads y para conservar algo de orden almacena los archivos en subcarpetas de año y mes.

Probablemente hay otras formas de abordar este problema pero a mi se me ocurrió hacer un programa en Python inspirado en programas que ya había hecho para otros fines.

Lo primero es establecer un directorio de trabajo, luego hacer un barrido a esa carpeta y sus subcarpetas.

Si encuentra un archivo JPG inicia una conversión y genera un archivo del mismo nombre pero con extensión WebP.

Veamos el código.

import os
from PIL import Image

carpeta_raiz = "/carpeta/de/trabajo/"

# Localizar los archivos jpg
for root, dirs, files in os.walk(carpeta_raiz):
    for file in files:
        if file.endswith(".jpg"):
            archivo = os.path.join(root, file)
            archivo_nuevo = archivo.replace('.jpg', '.webp')

            # Convertirlos a WebP
            im = Image.open(archivo).convert("RGB")
            im.save(archivo_nuevo,"webp")

            print(archivo_nuevo)        

print("¡Trabajo terminado!")

Como pueden ver es un código muy sencillo, se puede adaptar para otro tipo de conversiones sin problemas.

Una vez que tuve los archivos WebP, lo único que tuve que hacer es una búsqueda y reemplazo en los archivos markdown que sirven para generar los artículos del sitio.

Ejemplos los pueden ver en: Ex Hacienda La Loma, cuna de la División del Norte y en Mercado Municipal General Francisco Villa. Ambos artículos contienen una buena cantidad de imágenes en formato WebP y creo que tienen un tiempo de carga mucho más que razonable. Bueno, eso digo yo, porque después de la primer carga entran en el juego los cachés de los navegadores.

Espero que les sea de utilidad y procuraré escribir más seguido, que también a mi me hace falta.

Coronavirus, Python y como mezclarlos para obtener información sobre la pandemia.

En estos días no se habla de otra cosa que no sea del Coronavirus aka el COVID-19. Es prácticamente imposible que pasen 5 minutos sin ver una nota, meme, audio o canción relacionado con el tema.

El colmo es que me enteré de que ya hicieron un módulo para Python que obtiene los datos de como va avanzando la pandemia en el mundo con gracias a la información proporcionada por la Universidad John Hopkins.

Trasteando un poco hice un pequeño programa para monitorear el avance del coronavirus en México. El programa muestra los casos confirmados, los muertos y la tasa de mortalidad en México y el mundo.

Instalar covid

Para poder usar el módulo hay que instalarlo con pip.

pip install covid

El código es el siguiente:

from covid import Covid
import time

covid = Covid()
covid.get_data()

casos_mexico = covid.get_status_by_country_name("mexico")

confirmados_mexico = casos_mexico['confirmed']
muertos_mexico = casos_mexico['deaths']

fechahora = time.strftime("%a, %d %b %Y %H:%M:%S %Z", time.localtime(casos_mexico['last_update']/1000))

print("                          MÉXICO")
print("                         ========")
print("       Última actualización :", fechahora)
print("          Casos confirmados : %i" % (confirmados_mexico) )
print("                    Muertos : %i" % (muertos_mexico))

tasa_letalidad_mexico = (muertos_mexico/confirmados_mexico) * 100
print("          Tasa de letalidad : %4.2f %%" % (tasa_letalidad_mexico))


confirmed = covid.get_total_confirmed_cases()
deaths = covid.get_total_deaths()

tasa_letalidad_mundial = (deaths / confirmed) * 100
print("  Tasa de letalidad mundial : %4.2f %%" % (tasa_letalidad_mundial))

Como pueden ver el código es bien sencillo. Tuve más problemas en mostrar de forma correcta la fecha y hora de la última actualización que en consultar la información.

Un programa como este puede ser muy útil para recolectar información e ir construyendo gráficas.

El único problema que tengo es que no creo en las cifras oficiales. El sistema de salud mexicano viene de problemas serios de falta de medicamentos para tratamiento de niños con cáncer, cáncer de mama, falta de vacunas y un líder moral que cree que la mejor protección contra el coronavirus es un Detente del Sagrado Corazón de Jesús (no no es broma).

Así es, este es el plan del presidente contra el coronavirus.

En estos días se dio a conocer que el costo de una prueba para el COVID-19 ronda en los 8 mil pesos mexicanos, así que no creo que este gobierno con su “austeridad republicana” (porque si hay dinero pero para otras cosas cof dos bocas cooof tren maya cooooof Santa Lucía cooof camionetas para la guardia nacional y recontra cooof) tenga la intención o el compromiso de aplicar pruebas a una población que todos los años se enfrenta a influenza, AH1N1, zika, chikunguña, dengue, sarampión o envenenamiento súbito por plomo (o sea unos buenos balazos). Pero en fin, eso es otro tema.

Por cierto, ¿Alguien sabe donde venden esos Detente? es para una investigación.

Covidify

Actualización 4-abr-2020. Lamentablemente el módulo covid dejó de funcionar hace un par de días (espero que no se haya enfermado). Y al estar buscando alguna solución di con Covidify que hace un mucho mejor trabajo que el módulo anterior.

Extrae la información, hace gráficas y lo entrega todo en un resumen en Excel (se puede abrir en LibreOffice).

Resumen de datos para México sobre el COVID19.
La recolección de datos.
Casos confirmados y los nuevos casos.
¿ Y ese brinco tan enorme en los casos recuperados?

Para utilizarlo primero tiene que instalar covidify:

pip install covidify

Y directamente desde la terminal iniciar la recolección de datos. En mi caso fue algo así:

covidify run --country="Mexico" --output="/directorio/de/salida/"

En el directorio de salida que especifiquen se van a encontrar con todos los archivos que generó el programa, pero el resumen están en el archivo en Excel.

Y hoy que estuve analizando los datos, parece que hay menos enfermos de COVID19, o es eso, o se les terminaron las pruebas.

¿A qué se debe esa caída tan brusca en el número de infectados?

Recuerden seguir las recomendaciones. Quedarse en casa, lavarse frecuentemente las manos, evitar lugares concurridos y guardar la sana distancia.