<?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>Forem: Jaime Hernández</title>
    <description>The latest articles on Forem by Jaime Hernández (@devjaime).</description>
    <link>https://forem.com/devjaime</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%2F24135%2Ff45e350b-c783-4d2d-bd0f-c1f8bdd107e3.png</url>
      <title>Forem: Jaime Hernández</title>
      <link>https://forem.com/devjaime</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/devjaime"/>
    <language>en</language>
    <item>
      <title>⚡ uv: La herramienta ultrarrápida para entornos Python</title>
      <dc:creator>Jaime Hernández</dc:creator>
      <pubDate>Fri, 02 May 2025 15:38:00 +0000</pubDate>
      <link>https://forem.com/devjaime/uv-la-herramienta-ultrarrapida-para-entornos-python-322h</link>
      <guid>https://forem.com/devjaime/uv-la-herramienta-ultrarrapida-para-entornos-python-322h</guid>
      <description>&lt;p&gt;Cuando trabajas con Python, probablemente usas &lt;code&gt;pip&lt;/code&gt;, &lt;code&gt;virtualenv&lt;/code&gt; y &lt;code&gt;requirements.txt&lt;/code&gt; como parte de tu flujo. Pero, ¿y si existiera una herramienta que pudiera hacer todo esto más rápido y con una sola línea de comando? Aquí entra en juego &lt;code&gt;uv&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 ¿Qué es &lt;code&gt;uv&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;uv&lt;/code&gt; es una herramienta todo-en-uno escrita en &lt;strong&gt;Rust&lt;/strong&gt; que reemplaza:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;pip&lt;/code&gt; → para instalar paquetes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;virtualenv&lt;/code&gt; → para crear entornos virtuales&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pip-tools&lt;/code&gt; → para sincronizar dependencias&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Y lo hace con un enfoque &lt;strong&gt;ultrarrápido&lt;/strong&gt;, confiable y reproducible.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Desarrollado por &lt;a href="https://astral.sh" rel="noopener noreferrer"&gt;Astral&lt;/a&gt;, la misma empresa detrás de &lt;code&gt;ruff&lt;/code&gt;, &lt;code&gt;uv&lt;/code&gt; está diseñado para desarrolladores que valoran la velocidad y la simplicidad.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🧪 ¿Por qué deberías probarlo?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Velocidad extrema&lt;/strong&gt;: Hasta 8 veces más rápido que pip&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compatible con &lt;code&gt;pyproject.toml&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resolución determinista de dependencias&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instalaciones reproducibles&lt;/strong&gt; en CI/CD&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cero configuración inicial&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💻 Ejemplos de uso
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Crear un entorno virtual
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv venv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Instalar dependencias
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv pip &lt;span class="nb"&gt;install &lt;/span&gt;requests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sincronizar desde &lt;code&gt;pyproject.toml&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv pip &lt;span class="nb"&gt;sync&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ver dependencias instaladas
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv pip freeze
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📦 ¿Reemplaza a &lt;code&gt;pipx&lt;/code&gt;, &lt;code&gt;poetry&lt;/code&gt; o &lt;code&gt;pipenv&lt;/code&gt;?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pipx&lt;/strong&gt; → Mejor para herramientas de línea de comandos aisladas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Poetry&lt;/strong&gt; → Mayor enfoque en empaquetado de proyectos, pero más lento.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pipenv&lt;/strong&gt; → Similar en objetivos, pero menos eficiente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;uv&lt;/code&gt; destaca por su &lt;strong&gt;velocidad&lt;/strong&gt; y por usar el mínimo de herramientas externas.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤔 ¿Cuándo usar &lt;code&gt;uv&lt;/code&gt;?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Proyectos medianos y grandes que tarden mucho en instalarse.&lt;/li&gt;
&lt;li&gt;Pipelines de integración continua.&lt;/li&gt;
&lt;li&gt;Equipos que busquen entornos reproducibles.&lt;/li&gt;
&lt;li&gt;Usuarios que ya usan &lt;code&gt;pyproject.toml&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📚 Recursos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitHub oficial: &lt;a href="https://github.com/astral-sh/uv" rel="noopener noreferrer"&gt;https://github.com/astral-sh/uv&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Web de Astral: &lt;a href="https://astral.sh" rel="noopener noreferrer"&gt;https://astral.sh&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Versión original del blog: &lt;a href="https://jaimehernandez.dev/blog/2025-05-02_uv-python/" rel="noopener noreferrer"&gt;https://jaimehernandez.dev/blog/2025-05-02_uv-python/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;code&gt;uv&lt;/code&gt; está cambiando la forma en que desarrollamos en Python. Si te importa la productividad, la velocidad y la confiabilidad, esta herramienta merece un lugar en tu flujo de trabajo.&lt;/p&gt;

&lt;p&gt;¿Ya la probaste? ¡Déjame saber en los comentarios qué opinas! 🚀&lt;/p&gt;

</description>
      <category>python</category>
      <category>rust</category>
      <category>pip</category>
      <category>virtualenv</category>
    </item>
    <item>
      <title>📄 ¿Qué es llms.txt? Optimiza tu Web para la Era de la IA</title>
      <dc:creator>Jaime Hernández</dc:creator>
      <pubDate>Fri, 02 May 2025 02:47:00 +0000</pubDate>
      <link>https://forem.com/devjaime/que-es-llmstxt-optimiza-tu-web-para-la-era-de-la-ia-4i70</link>
      <guid>https://forem.com/devjaime/que-es-llmstxt-optimiza-tu-web-para-la-era-de-la-ia-4i70</guid>
      <description>&lt;h1&gt;
  
  
  🧠 ¿Qué es &lt;code&gt;llms.txt&lt;/code&gt;?
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;llms.txt&lt;/code&gt; es un archivo de texto en formato Markdown que se ubica en la raíz de un sitio web (como &lt;code&gt;https://tusitio.com/llms.txt&lt;/code&gt;). Su función principal es facilitar que los modelos de lenguaje de gran escala (LLMs), como ChatGPT, Claude o Gemini, comprendan y accedan al contenido clave de un sitio web de forma más eficiente.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 ¿Por qué se necesita?
&lt;/h2&gt;

&lt;p&gt;Los LLMs tienen una &lt;strong&gt;ventana de contexto limitada&lt;/strong&gt;, lo que significa que no pueden procesar una página web completa llena de menús, banners, anuncios y scripts innecesarios. El archivo &lt;code&gt;llms.txt&lt;/code&gt; permite ofrecer versiones limpias, estructuradas y relevantes del contenido del sitio.&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 ¿Cómo se estructura?
&lt;/h2&gt;

&lt;p&gt;Un archivo &lt;code&gt;llms.txt&lt;/code&gt; típico incluye:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Título en H1 del sitio o proyecto&lt;/li&gt;
&lt;li&gt;Breve descripción del propósito del sitio&lt;/li&gt;
&lt;li&gt;Secciones con enlaces a versiones &lt;code&gt;.md&lt;/code&gt; o &lt;code&gt;.txt&lt;/code&gt; de las páginas más relevantes&lt;/li&gt;
&lt;li&gt;Sección opcional con contenido adicional útil&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ejemplo:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Blog de Jaime sobre IA&lt;/span&gt;
&lt;span class="gt"&gt;
&amp;gt; Un blog sobre inteligencia artificial aplicada, desarrollo web y cloud computing.&lt;/span&gt;

&lt;span class="gu"&gt;## Documentación&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Guía de inicio&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://codeia.cl/guia-inicio.md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: Primeros pasos en IA generativa.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;API&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://codeia.cl/api.md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: Accede a los endpoints disponibles.

&lt;span class="gu"&gt;## Tutoriales&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Construir un chatbot&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://codeia.cl/chatbot.md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: Aprende paso a paso.

&lt;span class="gu"&gt;## Optional&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Blog&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://codeia.cl/blog.md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: Últimos artículos.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔍 ¿Cómo se diferencia de &lt;code&gt;robots.txt&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;Mientras &lt;code&gt;robots.txt&lt;/code&gt; indica a los buscadores qué páginas indexar o no, &lt;code&gt;llms.txt&lt;/code&gt; &lt;strong&gt;es una guía específica para modelos de lenguaje&lt;/strong&gt; que leen y generan texto, no para motores de búsqueda tradicionales. Es parte de una tendencia creciente de &lt;strong&gt;SEO para IA&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ Beneficios de usar &lt;code&gt;llms.txt&lt;/code&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mejora la visibilidad de tu contenido en respuestas generadas por IA&lt;/li&gt;
&lt;li&gt;Reduce la ambigüedad de tus contenidos al limpiarlos para su análisis&lt;/li&gt;
&lt;li&gt;Complementa otros archivos como &lt;code&gt;sitemap.xml&lt;/code&gt; o &lt;code&gt;robots.txt&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧪 Casos de uso
&lt;/h2&gt;

&lt;h3&gt;
  
  
  📡 Integración con MCP (Model Context Protocol)
&lt;/h3&gt;

&lt;p&gt;Cuando un agente basado en MCP necesita comprender rápidamente el contenido estructurado de una organización (como políticas, APIs o documentos internos), puede acceder al &lt;code&gt;llms.txt&lt;/code&gt; para priorizar qué contenido cargar primero en su contexto limitado. Esto permite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Selección automática de documentos clave para respuestas más precisas.&lt;/li&gt;
&lt;li&gt;Reducción de tokens innecesarios en respuestas generadas.&lt;/li&gt;
&lt;li&gt;Mejora de la velocidad de inferencia en flujos multi-agente.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🤖 Chatbots empresariales
&lt;/h3&gt;

&lt;p&gt;Los chatbots que sirven como asistentes en sitios corporativos pueden usar &lt;code&gt;llms.txt&lt;/code&gt; para acceder a documentación técnica limpia, mejorando la calidad de sus respuestas.&lt;/p&gt;

&lt;h3&gt;
  
  
  🌐 Plataformas educativas
&lt;/h3&gt;

&lt;p&gt;Sitios con cursos o tutoriales pueden facilitar que los modelos de IA accedan a los contenidos más relevantes para sugerir recursos adecuados al contexto del estudiante.&lt;/p&gt;

&lt;h3&gt;
  
  
  🛍️ E-commerce con IA
&lt;/h3&gt;

&lt;p&gt;En tiendas online, un &lt;code&gt;llms.txt&lt;/code&gt; puede destacar productos destacados, políticas de devolución o condiciones de envío para que los asistentes de IA brinden mejor soporte al cliente.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔧 Recursos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Sitio oficial: &lt;a href="https://llmstxt.org/" rel="noopener noreferrer"&gt;llmstxt.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Generador automático: &lt;a href="https://llmstxt-generator.vercel.app/" rel="noopener noreferrer"&gt;llmstxt-generator&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Con la expansión de la inteligencia artificial generativa, &lt;code&gt;llms.txt&lt;/code&gt; se perfila como una pieza clave para el futuro de la web semántica. ¿Ya lo estás usando en tu sitio?&lt;/p&gt;

</description>
      <category>llmstxt</category>
      <category>ia</category>
      <category>llm</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Explorando Kaggle en 2025: Aprende, Compite y Crea con IA Generativa</title>
      <dc:creator>Jaime Hernández</dc:creator>
      <pubDate>Thu, 01 May 2025 04:49:00 +0000</pubDate>
      <link>https://forem.com/devjaime/explorando-kaggle-en-2025-aprende-compite-y-crea-con-ia-generativa-172j</link>
      <guid>https://forem.com/devjaime/explorando-kaggle-en-2025-aprende-compite-y-crea-con-ia-generativa-172j</guid>
      <description>&lt;p&gt;Kaggle sigue siendo uno de los entornos más poderosos para aprender y aplicar ciencia de datos, y en 2025 su relevancia crece aún más con el auge de la inteligencia artificial generativa.&lt;/p&gt;

&lt;p&gt;Este blog recoge los mejores recursos actuales, competencias activas y materiales para que puedas aprender, competir y crear con IA desde hoy.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 ¿Qué es Kaggle en 2025?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.kaggle.com" rel="noopener noreferrer"&gt;Kaggle&lt;/a&gt; es una plataforma de Google que permite a desarrolladores y científicos de datos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aprender con cursos gratuitos y notebooks ejecutables&lt;/li&gt;
&lt;li&gt;Participar en competencias reales con datos del mundo real&lt;/li&gt;
&lt;li&gt;Publicar código reproducible en la nube&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧠 Cursos y guías destacadas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📘 &lt;strong&gt;&lt;a href="https://www.kaggle.com/learn-guide/5-day-genai" rel="noopener noreferrer"&gt;Curso Intensivo de IA Generativa de 5 días&lt;/a&gt;&lt;/strong&gt;: Una guía paso a paso para dominar los fundamentos de la IA generativa, desde prompts hasta evaluación de modelos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🏆 Competencias activas en IA generativa
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.kaggle.com/competitions/gen-ai-intensive-course-capstone-2025q1" rel="noopener noreferrer"&gt;Capstone IA Generativa 2025Q1&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.kaggle.com/competitions/detect-ai-vs-human-generated-images" rel="noopener noreferrer"&gt;Detectar Imágenes generadas por IA&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.kaggle.com/competitions/generative-ai-for-3-d-human-motion-description" rel="noopener noreferrer"&gt;Descripción de Movimiento Humano 3D&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📘 Notebooks destacados para aprender
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.kaggle.com/code/sanjushasuresh/generative-ai-creating-machines-more-human-like" rel="noopener noreferrer"&gt;Creando Máquinas Más Humanas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kaggle.com/code/niyamatalmass/generative-ai-tools-landscape" rel="noopener noreferrer"&gt;Paisaje de Herramientas de IA Generativa&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📂 Datasets útiles y actuales
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.kaggle.com/datasets/toddgardiner/google-genai-intensive-april-2025" rel="noopener noreferrer"&gt;Dataset oficial del curso intensivo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kaggle.com/competitions/detect-ai-vs-human-generated-images/data" rel="noopener noreferrer"&gt;Imágenes generadas vs humanas&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📚 Recursos para seguir aprendiendo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.kaggle.com/discussions/getting-started/555252" rel="noopener noreferrer"&gt;Discusión oficial: Guía de Aprendizaje de IA Generativa&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ✅ Conclusión
&lt;/h2&gt;

&lt;p&gt;Kaggle es el lugar ideal para entrenar y mostrar tus habilidades en IA generativa. Si buscas aplicar tu conocimiento en desafíos reales, aprender de otros y mejorar tu portafolio, esta es tu plataforma.&lt;/p&gt;

&lt;p&gt;📖 Artículo original: &lt;a href="https://jaimehernandez.dev/blog/2025-05-01_kaggle-ia-generativa/" rel="noopener noreferrer"&gt;jaimehernandez.dev/blog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;¿Ya estás compitiendo en Kaggle? ¡Te leo en los comentarios!&lt;/p&gt;

</description>
      <category>kaggle</category>
      <category>machinelearning</category>
      <category>ai</category>
      <category>generativeai</category>
    </item>
    <item>
      <title>🧠 JSON AI Inspector: Analyzing JSON with AI (Open Source Tool)</title>
      <dc:creator>Jaime Hernández</dc:creator>
      <pubDate>Sun, 20 Apr 2025 00:41:54 +0000</pubDate>
      <link>https://forem.com/devjaime/json-ai-inspector-analyzing-json-with-ai-open-source-tool-pj3</link>
      <guid>https://forem.com/devjaime/json-ai-inspector-analyzing-json-with-ai-open-source-tool-pj3</guid>
      <description>&lt;h2&gt;
  
  
  🧠 JSON AI Inspector
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/json-ai-tools/json-ai-inspector" rel="noopener noreferrer"&gt;🔗 GitHub Repo&lt;/a&gt; • &lt;a href="https://json-ai-inspector.streamlit.app/" rel="noopener noreferrer"&gt;🌐 Live App&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A free and open-source &lt;strong&gt;Streamlit application&lt;/strong&gt; that brings JSON understanding to the next level — powered by &lt;strong&gt;Groq AI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Whether you're working with complex APIs, debugging nested objects, or generating mock data, &lt;code&gt;json-ai-inspector&lt;/code&gt; is your AI companion.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. JSON Formatting
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Pretty-printed JSON with syntax highlighting&lt;/li&gt;
&lt;li&gt;Export as CSV (Excel-ready)&lt;/li&gt;
&lt;li&gt;Auto-generate type definitions for:

&lt;ul&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Go&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. AI Analysis (Groq Powered)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ask natural language questions about your JSON&lt;/li&gt;
&lt;li&gt;Receive contextual answers from the model&lt;/li&gt;
&lt;li&gt;Understand deeply nested structures in seconds&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. JSON Comparison Tool
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Drop in two JSONs and see a side-by-side difference&lt;/li&gt;
&lt;li&gt;Visual diffs for changed/added/removed nodes&lt;/li&gt;
&lt;li&gt;Export a full comparison report&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Mock Data Generator
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Generate realistic JSON mock data&lt;/li&gt;
&lt;li&gt;Supports types like &lt;code&gt;string&lt;/code&gt;, &lt;code&gt;int&lt;/code&gt;, &lt;code&gt;boolean&lt;/code&gt;, &lt;code&gt;email&lt;/code&gt;, &lt;code&gt;url&lt;/code&gt;, &lt;code&gt;objectId&lt;/code&gt;, etc.&lt;/li&gt;
&lt;li&gt;Array/type inference included&lt;/li&gt;
&lt;li&gt;Export datasets for testing and seeding&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧩 Other Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🌐 English and Spanish language support&lt;/li&gt;
&lt;li&gt;🌓 Dark/Light Mode&lt;/li&gt;
&lt;li&gt;💾 History of generated or analyzed data&lt;/li&gt;
&lt;li&gt;🧠 Stateless with session memory&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚀 Quick Start
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Clone the repository
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/json-ai-tools/json-ai-inspector.git
&lt;span class="nb"&gt;cd &lt;/span&gt;json-ai-inspector
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Install dependencies
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. (Optional) Add your Groq API key
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"GROQ_API_KEY=your-key-here"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Run the app
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;streamlit run app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🌍 Use Cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Testing API responses and generating test data&lt;/li&gt;
&lt;li&gt;Auto-generating type definitions for contracts&lt;/li&gt;
&lt;li&gt;Validating JSON input/output in development pipelines&lt;/li&gt;
&lt;li&gt;Quickly interpreting large or deeply nested structures&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 Why This Tool?
&lt;/h2&gt;

&lt;p&gt;Unlike simple formatters or linters, JSON AI Inspector leverages AI to actually &lt;strong&gt;reason about the data&lt;/strong&gt; you're inspecting. Ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"What are the main fields in this object?"&lt;/li&gt;
&lt;li&gt;"Which values are optional?"&lt;/li&gt;
&lt;li&gt;"Is this data consistent across nodes?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And more. It’s like having a JSON-savvy assistant at your side.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤝 Contribute
&lt;/h2&gt;

&lt;p&gt;This tool is still evolving. Contributions, feedback, and ideas are always welcome. Feel free to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⭐ Star the project on GitHub&lt;/li&gt;
&lt;li&gt;🐛 Open an issue or suggestion&lt;/li&gt;
&lt;li&gt;🔧 Submit a PR&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Made with ❤️ by the community. Visit &lt;a href="https://codeia.cl" rel="noopener noreferrer"&gt;CodeIA.cl&lt;/a&gt; for more AI-powered tools.&lt;/p&gt;




</description>
      <category>python</category>
      <category>ai</category>
      <category>json</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Construyendo un BFF en Go con OpenAPI: Casos de Uso y Buenas Prácticas</title>
      <dc:creator>Jaime Hernández</dc:creator>
      <pubDate>Sun, 30 Mar 2025 14:47:37 +0000</pubDate>
      <link>https://forem.com/devjaime/construyendo-un-bff-en-go-con-openapi-casos-de-uso-y-buenas-practicas-39ag</link>
      <guid>https://forem.com/devjaime/construyendo-un-bff-en-go-con-openapi-casos-de-uso-y-buenas-practicas-39ag</guid>
      <description>&lt;p&gt;📍 &lt;em&gt;Este artículo fue publicado originalmente en &lt;a href="https://jaimehernandez.dev/blog/2025-03-28_bff-golang-openapi/" rel="noopener noreferrer"&gt;mi blog personal&lt;/a&gt;.&lt;/em&gt;  &lt;/p&gt;

&lt;h1&gt;
  
  
  Construyendo un BFF en Go con OpenAPI: Casos de Uso y Buenas Prácticas 🚀
&lt;/h1&gt;

&lt;p&gt;En sistemas distribuidos modernos, especialmente aquellos con múltiples interfaces frontend (web, mobile, IoT), es común enfrentarse a la necesidad de adaptar los datos y funcionalidades del backend para cada canal. Aquí es donde entra en juego el &lt;strong&gt;Backend For Frontend (BFF)&lt;/strong&gt;, un patrón que separa la lógica de presentación y facilita la orquestación entre servicios y clientes.&lt;/p&gt;

&lt;p&gt;En este artículo, te mostraré cómo construir un BFF en &lt;strong&gt;Golang&lt;/strong&gt; utilizando &lt;strong&gt;OpenAPI&lt;/strong&gt;, compartiendo ejemplos bien estructurados, casos de uso y buenas prácticas para mantener tu proyecto limpio y escalable.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 ¿Qué es un BFF y cuándo usarlo?
&lt;/h2&gt;

&lt;p&gt;Un &lt;strong&gt;BFF&lt;/strong&gt; actúa como intermediario entre el frontend y los microservicios del backend. Su objetivo es:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agregar, adaptar o transformar datos desde distintos servicios.&lt;/li&gt;
&lt;li&gt;Proveer seguridad (autenticación/autorización).&lt;/li&gt;
&lt;li&gt;Exponer una API optimizada para cada tipo de cliente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;📌 Casos de uso típicos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Una app móvil que requiere datos más livianos o en otro formato.&lt;/li&gt;
&lt;li&gt;Evitar que el frontend conozca detalles de múltiples microservicios.&lt;/li&gt;
&lt;li&gt;Centralizar la autenticación o la gestión de sesiones.&lt;/li&gt;
&lt;li&gt;Minimizar llamadas de red agregando o preprocesando datos en el BFF.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠️ ¿Por qué usar Go y OpenAPI para un BFF?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Go&lt;/strong&gt; es eficiente, rápido, con tipado estático y perfecto para construir APIs. Su ecosistema incluye herramientas robustas para definir contratos con OpenAPI, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/go-swagger/go-swagger" rel="noopener noreferrer"&gt;&lt;code&gt;go-swagger&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/deepmap/oapi-codegen" rel="noopener noreferrer"&gt;&lt;code&gt;oapi-codegen&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/getkin/kin-openapi" rel="noopener noreferrer"&gt;&lt;code&gt;kin-openapi&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;OpenAPI permite definir tu contrato de API primero (spec-first), o bien generarlo desde tu código (code-first), asegurando documentación clara, validación automática y generación de clientes.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ Estructura del Proyecto
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bff-service/
├── api/
│   ├── openapi.yaml          &lt;span class="c"&gt;# Definición de la API&lt;/span&gt;
│   └── api.gen.go            &lt;span class="c"&gt;# Código generado con oapi-codegen&lt;/span&gt;
├── cmd/
│   └── main.go               &lt;span class="c"&gt;# Entrada principal del BFF&lt;/span&gt;
├── handlers/
│   └── user_handler.go       &lt;span class="c"&gt;# Handlers HTTP&lt;/span&gt;
├── internal/
│   └── services/             &lt;span class="c"&gt;# Lógica de negocio y conexiones externas&lt;/span&gt;
└── go.mod / go.sum
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Ejemplo de OpenAPI (openapi.yaml)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;openapi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3.0.0&lt;/span&gt;
&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;User BFF API&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1.0"&lt;/span&gt;
&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;/users/{id}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Obtener usuario por ID&lt;/span&gt;
      &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;id&lt;/span&gt;
          &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;path&lt;/span&gt;
          &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;200'&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Usuario encontrado&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/User'&lt;/span&gt;
&lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schemas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;User&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
        &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⚙️ Generar Código con oapi-codegen
&lt;/h2&gt;

&lt;p&gt;Instalamos la herramienta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go &lt;span class="nb"&gt;install &lt;/span&gt;github.com/deepmap/oapi-codegen/cmd/oapi-codegen@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Creamos el archivo api/api.gen.go:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;oapi-codegen &lt;span class="nt"&gt;-generate&lt;/span&gt; types,chi-server &lt;span class="nt"&gt;-package&lt;/span&gt; api api/openapi.yaml &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; api/api.gen.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧹 Handler de ejemplo (handlers/user_handler.go)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;handlers&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s"&gt;"context"&lt;/span&gt;
  &lt;span class="s"&gt;"net/http"&lt;/span&gt;
  &lt;span class="s"&gt;"github.com/yourname/bff-service/api"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;UserHandler&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;UserHandler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;GetUserById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="s"&gt;"Jane Doe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Email&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"jane@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JSONResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StatusOK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 main.go (Registro del router)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s"&gt;"log"&lt;/span&gt;
  &lt;span class="s"&gt;"net/http"&lt;/span&gt;

  &lt;span class="s"&gt;"github.com/go-chi/chi/v5"&lt;/span&gt;
  &lt;span class="s"&gt;"github.com/yourname/bff-service/api"&lt;/span&gt;
  &lt;span class="s"&gt;"github.com/yourname/bff-service/handlers"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;chi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewRouter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;handlers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UserHandler&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;

  &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RegisterHandlers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"🚀 BFF corriendo en http://localhost:8080"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ListenAndServe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;":8080"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✅ Buenas prácticas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Valida contratos OpenAPI al inicio del servidor.&lt;/li&gt;
&lt;li&gt;Versiona tu API: usa rutas como /v1/users.&lt;/li&gt;
&lt;li&gt;Testea con mocks generados desde OpenAPI.&lt;/li&gt;
&lt;li&gt;Documenta tus endpoints y errores esperados.&lt;/li&gt;
&lt;li&gt;No mezcles lógica de negocio con handlers.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧪 Prueba con Swagger UI
&lt;/h2&gt;

&lt;p&gt;Puedes usar herramientas como Swagger UI o integrarlo en tu servidor para testear los endpoints directamente desde la documentación.&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 Conclusión
&lt;/h2&gt;

&lt;p&gt;Construir un BFF en Go con OpenAPI es una excelente manera de garantizar escalabilidad, claridad en los contratos de servicio y eficiencia para los equipos frontend. Este enfoque mejora la mantenibilidad, facilita la colaboración entre equipos y reduce la complejidad del cliente.&lt;/p&gt;

&lt;p&gt;Si te interesa llevar esta implementación a producción o automatizar su despliegue en la nube con CI/CD, ¡déjamelo saber! 👨‍💻&lt;/p&gt;

</description>
      <category>go</category>
      <category>openapi</category>
      <category>bff</category>
      <category>microservicios</category>
    </item>
    <item>
      <title>Migrando Microservicios de NestJS con TypeScript a Go: Una Semana de Descubrimientos</title>
      <dc:creator>Jaime Hernández</dc:creator>
      <pubDate>Sun, 23 Jun 2024 18:18:19 +0000</pubDate>
      <link>https://forem.com/devjaime/migrando-microservicios-de-nestjs-con-typescript-a-go-una-semana-de-descubrimientos-4585</link>
      <guid>https://forem.com/devjaime/migrando-microservicios-de-nestjs-con-typescript-a-go-una-semana-de-descubrimientos-4585</guid>
      <description>&lt;h2&gt;
  
  
  Migrando Microservicios de NestJS con TypeScript a Go: Una Semana de Descubrimientos
&lt;/h2&gt;

&lt;p&gt;En la última semana, me he sumergido en el mundo de Go con el objetivo de migrar nuestros microservicios desarrollados en NestJS con TypeScript. Esta travesía ha sido un ejercicio intenso de desaprender ciertos paradigmas y adoptar otros, comprendiendo las diferencias fundamentales entre estos dos ecosistemas de desarrollo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nuestra Arquitectura en NestJS
&lt;/h2&gt;

&lt;p&gt;En nuestro stack con NestJS, manejamos microservicios conectados a bases de datos PostgreSQL y Redis. Implementamos diversas estrategias de comunicación entre microservicios:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Comunicación por Eventos&lt;/strong&gt;: Utilizamos Pub/Sub para suscripciones y tópicos que permiten la comunicación asíncrona entre microservicios.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend for Frontend (BFF)&lt;/strong&gt;: Implementamos APIs REST protegidas con JWT, que sirven de intermediarios entre el frontend y la base de datos.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Validaciones y Migraciones
&lt;/h3&gt;

&lt;p&gt;La validación de DTOs y la migración de datos son cruciales en nuestro sistema. TypeScript nos ha permitido definir tipos estrictos y estructuras con Knex y TypeORM para manejar migraciones. Aunque eficaz, este enfoque requiere un conocimiento profundo del lenguaje y de cómo manipular flujos de datos a través de diferentes microservicios.&lt;/p&gt;

&lt;h3&gt;
  
  
  Retos con NestJS
&lt;/h3&gt;

&lt;p&gt;Detectamos problemas de &lt;strong&gt;event loop&lt;/strong&gt; que afectaban la performance, los cuales abordamos usando la librería Clinic.js. Identificamos los cuellos de botella y optimizamos el uso de patrones de diseño junto con &lt;code&gt;async&lt;/code&gt; y &lt;code&gt;await&lt;/code&gt;. Sin embargo, manejar concurrencia en Node.js puede ser complejo y costoso en términos de recursos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adentrándonos en Go
&lt;/h2&gt;

&lt;p&gt;Al explorar Go, nos encontramos con una transición de paradigmas y una serie de diferencias significativas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Compilación y Tipado Estático&lt;/strong&gt;: A diferencia de TypeScript, Go es un lenguaje compilado con tipado estático fuerte, lo que nos fuerza a detectar errores en tiempo de compilación.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control de Flujo y Manejo de Errores&lt;/strong&gt;: Go simplifica el manejo de errores a través de su enfoque explícito de retorno de errores, en lugar de excepciones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Estructura de Datos y Memoria&lt;/strong&gt;: La asignación de memoria y la gestión de estructuras de datos en Go requiere una comprensión más profunda del hardware, lo cual es diferente al enfoque más abstracto de JavaScript.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  POO e Interfaces
&lt;/h3&gt;

&lt;p&gt;En Go, aunque la orientación a objetos es soportada, se manifiesta de manera diferente. La ausencia de herencia tradicional y la utilización de interfaces proporciona una flexibilidad distinta que debe ser entendida a fondo para aprovechar al máximo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ejemplos Comparativos
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Validación de Datos
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;NestJS&lt;/strong&gt;: Usamos Decoradores en DTOs para la validación.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;IsString&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;IsInt&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;class-validator&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CreateUserDto&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;IsString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;IsInt&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Go&lt;/strong&gt;: Usamos librerías como &lt;code&gt;go-playground/validator&lt;/code&gt; para la validación.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"gopkg.in/go-playground/validator.v9"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`validate:"required"`&lt;/span&gt;
    &lt;span class="n"&gt;Age&lt;/span&gt;  &lt;span class="kt"&gt;int&lt;/span&gt;    &lt;span class="s"&gt;`validate:"gte=0"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;validate&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;validator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Age&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;25&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;validate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Struct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Comunicación Asíncrona
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;NestJS&lt;/strong&gt;: Uso de &lt;code&gt;async/await&lt;/code&gt; para manejar promesas.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;apiCall&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Go&lt;/strong&gt;: Uso de gorutinas y canales para concurrencia.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;dataChan&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;chan&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;dataChan&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="n"&gt;apiCall&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}()&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="n"&gt;dataChan&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Herramientas y Configuración
&lt;/h3&gt;

&lt;p&gt;En Go, hemos adoptado herramientas como &lt;strong&gt;Gin&lt;/strong&gt; para APIs REST y &lt;strong&gt;Gorm&lt;/strong&gt; como ORM. La configuración de nuestro entorno en VSCode con &lt;code&gt;make&lt;/code&gt; para automatizar tareas ha sido crucial para mantener la productividad y adaptarnos a este nuevo flujo de trabajo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reflexiones Finales
&lt;/h2&gt;

&lt;p&gt;Migrar de NestJS con TypeScript a Go ha sido desafiante pero también gratificante. Mientras que NestJS ofrece una experiencia enriquecida en el desarrollo rápido de APIs con un enfoque en la reutilización y la abstracción, Go nos ha brindado un control más granular sobre la concurrencia y el rendimiento, esencial para aplicaciones altamente escalables.&lt;/p&gt;

&lt;p&gt;Seguimos experimentando y ajustando nuestros flujos de trabajo, y a pesar de los desafíos, estamos entusiasmados con las posibilidades que ofrece Go para el futuro de nuestros microservicios.&lt;/p&gt;




&lt;p&gt;Espero que este blog sirva como una guía y una inspiración para aquellos que estén considerando una transición similar. ¿Qué experiencias han tenido ustedes con la migración de tecnologías? ¿Qué retos y soluciones han encontrado en el camino?&lt;/p&gt;

&lt;p&gt;¡Compartan sus historias y sigamos aprendiendo juntos!&lt;/p&gt;

</description>
      <category>nestjs</category>
      <category>go</category>
      <category>spanish</category>
    </item>
    <item>
      <title>What is Kafka and How to Implement it in NestJS</title>
      <dc:creator>Jaime Hernández</dc:creator>
      <pubDate>Wed, 15 Nov 2023 11:03:04 +0000</pubDate>
      <link>https://forem.com/devjaime/what-is-kafka-and-how-to-implement-it-in-nestjs-4973</link>
      <guid>https://forem.com/devjaime/what-is-kafka-and-how-to-implement-it-in-nestjs-4973</guid>
      <description>&lt;p&gt;Apache Kafka&lt;/p&gt;

&lt;p&gt;Apache Kafka is a distributed and scalable data processing platform used for real-time data streaming. It serves as a messaging and event streaming platform, facilitating the secure, reliable, and real-time transfer of data between applications and distributed systems.&lt;/p&gt;

&lt;p&gt;Kafka operates on a publish-subscribe model, where data producers publish messages to a topic, and consumers subscribe to that topic to receive messages. Kafka can handle large volumes of real-time data and distribute them to multiple consumers in parallel.&lt;/p&gt;

&lt;p&gt;Commonly, Kafka finds applications in enterprise solutions, especially those requiring high-speed, high-availability communication between distributed systems. Additionally, Kafka is a flexible platform that can be integrated with various programming languages and tools, boasting an active developer community contributing to its improvement and expansion.&lt;/p&gt;

&lt;p&gt;Key features of Kafka include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Horizontal scalability&lt;/li&gt;
&lt;li&gt;Fault tolerance&lt;/li&gt;
&lt;li&gt;Data replication&lt;/li&gt;
&lt;li&gt;Storage capacity&lt;/li&gt;
&lt;li&gt;Integration with data processing tools like Apache Spark, Apache Flink, and Apache Storm&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Implementing Kafka in NestJS
&lt;/h2&gt;

&lt;p&gt;To implement Kafka in NestJS, follow these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Step one&lt;/li&gt;
&lt;li&gt;Step two&lt;/li&gt;
&lt;li&gt;Step three&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;1. Install the @nestjs/microservices and kafkajs packages using npm:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @nestjs/microservices kafkajs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;2. Create a Kafka module in NestJS using the NestJS generator:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nest generate module kafka
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;3. Import the KafkaModule in your main application:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;KafkaModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./kafka/kafka.module&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;KafkaModule&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;controllers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;AppController&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;providers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;AppService&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AppModule&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;4. Create a Kafka service in the KafkaModule:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Injectable&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@nestjs/common&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Kafka&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;kafkajs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Injectable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;KafkaService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;kafka&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;kafka&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Kafka&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;your-client-id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;brokers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;kafka-broker1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;kafka-broker2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;sendMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;producer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;kafka&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;producer&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;producer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;producer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="nx"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;producer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disconnect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;consumeMessages&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;consumer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;kafka&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;consumer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;groupId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;group-id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;consumer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;consumer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;fromBeginning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;consumer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;eachMessage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;partition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Handle the received message&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
          &lt;span class="nx"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nx"&gt;partition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;5. Add a controller in the KafkaModule to handle HTTP requests:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Controller&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Param&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@nestjs/common&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;KafkaService&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./kafka.service&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Controller&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;kafka&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;KafkaController&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;kafkaService&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;KafkaService&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;send/:topic&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;sendKafkaMessage&lt;/span&gt;&lt;span class="p"&gt;(@&lt;/span&gt;&lt;span class="nd"&gt;Param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;topic&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;kafkaService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;consume/:topic&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;consumeKafkaMessages&lt;/span&gt;&lt;span class="p"&gt;(@&lt;/span&gt;&lt;span class="nd"&gt;Param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;topic&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;kafkaService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;consumeMessages&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;6. Add the controller to the KafkaModule:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;controllers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;KafkaController&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;providers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;KafkaService&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;KafkaModule&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;7. Start your application.
These are the basic steps to implement Kafka in NestJS. Of course, there are many other configurations and options to consider, depending on your specific use case.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>kafka</category>
      <category>nestjs</category>
    </item>
    <item>
      <title>Simplifying Daily Life with Automation and Python: A Journey into Artificial Intelligence</title>
      <dc:creator>Jaime Hernández</dc:creator>
      <pubDate>Tue, 14 Nov 2023 01:12:42 +0000</pubDate>
      <link>https://forem.com/devjaime/simplifying-daily-life-with-automation-and-python-a-journey-into-artificial-intelligence-1h2k</link>
      <guid>https://forem.com/devjaime/simplifying-daily-life-with-automation-and-python-a-journey-into-artificial-intelligence-1h2k</guid>
      <description>&lt;h1&gt;
  
  
  I. Introduction to Automation and Python:
&lt;/h1&gt;

&lt;p&gt;In the hustle and bustle of daily life, we often find ourselves performing repetitive tasks that consume time and energy. This is where automation comes into play, and what better way to tackle it than with Python, a versatile and easy-to-learn programming language.&lt;/p&gt;

&lt;h2&gt;
  
  
  II. Repetitive Tasks and Python:
&lt;/h2&gt;

&lt;p&gt;From organizing files to scheduling emails, Python offers libraries and modules that simplify the automation of daily tasks. We’ll explore practical examples of creating simple scripts to perform tasks such as file and folder management, data extraction from spreadsheets, and more.&lt;/p&gt;

&lt;h3&gt;
  
  
  Repetitive Tasks and Python: A Practical Example
&lt;/h3&gt;

&lt;p&gt;Now that we’ve laid the groundwork for automation and Python, let’s take a practical step towards simplifying a common repetitive task: organizing files in our system. Imagine downloading files to your desktop every day, and after a while, it becomes chaotic. This is where Python can work wonders.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example: Organizing Files with Python
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;shutil&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;organize_files&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;download_path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# List of extensions and their corresponding folders
&lt;/span&gt;    &lt;span class="n"&gt;extensions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Documents&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.pdf&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.docx&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.txt&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Images&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.jpg&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.png&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.gif&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Music&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.mp3&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.wav&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Videos&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.mp4&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.mkv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="c1"&gt;# Add more categories as needed
&lt;/span&gt;    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;# Iterate over each file in the Downloads folder
&lt;/span&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;download_path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# Get the file extension
&lt;/span&gt;        &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;extension&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;splitext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Iterate over the categories and move the file to the corresponding folder
&lt;/span&gt;        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;allowed_extensions&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;extensions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;extension&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;allowed_extensions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;destination_folder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;download_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

                &lt;span class="c1"&gt;# Create the folder if it doesn't exist
&lt;/span&gt;                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;destination_folder&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                    &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;makedirs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;destination_folder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

                &lt;span class="c1"&gt;# Move the file to the corresponding folder
&lt;/span&gt;                &lt;span class="n"&gt;shutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;download_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;destination_folder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;File &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; moved to &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;destination_folder&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Path to the Downloads folder
&lt;/span&gt;&lt;span class="n"&gt;download_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/path/to/your/downloads/folder&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Call the function to organize the files
&lt;/span&gt;&lt;span class="nf"&gt;organize_files&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;download_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  III. Integrating Artificial Intelligence:
&lt;/h2&gt;

&lt;p&gt;AI adds a special touch to automation by allowing our scripts to learn and adapt over time. We’ll explore how to implement machine learning algorithms to make our automations smarter and more personalized. Imagine a system that learns from your patterns and anticipates your needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating a Personal Assistant in Python: A Practical Example
&lt;/h3&gt;

&lt;p&gt;In this section, we’ll dive into the fascinating world of artificial intelligence and create a basic personal assistant using Python and natural language processing (NLP) techniques. This assistant will be able to perform tasks such as reminders, online information searches, and more.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Example: Personal Assistant with Python and NLP
For this example, we’ll use the speech_recognition library for voice input, pyttsx3 for voice output, and wikipedia-api for online information retrieval. Make sure to have these libraries installed before running the code. You can install them using pip install SpeechRecognition pyttsx3 wikipedia-api.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;speech_recognition&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pyttsx3&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;wikipediaapi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  (Code for the personal assistant function is included here)
&lt;/h1&gt;

&lt;h2&gt;
  
  
  IV. Automation at Work:
&lt;/h2&gt;

&lt;p&gt;We’ll apply these concepts to a work environment, demonstrating how Python and AI can optimize common tasks in the workplace. From generating reports to sorting emails, we’ll see how automation can free up time for more strategic and creative tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  V. Creating a Personal Assistant:
&lt;/h2&gt;

&lt;p&gt;How about having your own customized assistant? We’ll explore how to build a virtual assistant using Python and natural language processing (NLP) techniques. From reminders to online information searches, your assistant will be ready to help anytime.&lt;/p&gt;

&lt;h2&gt;
  
  
  VI. Challenges and Ethics in Automation:
&lt;/h2&gt;

&lt;p&gt;As we explore these exciting possibilities, we’ll also consider the ethical challenges associated with automation and artificial intelligence. From privacy to the impact on employment, it’s essential to address these issues to ensure responsible use of technology.&lt;/p&gt;

&lt;h2&gt;
  
  
  VII. Conclusions and Next Steps:
&lt;/h2&gt;

&lt;p&gt;In this journey, we’ve seen how Python and artificial intelligence can work together to simplify our daily lives. By exploring automation, we’ve freed up time and resources to focus on what really matters. In future posts, we’ll explore new trends and advances in this exciting field.&lt;/p&gt;

</description>
      <category>python</category>
      <category>ia</category>
    </item>
  </channel>
</rss>
