Si tenemos un contenedor con display: flex en nuestro documento no funcionarán los estilos CSS page-break-inside de sus hijos.
Category: Programación
Proxy inverso para websockets de socket.io con nginx
Si tenemos configurado y funcionando un servidor web podemos añadirle capacidades de websockets sin tener que complicarnos con nuevos puertos, certificados de seguridad, etc.
Para eso vamos a usar nginx como proxy inverso. En mi caso necesitaba poder conectar a un programa escrito en node mediante websockets (desde el navegador del cliente) y mediante http (desde mi API en el servidor).
El programa de node usa socket.io y escucha en el puerto 1978.
Esta es la configuración que he utilizado. En el fichero nginx.conf añadimos esta directiva dentro del bloque http:
upstream websocket {
server localhost:1978;
}
Y en el fichero de configuración de nuestro servidor, dentro del bloque server:
# Esta es la ruta que usa socket.io para escuchar conexiones de websockets
location /socket.io/ {
proxy_pass http://websocket;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
# Esta es la ruta a la que podremos llamar desde la API.
location /fry/ {
proxy_pass http://localhost:1978;
}
En el código JS del cliente usaremos como host de conexión de socket.io https://midominio.com y para conectar desde PHP https://midominio.com/fry/endpoint
Comparar valores con array de datos JSON en MySQL
Supongamos que tenemos en una tabla una columna a_productIds de tipo JSON que contiene un array de números y queremos listar los registros que tienen en esa columna algún valor de una lista de números.
La forma más sencilla que he encontrado es usar la función JSON_OVERLAPS que recibe dos documentos JSON y devuelve 1 si tienen en común algún par clave-valor o elemento de array (esto es lo que nos interesa aquí).
Si queremos listar los registros que tienen en a_productIds alguno de los valores 1, 2 o 3 la consulta quedaría así:
SELECT *
FROM tabla
WHERE JSON_OVERLAPS(JSON_EXTRACT(a_productIds, '$'), '[1, 2, 3]');
En ocasiones quizá necesitemos localizar arrays vacíos, esto puede hacerse con la función JSON_LENGTH:
SELECT *
FROM tabla
WHERE JSON_LENGTH(a_productIds, '$') = 0;
Alternativa a Google Fonts
Hay una alternativa a Google Fonts que parece ser que no recopila datos de los usuarios y ayuda a cumplir mejor la normativa de protección de datos. Se llama Bunny Fonts.
Configuración de php-fpm para reiniciarse si detecta fallos
Hay una explicación detallada aquí pero las líneas que nos interesan son:
emergency_restart_threshold 10
emergency_restart_interval 1m
process_control_timeout 10s
Comando para copia estática de una web de Joomla con wget
Disclaimer: para una copia rápida me ha funcionado este comando, no garantizo que sea perfecta ni que descargue bien todas las páginas o ficheros.
wget -r -l 10 -k -p -t 5 -nc -E https://dominio.com
Configuración de nginx para servir desde un mismo dominio una SPA y su API
En esta página lo explican estupendamente, con un ejemplo completo.
Letras gordotas para los minimapas de los IDEs
El minimapa que muchos IDEs muestran a la derecha de un fichero abierto resulta bastante útil.
Y en esta página web podemos generar texto en letras goooordas (yo uso la fuente ANSI regular).
El resultado es que podemos usar estas letras gordas para dejar indicaciones visuales en el minimapa de dónde empiezan ciertas secciones. La imagen del ejemplo es de un fichero donde defino los filtros que pueden usarse en diferentes tablas de datos en una aplicación web.
Cambiar la ordenación de fechas NULL en MySQL
Al ordenar por un campo de fecha los campos NULL se consideran menores que cualquier fecha definida.
Supongamos que tenemos una tabla con tres fechas: 1-1-2020, 1-1-2021 y NULL. Ordenando por ese campo de fecha ASC el resultado es:
NULL 2020-01-01 2021-01-01
y con DESC sería
2021-01-01 2020-01-01 NULL
Si queremos modificar este comportamiento y que al ordenar por un campo de fecha se considere NULL como mayor que cualquier fecha conocida tenemos que añadir un – al nombre del campo de fecha. ¡Ojo! Esto hará que si ordenamos por ASC el resultado sean fechas en orden descendiente y viceversa, así que quizá tengas que tenerlo en cuenta en tu código (en mi caso como es para ordenar una columna de una tabla de datos no importa mucho).
SELECT dateField FROM table ORDER BY -dateField ASC NULL 2021-01-01 2020-01-01 SELECT dateField FROM table ORDER BY -dateField DESC 2020-01-01 2021-01-01 NULL
Aplicar selector :focus de CSS en una imagen
Para poder aplicar un selector :focus a una imagen debemos conseguir que sea focusable, y esto se consigue añadiéndole un atributo tabindex.