Creación usuarios en MySQL y MariaDB

Vamos a repasar la creación de usuarios y asignación de permisos en MySQL y MariaDB.

Para crear un usuario en MariaDB o MySQL necesitamos ejecutar la siguiente consulta SQL, en la que vamos a configurar el nombre del usuario, en este caso “myuser” el host name y la contraseña.

CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'Passw0rd!';

Para conocer los usuarios que ya tenemos creados y sus host names asignados en la base de datos podemos consultar la tabla “user” de la base “mysql”.

SELECT User, Host FROM mysql.user;

Si queremos otorgar acceso a una base de datos específica necesitamos ejecutar lo siguiente:

GRANT ALL PRIVILEGES ON mytable . * TO 'myuser'@'localhost';

Donde “mytable” será la tabla con acceso para el usuario “myuser”.

Si lo que buscamos es cambiar la contraseña para un usuario determinado podemos ejecutar:

SET PASSWORD FOR ‘myuser’@’localhost’ = PASSWORD(‘newPassw0rd’);

Finalmente si esta información está almacenada en cache por el motor de la base de datos, es necesario limpiarla.

FLUSH PRIVILEGES;

Eliminar últimos commits con GIT

Si lo que necesitamos es remover el último commit que hicimos en el proyecto con GIT, podemos recurrir al comando git reset –hard HEAD^, si tenemos más de un commit que eliminar podemos ejecutar git reset –hard HEAD~2, lo que nos va a permitir remover los últimos dos commits que hicimos. Hay que tener en cuenta que de esta manera eliminamos los archivos de nuestro working directory por lo que si queremos evitar eso y tener los archivos disponibles para editarlos solo debemos quitar el parámetro –hard.

Si los commits que deshicimos previamente ya fueron enviados al repositorio remoto, podemos actualizarlo con ejecutando git push origin +master con lo que el repositorio remoto quedará idéntico a nuestra copia local.

nginx hardening

Se conoce como hardening al proceso de reforzar la seguridad de un sistema, como consecuencia reducimos la superficie de ataque del mismo. Las formas más obvias de reforzar la seguridad son por ejemplo, cambiar los passwords que vienen por default, que aunque parezca difícil de creer muchas veces no se hace, eliminar software y servicios innecesarios, y mantener el sistema actualizado.

En esta entrada voy a agregar algunos consejos específicamente sobre nginx, pero que se podrían trasladar a otro webserver.

Continuá leyendo nginx hardening

Docker comandos útiles

Lista de los comandos más frecuentes al usar Docker.

# listar las imágenes disponibles
docker images

# listar los contenedores que están en ejecución
docker ps

# listar todos los contenedores
docker ps -a

# crear una imagen a partir de un Dockerfile
docker build

# ejecutar un comando en un nuevo contenedor
docker run IMAGEN

# elimina uno o más contenedores
docker rm CONTENEDOR

# elimina una o más imágenes
docker rmi IMAGEN

Si queremos eliminar todos los contenedores que tenemos actualmente podemos ejecutar las dos líneas siguientes, muy útil sobre todo cuando estamos aprendiendo y experimentando con Docker.

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

Web scraping con selenium

Existen casos en donde no vamos a poder scrapear una página correctamente debido al uso de Javascript. Ante esta circunstancia debemos recurrir a selenium y automatizar el uso de un navegador, que puede ser por ejemplo Firefox o Chrome. Para lograr esto es necesario descargar el driver del navegador que vayamos a utilizar y la librería selenium para Python.

Continuá leyendo Web scraping con selenium

Extensiones recomendadas para Visual Studio Code

Visual Studio Code cuenta con extensiones muy interesantes que mejoran la productividad facilitando algunas tareas. A continuación algunas de las que me parecen necesarias, sobre todo si se trabaja en desarrollo web.

REST Client
Id: humao.rest-client

Permite ejecutar HTTP requests directamente desde el editor.

De manera sencilla escribiendo la URL a la que vamos a realizar el pedido o utilizando el standard RFC 2626.

# Forma simple

https://www.w3.org

# RFC 2616

POST https://example.com/comments HTTP/1.1
content-type: application/json

{
    "name": "sample",
    "time": "Wed, 21 Oct 2015 18:27:50 GMT"
}

Ejecutamos con la combinación Alt + Ctrl + R o bien podemos llamarlo desde la paleta de comandos con Ctrl + Shift + P y escribir REST Client para ver las opciones disponibles. Una opción muy útil es ver el historial de requests, que también podemos acceder con la combinación Alt + Ctrl + H, que incluye información de los bytes contenidos en la respuesta, y la última fecha de ejecución.

Name: Code Runner
Id: formulahendry.code-runner

Nos permite ejecutar el código seleccionado y visualizar su resultado. Funciona con una gran cantidad de lenguajes.

Todo Tree
Id: gruntfuggly.todo-tree

Muestra los TODOs, FIXMEs, etc. en una lista de árbol.

Name: Path Intellisense
Id: christian-kohler.path-intellisense

Nos permite ver mientras editamos una ruta, por ejemplo el atributo src de una imagen, los archivos en el directorio, todo a medida que vamos completando el texto, por ejemplo, “./” nos despliega los archivos del directorio en el que estamos trabajando.


Actualización: Reemplacé el TODO Highlight por el Todo Tree, me parece más intuitivo y práctico su funcionamiento, agregando un acceso en la barra de opciones de la izquierda donde podemos visualizar los TODOs en estructura jerarquica.

Full-text search en Sqlite3

Para utilizar Full-text search en Sqlite3 es necesario crear una VIRTUAL TABLE, actualmente la última extensión es FTS5.

CREATE VIRTUAL TABLE mi_tabla USING fts5(col1, col2, col...n);

En el caso de querer aplicar FTS5 a una tabla existente lo que se puede hacer es crear una nueva virtual table con FTS5 con las mismas características y luego hacer un INSERT de la tabla vieja sobre la nueva.

INSERT INTO mi_tabla_fts SELECT * FROM mi_tabla

Luego podemos eliminar con DROP la tabla prexistente y renombrar la nueva con ALTER TABLE mi_tabla_fts RENAME TO mi_tabla;

Para hacer búsquedas utilizamos la keyword MATCH, por ejemplo:

SELECT * FROM mi_tabla WHERE titulo MATCH 'Ejemplo'

Esto sería idéntico a un SELECT * FROM mi_tabla WHERE titulo = ‘Ejemplo’

También tenemos a disposición tres funciones auxiliares, bm25, snippet y highlight. bm25() retorna un valor númerico que nos indica la precisión del la búsqueda (a menor valor mayor precisión). Por otra parte snippet() y highlight() nos sirven más para presentar el resultado de la búsqueda, por ejemplo con highlight podemos devolver <b>KEYWORD</b>.