martes, 17 de abril de 2012

Toqueteando el /etc/hosts

¿Quién no se ha encontrado editando el /etc/hosts cada vez por tres cuando se está desarrollando?
Lo mejor es tener unas cuantas plantillas de fichero hosts y crearse un pequeño script para cambiar de una a otra, por ejemplo:

#!/bin/bash
HOSTS=/etc/hosts
HOST_DESARROLLO=$HOME/hosts.desarrollo
HOST_PRODUCCION=$HOME/hosts.produccion
if [[ $1 == 'dev' ]]; then
sudo cp $HOST_DESARROLLO $HOSTS
echo "$HOSTS actualizado a desarrollo"
else
sudo cp $HOST_PRODUCCION $HOSTS
echo "$HOSTS actualizado a producción"
fi
echo

viernes, 13 de abril de 2012

(n+1)*n/2

La suma de los N primeros números naturales es
S = (N+1)*N/2

Utilidad aplicada:

Supongamos un modelo de datos (una tabla) en el que hay un atributo para ordenar, un entero correlativo que empieza en 0. Para garantizar la coherencia de los datos, tenemos que asegurarnos que cada operación de modificación deja la tabla bien:

Aquí tenemos un ejemplo de datos coherentes:
+--------+-------+
| _order | id    |
+--------+-------+
|      0 | 18685 |
|      1 | 21971 |
|      2 | 21979 |
|      3 | 21977 |
|      4 | 21975 |
|      5 | 21973 |
|      6 | 22047 |
+--------+-------+


Y aquí uno de datos no coherentes: se ha borrado un dato pero no se ha actualizado bien el _order en la tabla:

+--------+-------+
| _order | id    |
+--------+-------+
|      0 | 18685 |
|      1 | 21971 |
|      2 | 21979 |
|      3 | 21977 |
|      4 | 21975 |
|      6 | 21973 |
|      7 | 22047 |
+--------+-------+


¿Cómo comprobar en una tabla estas incoherencias? Aquí entra en juego nuestra fórmula.

Si todo está bien, la suma de los _order + 1 debe ser igual a la suma de los n enteros hasta los N registros que tengamos en la tabla.



SELECT COUNT(id), 
cliente,
SUM(_order+1) AS suma_order,
ROUND((COUNT(id)+1)*COUNT(id)/2, 0) AS suma_buena
FROM tabla
GROUP BY cliente
HAVING ROUND((COUNT(id)+1)*COUNT(id)/2, 0) != SUM(_order+1)
ORDER BY COUNT(id);