<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Horacio Degiorgi</title>
    <description>The latest articles on DEV Community by Horacio Degiorgi (@horaciodegiorgi).</description>
    <link>https://dev.to/horaciodegiorgi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F221689%2F7fcc65e6-08b1-4085-9721-159f438295aa.jpg</url>
      <title>DEV Community: Horacio Degiorgi</title>
      <link>https://dev.to/horaciodegiorgi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/horaciodegiorgi"/>
    <language>en</language>
    <item>
      <title>Meet mytuis: A Sleek Terminal Application Manager Built with Bash and Gum</title>
      <dc:creator>Horacio Degiorgi</dc:creator>
      <pubDate>Sun, 21 Jun 2026 15:48:54 +0000</pubDate>
      <link>https://dev.to/horaciodegiorgi/meet-mytuis-a-sleek-terminal-application-manager-built-with-bash-and-gum-39b9</link>
      <guid>https://dev.to/horaciodegiorgi/meet-mytuis-a-sleek-terminal-application-manager-built-with-bash-and-gum-39b9</guid>
      <description>&lt;p&gt;Having spent over 25 years in software development and managing countless Linux environments, I've accumulated a vast collection of custom bash scripts, containers, and CLI tools. Remembering their exact paths and managing them efficiently directly from the terminal is a common challenge. To solve this, I built &lt;strong&gt;mytuis&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
mytuis is a small, attractive terminal UI for managing a personal catalogue of applications. It is built with gum and plain bash, with persistent storage in a human-readable YAML file.&lt;br&gt;
GITHUB REPO : &lt;a href="https://github.com/horaciod/mytuis" rel="noopener noreferrer"&gt;https://github.com/horaciod/mytuis&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3s8lcy60o65haulkmu0v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3s8lcy60o65haulkmu0v.png" alt=" " width="361" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Why mytuis?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I wanted a tool that didn't require heavy dependencies or a complex setup, but still looked great and provided a smooth user experience. Here is what mytuis brings to the terminal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CRUD operations:&lt;/strong&gt; You can create, read, update, and delete application entries from a single menu.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quick launch:&lt;/strong&gt; Pick an app from the filterable list and it is launched immediately. It replaces the manager process via exec, meaning no extra shell window is left behind.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart path handling:&lt;/strong&gt; It accepts absolute paths (like /usr/bin/firefox), relative paths (./scripts/myscript.sh), tilde paths (~/bin/foo), or plain command names looked up in your $PATH (firefox).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistent metadata:&lt;/strong&gt; Every entry stores its name, description, absolute path, creation date, and last-used date.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Friendly TUI:&lt;/strong&gt; You get clear menus, color-coded messages, and clean borders, all powered by gum.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Under the Hood: Plain Text and Standard Utils&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Simplicity and standard compliance were key goals. mytuis requires &lt;strong&gt;bash ≥ 4&lt;/strong&gt; and standard Unix utilities like awk, sed, grep, date, and tput.&lt;br&gt;&lt;br&gt;
Your catalogue is stored at ~/.mytuis.yaml. Because it is a standard YAML file, it can be inspected, edited, or backed up with any text editor. It is also completely safe to sync with a dotfiles repository or version-control.&lt;br&gt;&lt;br&gt;
To ensure data integrity, all file operations are performed atomically by rewriting the YAML file from scratch on every change, so there is no risk of leaving the file in a half-written state.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;How to Get Started&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;First, ensure you have &lt;strong&gt;gum&lt;/strong&gt; installed using your package manager (brew install gum for macOS, pacman -S gum for Arch, or apt install gum for some Debian-based distros).&lt;br&gt;&lt;br&gt;
Then, copy mytuis.sh somewhere on your $PATH:&lt;/p&gt;

&lt;p&gt;Bash&lt;br&gt;&lt;br&gt;
install -m 755 mytuis.sh /usr/local/bin/mytuis&lt;/p&gt;

&lt;p&gt;Alternatively, you can simply run it directly from the cloned repository using ./mytuis.sh. The script creates the ~/.mytuis.yaml file automatically on the first run.&lt;br&gt;&lt;br&gt;
From the main menu, you can start adding your apps. You'll just need to provide a unique name, a free-form description, and the path. The list is filterable, so you can quickly find any app by typing into the prompt.&lt;br&gt;&lt;br&gt;
Give it a try in your own terminal workflow and let me know what you think!&lt;/p&gt;

</description>
      <category>bash</category>
      <category>linux</category>
      <category>tui</category>
      <category>cli</category>
    </item>
    <item>
      <title>Encuentra tu archivo YAML de Docker Compose en segundos con fzf. 🚀</title>
      <dc:creator>Horacio Degiorgi</dc:creator>
      <pubDate>Sun, 19 Apr 2026 16:00:09 +0000</pubDate>
      <link>https://dev.to/horaciodegiorgi/encuentra-tu-archivo-yaml-de-docker-compose-en-segundos-con-fzf-3n25</link>
      <guid>https://dev.to/horaciodegiorgi/encuentra-tu-archivo-yaml-de-docker-compose-en-segundos-con-fzf-3n25</guid>
      <description>&lt;p&gt;¿Alguna vez te has encontrado en un servidor con decenas de contenedores corriendo y no recuerdas exactamente dónde está el archivo docker-compose.yml de uno de ellos?&lt;/p&gt;

&lt;p&gt;Docker Compose inyecta etiquetas (labels) en los contenedores al crearlos, pero consultarlas manualmente con docker inspect es un proceso lento. Para solucionar esto, hice un pequeño script en Bash que utiliza fzf para seleccionar el contenedor y mostrarte toda su info relevante al instante.&lt;/p&gt;

&lt;p&gt;📺 Miralo en acción&lt;/p&gt;


&lt;div class="ltag_asciinema"&gt;
  
&lt;/div&gt;


&lt;p&gt;El Script: fcompose.sh&lt;/p&gt;

&lt;p&gt;Este script permite:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Selección interactiva con fzf de contenedores en ejecución.

Vista previa (Preview) de redes, IPs, mapeo de puertos y volúmenes montados.

Ruta absoluta del archivo YAML que define al contenedor.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# Función para obtener la ruta del YAML desde las etiquetas de Docker&lt;/span&gt;
get_compose_path&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;
    docker inspect &lt;span class="nt"&gt;--format&lt;/span&gt; &lt;span class="s1"&gt;'{{ index .Config.Labels "com.docker.compose.project.config_files" }}'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$target&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 2&amp;gt;/dev/null
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="c"&gt;# Comando de preview con colores para visibilidad&lt;/span&gt;
    &lt;span class="nv"&gt;PREVIEW_CMD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"echo -e '&lt;/span&gt;&lt;span class="se"&gt;\e&lt;/span&gt;&lt;span class="s2"&gt;[1;36m--- REDES ---&lt;/span&gt;&lt;span class="se"&gt;\e&lt;/span&gt;&lt;span class="s2"&gt;[0m'; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
        docker inspect {1} --format '{{range &lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;net, &lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;conf := .NetworkSettings.Networks}}- {{ &lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;net }} ({{ &lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;conf.IPAddress }}){{println}}{{end}}'; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
        echo -e '&lt;/span&gt;&lt;span class="se"&gt;\n\e&lt;/span&gt;&lt;span class="s2"&gt;[1;36m--- PUERTOS (Host -&amp;gt; Contenedor) ---&lt;/span&gt;&lt;span class="se"&gt;\e&lt;/span&gt;&lt;span class="s2"&gt;[0m'; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
        docker inspect {1} --format '{{range &lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;p, &lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;conf := .NetworkSettings.Ports}}{{range &lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;conf}}{{ .HostIp }}:{{ .HostPort }} -&amp;gt; {{ &lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;p }}{{println}}{{end}}{{else}}Sin puertos mapeados{{end}}'; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
        echo -e '&lt;/span&gt;&lt;span class="se"&gt;\n\e&lt;/span&gt;&lt;span class="s2"&gt;[1;36m--- VOLÚMENES ---&lt;/span&gt;&lt;span class="se"&gt;\e&lt;/span&gt;&lt;span class="s2"&gt;[0m'; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
        docker inspect {1} --format '{{range .Mounts}}- {{.Source}} -&amp;gt; {{.Destination}}{{println}}{{end}}'"&lt;/span&gt;

    &lt;span class="nv"&gt;SELECTION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;docker ps &lt;span class="nt"&gt;--format&lt;/span&gt; &lt;span class="s2"&gt;"{{.Names}}"&lt;/span&gt; | fzf &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;--height&lt;/span&gt; 80% &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;--reverse&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Contenedores activos | Enter para ver ruta YAML"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;--preview&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PREVIEW_CMD&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;--preview-window&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;right:65%:wrap&lt;span class="si"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SELECTION&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;exit &lt;/span&gt;0
    &lt;span class="k"&gt;fi
    &lt;/span&gt;&lt;span class="nv"&gt;CONTAINER_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$SELECTION&lt;/span&gt;
&lt;span class="k"&gt;else
    &lt;/span&gt;&lt;span class="nv"&gt;CONTAINER_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;span class="k"&gt;fi

&lt;/span&gt;&lt;span class="nv"&gt;COMPOSE_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;get_compose_path &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CONTAINER_NAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$COMPOSE_PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n\0&lt;/span&gt;&lt;span class="s2"&gt;33[1;31m[!] El contenedor '&lt;/span&gt;&lt;span class="nv"&gt;$CONTAINER_NAME&lt;/span&gt;&lt;span class="s2"&gt;' no tiene etiquetas de Docker Compose.&lt;/span&gt;&lt;span class="se"&gt;\0&lt;/span&gt;&lt;span class="s2"&gt;33[0m"&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;else
    &lt;/span&gt;&lt;span class="nv"&gt;SEPARATOR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\0&lt;/span&gt;&lt;span class="s2"&gt;33[1;36m------------------------------------------------------------&lt;/span&gt;&lt;span class="se"&gt;\0&lt;/span&gt;&lt;span class="s2"&gt;33[0m"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n\0&lt;/span&gt;&lt;span class="s2"&gt;33[1;32m✔ Contenedor:&lt;/span&gt;&lt;span class="se"&gt;\0&lt;/span&gt;&lt;span class="s2"&gt;33[0m &lt;/span&gt;&lt;span class="nv"&gt;$CONTAINER_NAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\0&lt;/span&gt;&lt;span class="s2"&gt;33[1;34m✔ Archivo YAML:&lt;/span&gt;&lt;span class="se"&gt;\0&lt;/span&gt;&lt;span class="s2"&gt;33[0m &lt;/span&gt;&lt;span class="nv"&gt;$COMPOSE_PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="nv"&gt;$SEPARATOR&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\0&lt;/span&gt;&lt;span class="s2"&gt;33[1;33mResumen de Red y Puertos:&lt;/span&gt;&lt;span class="se"&gt;\0&lt;/span&gt;&lt;span class="s2"&gt;33[0m"&lt;/span&gt;
    docker inspect &lt;span class="nt"&gt;--format&lt;/span&gt; &lt;span class="s1"&gt;'Redes: {{range $net, $v := .NetworkSettings.Networks}}{{$net}} ({{$v.IPAddress}}) {{end}}
Puertos: {{range $p, $conf := .NetworkSettings.Ports}}{{range $conf}}{{.HostIp}}:{{.HostPort}}-&amp;gt;{{$p}} {{end}}{{end}}'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CONTAINER_NAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SEPARATOR&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cómo usarlo&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Guarda el código como fcompose.sh.

Dale permisos: chmod +x fcompose.sh.

(Opcional) Muévelo a tu path: sudo mv fcompose.sh /usr/local/bin/fcompose.

¡Corre fcompose y disfruta!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Requisitos&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fzf: El motor de búsqueda difusa.

Docker: ¡Obviamente!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://gist.github.com/horaciod/cbc195aa37048a45c7dc6150ee134b42" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Espero que les sirva tanto como a mí para administrar servidores con muchos microservicios. ¡Cualquier mejora es bienvenida en los comentarios!&lt;/p&gt;

&lt;h1&gt;
  
  
  docker #devops #bash #linux #productivity
&lt;/h1&gt;

</description>
      <category>docker</category>
      <category>devops</category>
      <category>linux</category>
      <category>bash</category>
    </item>
    <item>
      <title>en adminer.org no hay forma de guardar todos los sql desde la opcion de Historial ... 
este bookmarket resuelve eso. 
Primero ir a "historial" -&gt; editar todos y luego el bookmark .

https://gist.github.com/horaciod/08be31906c68c6d4261258ee370b0f08</title>
      <dc:creator>Horacio Degiorgi</dc:creator>
      <pubDate>Thu, 26 Feb 2026 22:13:18 +0000</pubDate>
      <link>https://dev.to/horaciodegiorgi/en-adminerorg-no-hay-forma-de-guardar-todos-los-sql-desde-la-opcion-de-historial-este-483l</link>
      <guid>https://dev.to/horaciodegiorgi/en-adminerorg-no-hay-forma-de-guardar-todos-los-sql-desde-la-opcion-de-historial-este-483l</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://gist.github.com/horaciod/08be31906c68c6d4261258ee370b0f08" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.githubassets.com%2Fassets%2Fgist-og-image-54fd7dc0713e.png" height="auto" class="m-0"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://gist.github.com/horaciod/08be31906c68c6d4261258ee370b0f08" rel="noopener noreferrer" class="c-link"&gt;
            bookmarklet para descargar en un archivo .txt el contenido del primer textarea · GitHub
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            bookmarklet para descargar en un archivo .txt el contenido del primer textarea - bk.js
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.githubassets.com%2Ffavicons%2Ffavicon.svg"&gt;
          gist.github.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;




</description>
      <category>database</category>
      <category>javascript</category>
      <category>spanish</category>
      <category>sql</category>
    </item>
    <item>
      <title>Hice mi primer script en rust-script para hacer backups de solr/lucene con barra de progreso usando gemini. 
Es realmente increíble 
https://gist.github.com/horaciod/858fdeb5632abe806ef2707c03bbf5cd</title>
      <dc:creator>Horacio Degiorgi</dc:creator>
      <pubDate>Thu, 15 Jan 2026 05:10:42 +0000</pubDate>
      <link>https://dev.to/horaciodegiorgi/hice-mi-primer-script-en-rust-script-para-hacer-backups-de-solrlucene-con-barra-de-progreso-39j7</link>
      <guid>https://dev.to/horaciodegiorgi/hice-mi-primer-script-en-rust-script-para-hacer-backups-de-solrlucene-con-barra-de-progreso-39j7</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://gist.github.com/horaciod/858fdeb5632abe806ef2707c03bbf5cd" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.githubassets.com%2Fassets%2Fgist-og-image-54fd7dc0713e.png" height="auto" class="m-0"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://gist.github.com/horaciod/858fdeb5632abe806ef2707c03bbf5cd" rel="noopener noreferrer" class="c-link"&gt;
            hace backup de un motor solr · GitHub
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            hace backup de un motor solr. GitHub Gist: instantly share code, notes, and snippets.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.githubassets.com%2Ffavicons%2Ffavicon.svg"&gt;
          gist.github.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;




</description>
      <category>gemini</category>
      <category>rust</category>
      <category>showdev</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Reemplazo para Getpocket</title>
      <dc:creator>Horacio Degiorgi</dc:creator>
      <pubDate>Tue, 22 Jul 2025 13:13:42 +0000</pubDate>
      <link>https://dev.to/horaciodegiorgi/reemplazo-para-getpocket-38j</link>
      <guid>https://dev.to/horaciodegiorgi/reemplazo-para-getpocket-38j</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fompiptgnrajd0eglupfn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fompiptgnrajd0eglupfn.png" alt=" " width="165" height="57"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Desde la caída de getpocket.com (herramienta de marcadores que usé por 6 años), busco una alternativa.&lt;/p&gt;

&lt;p&gt;Encontré un sistema de enlaces autoalojado y muy versátil:&lt;br&gt;
&lt;a href="https://linkding.link/" rel="noopener noreferrer"&gt;https://linkding.link/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lo instalé en modo de prueba y es un sistema de enlaces muy potente, con aplicación para teléfono.&lt;br&gt;
&lt;a href="https://enlaces.bibliosistemas.com/" rel="noopener noreferrer"&gt;https://enlaces.bibliosistemas.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se instala con Docker Compose, usa SQLite, no requiere nada especial en el servidor, es multiusuario, tiene extensiones para Firefox y Chrome, y aplicación para teléfono.&lt;br&gt;
Permite exportar todo en HTML (estándar de Netscape).&lt;/p&gt;

&lt;p&gt;¡Increíble!&lt;/p&gt;

</description>
      <category>linkding</category>
      <category>docker</category>
      <category>website</category>
      <category>productivity</category>
    </item>
    <item>
      <title>my whois site (after a lot of years) is down dockerizing... $ docker run mbootgithub/whoisdomain -d bibliosistemas.com -j | jq -r .</title>
      <dc:creator>Horacio Degiorgi</dc:creator>
      <pubDate>Mon, 14 Jul 2025 00:16:54 +0000</pubDate>
      <link>https://dev.to/horaciodegiorgi/my-whois-site-after-a-lot-of-years-is-down-dockerizing-docker-run-115b</link>
      <guid>https://dev.to/horaciodegiorgi/my-whois-site-after-a-lot-of-years-is-down-dockerizing-docker-run-115b</guid>
      <description></description>
      <category>docker</category>
      <category>networking</category>
      <category>selfhost</category>
      <category>backenddevelopment</category>
    </item>
    <item>
      <title>Análisis de datos con IA (gemini)</title>
      <dc:creator>Horacio Degiorgi</dc:creator>
      <pubDate>Sun, 13 Jul 2025 17:50:28 +0000</pubDate>
      <link>https://dev.to/horaciodegiorgi/analisis-de-datos-con-ia-gemini-1m1e</link>
      <guid>https://dev.to/horaciodegiorgi/analisis-de-datos-con-ia-gemini-1m1e</guid>
      <description>&lt;h2&gt;
  
  
  Mi Experiencia con Gemini: Un Aliado Inesperado en el Análisis de Datos
&lt;/h2&gt;

&lt;p&gt;Recientemente, me encontré ante el desafío de analizar una tabla de PostgreSQL con 6000 registros, "documentos", que contenía una cantidad considerable de información pero que la aplicación que servía para la carga no estaba documentada. Mi objetivo era obtener una comprensión profunda de los datos, identificar valores únicos y cuantificar registros, tareas que, a priori, podrían parecer tediosas y complejas en términos de escritura de consultas SQL. Fue entonces cuando decidí recurrir a Gemini, y la experiencia fue, sin dudas, reveladora.&lt;/p&gt;

&lt;p&gt;Al proporcionarle la estructura &lt;code&gt;CREATE TABLE&lt;/code&gt; de mi tabla &lt;code&gt;public.documentos&lt;/code&gt;, le pedí que generara las consultas SQL necesarias para un análisis completo. No solo me brindó la consulta para obtener el &lt;strong&gt;total de registros&lt;/strong&gt;, sino que también desglosó la &lt;strong&gt;cantidad de valores únicos para cada columna&lt;/strong&gt;, un aspecto crucial para evaluar la calidad y la diversidad de los datos.&lt;/p&gt;

&lt;p&gt;Lo que realmente me impresionó fue su capacidad para anticipar mis necesidades. Además de los conteos generales, Gemini generó consultas específicas para la &lt;strong&gt;distribución de valores&lt;/strong&gt; en columnas clave como &lt;code&gt;id_tipo_doc&lt;/code&gt;, &lt;code&gt;anio&lt;/code&gt;, &lt;code&gt;id_autoridad&lt;/code&gt;, y &lt;code&gt;usuario_registra&lt;/code&gt;. Esto me permitió ir más allá de los números brutos y visualizar cómo se comportaban los datos dentro de cada categoría, facilitando la identificación de patrones y anomalías. La claridad y concisión de las consultas generadas, listas para ser ejecutadas en mi base de datos, optimizaron significativamente mi tiempo y esfuerzo.&lt;/p&gt;

&lt;p&gt;Trabajar con Gemini para este análisis de datos transformó lo que podría haber sido una tarea compleja y demorada en un proceso ágil y eficiente. Su habilidad para interpretar mis requerimientos y traducirlos en código SQL funcional y relevante lo posiciona como un asistente invaluable para cualquier persona que trabaje con bases de datos. Definitivamente, es una herramienta que recomiendo para potenciar el análisis de datos y optimizar los flujos de trabajo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- ejemplo de la SQL para un tipo de campo generado por gemini 2.5 flash&lt;/span&gt;

&lt;span class="c1"&gt;-- Para usuario_registra:&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;usuario_registra&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;cantidad&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;documentos&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;usuario_registra&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;cantidad&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>database</category>
      <category>gemini</category>
    </item>
    <item>
      <title>Consultando Catálogos con la API de VuFind: un MCP en python</title>
      <dc:creator>Horacio Degiorgi</dc:creator>
      <pubDate>Fri, 04 Jul 2025 14:37:47 +0000</pubDate>
      <link>https://dev.to/horaciodegiorgi/consultando-catalogos-con-la-api-de-vufind-un-mcp-en-python-31nc</link>
      <guid>https://dev.to/horaciodegiorgi/consultando-catalogos-con-la-api-de-vufind-un-mcp-en-python-31nc</guid>
      <description>&lt;p&gt;En el ecosistema de las bibliotecas y centros de documentación, la capacidad de acceder a múltiples catálogos de manera centralizada es fundamental. VuFind, como sistema de descubrimiento de código abierto, ofrece una potente &lt;strong&gt;API RESTful&lt;/strong&gt; que permite a los desarrolladores interactuar con sus datos mediante programación.&lt;/p&gt;

&lt;p&gt;Este artículo técnico detalla el diseño y la implementación de un &lt;strong&gt;MCP&lt;/strong&gt; simple, desarrollado en Python. Este server MCP permitirá a un usuario realizar búsquedas en una o más instancias de VuFind configuradas, obteniendo los resultados directamente en su terminal.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué es VuFind y su API?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;VuFind&lt;/strong&gt; es una interfaz de descubrimiento de recursos bibliotecarios que se instala sobre un software de catalogación tradicional (como Koha o Aleph) para ofrecer una experiencia de usuario más moderna y unificada. Su corazón, en lo que a interoperabilidad respecta, es su API.&lt;/p&gt;

&lt;p&gt;La API de VuFind es de tipo &lt;strong&gt;RESTful&lt;/strong&gt;, lo que significa que opera sobre los principios del protocolo HTTP. Las interacciones se realizan a través de URLs específicas (endpoints) y los datos se intercambian, comúnmente, en formato &lt;strong&gt;JSON (JavaScript Object Notation)&lt;/strong&gt;, un estándar ligero y fácil de procesar para la mayoría de los lenguajes de programación, incluido Python.&lt;/p&gt;

&lt;p&gt;El principal endpoint que utilizaremos es &lt;code&gt;/api/v1/search&lt;/code&gt;. Una petición a este endpoint nos devolverá una lista de registros que coincidan con nuestros criterios de búsqueda.&lt;/p&gt;

&lt;h3&gt;
  
  
  Diseñando nuestro MCP en Python
&lt;/h3&gt;

&lt;p&gt;El objetivo es crear un script en Python que cumpla los siguientes requisitos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Configurable:&lt;/strong&gt; Debe ser fácil agregar, quitar o modificar las instancias de VuFind a las que queremos consultar.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Soporte del protocolo MCP:&lt;/strong&gt; usando la librería FastMCP&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Funcional:&lt;/strong&gt; Debe aceptar una consulta de búsqueda, elegir la herramienta adecuada y realizar la consulta via api para luego   devolver los resultados de manera legible.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para esto, utilizaremos dos bibliotecas estándar y muy populares en Python:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;requests&lt;/code&gt;: Para manejar las peticiones HTTP de forma sencilla y robusta.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;json&lt;/code&gt;: Para interpretar la respuesta JSON que nos devuelve la API.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Paso 1: Configuración de las Instancias de VuFind
&lt;/h4&gt;

&lt;h3&gt;
  
  
  Código Completo y Ejemplo de Uso
&lt;/h3&gt;

&lt;p&gt;el código completo está alojado en github y publicado en &lt;a href="https://mcp.so/server/vufind-mpc-api/horaciod?tab=content" rel="noopener noreferrer"&gt;https://mcp.so/server/vufind-mpc-api/horaciod?tab=content&lt;/a&gt; &lt;br&gt;
Y una vez instalado en claude o gemini-cli se puede hacer uso y obtener una respuesta como la de la imagen a la pregunta  "en el snrd hay información o tesis  de análisis de perez reverte" (esto selecciona la herramienta del mcp y realiza la llamada API para luego mostrar los registros formateados. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Filkkxk07zzci330lzse2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Filkkxk07zzci330lzse2.png" alt="Image description" width="800" height="279"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Video explicativo de cómo instalarlo en Gemini. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=zkAsEGKhyzM" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=zkAsEGKhyzM&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusión
&lt;/h3&gt;

&lt;p&gt;La API de VuFind abre un abanico de posibilidades para la integración y el desarrollo de herramientas personalizadas. Con unas pocas líneas de Python y la ayuda de la biblioteca &lt;code&gt;requests&lt;/code&gt;, hemos construido un &lt;strong&gt;cliente de metabúsqueda funcional y extensible&lt;/strong&gt;. Este tipo de desarrollos demuestra cómo la automatización y la interoperabilidad pueden potenciar enormemente el acceso a la información distribuida en los catálogos de bibliotecas, creando soluciones eficientes y adaptadas a necesidades específicas.&lt;/p&gt;

</description>
      <category>python</category>
      <category>gemini</category>
      <category>vufind</category>
    </item>
    <item>
      <title>Buena lista de comandos docker.</title>
      <dc:creator>Horacio Degiorgi</dc:creator>
      <pubDate>Mon, 23 Jun 2025 01:59:26 +0000</pubDate>
      <link>https://dev.to/horaciodegiorgi/buena-lista-de-comandos-docker-f6f</link>
      <guid>https://dev.to/horaciodegiorgi/buena-lista-de-comandos-docker-f6f</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/benguerine/51-docker-commands-that-youll-ever-need-to-get-started-with-docker-5c8b" class="crayons-story__hidden-navigation-link"&gt;51 docker commands that you'll ever need to get started with docker 🔥&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/benguerine" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1534000%2Fe4a2d2f3-18fe-47a7-9d7f-8e2f37907305.jpeg" alt="benguerine profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/benguerine" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Mohammed Benguerine
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Mohammed Benguerine
                
              
              &lt;div id="story-author-preview-content-2611876" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/benguerine" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1534000%2Fe4a2d2f3-18fe-47a7-9d7f-8e2f37907305.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Mohammed Benguerine&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/benguerine/51-docker-commands-that-youll-ever-need-to-get-started-with-docker-5c8b" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 22 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/benguerine/51-docker-commands-that-youll-ever-need-to-get-started-with-docker-5c8b" id="article-link-2611876"&gt;
          51 docker commands that you'll ever need to get started with docker 🔥
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devops"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devops&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/docker"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;docker&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/benguerine/51-docker-commands-that-youll-ever-need-to-get-started-with-docker-5c8b" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/benguerine/51-docker-commands-that-youll-ever-need-to-get-started-with-docker-5c8b#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>devops</category>
      <category>webdev</category>
      <category>programming</category>
      <category>docker</category>
    </item>
    <item>
      <title>using commit to make new issues (assign to others tasks, etc) using an action in gitea</title>
      <dc:creator>Horacio Degiorgi</dc:creator>
      <pubDate>Tue, 18 Mar 2025 01:46:48 +0000</pubDate>
      <link>https://dev.to/horaciodegiorgi/using-commit-to-make-new-issues-assign-to-others-tasks-etc-using-an-action-in-gitea-27n5</link>
      <guid>https://dev.to/horaciodegiorgi/using-commit-to-make-new-issues-assign-to-others-tasks-etc-using-an-action-in-gitea-27n5</guid>
      <description></description>
    </item>
    <item>
      <title>Tus servers están recibiendo mucho tráfico ? quizás no sean más que los maliciosos BOTS de IA ...</title>
      <dc:creator>Horacio Degiorgi</dc:creator>
      <pubDate>Wed, 26 Feb 2025 14:54:35 +0000</pubDate>
      <link>https://dev.to/horaciodegiorgi/tus-servers-estan-recibiendo-mucho-trafico-quizas-no-sean-mas-que-los-maliciosos-bots-de-ia--2opp</link>
      <guid>https://dev.to/horaciodegiorgi/tus-servers-estan-recibiendo-mucho-trafico-quizas-no-sean-mas-que-los-maliciosos-bots-de-ia--2opp</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/horaciodegiorgi" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F221689%2F7fcc65e6-08b1-4085-9721-159f438295aa.jpg" alt="horaciodegiorgi"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/horaciodegiorgi/bloqueando-iabots-en-nginx-24kf" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Bloqueando IABots en Nginx&lt;/h2&gt;
      &lt;h3&gt;Horacio Degiorgi ・ Feb 26&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#nginx&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#español&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#linux&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webperf&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>nginx</category>
      <category>español</category>
      <category>linux</category>
      <category>webperf</category>
    </item>
    <item>
      <title>Are your servers receiving a lot of traffic? Maybe it is nothing more than the malicious AI BOTS...</title>
      <dc:creator>Horacio Degiorgi</dc:creator>
      <pubDate>Wed, 26 Feb 2025 14:53:41 +0000</pubDate>
      <link>https://dev.to/horaciodegiorgi/are-your-servers-receiving-a-lot-of-traffic-maybe-it-is-nothing-more-than-the-malicious-ai-bots-3k8c</link>
      <guid>https://dev.to/horaciodegiorgi/are-your-servers-receiving-a-lot-of-traffic-maybe-it-is-nothing-more-than-the-malicious-ai-bots-3k8c</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/horaciodegiorgi" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F221689%2F7fcc65e6-08b1-4085-9721-159f438295aa.jpg" alt="horaciodegiorgi"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/horaciodegiorgi/blocking-bots-in-nginx-1k5i" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Blocking bots in Nginx&lt;/h2&gt;
      &lt;h3&gt;Horacio Degiorgi ・ Feb 26&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#nginx&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#linux&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#proxy&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>nginx</category>
      <category>linux</category>
      <category>proxy</category>
    </item>
  </channel>
</rss>
