<?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.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>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; 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;
              Comments


              &lt;span class="hidden s:inline"&gt;Add 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>
    <item>
      <title>Bloqueando IABots en Nginx</title>
      <dc:creator>Horacio Degiorgi</dc:creator>
      <pubDate>Wed, 26 Feb 2025 14:39:29 +0000</pubDate>
      <link>https://dev.to/horaciodegiorgi/bloqueando-iabots-en-nginx-24kf</link>
      <guid>https://dev.to/horaciodegiorgi/bloqueando-iabots-en-nginx-24kf</guid>
      <description>&lt;p&gt;En &lt;a href="https://bibliotecas.uncuyo.edu.ar" rel="noopener noreferrer"&gt;bibliotecas.uncuyo.edu.ar&lt;/a&gt; tenemos multiples servicios corriendo detrás de un proxy reverso basado en nginx. &lt;br&gt;
Desde hace días todos los sistemas se han ralentizado.&lt;br&gt;
 Analizando los logs de uso hemos encontrado un incremento masivo de "visitas" de bots de IA. Los cuales no respetan las reglas robots.txt &lt;br&gt;
¿Cómo los bloqueamos?&lt;br&gt;
Usando reglas en la definición de los proxy_hosts&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$http_user_agent&lt;/span&gt; ~&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="s2"&gt;"amazonbot|Claudebot|claudebot|DataForSeoBot|dataforseobot|Amazonbot|SemrushBot|Semrush|AhrefsBot|MJ12bot|YandexBot|YandexImages|MegaIndex.ru|BLEXbot|BLEXBot|ZoominfoBot|YaK|VelenPublicWebCrawler|SentiBot|Vagabondo|SEOkicks|SEOkicks-Robot|mtbot/1.1.0i|SeznamBot|DotBot|Cliqzbot|coccocbot|python|Scrap|SiteCheck-sitecrawl|MauiBot|Java|GumGum|Clickagy|AspiegelBot|Yandex|TkBot|CCBot|Qwantify|MBCrawler|serpstatbot|AwarioSmartBot|Semantici|ScholarBot|proximic|MojeekBot|GrapeshotCrawler|IAScrawler|linkdexbot|contxbot|PlurkBot|PaperLiBot|BomboraBot|Leikibot|weborama-fetcher|NTENTbot|Screaming Frog SEO Spider|admantx-usaspb|Eyeotabot|VoluumDSP-content-bot|SirdataBot|adbeat_bot|TTD-Content|admantx|Nimbostratus-Bot|Mail.RU_Bot|Quantcastboti|Onespot-ScraperBot|Taboolabot|Baidu|Jobboerse|VoilaBot|Sogou|Jyxobot|Exabot|ZGrab|Proximi|Sosospider|Accoona|aiHitBot|Genieo|BecomeBot|ConveraCrawler|NerdyBot|OutclicksBot|findlinks|JikeSpider|Gigabot|CatchBot|Huaweisymantecspider|Offline Explorer|SiteSnagger|TeleportPro|WebCopier|WebReaper|WebStripper|WebZIP|Xaldon_WebSpider|BackDoorBot|AITCSRoboti|Arachnophilia|BackRub|BlowFishi|perl|CherryPicker|CyberSpyder|EmailCollector|Foobot|GetURL|httplib|HTTrack|LinkScan|Openbot|Snooper|SuperBot|URLSpiderPro|MAZBot|EchoboxBot|SerendeputyBot|LivelapBot|linkfluence.com|TweetmemeBot|LinkisBot|CrowdTanglebot"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return &lt;/span&gt;403&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En nuestro caso como utilizamos proxymanager para gestionar los distintos dominios, el ingreso de esta configuracion se hace en  el apartado advanced. &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%2F0c65u3xugmqu7bj76bqn.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%2F0c65u3xugmqu7bj76bqn.png" alt="edición avanzada de proxy manager" width="491" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>nginx</category>
      <category>español</category>
      <category>linux</category>
      <category>webperf</category>
    </item>
    <item>
      <title>Blocking bots in Nginx</title>
      <dc:creator>Horacio Degiorgi</dc:creator>
      <pubDate>Wed, 26 Feb 2025 14:35:12 +0000</pubDate>
      <link>https://dev.to/horaciodegiorgi/blocking-bots-in-nginx-1k5i</link>
      <guid>https://dev.to/horaciodegiorgi/blocking-bots-in-nginx-1k5i</guid>
      <description>&lt;p&gt;At bibliotecas.uncuyo.edu.ar we have multiple services running behind a reverse proxy based on nginx.&lt;br&gt;
For days now all systems have been slowing down. Analyzing the usage logs we have found a massive increase in "visits" from AI bots.&lt;br&gt;
How do we block them?&lt;br&gt;
Using rules in the definition of the proxy_hosts&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$http_user_agent&lt;/span&gt; ~&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="s2"&gt;"amazonbot|Claudebot|claudebot|DataForSeoBot|dataforseobot|Amazonbot|SemrushBot|Semrush|AhrefsBot|MJ12bot|YandexBot|YandexImages|MegaIndex.ru|BLEXbot|BLEXBot|ZoominfoBot|YaK|VelenPublicWebCrawler|SentiBot|Vagabondo|SEOkicks|SEOkicks-Robot|mtbot/1.1.0i|SeznamBot|DotBot|Cliqzbot|coccocbot|python|Scrap|SiteCheck-sitecrawl|MauiBot|Java|GumGum|Clickagy|AspiegelBot|Yandex|TkBot|CCBot|Qwantify|MBCrawler|serpstatbot|AwarioSmartBot|Semantici|ScholarBot|proximic|MojeekBot|GrapeshotCrawler|IAScrawler|linkdexbot|contxbot|PlurkBot|PaperLiBot|BomboraBot|Leikibot|weborama-fetcher|NTENTbot|Screaming Frog SEO Spider|admantx-usaspb|Eyeotabot|VoluumDSP-content-bot|SirdataBot|adbeat_bot|TTD-Content|admantx|Nimbostratus-Bot|Mail.RU_Bot|Quantcastboti|Onespot-ScraperBot|Taboolabot|Baidu|Jobboerse|VoilaBot|Sogou|Jyxobot|Exabot|ZGrab|Proximi|Sosospider|Accoona|aiHitBot|Genieo|BecomeBot|ConveraCrawler|NerdyBot|OutclicksBot|findlinks|JikeSpider|Gigabot|CatchBot|Huaweisymantecspider|Offline Explorer|SiteSnagger|TeleportPro|WebCopier|WebReaper|WebStripper|WebZIP|Xaldon_WebSpider|BackDoorBot|AITCSRoboti|Arachnophilia|BackRub|BlowFishi|perl|CherryPicker|CyberSpyder|EmailCollector|Foobot|GetURL|httplib|HTTrack|LinkScan|Openbot|Snooper|SuperBot|URLSpiderPro|MAZBot|EchoboxBot|SerendeputyBot|LivelapBot|linkfluence.com|TweetmemeBot|LinkisBot|CrowdTanglebot"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return &lt;/span&gt;403&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In our case, since we use &lt;a href="https://github.com/NginxProxyManager/nginx-proxy-manager" rel="noopener noreferrer"&gt;proxymanager&lt;/a&gt; to manage the different domains, the entry of this configuration is done in the advanced section&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%2Fa5rpp7i0qocfkjnszvtn.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%2Fa5rpp7i0qocfkjnszvtn.png" alt="advanced conf in proxymanager" width="491" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

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