Tecnologia

🐍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

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

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

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.

Docker Compose Build Image

En la configuración de tu archivo docker-compose.yml, puedes definir si quieres descargar una imagen del dockerhub o si prefieres construirla tu mismo usando el archivo dockerfile de tu proyecto.

Sin embargo, tambien puedes usar las dos instrucciones al mismo tiempo:

build: .
image: testing:prod

En este caso, docker-compose usara el comando build para construir la imagen, pero le pondra el nombre indicado en image 😀

DU Ordenado

Uno de mis comandos favoritos es

du -hs *

el cual me permite conocer los directorios y la cantidad de Gigas que ocupan. Sin embargo, en una lista larga de archivos estos suelen venir desordenados. Y aunque se puede concatenar con el comando sort, al tener estos registros un sufijo ( K, M, G ) suele ser inservible utilizar el comando sort.

Sin embargo, hoy descubri un parametro de sort ( -h ) el cual le permite entender los sufijos. Ahora si tengo una lista de 50 directorios, perfectamente ordenados por tamaño.

du -hs * | sort -h