🐍Como crear un xls en Django

Django es un framework muy popular ( el omnipresente ) en proyectos web con Python. El modulo que vamos a usar para generar archivos Excel ( XLS ) se llama openpyxl.

Puedes instalarlo en tu computadora usando el comando pip, y puedes usarlo no solo en proyectos Django, sino tambien en scripts de administracion de python, etc.

pip install openpyxl

OpenpyXL es una libreria muy completa para el manejo de archivos XLS. Te permite trabajar con pestañas, formulas, estilos, etc. En NODEJS suelo utilizar otra libreria ( json-to-xls ) que como su nombre lo indica es mucho, mucho mas simple. Sin embargo, OpenpyXL a pesar de poder abarcara muchas opciones mantiene su simplicidad, lo cual se agradece.

Ahora bien, vamos al codigo. Lo primero es importar la libreriria

import openpyxl

Y con eso crear nuestro woorkbook ( este sera nuestro archivo xls final )

book = openpyxl.Workbook()

Recuerden que en excel tenemos pestañas en la parte inferior, esas se llaman sheets y con openxl podemos manejarlas a nuestro antojo. De momento solo vamos a seleccionar la pestaña por defecto.

sheet = book.active

Una vez que tenemos la variable sheet podemos agregar los registros a nuestro XLS, en este caso vamos a agregar una fila de cabecera primero y luego los datos

sheet.append( ( “Nombre”,”Telefono”, “Email” ) )
for p in personas:
sheet.append( ( p.nombre, p.telefono, p.email  ) )

Con esto ya tenemos listo nuestro archivo XLS. Ahora solo hace falta guardarlo o descargarlo. Vamos a mostrar las dos opciones:

Guardarlo

book.save(“/tmp/nuevoxls.xls”)

Descargarlo

response = HttpResponse(content_type=’application/msexcel’)
response[‘Content-Disposition’] = ‘attachment; filename=nuevoxls.xls’
book.save(response)
return response

Y listo, ya tienen su nuevo XLS generado.

#HappyCoding

🖐️ Ubuntu: Como evitar actualizar el Kernel

En linux los drivers del hardware que usas son desarrollados por la comunidad de software libre. Y como tal, pueden tener algunos bugs en su funcionamiento o pueden simplemente no ser soportados.

En alguna ocasion ( en realidad mas de una ) un hardware puede funcionar bien en una version de los drivers y en la siguiente no 🙁 . Y como la mayoria de los drivers vienen integrado en el kernel de linux, una actualizacion de kernel puede desactivar algun dispositivo de tu maquina.

Para prevenir eso, evito actualizar el kernel una vez que estan todos mis dipositivos funcionando. Podemos bloquear la actualizacion del kernel usando los siguientes comandos:

sudo apt-mark hold linux-image-generic
sudo apt-mark hold linux-headers-generic

Y si deseas volver a actualizarlos, pues debes desmarcarlos:

sudo apt-mark unhold linux-image-generic
sudo apt-mark unhold linux-headers-generic

Deshabilitando el Cache de Drupal para desarrollo

Drupal usa un sistema de cache para mejorar el rendimiento de los sistemas en produccion. Sin embargo, cuando estamos en desarrollo, este puede ser particularmente frustrante.

En mi caso, tengo que ir a la consola casi con cada cambio para ejecutar drush cc all o esperar varios minutos a que se apliquen los cambios en algun tema. Cambios que algunas veces puede ser simplemente correccion de algun label.

Investigando sobre el tema encontre un API de Drupal que me permite limpiar mi cache de forma automatica en cada request de drupal.

Solo debes incluir la siguiente funcion en drupal

cache_clear_all(NULL, ‘cache_page’);

Y hacer cambios rapidos en tu template sin tener que estar limpiando cache manualmente.

#HappyCoding

⚙ Docker Compose: no module named ordered_dict

Hoy dia, fallo la ejecucion de docker-compose en uno de mis servidores.

El problema:

E ImportError: No module named ordered_dict

La solución ?

Asegurarnos de tener la version urllib3-1.22, actualmente la version en produccion es la 1.26

Para tal efecto ejecutamos los siguientes comandos

pip uninstall urllib3
pip install urllib3=1.22

#HappyCoding

Bash: Ejecutar un proceso en domingo

Tenemos un proceso configurado en CRON para ejecutar un script de bash. Sin embargo, ciertas partes de dicho proceso solo deben ejecutarse un dia a la semana.

Para eso vamos a programar nuestro script en bash para solo se ejecute en domingo.

day=`date +%u`
if [ $day eq 0 ]; then
# Proceso que se ejecuta solo en domingo
fi

El comando date +%u nos devuelve el numero de dia de la semana.
Siendo 0 domingo, 1 Lunes, 2 Martes, 3 Miercoles, 4 Jueves, 5 Viernes, 6 Sabado.

#HappyCoding

Drupal7 node template path based

Cuando queremos personalizar el theme de un nodo en drupal. usualmente tenemos la opcion de hacerlo basado en el content type: node–type.tpl.php

O tambien podemos usar el nid del nodo que queremos personalizar: node–nid.tpl.php

Sin embargo, en un proyecto con una gran cantidad de nodos personalizados es muy dificil seguir el rastro de a que nodo pertenece un theme.tpl.php

Para esto podemos crear themes basados en el path del nodo ( el cual deberia ser mas descriptivo )

Para esto creamos la funcion hook_preprocess_node en el archivo template.php

mytheme_preprocess_node(&$variables) {
  $alias = drupal_get_path_alias();
  $alias =str_replace('/', '_', $alias);
  $suggestion[] = "node__$alias";
  $variables['theme_hook_suggestions'] = array_merge($variables['theme_hook_suggestions'], $suggestion);
}

Y ahora ya podemos crear templates con el noombre del path de los nodos. Por ejemplo, si tenemos un nodo con el path “noticia/equipo-dota-peruano” podemos crear un archivo “node–noticia-equipo-dota-peruano.tpl.php”

#HappyCoding

Python – Parametros de funcion en formato JSON

Cuando desarrollamos en python podemos tener una funcion con multiples argumentos.

def addCart( precio, cantidad, producto ):
pass

Si hemos recibido dichos parametros en un objeto JSON o los tenemos guardados en un diccionario, podemos pasarlo directamente. Python, se encargara de asignar a cada parametro la propiedad correspondiete del objeto. Para esto debemos pasar la variable a la funcion anteponiendo dos asteriscos.

addCart(**params)

NGINX – Logging Country Access

Trabajando con NGINX para controlar el acceso de ciertos paises, encontre un modulo GeoIP Country, que nos permite determinar en funcion de la IP el pais de origen de un request.

Al agregarlo en nuestro nginx.conf podemos bloquear facilmente visitas de ciertos paises. Por ejemplo:

geoip_country /usr/share/GeoIP/GeoIP.dat;
map $geoip_country_code $allowed_country {
default yes;
RU no; #Rusia
UK no; #Ukrania
CN no; #China
}

Sin embargo, al tenerlo instalado en nginx, tambien podemos hacer uso de la variable $geoip_country para mapear en nuestro access log, de que pais vino el request. Asi el pais no este bloqueado.

Para esto definimos nuestro propio formato en log_format:

log_format main ‘$status $body_bytes_sent $geoip_country_code $sent_http_content_type “$request_method $scheme://$host$request_uri” $http_referer @$remote_addr $http_user_agent ‘;

Y lo aplicamos en la declaracion de access_log:

access_log /var/log/nginx/access.log main;

Y listo, ahora tendremos la informacion del pàis de nuestras peticiones:

200 8938 PE text/html; charset=UTF-8 “GET https://www.mariouriarte.com/?s=react” https://www.mariouriarte.com/?s=nginx @190.202.62.205 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/75.0.3770.90 Chrome/75.0.3770.90 Safari/537.36

Linux Console: df without snap

df es un comando linux que nos permite saber el tamaño exacto de nuestras particiones y cuanto de especio libre disponemos.

Muy util, sobre todo en servidores. Pero a raiz de la aparicion de snap y dockers esta lista de particiones se llenaba de informacion repetida.

Todas las particiones loop, no existian en realidad sino que eran particiones virtuales ( archivos dentro de particiones reales ) lo que significaba que no me servian para efectos de administrar el espacio de mi sistema.

Para poder obtener un listado con las particiones reales del sistema, hay que ejecutar el comando df con una lista de parametros

df  -x squashfs -T -h

Donde:

  • -x squashfs
    Nos indica que no queremos visualizar ese tipo de sistema de archivos
  • -T
    Nos indica que queremos que tipo de archivo es cada particion ( segunda columna )
  • -h
    Nos indica que los tamaños de las particiones lo veremos con el sufijo K M G ( KB, MB, GB )

Y para evitar tener que escribir dicho comando siempre podemos crear un alias

alias df=’df -x squashfs -T -h ‘

Como convertir imagenes webp a png usando la linea de comandos

El formato webp, es el “nuevo” formato de google para compresion de imagenes sin perdida ideal para internet. Una misma imagen en webp ( 94k ) y en png ( 1.1 M ).

Sin embargo,  no todas las aplicaciones de linux ( o windows o mac ) estan preparadas para trabajar con este formato. Asi que para poder usarlas fuera del navegador deberemos convertirlas.

En linux existe una herramiento webp que vamos a instalar

sudo apt install webp

Y ahora podemos hacer la conversion con el siguiente comando

dwebp <imagen.webp>  -o <imagen.png>

Por si acaso, tambien podemos hacer el camino inverso. Hacer la conversion al nuevo formato webp usando el comando

cwebp <imagen.png> -o <imagen.webp>

Yo ya tengo varios proyectos web y mobiles donde valdria la pena usarla.