Haciendo del Desarrollo y la Arquitectura Web, ciencia y pasión.
image
mar
2025

Arquitectura orientada a eventos

Anteriormente, ya habíamos hablado de patrones orientados a eventos, habíamos puesto un Kafka en funcionamiento, con algunos publicadores y suscriptores. Pues bien, hoy vamos a profundizar en un escenario puramente orientado a eventos. Primero, expli...
  • Por Daniel Gimeno
  • article
image
mar
2025

Arquitectura hexagonal

Hoy vamos a jugar con el tema de la Arquitectura Hexagonal, o como tambien se suele llamar, "puertos y adaptadores", es un enfoque que separa claramente la lógica de negocio de los detalles técnicos externos. Os plantearé sus principales caracteristi...
  • Por Daniel Gimeno
  • article
image
mar
2025

Securiza tu web con Let's Encrypt

Ya teniamos la web terminada, la habiamos subido a un repositorio y hasta aprendimos a desplegarla usando git hooks o jenkins. Pero un capítulo estaba pendiente: hacerla segura. Allá por 2018 Google empezó a penalizar los sitios no seguros, y los que...
  • Por Daniel Gimeno
  • article
image
mar
2025

Despliega tu website con Git

Pues bien, ya tienes terminada tu pagina web. En tu entorno local tienes tu nueva flamante web, que te has currado con el framework de moda. Lo empaquetas en un zip o un tgz y lo "efetepeas" copias al servidor en producción, lo descomprimes y listo. ...
  • Por Daniel Gimeno
  • article
image
mar
2025

Introduccion a Kafka

Hoy hemos venido a jugar con Kafka o mejor dicho Apache Kafka, ya que se trata de un proyecto bajo el paraguas de Apache Foundation. No todo el mundo es consciente de la aportacion de esta institucion, con sus cientos de proyectos. Pues vamos allá, A...
  • Por Daniel Gimeno
  • article
image
mar
2025

¿Que es un proxy inverso?

Llevo un tiempo queriendo hacer algunas pruebecillas con el tema de los proxys, los proxys inversos, balanceadores de carga, etc y hoy por fin de la mano de Docker vamos a montar un pequeño sistema en local, en muy pocos pasos y ultrafacil. Antes de...
  • Por Daniel Gimeno
  • article
image
mar
2021

Docker, Capitulo 1

Hoy os voy a hablar de Docker. Llevaba muchisimo tiempo queriendo escribir sobre esta tecnología, pues vamos allá. Docker es relativamente joven, de 2013, en muy pocos años se ha convertido en el estandar de facto, con un gran futuro por delante. Se ...
  • Por Daniel Gimeno
  • article

Tips, recetillas y truquis

Tip nº21

Comandos de Nginx

Abril, 2025

Resumen de los comandos más típicos para administrar Nginx:

📌 Gestión del servicio Nginx

Estos comandos se usan para iniciar, detener y reiniciar Nginx en sistemas basados en systemd:

  • Iniciar Nginx

    sudo systemctl start nginx
    
  • Detener Nginx

    sudo systemctl stop nginx
    
  • Reiniciar Nginx

    sudo systemctl restart nginx
    
  • Recargar la configuración sin interrumpir el servicio

    sudo systemctl reload nginx
    
  • Ver el estado de Nginx

    sudo systemctl status nginx
    

🔍 Verificación de configuración

Antes de aplicar cambios en la configuración de Nginx, es recomendable verificarlos:

sudo nginx -t

Si todo está correcto, verás un mensaje como:
nginx: configuration file /etc/nginx/nginx.conf test is successful

📂 Gestión de archivos de configuración

  • Archivo de configuración principal:

    /etc/nginx/nginx.conf
    
  • Directorio para sitios habilitados:

    /etc/nginx/sites-enabled/
    
  • Directorio para sitios disponibles:

    /etc/nginx/sites-available/
    

Para activar un sitio:

sudo ln -s /etc/nginx/sites-available/misitio /etc/nginx/sites-enabled/

Para desactivar un sitio:

sudo rm /etc/nginx/sites-enabled/misitio

📊 Logs y depuración

  • Ver los registros de acceso

    sudo tail -f /var/log/nginx/access.log
    
  • Ver los registros de errores

    sudo tail -f /var/log/nginx/error.log
    

🔧 Otras operaciones útiles

  • Ver la versión de Nginx

    nginx -v
    
  • Ver procesos de Nginx en ejecución

    ps aux | grep nginx
    
  • Recargar Nginx en caso de fallo sin reiniciarlo

    sudo nginx -s reload
    

 

Seguir leyendo
Tip nº20

Comandos Apache

Abril, 2025

Aquí va una lista de los comandos más habituales para administrar el servidor web Apache HTTP Server en sistemas Linux/Unix y Windows:

📌 Comandos básicos en Linux/Unix (systemd - Ubuntu/Debian/CentOS)

Iniciar, detener, reiniciar y ver el estado de Apache:

sudo systemctl start apache2    # Iniciar Apache (en Debian/Ubuntu)
sudo systemctl start httpd      # Iniciar Apache (en CentOS/RHEL)
sudo systemctl stop apache2     # Detener Apache
sudo systemctl restart apache2  # Reiniciar Apache (cierra y abre conexiones)
sudo systemctl reload apache2   # Recargar configuración sin reiniciar (sin caída)
sudo systemctl status apache2   # Ver estado del servicio

Habilitar/deshabilitar inicio automático:

sudo systemctl enable apache2   # Iniciar automáticamente al arrancar el sistema
sudo systemctl disable apache2  # Desactivar inicio automático

Ver errores y logs:

sudo tail -f /var/log/apache2/error.log  # Monitorizar errores en tiempo real (Debian/Ubuntu)
sudo tail -f /var/log/httpd/error_log    # CentOS/RHEL

📌 Comandos en Windows (si Apache está instalado como servicio):

net start Apache2.4     # Iniciar Apache
net stop Apache2.4      # Detener Apache
httpd -k restart        # Reiniciar (desde la terminal con permisos)
httpd -k graceful       # Recargar configuración sin desconexiones

📌 Comandos generales útiles:

Probar sintaxis de configuración antes de reiniciar:

sudo apachectl configtest  # Verificar errores en archivos de configuración

Ver versión de Apache:

apache2 -v    # Debian/Ubuntu
httpd -v      # CentOS/RHEL

Listar módulos instalados:

apache2ctl -M   # Debian/Ubuntu
httpd -M        # CentOS/RHEL

📌 Gestión de hosts virtuales (vhosts):

  • Habilitar un sitio (en Debian/Ubuntu):
    sudo a2ensite mi-sitio.conf    # Habilitar sitio
    sudo a2dissite mi-sitio.conf   # Deshabilitar sitio
    
  • Habilitar módulos (como rewrite):
    sudo a2enmod rewrite    # Activar módulo
    sudo a2dismod rewrite   # Desactivar módulo
    

🔍 Notas importantes:

  • En CentOS/RHEL/Fedora, el nombre del servicio suele ser httpd en lugar de apache2.
  • Después de cambios en la configuración, siempre verifica con sudo apachectl configtest antes de reiniciar.
  • Si usas XAMPP, los comandos son distintos (ej: /opt/lampp/lampp start en Linux).

Seguir leyendo
Tip nº19

Gestor de paquetes pip

Abril, 2025

Aquí van algunas opciones típicas de pip, el gestor de paquetes de Python:

🔹 Instalación y Actualización de Paquetes

  • pip install <paquete> → Instala un paquete desde PyPI.

  • pip install <paquete>==<versión> → Instala una versión específica de un paquete.

  • pip install -r requirements.txt → Instala paquetes desde un archivo de dependencias.

  • pip install --upgrade <paquete> → Actualiza un paquete a la última versión.

  • pip install --upgrade pip → Actualiza pip a la última versión.

🔹 Gestión de Paquetes Instalados

  • pip list → Lista todos los paquetes instalados.

  • pip freeze → Muestra los paquetes instalados en formato compatible con requirements.txt.

  • pip show <paquete> → Muestra información detallada sobre un paquete.

  • pip uninstall <paquete> → Desinstala un paquete.

🔹 Gestión de Caché y Depuración

  • pip cache purge → Elimina la caché de pip.

  • pip check → Verifica que no haya dependencias rotas o incompatibles.

Si quieres que agregue estos comandos a tu documento o necesitas más detalles, dime. 🚀

Aquí tienes un resumen de los comandos más típicos para administrar Nginx:

📌 Gestión del servicio Nginx

Estos comandos se usan para iniciar, detener y reiniciar Nginx en sistemas basados en systemd:

  • Iniciar Nginx

    sudo systemctl start nginx
    
  • Detener Nginx

    sudo systemctl stop nginx
    
  • Reiniciar Nginx

    sudo systemctl restart nginx
    
  • Recargar la configuración sin interrumpir el servicio

    sudo systemctl reload nginx
    
  • Ver el estado de Nginx

    sudo systemctl status nginx
    

🔍 Verificación de configuración

Antes de aplicar cambios en la configuración de Nginx, es recomendable verificarlos:

sudo nginx -t

Si todo está correcto, verás un mensaje como:
nginx: configuration file /etc/nginx/nginx.conf test is successful

📂 Gestión de archivos de configuración

  • Archivo de configuración principal:

    /etc/nginx/nginx.conf
    
  • Directorio para sitios habilitados:

    /etc/nginx/sites-enabled/
    
  • Directorio para sitios disponibles:

    /etc/nginx/sites-available/
    

Para activar un sitio:

sudo ln -s /etc/nginx/sites-available/misitio /etc/nginx/sites-enabled/

Para desactivar un sitio:

sudo rm /etc/nginx/sites-enabled/misitio

📊 Logs y depuración

  • Ver los registros de acceso

    sudo tail -f /var/log/nginx/access.log
    
  • Ver los registros de errores

    sudo tail -f /var/log/nginx/error.log
    

🔧 Otras operaciones útiles

  • Ver la versión de Nginx

    nginx -v
    
  • Ver procesos de Nginx en ejecución

    ps aux | grep nginx
    
  • Recargar Nginx en caso de fallo sin reiniciarlo

    sudo nginx -s reload
    

 

Seguir leyendo
Tip nº18

Opciones del gestor de dependencias Poetry

Abril, 2025

Aquí tienes algunas opciones típicas de Poetry, el gestor de dependencias para Python:

🔹 Gestión de Proyectos

  • poetry new <nombre_proyecto> → Crea un nuevo proyecto con la estructura básica.

  • poetry init → Inicializa un nuevo proyecto en un directorio existente.

  • poetry install → Instala las dependencias del proyecto.

  • poetry update → Actualiza las dependencias según el pyproject.toml.

🔹 Gestión de Dependencias

  • poetry add <paquete> → Añade una dependencia al proyecto.

  • poetry add <paquete> --dev → Añade una dependencia solo para desarrollo.

  • poetry remove <paquete> → Elimina una dependencia.

🔹 Entornos Virtuales

  • poetry shell → Activa el entorno virtual del proyecto.

  • poetry env list → Muestra los entornos virtuales disponibles.

  • poetry env remove <python_version> → Elimina un entorno virtual.

🔹 Gestión de Versiones

  • poetry version → Muestra la versión actual del proyecto.

  • poetry version <nueva_version> → Cambia la versión del proyecto.

🔹 Publicación y Distribución

  • poetry build → Construye el paquete del proyecto.

  • poetry publish → Publica el paquete en PyPI.

Si quieres que agregue estos comandos a tu documento o necesitas más detalles, dime. 🚀

Seguir leyendo
Tip nº17

Docker-compose

Abril, 2025

Aquí tienes un resumen de los comandos más útiles de Docker Compose:

🔹 Docker Compose

  • docker-compose up -d → Inicia los servicios definidos en docker-compose.yml en segundo plano.

  • docker-compose down → Detiene y elimina los contenedores de docker-compose.

  • docker-compose logs -f → Muestra los logs de los servicios en tiempo real.

  • docker-compose ps → Lista los contenedores gestionados por docker-compose.

  • docker-compose restart → Reinicia los servicios.

  • docker-compose stop → Detiene los servicios sin eliminarlos.

  • docker-compose rm → Elimina los contenedores gestionados por docker-compose.

  • docker-compose exec <servicio> <comando> → Ejecuta un comando en un contenedor de docker-compose.

🔹 Limpieza del Sistema

  • docker system prune -a → Elimina contenedores, imágenes y volúmenes no utilizados.

  • docker container prune → Elimina todos los contenedores detenidos.

  • docker image prune → Elimina imágenes no utilizadas.

Si necesitas un comando más específico o con opciones adicionales, dime y te ayudo. 🚀

Seguir leyendo
Tip nº16

Comandos de Docker

Abril, 2025

Aquí tienes un resumen de los comandos más útiles de Docker:

🔹 Gestión de Imágenes

  • docker pull <imagen> → Descarga una imagen desde Docker Hub.

  • docker images → Lista las imágenes disponibles en el sistema.

  • docker rmi <imagen> → Elimina una imagen localmente.

  • docker build -t <nombre:tag> . → Construye una imagen desde un Dockerfile.

🔹 Gestión de Contenedores

  • docker run -d -p 8080:80 --name <nombre> <imagen> → Crea y ejecuta un contenedor en segundo plano.

  • docker ps → Lista los contenedores en ejecución.

  • docker ps -a → Lista todos los contenedores, incluidos los detenidos.

  • docker stop <contenedor> → Detiene un contenedor en ejecución.

  • docker start <contenedor> → Inicia un contenedor detenido.

  • docker restart <contenedor> → Reinicia un contenedor.

  • docker rm <contenedor> → Elimina un contenedor.

  • docker exec -it <contenedor> bash → Accede a la terminal de un contenedor en ejecución.

🔹 Gestión de Volúmenes y Redes

  • docker volume create <nombre> → Crea un volumen.

  • docker volume ls → Lista los volúmenes.

  • docker volume rm <nombre> → Elimina un volumen.

  • docker network ls → Lista las redes de Docker.

  • docker network create <nombre> → Crea una red personalizada.

  • docker network connect <red> <contenedor> → Conecta un contenedor a una red.

🔹 Docker Compose

  • docker-compose up -d → Inicia los servicios definidos en docker-compose.yml en segundo plano.

  • docker-compose down → Detiene y elimina los contenedores de docker-compose.

  • docker-compose logs -f → Muestra los logs de los servicios en tiempo real.

🔹 Limpieza del Sistema

  • docker system prune -a → Elimina contenedores, imágenes y volúmenes no utilizados.

  • docker container prune → Elimina todos los contenedores detenidos.

  • docker image prune → Elimina imágenes no utilizadas.

Si necesitas un comando más específico o con opciones adicionales, dime y te ayudo. 🚀

Seguir leyendo
Tip nº15

Comandos de Git

Marzo, 2025

Aquí va un listado de comandos esenciales de Git organizados por categorías:

🔹 Configuración Inicial

git config --global user.name "Tu Nombre"    # Configura el nombre de usuario  
git config --global user.email "tu@email.com" # Configura el correo electrónico  
git config --list                             # Muestra la configuración actual  

🔹 Inicialización y Clonación

git init             # Inicia un nuevo repositorio en el directorio actual  
git clone URL        # Clona un repositorio remoto  

🔹 Estado y Registro

git status         # Muestra el estado del repositorio  
git log           # Muestra el historial de commits  
git log --oneline # Historial en una sola línea  
git diff          # Muestra diferencias entre archivos  

🔹 Añadir y Confirmar Cambios

git add archivo     # Añade un archivo al área de preparación  
git add .           # Añade todos los cambios  
git commit -m "Mensaje"  # Guarda los cambios con un mensaje  
git commit --amend  # Modifica el último commit  

🔹 Ramas (Branches)

git branch               # Lista las ramas  
git branch nombre_rama   # Crea una nueva rama  
git checkout nombre_rama # Cambia a una rama existente  
git checkout -b nueva_rama # Crea y cambia a la nueva rama  
git merge nombre_rama    # Fusiona una rama con la actual  
git branch -d nombre_rama # Elimina una rama local  

🔹 Trabajo con Remoto

git remote -v                # Lista los repositorios remotos  
git remote add origin URL    # Conecta un repositorio local con uno remoto  
git push origin main         # Sube cambios a la rama principal  
git pull origin main         # Descarga cambios de la rama principal  
git fetch origin             # Obtiene datos remotos sin fusionar  

🔹 Deshacer Cambios

git checkout -- archivo      # Revierte cambios no confirmados  
git reset HEAD archivo       # Deshace `git add`  
git reset --soft HEAD~1      # Deshace el último commit, pero mantiene los cambios  
git reset --hard HEAD~1      # Borra el último commit y sus cambios  
git revert HEAD              # Crea un nuevo commit que revierte el último  

🔹 Etiquetas (Tags)

git tag nombre_etiqueta        # Crea una etiqueta  
git tag -a nombre_etiqueta -m "Mensaje"  # Crea una etiqueta con anotación  
git push origin --tags         # Envía las etiquetas al remoto  

🔹 Stash (Guardar Cambios Temporalmente)

git stash       # Guarda cambios sin confirmarlos  
git stash pop   # Recupera los cambios guardados  
git stash list  # Muestra los cambios guardados en stash  

🔹 Otros Comandos Útiles

git show HEAD      # Muestra detalles del último commit  
git shortlog       # Resumen del historial de commits por autor  
git blame archivo  # Muestra quién modificó cada línea de un archivo  

Si necesitas más detalles sobre algún comando o una acción específica, dime. 😊

Seguir leyendo
Tip nº14

Comandos curiosos

Marzo, 2025

Os traigo un par de comandos más  divertidos que practicos, pero que no dejan de ser curiosos. El primero comando es sl, una broma clásica en sistemas Unix/Linux. Es una variación del comando ls (listar archivos), pero en lugar de mostrar archivos en un directorio, muestra una animación de una locomotora de vapor en la terminal.

Se creó para "castigar" a quienes escriben ls demasiado rápido y se equivocan. Si no lo tienes instalado, puedes agregarlo en Debian/Ubuntu con:

sudo apt install sl

Y en Arch Linux con:

sudo pacman -S sl

Al ejecutarlo con sl, verás un tren moviéndose por la pantalla. También tiene opciones como:

  • sl -F: Muestra un tren descarrilado.

  • sl -l: Muestra un tren más lento.

  • sl -a: Muestra un tren con diferentes efectos.

Aqui te paso algunos mas comandos similares que son bromas o simplemente divertidos en Unix/Linux. Aquí algunos ejemplos:

  • cowsay: Muestra una vaca ASCII diciendo el texto que le pases.

    sudo apt install cowsay
    cowsay "Hola mundo"
    
  • fortune: Muestra frases aleatorias y curiosas.

    sudo apt install fortune
    fortune
    
  • cmatrix: Simula la lluvia de caracteres de la película The Matrix.

    sudo apt install cmatrix
    cmatrix
    
  • lolcat: Aplica colores arcoíris al texto.

    sudo apt install lolcat
    echo "Texto colorido" | lolcat
    

Y por último el mas fascinante de todos: un video en modo asci, una demostracion del poderio del Ascii Art. Es un programa que muestra una animación ASCII impresionante en la terminal, con gráficos en movimiento y efectos visuales. Fue creado en 1997 por A.A. van Ruler y es una especie de demostración técnica del potencial del arte en ASCII.

Instalación

Si quieres probarlo, puedes instalarlo en Debian/Ubuntu con:

sudo apt install bb

En Arch Linux, se encuentra en el AUR:

yay -S bb

Uso

Una vez instalado, simplemente ejecútalo con:

bb

Disfrutarás de una animación en ASCII bastante elaborada, que muestra un espectáculo de efectos gráficos.

 

Seguir leyendo
Tip nº13

lectura de archivos por shell

Marzo, 2025

 

En Shell Script, puedes manejar archivos de varias maneras, como abrir, leer, escribir y procesarlos línea por línea. Aquí te explico los métodos más comunes:


1. Apertura y lectura de archivos

Usando cat

cat archivo.txt

Muestra el contenido del archivo en la terminal.


Usando while read (Recomendado para procesar línea por línea)

while IFS= read -r linea; do
    echo "Línea: $linea"
done < archivo.txt
  • IFS= evita problemas con espacios en blanco al inicio o final.
  • read -r impide que las barras invertidas (\) se interpreten como caracteres de escape.

Leyendo el archivo con awk

awk '{print "Línea: " $0}' archivo.txt

Permite manipular y extraer datos fácilmente.


Leyendo el archivo con sed

sed -n 's/foo/bar/p' archivo.txt

Este comando reemplaza "foo" por "bar" y muestra solo las líneas afectadas.


2. Escritura en archivos

Sobrescribir un archivo

echo "Nuevo contenido" > archivo.txt

Borra el contenido anterior y escribe "Nuevo contenido".


Añadir contenido al final del archivo

echo "Otra línea más" >> archivo.txt

Añade la línea sin borrar el contenido anterior.


3. Procesamiento de archivos

Contar líneas, palabras y caracteres

wc archivo.txt

Muestra el número de líneas, palabras y caracteres.


Filtrar líneas con grep

grep "palabra" archivo.txt

Muestra solo las líneas que contienen "palabra".


Reemplazar texto en el archivo

sed -i 's/viejo/nuevo/g' archivo.txt

Reemplaza todas las apariciones de "viejo" por "nuevo" dentro del archivo.


Ejemplo Completo: Procesamiento de un archivo línea por línea

#!/bin/bash

archivo="datos.txt"

while IFS= read -r linea; do
    echo "Procesando: $linea"
    # Aquí puedes hacer más operaciones con cada línea
done < "$archivo"

Este script lee un archivo (datos.txt) y procesa cada línea.

Seguir leyendo
Tip nº12

Uso de getops para manejo de opciones

Marzo, 2025

El comando getopts en shell script se usa para procesar opciones de línea de comandos de manera estructurada. Es útil cuando quieres manejar argumentos como -a, -b valor o combinaciones de ellos.

Funcionamiento de getopts

El comando analiza los argumentos pasados al script y asigna las opciones y valores a variables.

Ejemplo básico

#!/bin/bash

while getopts "a:b:" opt; do
  case $opt in
    a) echo "Opción -a con valor: $OPTARG" ;;
    b) echo "Opción -b con valor: $OPTARG" ;;
    *) echo "Uso: $0 -a valor -b valor" ;;
  esac
done

Si ejecutas:

./script.sh -a 10 -b 20

La salida será:

Opción -a con valor: 10
Opción -b con valor: 20

Explicación

  • "a:b:" → Define dos opciones: -a y -b, ambas requieren un valor (por eso los :).

  • $opt → Contiene la opción actual (a o b).

  • $OPTARG → Contiene el valor asociado a la opción.

  • El while recorre los argumentos hasta que se procesan todos.

Si quieres incluir esta información en tu documento, dime dónde la agrego.

Seguir leyendo
Tip nº11

Comando wc para contar

Marzo, 2025

El comando wc -l cuenta el número de líneas en una entrada. Se puede usar de varias maneras en Zsh para contar múltiples entradas:

  1. Contar líneas en un solo archivo

    wc -l archivo.txt
    

    Esto mostrará la cantidad de líneas en archivo.txt.

  2. Contar líneas en varios archivos

    wc -l archivo1.txt archivo2.txt
    

    Esto devuelve el número de líneas en cada archivo y una suma total.

  3. Contar líneas de la entrada estándar (stdin)

    cat archivo.txt | wc -l
    

    O de forma más eficiente:

    < archivo.txt wc -l
    
  4. Contar líneas de múltiples archivos coincidentes

    wc -l *.txt
    

    Esto cuenta las líneas de todos los archivos .txt en el directorio actual.

  5. Contar líneas en la salida de un comando

    ls -1 | wc -l
    

    Cuenta la cantidad de archivos y directorios en la carpeta actual.

  6. Contar líneas en archivos dentro de subdirectorios

    find . -type f -name "*.txt" -exec wc -l {} +
    

    Esto busca archivos .txt en el directorio actual y subdirectorios, luego cuenta sus líneas.

Si quieres agregar una sección en el documento sobre wc -l, dime dónde te gustaría que la incluya.

Seguir leyendo
Tip nº10

Zsh y oh my Zsh

Marzo, 2025

Zsh (Z Shell) es una consola de línea de comandos avanzada y altamente configurable, usada como intérprete de órdenes en sistemas operativos tipo Unix, como Linux y macOS. Es una alternativa mejorada a Bash (Bourne Again Shell), con características adicionales que la hacen popular entre desarrolladores y administradores de sistemas.

Características principales de Zsh

  1. Autocompletado avanzado

    • Puede completar nombres de comandos, archivos, directorios, opciones de comandos y más.

    • Soporta sugerencias y corrección automática de errores tipográficos.

  2. Historial mejorado

    • Permite buscar comandos previos de manera más eficiente con Ctrl + R.

    • Almacena comandos con más opciones de personalización que Bash.

  3. Globos y expansiones de archivos mejoradas

    • Admite expresiones avanzadas para la selección de archivos (ejemplo: ls **/*.txt lista todos los archivos .txt en subdirectorios).

  4. Alias y funciones avanzadas

    • Permite definir alias de comandos más flexibles y crear funciones para automatizar tareas.

  5. Temas y personalización con Oh My Zsh

    • Oh My Zsh es un framework que facilita la configuración de Zsh, permitiendo añadir temas y plugins fácilmente.

    • Soporta temas visuales que modifican el prompt con información útil, como el estado de Git o la rama actual.

  6. Mayor flexibilidad con scripts

    • Zsh ofrece más opciones y control sobre scripting en comparación con Bash.

  7. Mejor integración con Git

    • Incluye plugins que mejoran la experiencia al trabajar con Git, mostrando información de estado en el prompt.

Cómo instalar y configurar Zsh

  1. Instalar Zsh

    • En Ubuntu/Debian:

      sudo apt install zsh
      
    • En macOS (viene por defecto, pero puedes actualizarlo con Homebrew):

      brew install zsh
      
    • En Arch Linux:

      sudo pacman -S zsh
      
  2. Cambiar la shell por defecto a Zsh

    chsh -s $(which zsh)
    

    Luego, cierra sesión y vuelve a iniciarla para aplicar los cambios.

  3. Instalar Oh My Zsh (opcional, pero recomendado)

    sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
    

    Esto permite gestionar temas y plugins fácilmente.

  4. Activar plugins útiles
    Edita el archivo ~/.zshrc y en la línea de plugins=(git) puedes añadir más, como:

    plugins=(git zsh-autosuggestions zsh-syntax-highlighting)
    

    Luego, recarga la configuración:

    source ~/.zshrc
    

Conclusión

Zsh es una alternativa poderosa y flexible a Bash, con muchas mejoras en autocompletado, personalización y funcionalidad. Si usas la terminal con frecuencia, especialmente para desarrollo o administración de sistemas, vale la pena probarla y configurarla con Oh My Zsh para aprovechar todas sus ventajas.

Seguir leyendo
Tip nº9

T-mux

Marzo, 2025

Tmux (Terminal Multiplexer) es una herramienta poderosa que permite manejar múltiples sesiones de terminal dentro de una misma ventana. Es especialmente útil para desarrolladores, administradores de sistemas y usuarios que trabajan en servidores remotos.


¿Para qué sirve Tmux?

  • Multiplexar terminales → Puedes tener varias sesiones dentro de una misma terminal.

  • Dividir la pantalla → Permite dividir la terminal en paneles.

  • Sesiones persistentes → Si la conexión SSH se cae, Tmux mantiene la sesión abierta.

  • Trabajar con múltiples ventanas → Puedes cambiar entre diferentes ventanas fácilmente.


Comandos básicos de Tmux

1. Iniciar y administrar sesiones

  • Iniciar una nueva sesión:

    tmux
    
  • Iniciar una sesión con nombre:

    tmux new -s nombre_sesion
    
  • Listar sesiones activas:

    tmux ls
    
  • Reconectar a una sesión activa:

    tmux attach -t nombre_sesion
    
  • Cerrar sesión de Tmux:

    exit
    
  • Desvincular sesión sin cerrarla (para retomarla después):

    Ctrl + b, luego d
    

2. Manejo de ventanas y paneles

Tmux permite dividir la terminal en varias ventanas y paneles.

Ventanas (como pestañas en un navegador)

  • Crear una nueva ventana:

    Ctrl + b, luego c
    
  • Moverse entre ventanas:

    Ctrl + b, luego n  (siguiente ventana)
    Ctrl + b, luego p  (ventana anterior)
    
  • Listar todas las ventanas:

    Ctrl + b, luego w
    
  • Cerrar la ventana actual:

    Ctrl + b, luego &
    

Paneles (dividir la pantalla)

  • Dividir la pantalla verticalmente:

    Ctrl + b, luego %
    
  • Dividir la pantalla horizontalmente:

    Ctrl + b, luego "
    
  • Moverse entre paneles:

    Ctrl + b, luego flecha izquierda/derecha/arriba/abajo
    
  • Cerrar un panel:

    Ctrl + b, luego x
    

3. Guardar y restaurar sesiones

Si trabajas en un servidor remoto, es útil poder restaurar sesiones fácilmente.

  • Guardar el estado de la sesión:

    tmux detach
    
  • Restaurar una sesión desconectada:

    tmux attach -t nombre_sesion
    

Tmux es muy útil cuando necesitas trabajar con varias terminales al mismo tiempo sin abrir varias ventanas separadas. ¿Quieres algún truco más avanzado sobre Tmux? 🚀

Seguir leyendo
Tip nº8

Busqueda en Vim

Marzo, 2025

Muchas veces echo en falta tener una referencia de busqueda y reemplazo en vim, aprovechando la circunstancia pongo aqui unas notas:


1. Búsqueda y reemplazo

  • Buscar una palabra en el archivo:

    /palabra
    
  • Reemplazar una palabra en todo el archivo:

    :%s/viejo/nuevo/g
    
  • Confirmar cada reemplazo:

    :%s/viejo/nuevo/gc
    

2. Movimiento rápido

  • gg → Ir al inicio del archivo.

  • G → Ir al final del archivo.

  • 5G → Ir a la línea 5.

  • w → Moverse palabra por palabra hacia adelante.

  • b → Moverse palabra por palabra hacia atrás.


3. Copiar, cortar y pegar

  • yy → Copiar una línea.

  • dd → Cortar una línea.

  • p → Pegar después del cursor.

  • P → Pegar antes del cursor.

Si quieres copiar o cortar varias líneas, usa un número antes:

  • 5yy → Copiar 5 líneas.

  • 5dd → Cortar 5 líneas.


4. Dividir la pantalla (split)

  • :split archivo.txt → Abrir un archivo en una nueva ventana horizontal.

  • :vsplit archivo.txt → Abrir un archivo en una nueva ventana vertical.

  • Ctrl + w + w → Alternar entre ventanas.

  • Ctrl + w + h/j/k/l → Moverse entre ventanas.


5. Macros (grabar y repetir comandos)

Si necesitas repetir una secuencia de comandos:

  1. Presiona q seguido de una letra (ej. qa para grabar en el registro a).

  2. Escribe los comandos que deseas grabar.

  3. Presiona q nuevamente para detener la grabación.

  4. Ejecuta la macro con @a.

  5. Para repetirla varias veces, usa 3@a (repite 3 veces).


6. Uso de buffers

  • :e archivo.txt → Abrir un archivo en un nuevo buffer.

  • :ls → Ver la lista de buffers abiertos.

  • :b2 → Cambiar al buffer número 2.

  • :bd → Cerrar el buffer actual.


7. Modo visual para seleccionar texto

  • v → Entrar en modo visual.

  • V → Seleccionar líneas completas.

  • Ctrl + v → Selección en bloque (columnas).

  • y → Copiar la selección.

  • d → Cortar la selección.


8. Autocompletado

Mientras escribes en modo insert (i):

  • Ctrl + n → Sugerencias de palabras basadas en el archivo actual.

  • Ctrl + p → Buscar coincidencias previas en el archivo.


Estas son solo algunas funciones esenciales. ¿Te interesa alguna en particular o necesitas algo más avanzado? 🚀

Seguir leyendo
Tip nº7

Sort -k n

Marzo, 2025

El comando sort -k en shell se usa para ordenar archivos o listas de datos en función de una columna específica.

Sintaxis básica

sort -k N archivo.txt

Donde N es el número de la columna a partir de la cual se quiere ordenar.

Ejemplos de uso

1. Ordenar por la segunda columna

Supongamos que tenemos un archivo datos.txt con este contenido:

Carlos 35
Ana 28
Luis 40
Elena 22

Si ejecutamos:

sort -k 2 -n datos.txt

El resultado será:

Elena 22
Ana 28
Carlos 35
Luis 40

Aquí, -k 2 indica que queremos ordenar por la segunda columna, y -n asegura que la ordenación sea numérica.

2. Ordenar alfabéticamente por la primera columna

sort -k 1 datos.txt

Salida:

Ana 28
Carlos 35
Elena 22
Luis 40

3. Ordenar en orden inverso

Si queremos ordenar de mayor a menor, usamos -r:

sort -k 2 -n -r datos.txt

Salida:

Luis 40
Carlos 35
Ana 28
Elena 22

Opciones útiles

  • -n → Ordenación numérica.

  • -r → Orden inverso (de mayor a menor).

  • -t → Especificar un delimitador si los campos están separados por otro símbolo en vez de espacios.

    sort -t ',' -k 2 archivo.csv
    
  • -k N,M → Ordenar por un rango de columnas.

¿Quieres que adapte esta explicación a un caso específico que estés trabajando?

Seguir leyendo
Tip nº6

Funciones Syntax y TOhtml de vim

Marzo, 2025

Vim es un editor de texto muy potente, y dos de sus funciones útiles son :syntax y :TOhtml. Aquí te explico cómo funcionan:

1. :syntax (Resaltado de Sintaxis)

La función :syntax se usa para habilitar, deshabilitar o configurar el resaltado de sintaxis en Vim. Vim tiene soporte para resaltar la sintaxis de muchos lenguajes de programación, lo que facilita la lectura y edición de código.

  • Para activar el resaltado de sintaxis:

    :syntax on
    
  • Para desactivar el resaltado de sintaxis:

    :syntax off
    
  • Para refrescar el resaltado de sintaxis (útil si algo no se ve bien):

    :syntax enable
    

Si estás editando un archivo y Vim no detecta automáticamente el lenguaje, puedes forzar la sintaxis con:

:set syntax=python   " Para Python
:set syntax=html     " Para HTML

Puedes ver qué tipo de sintaxis está activa con:

:set syntax?

2. :TOhtml (Convertir Código en HTML con Colores)

El comando :TOhtml convierte el contenido del archivo actual en un archivo HTML con resaltado de sintaxis, útil si quieres compartir código en una página web con los mismos colores que ves en Vim.

¿Cómo usarlo?

  1. Abre un archivo en Vim con sintaxis habilitada.

  2. Ejecuta el comando:

    :TOhtml
    
  3. Vim generará un archivo HTML con el mismo código y resaltado de colores.

  4. Guarda el archivo HTML con:

    :w nombre_archivo.html
    
  5. Ahora puedes abrir el archivo HTML en un navegador y ver tu código con resaltado de colores.

Usos comunes:

  • Compartir código en blogs o páginas web con formato atractivo.

  • Crear documentación con código resaltado.

  • Guardar capturas de código en formato HTML para referencia.

Si usas Vim frecuentemente para programar, estas funciones pueden hacerte la vida más fácil. ¿Quieres más detalles sobre alguna en particular?

Seguir leyendo
Tip nº5

comparador [[..]]

Marzo, 2025

Aquí va otro truco útil para Shell Scripting:

Usa [[ ... ]] en lugar de [ ... ] para comparaciones más potentes en Bash

Cuando necesitas hacer comparaciones en un script, es mejor usar [[ ... ]] en lugar de [ ... ], ya que es más seguro y flexible.

📌 Ejemplo con [ ... ] (forma tradicional, menos potente)

#!/bin/bash

read -p "Introduce un número: " num

if [ "$num" -gt 10 ]; then
    echo "El número es mayor que 10"
fi

⚠️ Problemas:

  • Necesita -gt en lugar de > para números.

  • Puede fallar si num está vacío.

📌 Ejemplo con [[ ... ]] (mejor opción)

#!/bin/bash

read -p "Introduce un número: " num

if [[ $num -gt 10 ]]; then
    echo "El número es mayor que 10"
fi

✅ Ventajas de [[ ... ]]:

  • Soporta operadores lógicos (&&, ||) sin necesidad de -a o -o.

  • Permite comparaciones de cadenas con > y <.

  • No es necesario poner comillas en variables.

📌 Ejemplo con comparaciones de cadenas

cadena="Hola"

if [[ $cadena == "Hola" ]]; then
    echo "Las cadenas son iguales"
fi

✅ Más legible y seguro que [ "$cadena" = "Hola" ].

🔥 Conclusión: Usa [[ ... ]] para condiciones más seguras y limpias en Bash. 🚀

Seguir leyendo
Tip nº4

Uso de $( ) en lugar de `...`

Marzo, 2025

Aquí va otro truco útil para Shell Scripting:

Usa $(...) en lugar de las comillas invertidas `...` para capturar la salida de un comando

En Bash, a veces necesitas capturar la salida de un comando y guardarla en una variable. Aunque se pueden usar comillas invertidas, es mejor usar $(), ya que es más legible y admite anidación.

📌 Ejemplo con comillas invertidas (forma antigua y menos legible)

archivo=`ls | grep "log"`
echo "Archivo encontrado: $archivo"

⚠️ Problemas: Difícil de leer y propensa a errores si anidas comandos.

📌 Ejemplo con $() (mejor forma)

archivo=$(ls | grep "log")
echo "Archivo encontrado: $archivo"

✅ Más fácil de leer y admite anidación sin problemas.

📌 Ejemplo con anidación

resultado=$(grep "$(date +%Y-%m-%d)" registro.log)

🔹 Aquí, $(date +%Y-%m-%d) se evalúa primero y luego grep usa el resultado.

🔥 Conclusión: Usa $() en lugar de `...` para un código más limpio y seguro. 🚀

Seguir leyendo
Tip nº3

Usar fd en lugar de find

Marzo, 2025

Usar fd en lugar de find para búsquedas más rápidas y fáciles

El comando find en Linux puede ser lento y tedioso, pero fd es una alternativa más rápida y con mejor sintaxis.

📌 Ejemplo: Buscar archivos con find vs fd

Con find:

find . -name "*.py"

Con fd (mucho más simple y rápido):

fd ".py"

📌 Ejemplo: Buscar archivos ignorando los de .gitignore

fd --hidden --no-ignore "*.log"

Esto muestra archivos ocultos pero ignora los excluidos en .gitignore.

🔹 Instalación:

  • Ubuntu/Debian: sudo apt install fd-find

  • macOS (Homebrew): brew install fd

  • Windows (Scoop): scoop install fd

¡Mucho más rápido y cómodo que find! 🚀

Seguir leyendo
Tip nº2

Usar bat en lugar de cat

Marzo, 2025

Usar bat en lugar de cat para leer archivos con colores y numeración

El comando cat es útil, pero bat mejora la visualización con:
Colores para sintaxis (ideal para leer código)
Numeración de líneas
Integración con git (resalta cambios en archivos versionados)

📌 Ejemplo: Comparación entre cat y bat

Con cat:

cat script.py

Salida monótona en blanco y negro.

Con bat:

bat script.py

Salida con colores resaltados y líneas numeradas.

📌 Ejemplo: Ver diferencias en archivos Git

bat --diff script.py

Resalta los cambios en comparación con la última versión en Git.

🔹 Instalación:

  • Ubuntu/Debian:

    sudo apt install bat
    

    ⚠️ En algunos sistemas, se instala como batcat, así que usa batcat archivo.py.

  • macOS (Homebrew):

    brew install bat
    
  • Windows (Scoop):

    scoop install bat
    

Con bat, lmucho nejor para ver archivos !!

Seguir leyendo
Tip nº1

Usa entr para ejecutar comandos automáticamente cuando un archivo cambia

Marzo, 2025

Usa entr para ejecutar comandos automáticamente cuando un archivo cambia

Cuando trabajas con scripts o configuraciones y necesitas probar cambios sin ejecutar el comando manualmente cada vez, usa entr.

📌 Ejemplo: Ejecutar un script de Python cada vez que se modifique

 
script.py | entr python3 script.py

Cada vez que guardes script.py, entr lo ejecutará automáticamente.

📌 Ejemplo: Reiniciar un servicio cuando un archivo de configuración cambia

 
ls nginx.conf | entr sudo systemctl restart nginx

Cada vez que edites y guardes nginx.conf, nginx se reiniciará automáticamente.

🔹 Instalación:

  • Ubuntu/Debian: sudo apt install entr

  • macOS (Homebrew): brew install entr

  • Windows:

🔥 ¡Ideal para desarrollo ágil sin estar repitiendo comandos manualmente! 🚀

Seguir leyendo

Arquitectura orientada a eventos

Marzo, 2025

Anteriormente, ya habíamos hablado de patrones orientados a eventos, habíamos puesto un Kafka en funcionamiento, con algunos publicadores y suscriptores. Pues bien, hoy vamos a profundizar en un escenario puramente orientado a eventos. Primero, explicaré cómo se comporta un sistema orientado a eventos, las ventajas que tiene y también comentaré los inconvenientes, que, por supuesto, existen. Después, como siempre, haremos un poco de códi

Seguir leyendo

Arquitectura hexagonal

Marzo, 2025

Hoy vamos a jugar con el tema de la Arquitectura Hexagonal, o como tambien se suele llamar, "puertos y adaptadores", es un enfoque que separa claramente la lógica de negocio de los detalles técnicos externos. Os plantearé sus principales caracteristicas y despues nos meteremos en código, que imagino que colgaré en un repo.

Este patrón de diseño fue desarrollado por Alistair Cockburn en 2005. El objetivo de este patron de diseño es el de buscar el bajo acoplamiento y alta cohesion. Para ello se basa en la separacion del core central donde se han encapsulado el comportamiento de la aplicacion.

Seguir leyendo

Kubernetes sobre Minikube

Marzo, 2025

Hoy vamos a jugar un poco con la tecnología Kubernetes. En su día ya hablamos del modo de contener-izar aplicaciones en contenedores Docker. Ahora vamos a dar el siguiente paso que consiste en la orquestación de contenedores. Cuando hablamos de orquestación nos referimos a la capacidad de un entorno cloud de mantener una aplicación multicontenedor, permitiendo una escalabilidad hacia arriba y hacia abajo, con un garantía de la disponibilidad. Monitorización de los contenedores y auto-reparación de los contenedores comprometidos. Expulsión de contenedores obsoletos para la introducción de unos nuevos con un nuevo despliegue sin perdida de servicio. Una gran característica de Kubernetes es que la configuración se gestiona de forma declarativa, facilitando de ese modo, lo que se pretende, y comparándolo con lo que se tiene, y de esa manera poder mantener el down-time bajito. Como en otras ocasiones todo esto lo probaremos después en un entorno de pruebas que montaremos desde cero.

 

Seguir leyendo

Internet de las cosas, MQTT y ESP32

Marzo, 2025

Es este artículo vamos a investigar sobre el tan archifamoso Internet-de-las-cosas o IOT, del inglés Internet Of Things. Vamos a tocar varias cosas, revisaremos la arquitectura de un tipico escenario de comunicación entre dispositivos, veremos el protocolo MQTT y sus características, instalaremos un servidor, y luego nos conectaremos a este. También haremos unas publicaci

Seguir leyendo

Mysql sobre Docker

Septiembre, 2021

 

Siguiendo con la serie practica en Docker hoy vamos a darle una vuelta a Mysql sobre Docker. Veremos como nos permite muchísima flexibilidad, por ejemplo convivir varias bases de datos en la misma máquina. Esto es ideal por ejemplo para separar los entornos de PRE y PRO. En el anterior articulo de Docker ya dimos unas pinceladas de la instalación de Docker, asi que continuaremos a partir de ahí.
Para empezar debemos saber que Docker dispone de una plataforma con miles de imagenes disponibles para ser descargadas, llamada Docker hub.

Seguir leyendo

Securiza tu web con Let's Encrypt

Marzo, 2025

Ya teniamos la web terminada, la habiamos subido a un repositorio y hasta aprendimos a desplegarla usando git hooks o jenkins. Pero un capítulo estaba pendiente: hacerla segura. Allá por 2018 Google empezó a penalizar los sitios no seguros, y los que no llevaban el encabezado https:// los marcaba con una advertencia de "sitio no seguro". Ahora considera el protocolo valido y por defecto al https, así que de cara al posicionamiento es crucial. Garantiza varias cosas, pero la principal caracteristica es que la web que muestra un candado en su direccion, es legal y relamente es quien dice ser. La segunda propiedad que ganamos al instalar un certificado es que cifra nuestar conexion, así la comunicación cliente-servidor queda protegida con el protocolo SSL/TLS.

Esto nos protege de ataques Man-in-the-middle. Consiste en que un atacante se situa entre el cliente y el servidor intrereceptando el trafico, espiando el contenido y hasta insertando su propio contenido sin que las dos partes puedan advertirlo.

Seguir leyendo

Despliega tu website con Git

Marzo, 2025

Pues bien, ya tienes terminada tu pagina web. En tu entorno local tienes tu nueva flamante web, que te has currado con el framework de moda. Lo empaquetas en un zip o un tgz y lo "efetepeas" copias al servidor en producción, lo descomprimes y listo. Peeeero, a las 3 de la mañana nuestro cliente de Japon ha indicado que no se puede registrar nuevos usuarios. Al parecer la última versión del código es incosistente. Los tests, si es que había, no tuvieron en cuenta que los cambios en la bbdd aun no estaban desplegados. Así que pasaron por alto un campo nuevo de la tabla de usuarios que faltaba y que impide registrar usuarios nuevos.

Seguir leyendo

Introduccion a Kafka

Marzo, 2025

Hoy hemos venido a jugar con Kafka o mejor dicho Apache Kafka, ya que se trata de un proyecto bajo el paraguas de Apache Foundation. No todo el mundo es consciente de la aportacion de esta institucion, con sus cientos de proyectos. Pues vamos allá, Apache Kafka, es un sistema de mensajes basado en un Patron Publisher/Suscriber, distribuido, particionado, resiliente y replicado. Veremos sus caracteriticas principales y despues como de costumbre montaremos una pequeña arquitectura con Kafka en un entorno local, con varios productors y consumidores. Para hacerlo lo más real posible plantearemos un entorno lo mas heterogeneo posible, con piezas en Python y en PHP (Si, PHP tambien sabe jugar con Kafka)

En un principio, nuestra empresa era pequeña, con unos poco servicios nos apañabamos. la monitorización se hacia de aquella manera o simplemente no habia, habia varios servidores que tenian varios roles y todo iba la mar de bien. En un momento dado la empresa empieza a crecer, y se le añade esto y aquello. Los sistemas van madurando, de tal manera que lo que en un principio era un sistema facil de desarrollar y mantener se convierte en una tarea imposible. Tenemos un sistema muy heterogeneo, con partes en Java, otras partes en ASP y las partes mas actualizadas en PHP o Python, cualquier cambio supone un desafio, posiblemente parada  de servicio, lo que vemos aqui:

Seguir leyendo

¿Que es un proxy inverso?

Marzo, 2025

Llevo un tiempo queriendo hacer algunas pruebecillas con el tema de los proxys, los proxys inversos, balanceadores de carga, etc y hoy por fin de la mano de Docker vamos a montar un pequeño sistema en local, en muy pocos pasos y ultrafacil.

Antes de liarnos a descargar imágenes y tal vamos a dar un paso a tras y ver qué es realmente un proxy inverso y en que se diferencia de un proxy normal. Conceptualmente son bastante parecidos pero hay unas diferencias sutiles. Podríamos decir que la diferencia mas importante es a quien da servicio. Empezaremos con un proxy. Pues un proxy es una pieza intermedia entre un usuario y un servicio en internet que cachea o filtra ciertos contenidos dependiendo del tipo de usuario o tipo de categoría del servicio. Imagina que un empleado en un empresa decide que es buena idea acceder a Facebook en horario laboral. El proxy detectaría la categoría de ese empleado y sus privilegios asociados y podría prohibir el acceso a este servicio. Por otro lado imagina que ciertos empleados acceden a la web corporativa de su filial en Japón, y tras la primera consulta el proxy guardaría una copia de dicha web para que el segundo empleado no tuviera que esperar a que se descargue todo el contenido desde Japón.

Seguir leyendo

Docker, Capitulo 1

Marzo, 2021

Hoy os voy a hablar de Docker. Llevaba muchisimo tiempo queriendo escribir sobre esta tecnología, pues vamos allá. Docker es relativamente joven, de 2013, en muy pocos años se ha convertido en el estandar de facto, con un gran futuro por delante. Se trata de una tecnología que facilita de un modo extremo ciertos procesos, los despliegues, el testeo, la escalabilidad, la resiliencia (me encanta esta palabra ;^)), etc. Vamos a definir qué es Docker, pero antes vamos a decir lo que no es. Docker no es virtualización, como puedan ser VMware, KVM o VirtualBox. Antes de continuar con lo que es o lo que no es, vamos a dar un paso pasa atras para entender en qué consiste la virtualizacion.

Tradicionalmente el departamento de sistemas de una empresa tenía toda su infrastructura, como suelen decir fuera, on-premise, o in situ, en el CPD. La virtualización vino a dar respuestas y soluciones a problemas a la hora de permitir múltiples sistemas operativos corriendo en la misma máquina . La virtualización no es más que la creación, a traves de software de una emulacion de un recurso hardware. El hipervisor explota la capacidad de ciertos ordenadores, no todos lo permiten, de virtualizar los recursos, el procesador, la memoria, los interfaces de red, etc, de la máquina. Se debe elegir que proporción queremos que se asigne a la máquina virtualizada, cantidad de GB de memoria o nucleos de CPU. De este modo permiten ejecutar más de un sistema operativo en la misma máquina simultaneamente sobre ese hardware virtualizado.

Seguir leyendo

JWT sobre Codeigniter

Diciembre, -0001

    Hasta ahora, gran parte de la autenticación en sistemas se hacía por variables de sesión y cookies, de tal manera que se almacenaban estas en el lado del servidor creando un entorno relativamente robusto. El inconveniente es que esta arquitectura tiene un problema con la escalabilidad al tener que registrar en bbdd cada login del usuario.


Bien, entonces ¿que aporta JWT? Pues resumiendo mucho: el almacenamiento del token en el cliente. El proceso es sencillo, el usuario se loga en el servidor por medio de una pareja clave-contraseña o a traves de un proveedor de servicios externos, tipo Google, Facebook, etc. Tras esta autorización se construye un token con una serie de campos, especificamente para este usuario, hora, rol, etc. Tras la creación del token éste será empleado en cada operación que se haga al servidor.
Esta manera de autenticarse contra un servidor encaja con la arquitectura REST, haciendo que nuestro servicio web esté completamente sin información de estado: stateles. Entonces al almacenar toda la información de sesión en el cliente nuestra arquitectura se vuelve escalable sin afectar al rendimiento. Otra de las virtudes de un servicio web de este tipo es que se desacopla del cliente, así que nuestro servicio puede consumirse por igual, desde una aplicación de escritorio, un movil o una web.

Entonces, al tema. Un token que forma tiene, de que está compuesto? ¿que es eso de JWT? pues JWT responde al acrónimo Json Web Tokens, éste está dividido en tres substrings separados por un caracter punto y podria tener el siguiente aspecto:

Seguir leyendo

PHPUnit sobre Codeigniter

Diciembre, -0001

Como todos los frameworks, Codeigniter puede trabajar con Phpunit para poder desarrollar una plataforma de testeo de nuestra aplicación. En este articulo vamos a hablar de como instalarlo y configurarlo. Para empezar necesitaremos ambos instalados, CodeIgniter y PHPunit. El primero lo descargaremos de la web en un comprimido, no tiene ninguna ciencia, se se descarga, se descomprime y listo. El segundo lo instalaremos via composer. Lo primero es crear nuestro archivo composer.json. Este archivo sera el que alimente el comando composer, que tendrás que instalar. si ya existiera el archivo json solo faltaria asegurarse de que tenemos la linea con la version adecuada de phpunit


{
  "require-dev": {
    "phpunit/phpunit": "4.* || 5.*"
  }
}

Una vez creado el archivo en el raiz de nuestro proyecto le damos a composer:

Seguir leyendo

Introduccion a Git

Marzo, 2025

En esta entrada os voy a dar unas pinceladas, el ABC imprescindible para poder manejarse con GIT. Antes de empezar os contaré un poco de historia sobre el Git. Allá por 1991, Linus Torwalds andaba con el desarrollo del kernel de Linux. Este proyecto se llevaba de forma colaborativa por un conjunto de personas que contribuian desinteresadamente al mismo. Hasta 10000 personas y mas de 1000 empresas llegaron a participar en el proyecto. Para poder coordinar a este equipo de desarrollo distribuido por todo el mundo rapidamente se hizo necesaria una herramienta para colaborar.

El 25 de agosto de 1991 Linus Torwalds publicó en una entrada en las newsreaders del grupo comp.os.minix lo siguiente:

Hello everybody out there using minix -

I'm doing a (free) operating system (just a hobby, won't be big and professional like gnu) for 386(486) AT clones. This has been brewing since april, and is starting to get ready. I'd like any feedback on things people like/dislike in minix, as my OS resembles it somewhat (same physical layout of the file-system (due to practical reasons) among other things).

Seguir leyendo

Google Api PageSpeed & Symfony

Febrero, 2021

En esta entrada os voy a hablar del uso de Apis de Google. Google tiene infinidad de servicios disponibles para ayudarnos en nuestros desarrollos, Google Webmasters, Google AnaliticsMapas, History location, etc . La api que vamos a usar es PageSpeed, un servicio que ofrece Google para poder averiguar el pagerank de una web. Para hacerlo más interesante crearemos un servicio dentro del contenedor de servicios de una aplicación Symfony y lo llamaremos desde nuestro controlador. Este servicio nos da una serie de datos, como velocidad, recursos, infracciones, errores. Aquí teneis la dirección del servicio para ver que ofrece https://developers.google.com/ speed/pagespeed/insights/ Si entramos y revisamos esta misma web, veamos lo que nos dice:

resultado_pagespeed_dg_web

 

No esta mal del todo: un 90/100, alguna cosa a revisar, muy interesante. Por curiosidad lanzamos al mismo Google y nos da un 97/100.

Empezaremos por definir nuestro servicio en el archivo de configuracion services.yml.

 

parameters:
#    parameter_name: value
     pageRank.class: daniel\D1Bundle\Services\CurlService


services:
    my_api_call:
        class:        "%pageRank.class%"
        arguments:    [url]

Excelente, ya tenemos nuestro servicio configurado, al que hemos llamado my_api_call, que invocará a la clase definida en el parametro pageRank.class con valor CurlService, declarado dentro de mi bundle. Muy bien, ahora nos vamos a la carpeta de servicios dentro del bundle donde éstos se alojaran:

Seguir leyendo

Memcached vs Redis

Febrero, 2021

Algunas veces me he visto en la encrucijada de elegir entre Memcache, Memcached y Redis. A veces la información no es del todo precisa y a veces incluso alguna confusión entre Memcache y Memcached. Al buscar información encontramos que el rendimiento de estos últimos es similar inclinandose a favor de Memcached, aproximadamente un 16%. veamos los siguientes datos.

 

memcache vs memcached: 10000 keys
memcached set: 0.91661500930786
memcached get: 0.86234307289124
memcache set: 1.0546097755432
memcache get: 1.0519700050354

 

Efectivamente los resultados dan un margen a favor de Memcached, así que discutiremos entre Redis y Memcached. Ambos tienen en común que los dos son demonios encargados en almacenar parejas de datos clave-valor en memoria, pudiendo recuperarse desde un cliente. Hasta aquí las similitudes. Memcached es distribuido, es decir podemos tener un conjunto de servidores que atiendan peticiones. Redis puede extender su persistencia a disco como si de una base de datos se tratata, para ser mas precisos, Redis puede considerarse como un motor de base de datos en memoria. Redis además de almacenar parejas permite almacenar en memoria estructuras de datos, como listas, conjuntos o conjuntos ordenados, como dice en su descripcion, Redis es "Memcached on steroids". Sin embargo Memcached es algo más rapido y es distribuido, obteniendo una facil scalabilidad. Redis por su parte no es distribuido, pero permite su expansión por medio de clusters, que lo hace mas complejo de mantener

Seguir leyendo

Metodos y variables estaticas

Diciembre, -0001

Uno de los aspectos poco usados y mas oscuros de la programacion PHP es la funcionalidad que nos provee la palabra reservada Static. En esta entrada hablaremos de la palabra reservada Static y del operador de resolucion de ambito "::".  A este operador tambien se le conoce por el fantastico e incomprensible nombre Paamayin Nekudotayim, que  literalmente del hebreo quiere decir doble pareja de dos puntos. Dicho esto puedes olvidar su nombre pero es una frikada digna de contar entre cervezas.

Bien, una cerveza... digo.. la palabra reservada Static aplica a variables en una funcion o dentro de una clase, a variables miembro o a los metodos. Veremos todos ellos con algun ejemplo que nos dejaran claro su uso.

Entonces, ¿que es una variable estatica? Una variable estatica es una variable que solo existe en un ambito de una funcion pero que mantiene el valor cuando la funcion termina su ejecucion. Es decir recuerda su valor la proxima vez que se llama a la funcion ¿Como? Si ha terminado su ejecucion, deberia destruirse!! Veamos un ejemplo:


function mifuncion(){
   static $a = 1;
   $a *= 2;
   echo $a.'\n';
}
mifuncion();
mifuncion();
mifuncion();

Seguir leyendo

Servicios Web Rest con Symfony

Diciembre, -0001

Vamos a describir en este articulo la creacion de un servicio web basado en peticiones REST con un servicio de Symfony. A lo largo y ancho de la web encontraremos infinidad de servicios parecidos que entregan los resultados en JSON, XML o texto plano. Los resultados de una operación pueden venir organizados en arrays listo, por ejemplo, para poblar un desplegable mediante una operacion AJAX. Podemos ver como Twitter tiene servicios muy parecidos al que vamos a crear que devuelven los resultados via json. Por ejemplo podemos ver la info que devuelev para un usuario :


https://api.twitter.com/1.1/users/show.json?screen_name=rsarver

{
  "profile_sidebar_fill_color": "F8FCF2",
  "profile_sidebar_border_color": "547980",
  "profile_background_tile": true,
  "name": "Ryan Sarver",
  "profile_image_url": "http://a0.twimg.com/profile_images/1777569006/image1327396628_normal.png",
  "created_at": "Mon Feb 26 18:05:55 +0000 2007",
  "location": "San Francisco, CA",
  "follow_request_sent": false,
  "profile_link_color": "547980",
  "is_translator": false,
  "id_str": "795649",
  "default_profile": false,
  "contributors_enabled": true,
  "favourites_count": 3162,
  "url": null,
  "profile_image_url_https": "https://si0.twimg.com/profile_images/1777569006/image1327396628_normal.png",
[...]
}

En este artículo no nos detendremos en detalles secundarios como instalación del composer, establecimiento de permisos en el sistema de archivos o creación de la bbdd. Empezaremos desde el principio, creando nuestro proyecto desde cero, en la version 2.7 que es la más actual.

Seguir leyendo

PHPunit: Testeo de bases de datos

Diciembre, -0001

Vamos a echar un ojo a la extensión database de PHPunit, PHPUnit_Extensions_ Database_TestCase, una de las extensiones que posee para testear operaciones contra la bbdd.

Cuando usamos esta extensión añadimos dos metodos importantes, getconnection() y getDataSet(). Con el primero obtenemos un objeto conexión a la base de datos. Con el segundo obtenemos un subconjunto de datos y lo escribimos en nuestra base de datos. Este dataset puede estar basado en un archivo estatico o en queries.

En escenarios complejos los ficheros estaticos o fixtures, nos ayudarán a establecer un escenario sobre el cual probar nuestros métodos. En ocasiones cuando es necesario probar un método que efectúa una operación muy concreta, por ejemplo efectuar el balance contable de un mes de un cliente en el presente año, una opción es crear un fixture personalizado que creará el escenario necesario previo a la prueba.

Una cosa hay que tener claro. Los tests unitarios no son test de bases de datos, un test unitario testea código y comprueba que ha hecho lo que tenia que hacer. Veamos lo que tiene que hacer un test de base de datos:

1.- Poner la base de datos en un determinado estado controlado y acotado (eso es, con un fixture).

2.- Ejecutar el código que efectúa operaciones con la base de datos.

3.- Verificar que el estado actual y lo esperado son lo mismo.

Seguir leyendo

Liskov Substitution Principle, LSP

Diciembre, -0001

El tercero de los puntos de SOLID es el principio de sustitucion de Liskov. Fue desarrollado por Barvara Liskov y Jeannette Marie Wing en la decada de los noventa. En su definición más formal tenemos que: si S es un subtipo de T, entonces los objetos de tipo T en un programa de computadora pueden ser sustituidos por objetos de tipo S (es decir, los objetos de tipo S pueden sustituir objetos de tipo T), sin alterar ninguna de las propiedades deseables de ese programa (la corrección, la tarea que realiza, etc.).

Esto traducido al ámbito de la orientación a objetos, nos dice que si a un método M le podemos pasar objetos t1 de la clase T, el método hace correctamente su función. Entonces si tenemos que La clase S hereda de T e instanciamos un objeto s1 de la clase S, entonces podríamos pasarle este objeto s1 al metodo M y todo funcionará sin ningun problema.

En el mundo de la orientacion a objetos el concepto de herencia o extension se puede traducir al lenguaje hablado como: "ES UN". Cuando decimos X es un Y, entonces podemos aplicar herencia entre nuestras dos entidades:

Seguir leyendo

Open Close Principle, OCP

Diciembre, -0001

Lo que nos dice este principio es que "las entidades de software (clases o funciones…) deben estar abiertas para extenderse, pero cerradas para modificación". Esto no es mas que una planificacion correcta del flujo de vida de una entidad.

Acotando en la medida de lo posible el continuo remendado de dicha entidad dejando solo la posibilidad de actualizar o extender.

Nuestro objetivo es dejar la clase inalterada y dejar solo la puerta abierta a la posibilidad de añadir nuevo comportamiento. Para poder llevar a cabo esto es imprescindible tener un conocimiento de la aplicacion y de su alcance profundo, aunque esto no siempre es posible. Veamos un ejemplo sencillo que nos hará rapidamente violar el principio Abierto-Cerrado.

Seguir leyendo

Single Responsability Principle, SRP

Diciembre, -0001

El principio de la única responsabilidad es tan sencillo como su nombre indica. Una clase solo debe tener una única función o cometido. A primera vista podría parecer sencillo y trivial pero en ocasiones no es así y es facil caer en la tentación: "ya que estoy aqui le meto esto también". Se acaba teniendo clases que hacen infinidad de cosas dificultando el mantenimiento y el testeo. Una clase con menos responsabilidades que otra tendra más garantías de perdurar en el tiempo, sin estar sujeta a reiteradas mejoras y actualizaciones. Supongamos una clase encargada de hacer una única tarea. Aplicar aqui reusabilidad de codigo será siempre más fácil que si heredamos una librería con miles de lineas y n funciones que habrá que repasar para poder integrar en nuestro código. El principio de la unica responsabilidad o SRP, por sus siglas en ingles establece que:

Solo debe haber un motivo para cambiar una clase, en el sentido de que solo debe tener una unica tarea.

Seguir leyendo

Be S.O.L.I.D. my friend

Marzo, 2025

A principios de 2000 el ingeniero americano Robert C Martin dió forma a los conceptos que hay detrás del acronimo SOLID. Estos 5 principios reunen las bases que todo programador de orientación a objetos debería tener presentes a la hora de desarrollar.

InicialConcepto
S
Principio de Única Responsabilidad (Single responsibility principle)
la noción de que un objeto solo debería tener una única responsabilidad.
O
Principio Abierto/Cerrado
la noción de que las “entidades de software … deben estar abiertas para su extensión, pero cerradas para su modificación”.
L
Principio de sustitución de Liskov
la noción de que los “objetos de un programa deberían ser reemplazables por instancias de sus subtipos sin alterar el correcto funcionamiento del programa”.
I
Principio de Segregación de la Interface (Interface segregation principle)
la noción de que “muchas interfaces cliente específicas son mejores que una interfaz de propósito general.”
D
Principio de Inversión de Dependencia (Dependency inversion principle)
la noción de que uno debería “Depender de Abstracciones. No depender de concreciones.”
La Inyección de Dependencias es uno de los métodos que siguen este principio.

Seguir leyendo