Nginx en Debian: los comandos más básicos

Vamos a darle un ojo a los comandos más básicos del servidor Nginx para sistemas operativos Debian:

Arrancar Nginx:

Para iniciar Nginx puede ser uno de estos dos comandos, dependiendo de si el gestor de servicios es systemd o sysvinit:

$ sudo systemctl start nginx #systemd
$ sudo service nginx start   #sysvinit

Reiniciar Nginx:

En caso de que necesites reiniciar Nginx sería alguno de estos dos

$ sudo systemctl restart nginx #systemd
$ sudo service nginx restart   #sysvinit

Parar Nginx:

Para detener Nginx:

$ sudo systemctl stop nginx #systemd
$ sudo service nginx stop   #sysvinit

Habilitar arranque en el inicio:

Si queremos que Nginx arranque automáticamente al iniciar el sistema operativo entonces hay que utilizar este:

$ sudo systemctl enable nginx #systemd
$ sudo service nginx enable   #sysvinit

Comprobar la configuración:

Si has hecho cambios en la configuración de Nginx este comando te dirá si la configuración es correcta:

$ sudo nginx -t
Anuncios

Reiniciar una descargar desde el punto en que se cortó con cURL en Linux

Si ya vimos como descargar uno y también varios ficheros en Linux mediante cURL vamos con otra funcionalidad interesante ¿cómo hacemos para reiniciar una descarga que se ha interrumpido?

Basta con invocar el comando para descargar pero añadiendo “-C – ” (es decir, -C, un espacio, un guión y otro espacio, sin las comillas).

Entonces, si así es como comenzamos una descarga:

curl -O http://dominio.com/fichero.tar.gz

Así sería cómo la reiniciaríamos desde el punto en que se cortó:

curl -C - -O http://dominio.com/fichero.tar.gz

Usar cURL en Linux para bajar varios ficheros con un mismo comando.

Si hace unos meses veíamos cómo nos podemos servir de cURL en Linux para descargar un fichero desde una URL hoy vamos a expandir un poco esta entrada: ¿podemos descargar varios ficheros a la vez con el mismo comando? Pues sí.

La sintaxis es muy simple. Recordemos primero ¿Cómo descargamos un fichero con cURL?

curl -O http://dominio.com/fichero.tar.gz

Recordado esto ¿cómo descargamos varios? Pues muy simple, añadimos más url precedidas del parámetro -O tal que así:

curl -O http://dominio.com/fichero.tar.gz -O http://dominio.com/ficheroB.tar.gz -O http://dominio.com/ficheroC.tar.gz

Plantilla para control horario semanal en LibreOffice Calc

Mientras la prensa apaniaguada sigue creando una polémica totalmente prefabricada y ficticia por la obligatoriedad de registrar las horas trabajadas en los centros laborales yo os ofrezco una solución rápida y barata. Existen múltiples soluciones informatizadas, como sistemas basados en apps en la nube, sistemas RFID o sistemas de fichaje con reconocimiento de huella dactilar.

Pero si no quieres invertir en ninguno de estos sistemas puedes llevar el control a través de una hoja de cálculo. La siguiente es una plantilla que puedes descargar para hacerlo con la suite ofimática libre y gratuita LibreOffice Calc. Bastaría con ir actualizando semana a semana. Esta diseñada para jornada partida, para jornada intensiva bastaría con no usar las columnas de la tarde o eliminarlas. Calcula las horas trabajadas de mañana, de tarde, el total diario y finalmente suma el total semanal.

Desde este enlace puedes descargar la plantilla para LibreOffice Calc, formato ODS, comprimida en un fichero zip.

Firefox Monitor: herramienta para saber si tus datos han sido expuestos en Internet.

Mozilla sigue con su plan de esgrimirse adalid de la seguridad y la privacidad en internet y nos trae un nuevo producto: Firefox Monitor.

Esta herramienta nos pedirá que introduzcamos una dirección de correo y comprobará en diversas fuentes públicas si esta se ha visto expuesta en alguna filtración de datos de algún servicio a la que esté asociada.

Su funcionamiento es simple, basta con acceder a este enlace a la web de Firefox Monitor, introducir nuestro correo y pulsar en Buscar Filtraciones. Nos llevará a una ventana con los resultados de la búsqueda similar a esta:

Si algún servicio que uses aparece en esa lista ya sabes lo que toca, cambiar la contraseña.

Monitor además incluye un directorio actualizado con todas las filtraciones de las que tienen conocimiento y una sección con consejos de seguridad. Además ofrece un servicio de registro que nos enviará una alerta por correo electrónico si nuestro correo se ve expuesto en una filtración.

Memoization: Acelerando funciones recursivas. Ejemplo con Javascript.

En su día hablamos aquí sobre la recursividad y sus “peligros“. Las funciones recursivas son muy costosas a nivel de recursos pues al llamarse a si mismas repiten varias veces el mismo paso ¿hay una solución?

Memoization (memorización) es una técnica consistente en almacenar los resultados de funciones muy costosas para devolverlos directamente en lugar de volver a calcularlos.

Por ejemplo, la siguiente función que ya vimos en un artículo anterior nos permitiría calcular un factorial con javascript:

function factorial(num)
{
    if (num < 0) {
        return 0;
    }
    else if (num == 0) {
        return 1;
    }
    else {
        return (num * factorial(num - 1));
    }
}

¿Podemos optimizar mucho esta función cacheando los datos? Podemos:

function factorial(num) {
    // inicializamos si es necesario
    if (!factorial.cache) {
        factorial.cache = {};
    }
    if (num == 0) {
        return 1;
    } else if (num in factorial.cache) {
    // si ya tenemos en cache el factorial de num, lo devolvemos
        return factorial.cache[num];
    } else {
    factorial.cache[num] = num * factorial(num - 1);
    return factorial.cache[num];
}
 

De esta forma nos ahorramos varias llamadas a la función pues simplemente devolvemos un valor almacenado en memoria. Esta no es una técnica exclusiva de Javascript, podemos utilizarla con otros lenguajes de programación. Javascript sí tiene la particularidad de tratar las funciones como un objeto más, eso nos permite por ejemplo definirle la propiedad cache en el ejemplo de arriba (en otros lenguajes deberíamos pasarle como parámetro a la función el array de valores o declararlo como variable global), esto también nos permite hacer que una función reciba como parámetro una función o devuelva como resultado otra función, lo que se conoce como higher-order function o función de orden superior. Sirviéndonos de esto podríamos declarar una función genérica para nuestro memoization:

const memoization = function(func){
    const cache = {};
    return (...args) => {
        const key = [...args].toString();
        return key in cache ? cache[key] : (cache[key] = func(...args));
    }
}

De esta forma podríamos definir nuestra función factorial() tal que así:

var factorial = memoization(function(num) {		
    return (num <= 1) ? 1 : num * factorial(num-1);
})

Operadores de conjunto en SQL-Server: UNION, INTERSECT y EXCEPT

Los operadores de conjunto UNION, INTERSECT y EXCEPT nos permite combinar en una misma salida el resultado de distintas consultas SELECT, construyendo así una consulta más compleja, lo que se llama una consulta compuesta. Para poder combinar dos consultas con estos operadores necesitamos que se cumplan dos requisitos:

  • Que ambas consultas devuelvan el mismo número de columnas.
  • Que estas columnas contengan el mismo tipo de datos, o al menos tipos de datos que se puedan convertir de forma implícita.

Estos tres operadores se incorporaron a SQL-Server a partir de la versión 2008 y están también disponibles en la base de datos SQL de la plataforma Azure. Los tres operadores aceptan además el parámetro ALL, que modificará ligeramente los resultados ¿Cómo funcionan y qué diferencia hay entre ellas?

EXCEPT:

Este operador encuentra la diferencia entre las dos consultas y devuelve las filas que pertenecen únicamente a la primera consulta. Es decir, si una tupa aparece tanto en la consulta de la izquierda como en la de la derecha no será incluida en el resultado final. Si aparece solo en la de izquierda y en la de la derecha no, entonces será devuelta una vez.

Si añadimos ALL al EXCEPT notaremos una pequeña diferencia. Al igual que con el EXCEPT a secas el operador buscará la diferencia entre las dos consultas, pero los datos devueltos cambian. En este caso si una tupla aparece un número m de veces en la primera consulta, y la misma tupla aparece un número n veces en la segunda consulta, entonces esa tupla aparece m – n veces en la respuesta de salida, si dicha resta es mayor que 0.

/*consultamos una tabla de Productos 
y sacamos todos los resultados únicos 
que no que existen en la consulta sobre la tabla Almacén*/

Select Descripcion, Codigo from Productos
EXCEPT
Select Descripcion, Codigo from Almacen

/*Con ALL si la tupa Descripción,Codigo existiese tres veces
en el resultado de la primera consulta y una vez en la segunda
entonces en el resultado final saldría dos veces*/
Select Descripcion, Codigo from Productos
EXCEPT ALL
Select Descripcion, Codigo from Almacen

INTERSECT:

Este operador combina los resultados de dos consultas en un único resultado que comprime todas las filas comunes para ambas consultas. Es decir, funcionaría como un AND lógico: devuelve solo las ocurrencias existentes en ambas consultas.

Si añadimos ALL a este operador el resultado también cambiará. En ese caso si una tupla aparece un número m de veces en el resultado de la primera consulta y la misma tupla aparece n veces en la segunda, entonces esa tupla aparece el menor número de entre m o n en la respuesta de salida.

/*consultamos una tabla de Productos 
y sacamos todos los resultados únicos 
que también existen en la consulta sobre la tabla Almacén*/

Select Descripcion, Codigo from Productos
INTERSECT
Select Descripcion, Codigo from Almacen

/*Con ALL si la tupa Descripción,Codigo existiese tres veces
en el resultado de la primera consulta y una vez en la segunda
entonces en el resultado final saldría una vez solo*/
Select Descripcion, Codigo from Productos
INTERSECT ALL
Select Descripcion, Codigo from Almacen

UNION:

Finalmente vamos con UNION. Si antes os decía que INTERSECT funciona como un operador lógico AND entonces UNION funcionaría como un operador lógico OR. Devuelve las filas únicas que existen o en la consulta de la izquierda o en la de la derecha.

En este caso el operador ALL lo que hará será modificar el resultado del UNION de forma que en lugar de recibir solo las filas únicas recibamos tantas filas como haya en la primera consulta y en la segunda, un poco la operación contraria a la que realiza EXCEPT ALL. En este caso si una tupla aparece un número m de veces en la primera consulta, y la misma tupla aparece un número n veces en la segunda consulta, entonces esa tupla aparece m + n veces en la respuesta de salida.

/*consultamos una tabla de Productos 
y la tabla Almacén y sacamos los resultados únicos, distintos*/

Select Descripcion, Codigo from Productos
UNION
Select Descripcion, Codigo from Almacen

/*Con ALL si la tupa Descripción,Codigo existiese tres veces
en el resultado de la primera consulta y una vez en la segunda
entonces en el resultado final saldría cuatro veces*/
Select Descripcion, Codigo from Productos
UNION ALL
Select Descripcion, Codigo from Almacen