<?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: Tu codigo cotidiano</title>
    <description>The latest articles on DEV Community by Tu codigo cotidiano (@tu_codigocotidiano_f173d).</description>
    <link>https://dev.to/tu_codigocotidiano_f173d</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3375057%2Ffa90e872-13fe-4a57-b3d6-e75515a50879.png</url>
      <title>DEV Community: Tu codigo cotidiano</title>
      <link>https://dev.to/tu_codigocotidiano_f173d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tu_codigocotidiano_f173d"/>
    <language>en</language>
    <item>
      <title>Python 3.15: ¿lazy import acelera tus programas? Una prueba real</title>
      <dc:creator>Tu codigo cotidiano</dc:creator>
      <pubDate>Tue, 13 Oct 2026 10:24:30 +0000</pubDate>
      <link>https://dev.to/tu_codigocotidiano_f173d/python-315-lazy-import-acelera-tus-programas-una-prueba-real-1dcj</link>
      <guid>https://dev.to/tu_codigocotidiano_f173d/python-315-lazy-import-acelera-tus-programas-una-prueba-real-1dcj</guid>
      <description>&lt;p&gt;Python 3.15 se lanzó oficialmente el 9 de octubre de 2026, incorporando nuevas características para mejorar la expresividad del lenguaje y ofrecer más control sobre la ejecución de nuestros programas.&lt;/p&gt;

&lt;p&gt;Pero hay una diferencia importante entre conocer una novedad y comprobar su funcionamiento.&lt;/p&gt;

&lt;p&gt;Decidí instalar Python 3.15.0 en Windows y realizar un pequeño experimento.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué sucede con lazy import?
&lt;/h2&gt;

&lt;p&gt;Tradicionalmente, cuando Python encuentra una instrucción &lt;code&gt;import&lt;/code&gt;, carga e inicializa el módulo correspondiente.&lt;/p&gt;

&lt;p&gt;Python 3.15 incorpora la posibilidad de realizar importaciones diferidas mediante la nueva sintaxis &lt;code&gt;lazy import&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Esto permite aplazar la inicialización de determinados módulos hasta que sean utilizados.&lt;/p&gt;

&lt;h3&gt;
  
  
  El experimento
&lt;/h3&gt;

&lt;p&gt;Preparé un módulo llamado &lt;code&gt;modulo_pesado.py&lt;/code&gt; con una espera artificial de dos segundos durante su inicialización.&lt;/p&gt;

&lt;p&gt;Después comparé dos situaciones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Una importación tradicional mediante &lt;code&gt;import modulo_pesado&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Una importación diferida mediante &lt;code&gt;lazy import modulo_pesado&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Utilicé &lt;code&gt;time.perf_counter()&lt;/code&gt; para medir los tiempos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resultados
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operación&lt;/th&gt;
&lt;th&gt;Tiempo observado&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Importación tradicional&lt;/td&gt;
&lt;td&gt;2,006 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Declaración con lazy import&lt;/td&gt;
&lt;td&gt;0,000 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Primer uso del módulo diferido&lt;/td&gt;
&lt;td&gt;2,002 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;El valor de 0,000 segundos está redondeado a tres decimales. No significa que la declaración tenga un costo absolutamente nulo.&lt;/p&gt;

&lt;p&gt;Además, la espera utilizada era artificial, por lo que estos números no representan una mejora general de rendimiento.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué aprendí?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;lazy import&lt;/code&gt; no elimina el costo de importar un módulo: cambia el momento en que se realiza.&lt;/p&gt;

&lt;p&gt;Puede resultar útil en herramientas de línea de comandos, aplicaciones con funcionalidades opcionales o proyectos con numerosas dependencias.&lt;/p&gt;

&lt;p&gt;Sin embargo, también hay que considerar que la inicialización y los posibles errores de importación pueden ocurrir más tarde.&lt;/p&gt;

&lt;p&gt;La recomendación es medir antes de optimizar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Otras novedades de Python 3.15
&lt;/h2&gt;

&lt;p&gt;Además de las importaciones diferidas, esta versión incorpora mejoras interesantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;frozendict:&lt;/strong&gt; diccionarios cuyas entradas no pueden modificarse.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;sentinel:&lt;/strong&gt; marcadores únicos para diferenciar la ausencia de un valor de &lt;code&gt;None&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unpacking en comprensiones:&lt;/strong&gt; nuevas formas de combinar colecciones mediante &lt;code&gt;*&lt;/code&gt; y &lt;code&gt;**&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UTF-8 por defecto:&lt;/strong&gt; un comportamiento más uniforme en el manejo de texto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tachyon:&lt;/strong&gt; herramientas integradas para analizar dónde consume tiempo un programa.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Guía completa en español
&lt;/h2&gt;

&lt;p&gt;En Tu Código Cotidiano publiqué una guía dedicada a Python 3.15, que incluye instalación en Windows, ejemplos ejecutables y pruebas de sus seis novedades destacadas.&lt;/p&gt;

&lt;p&gt;Puedes consultar gratuitamente la primera parte. El contenido restante forma parte de la membresía Premium.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://tucodigocotidiano.yarumaltech.com/leer_guias/python-315-desde-cero-instalacion-seis-novedades-y-pruebas-reales/" rel="noopener noreferrer"&gt;Leer Python 3.15 desde cero: instalación, seis novedades y pruebas reales&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Y ahora una pregunta para la comunidad:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué novedad de Python 3.15 consideras más útil para proyectos reales?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Publicado por Tu Código Cotidiano.&lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>performance</category>
    </item>
    <item>
      <title>Python Virtual Environments Finally Explained: venv, pip and Dependencies</title>
      <dc:creator>Tu codigo cotidiano</dc:creator>
      <pubDate>Tue, 06 Oct 2026 16:41:39 +0000</pubDate>
      <link>https://dev.to/tu_codigocotidiano_f173d/python-virtual-environments-finally-explained-venv-pip-and-dependencies-1p7a</link>
      <guid>https://dev.to/tu_codigocotidiano_f173d/python-virtual-environments-finally-explained-venv-pip-and-dependencies-1p7a</guid>
      <description>&lt;h1&gt;
  
  
  Python Virtual Environments Finally Explained: venv, pip and Dependencies
&lt;/h1&gt;

&lt;p&gt;A Python virtual environment isn't a tiny virtual machine.&lt;/p&gt;

&lt;p&gt;It's a much simpler idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Give each project its own Python dependency context.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Imagine two projects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Project A → package 1.x
Project B → package 2.x
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If both projects depend on the same global Python installation, sooner or later those requirements can collide.&lt;/p&gt;

&lt;p&gt;With virtual environments:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Project A → .venv → package 1.x
Project B → .venv → package 2.x
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each project gets its own dependency space.&lt;/p&gt;

&lt;h2&gt;
  
  
  Activating isn't magic
&lt;/h2&gt;

&lt;p&gt;When you activate a virtual environment, you're not starting another operating system.&lt;/p&gt;

&lt;p&gt;You're mainly changing which executables your shell finds first.&lt;/p&gt;

&lt;p&gt;That's why this is such a useful diagnostic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"import sys; print(sys.executable)"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of trusting the &lt;code&gt;(.venv)&lt;/code&gt; label, ask Python which interpreter is actually running.&lt;/p&gt;

&lt;h2&gt;
  
  
  The same idea applies to pip
&lt;/h2&gt;

&lt;p&gt;I prefer:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;because it makes the relationship explicit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chosen Python
→ its pip
→ its packages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  And the environment shouldn't be precious
&lt;/h2&gt;

&lt;p&gt;A useful mental model is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The environment is disposable. The recipe to rebuild it isn't.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's why we usually keep things like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;source code
requirements.txt
.gitignore
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;in Git, but not the entire &lt;code&gt;.venv&lt;/code&gt; directory.&lt;/p&gt;

&lt;p&gt;I wrote a complete visual guide covering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;venv&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;activation&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pip&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;direct vs transitive dependencies&lt;/li&gt;
&lt;li&gt;&lt;code&gt;requirements.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Git&lt;/li&gt;
&lt;li&gt;rebuilding environments&lt;/li&gt;
&lt;li&gt;common debugging mistakes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Full guide in Spanish:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tucodigocotidiano.yarumaltech.com/leer_guias/entornos-virtuales-y-dependencias-cada-proyecto-en-su-propia-burbuja/" rel="noopener noreferrer"&gt;https://tucodigocotidiano.yarumaltech.com/leer_guias/entornos-virtuales-y-dependencias-cada-proyecto-en-su-propia-burbuja/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One question for Python developers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can you delete your virtual environment today and rebuild it without guessing what was installed?&lt;/strong&gt;&lt;/p&gt;

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

</description>
      <category>python</category>
      <category>beginners</category>
      <category>programming</category>
      <category>devops</category>
    </item>
    <item>
      <title>El candado no significa lo que crees: qué protege realmente HTTPS</title>
      <dc:creator>Tu codigo cotidiano</dc:creator>
      <pubDate>Mon, 05 Oct 2026 13:19:26 +0000</pubDate>
      <link>https://dev.to/tu_codigocotidiano_f173d/el-candado-no-significa-lo-que-crees-que-protege-realmente-https-4a6b</link>
      <guid>https://dev.to/tu_codigocotidiano_f173d/el-candado-no-significa-lo-que-crees-que-protege-realmente-https-4a6b</guid>
      <description>&lt;p&gt;Hay una idea que hemos aprendido casi automáticamente al navegar por Internet:&lt;/p&gt;

&lt;p&gt;🔒 Candado = página segura.&lt;/p&gt;

&lt;p&gt;Pero no es exactamente así.&lt;/p&gt;

&lt;p&gt;HTTPS puede ofrecer una conexión criptográficamente protegida con una página que, aun así, pertenece a un atacante.&lt;/p&gt;

&lt;p&gt;Entonces, ¿qué protege realmente HTTPS?&lt;/p&gt;

&lt;p&gt;HTTPS protege la conexión&lt;/p&gt;

&lt;p&gt;Cuando visitas una dirección que comienza con https://, HTTP funciona sobre TLS.&lt;/p&gt;

&lt;p&gt;Antes de intercambiar normalmente el contenido de la página, navegador y servidor realizan un TLS handshake.&lt;/p&gt;

&lt;p&gt;De forma simplificada, durante ese proceso deben resolver varias cosas:&lt;/p&gt;

&lt;p&gt;cómo protegerán la comunicación;&lt;/p&gt;

&lt;p&gt;cómo establecerán claves;&lt;/p&gt;

&lt;p&gt;cómo comprobará el navegador la identidad del servidor;&lt;/p&gt;

&lt;p&gt;y cómo sabrán si los datos fueron modificados.&lt;/p&gt;

&lt;p&gt;El resultado es un canal protegido entre ambos extremos.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confidencialidad&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Imagina que estás conectado a una red Wi-Fi y escribes una contraseña.&lt;/p&gt;

&lt;p&gt;Sin protección criptográfica adecuada, alguien situado en el camino podría intentar observar el tráfico.&lt;/p&gt;

&lt;p&gt;TLS cifra el contenido de la comunicación.&lt;/p&gt;

&lt;p&gt;Eso significa que capturar los paquetes no debería permitir simplemente leer tu contraseña, una cookie de sesión o los datos HTTP intercambiados.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Integridad&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cifrar no es suficiente.&lt;/p&gt;

&lt;p&gt;También necesitamos saber que alguien no cambió los datos mientras viajaban.&lt;/p&gt;

&lt;p&gt;Supongamos que una aplicación envía:&lt;/p&gt;

&lt;p&gt;transferir 100.000 pesos&lt;/p&gt;

&lt;p&gt;Un atacante situado en medio de la comunicación no debería poder transformarlo silenciosamente en:&lt;/p&gt;

&lt;p&gt;transferir 1.000.000 de pesos&lt;/p&gt;

&lt;p&gt;TLS utiliza mecanismos criptográficos que permiten detectar alteraciones en los datos protegidos.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Autenticación&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Aquí aparecen los certificados digitales.&lt;/p&gt;

&lt;p&gt;El servidor presenta un certificado relacionado con el dominio que estás visitando y demuestra que posee la clave privada correspondiente.&lt;/p&gt;

&lt;p&gt;Tu navegador comprueba, entre otras cosas, la cadena de confianza, el dominio y la validez del certificado.&lt;/p&gt;

&lt;p&gt;Eso ayuda a evitar que cualquier servidor pueda simplemente afirmar:&lt;/p&gt;

&lt;p&gt;“Yo soy ese sitio web”.&lt;/p&gt;

&lt;p&gt;¿Y de dónde sale la clave para cifrar?&lt;/p&gt;

&lt;p&gt;Esta es una de las partes más interesantes.&lt;/p&gt;

&lt;p&gt;Al principio, navegador y servidor todavía no comparten el secreto que utilizarán para proteger la sesión.&lt;/p&gt;

&lt;p&gt;Durante el handshake utilizan criptografía de clave pública e intercambio de claves para conseguir material secreto compartido.&lt;/p&gt;

&lt;p&gt;Después pueden derivar claves de sesión.&lt;/p&gt;

&lt;p&gt;Y una vez establecida la sesión, la mayor parte de la comunicación puede protegerse mediante criptografía simétrica, mucho más eficiente para grandes cantidades de datos.&lt;/p&gt;

&lt;p&gt;Conceptualmente:&lt;/p&gt;

&lt;p&gt;Navegador&lt;br&gt;
    ↓&lt;br&gt;
TLS handshake&lt;br&gt;
    ↓&lt;br&gt;
Certificado + autenticación&lt;br&gt;
    ↓&lt;br&gt;
Intercambio de claves&lt;br&gt;
    ↓&lt;br&gt;
Claves de sesión&lt;br&gt;
    ↓&lt;br&gt;
Canal HTTP protegido&lt;br&gt;
    ↓&lt;br&gt;
Servidor&lt;/p&gt;

&lt;p&gt;Entonces… ¿qué significa realmente el candado?&lt;/p&gt;

&lt;p&gt;Aquí está la distinción importante.&lt;/p&gt;

&lt;p&gt;HTTPS puede decirte que estás manteniendo una conexión protegida con el dominio que aparece en tu navegador.&lt;/p&gt;

&lt;p&gt;Pero no puede garantizar que la persona que creó ese dominio tenga buenas intenciones.&lt;/p&gt;

&lt;p&gt;Un atacante puede registrar un dominio parecido al de un banco, obtener un certificado válido y construir una página de phishing.&lt;/p&gt;

&lt;p&gt;Y entonces ocurre algo curioso:&lt;/p&gt;

&lt;p&gt;TLS puede proteger perfectamente tu contraseña mientras viaja hacia el atacante.&lt;/p&gt;

&lt;p&gt;La criptografía funcionó.&lt;/p&gt;

&lt;p&gt;El problema estaba en que nosotros confiamos en el sitio equivocado.&lt;/p&gt;

&lt;p&gt;HTTPS tampoco significa anonimato&lt;/p&gt;

&lt;p&gt;TLS protege el contenido de la comunicación que transporta, pero no hace invisible toda tu actividad en Internet.&lt;/p&gt;

&lt;p&gt;Direcciones IP, DNS, características de las conexiones y otros metadatos pueden seguir proporcionando información dependiendo de la arquitectura utilizada.&lt;/p&gt;

&lt;p&gt;Por eso HTTPS es una pieza fundamental de la seguridad web, pero no es una capa mágica.&lt;/p&gt;

&lt;p&gt;La próxima vez que veas el candado…&lt;/p&gt;

&lt;p&gt;No pienses simplemente:&lt;/p&gt;

&lt;p&gt;“Esta página es segura”.&lt;/p&gt;

&lt;p&gt;Una interpretación mucho mejor sería:&lt;/p&gt;

&lt;p&gt;“Mi navegador ha establecido un canal criptográficamente protegido con este dominio”.&lt;/p&gt;

&lt;p&gt;Detrás de ese pequeño candado hay certificados, firmas digitales, intercambio de claves, criptografía simétrica y décadas de ingeniería de seguridad.&lt;/p&gt;

&lt;p&gt;🎙️ Hice un episodio de menos de cuatro minutos de Tu Código Cotidiano donde Javier y Laura explican toda esta historia de forma conversacional:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tucodigocotidiano.yarumaltech.com/escuchar-podcast/que-protege-hoy-https/" rel="noopener noreferrer"&gt;https://tucodigocotidiano.yarumaltech.com/escuchar-podcast/que-protege-hoy-https/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pregunta para la comunidad: ¿qué otra tecnología usamos todos los días pero casi nunca nos detenemos a pensar cómo funciona?&lt;/p&gt;

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

</description>
      <category>security</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>I built Deception Mesh: an open-source Rust MVP for defensive cybersecurity telemetry</title>
      <dc:creator>Tu codigo cotidiano</dc:creator>
      <pubDate>Thu, 01 Oct 2026 14:41:18 +0000</pubDate>
      <link>https://dev.to/tu_codigocotidiano_f173d/i-built-deception-mesh-an-open-source-rust-mvp-for-defensive-cybersecurity-telemetry-4bka</link>
      <guid>https://dev.to/tu_codigocotidiano_f173d/i-built-deception-mesh-an-open-source-rust-mvp-for-defensive-cybersecurity-telemetry-4bka</guid>
      <description>&lt;p&gt;I just published &lt;strong&gt;Deception Mesh&lt;/strong&gt;, an open-source cybersecurity MVP built in Rust.&lt;/p&gt;

&lt;p&gt;Project page: &lt;a href="https://tucodigocotidiano.yarumaltech.com/proyectos/deception-mesh/" rel="noopener noreferrer"&gt;https://tucodigocotidiano.yarumaltech.com/proyectos/deception-mesh/&lt;/a&gt;&lt;br&gt;&lt;br&gt;
GitHub: &lt;a href="https://github.com/tucodigocotidiano/deception-mesh" rel="noopener noreferrer"&gt;https://github.com/tucodigocotidiano/deception-mesh&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;Most small projects and learning environments think about security only after something goes wrong.&lt;/p&gt;

&lt;p&gt;Firewalls, authentication and monitoring are important, but there is another useful defensive idea:&lt;/p&gt;

&lt;p&gt;What if we could deploy small decoy services that are not real production systems, but can help us observe suspicious behavior?&lt;/p&gt;

&lt;p&gt;That is the core idea behind Deception Mesh.&lt;/p&gt;

&lt;p&gt;Instead of exposing only real services, the project uses lightweight decoy sensors that can capture suspicious HTTP and SSH activity and turn it into structured telemetry.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Deception Mesh does
&lt;/h2&gt;

&lt;p&gt;Deception Mesh is a defensive MVP.&lt;/p&gt;

&lt;p&gt;It is not an offensive tool.&lt;/p&gt;

&lt;p&gt;It does not try to exploit systems.&lt;/p&gt;

&lt;p&gt;It does not provide attack automation.&lt;/p&gt;

&lt;p&gt;Its purpose is to help observe suspicious interactions against decoy services and make those events easier to inspect.&lt;/p&gt;

&lt;p&gt;The MVP includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP decoy sensor&lt;/li&gt;
&lt;li&gt;SSH decoy sensor&lt;/li&gt;
&lt;li&gt;REST API&lt;/li&gt;
&lt;li&gt;JWT authentication&lt;/li&gt;
&lt;li&gt;Role-based access control&lt;/li&gt;
&lt;li&gt;Webhook notifications&lt;/li&gt;
&lt;li&gt;CSV export&lt;/li&gt;
&lt;li&gt;Docker deployment&lt;/li&gt;
&lt;li&gt;Documentation for local execution and testing&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The technical idea
&lt;/h2&gt;

&lt;p&gt;The project is based on a simple flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A suspicious client interacts with a decoy service.&lt;/li&gt;
&lt;li&gt;The sensor captures the event.&lt;/li&gt;
&lt;li&gt;The system stores or exposes the event as structured telemetry.&lt;/li&gt;
&lt;li&gt;The operator can review the signal through logs, CSV exports, API responses or webhook notifications.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The goal is not to replace enterprise security platforms.&lt;/p&gt;

&lt;p&gt;The goal is to show that a small, understandable and auditable deception layer can be built with practical software engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Rust
&lt;/h2&gt;

&lt;p&gt;I chose Rust because it is a strong fit for infrastructure-oriented security projects.&lt;/p&gt;

&lt;p&gt;It gives a good balance between performance, memory safety and explicit design.&lt;/p&gt;

&lt;p&gt;For a project that handles network-facing components, Rust also encourages discipline around error handling, data structures and system boundaries.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I wanted to prove
&lt;/h2&gt;

&lt;p&gt;With this MVP, I wanted to validate four things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A deception-based security concept can be implemented without building a huge platform.&lt;/li&gt;
&lt;li&gt;Rust can be used to create small defensive sensors with clean architecture.&lt;/li&gt;
&lt;li&gt;Security telemetry can be made understandable for developers and students.&lt;/li&gt;
&lt;li&gt;A project can be useful even when its scope is intentionally limited.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That last point matters.&lt;/p&gt;

&lt;p&gt;This is not presented as a finished commercial product.&lt;/p&gt;

&lt;p&gt;It is a validated MVP with a clear defensive scope and room for improvement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this project is for
&lt;/h2&gt;

&lt;p&gt;This project may be useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Software engineering students&lt;/li&gt;
&lt;li&gt;Cybersecurity students&lt;/li&gt;
&lt;li&gt;Backend developers&lt;/li&gt;
&lt;li&gt;Rust learners&lt;/li&gt;
&lt;li&gt;People interested in defensive infrastructure&lt;/li&gt;
&lt;li&gt;Anyone curious about deception-based security&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It can also be a starting point for discussions around telemetry, detection, infrastructure hardening and practical security engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current limitations
&lt;/h2&gt;

&lt;p&gt;The project is intentionally honest about its current stage.&lt;/p&gt;

&lt;p&gt;It is an MVP.&lt;/p&gt;

&lt;p&gt;It still needs more hardening, better testing, stronger deployment guidance and deeper validation before being treated as production-ready.&lt;/p&gt;

&lt;p&gt;That is part of the reason I am publishing it openly.&lt;/p&gt;

&lt;p&gt;I want feedback, technical criticism and ideas from people who care about building useful defensive systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;Deception Mesh started as a practical experiment, but it became a valuable learning project around cybersecurity, Rust, backend systems and telecommunications.&lt;/p&gt;

&lt;p&gt;If you are interested in open-source cybersecurity, defensive telemetry or Rust-based infrastructure, I would be happy if you take a look.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/tucodigocotidiano/deception-mesh" rel="noopener noreferrer"&gt;https://github.com/tucodigocotidiano/deception-mesh&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback, issues, stars and technical suggestions are welcome.&lt;/p&gt;

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

</description>
      <category>cybersecurity</category>
      <category>rust</category>
      <category>opensource</category>
      <category>backend</category>
    </item>
    <item>
      <title>¿Cómo puede tu celular conectarse directamente con un satélite?</title>
      <dc:creator>Tu codigo cotidiano</dc:creator>
      <pubDate>Mon, 07 Sep 2026 23:16:10 +0000</pubDate>
      <link>https://dev.to/tu_codigocotidiano_f173d/como-puede-tu-celular-conectarse-directamente-con-un-satelite-1326</link>
      <guid>https://dev.to/tu_codigocotidiano_f173d/como-puede-tu-celular-conectarse-directamente-con-un-satelite-1326</guid>
      <description>&lt;p&gt;Imagina esto:&lt;/p&gt;

&lt;p&gt;Estás en una carretera, una montaña o una zona rural.&lt;/p&gt;

&lt;p&gt;Miras tu teléfono.&lt;/p&gt;

&lt;p&gt;Sin servicio.&lt;/p&gt;

&lt;p&gt;No hay una torre celular suficientemente cerca, pero cientos de kilómetros sobre tu cabeza pasa un satélite.&lt;/p&gt;

&lt;p&gt;¿Podría tu mismo teléfono conectarse con él?&lt;/p&gt;

&lt;p&gt;En determinados servicios, la respuesta ya es sí.&lt;/p&gt;

&lt;p&gt;Y técnicamente es fascinante.&lt;/p&gt;

&lt;p&gt;Una torre celular que se mueve por el espacio&lt;/p&gt;

&lt;p&gt;Una forma sencilla de entender Direct to Cell es imaginar ciertos satélites como una extensión de la infraestructura de una red móvil.&lt;/p&gt;

&lt;p&gt;El teléfono sigue teniendo enormes limitaciones:&lt;/p&gt;

&lt;p&gt;transmite con relativamente poca potencia;&lt;br&gt;
utiliza una antena diminuta;&lt;br&gt;
no fue diseñado como una gran terminal satelital.&lt;/p&gt;

&lt;p&gt;Por eso buena parte de la dificultad está del otro lado del enlace.&lt;/p&gt;

&lt;p&gt;El sistema satelital necesita detectar señales extremadamente débiles, gestionar haces de cobertura y mantener comunicación mientras el satélite se desplaza rápidamente respecto al usuario.&lt;/p&gt;

&lt;p&gt;Y entonces aparece Doppler&lt;/p&gt;

&lt;p&gt;Una torre terrestre normalmente permanece en el mismo lugar.&lt;/p&gt;

&lt;p&gt;Un satélite LEO no.&lt;/p&gt;

&lt;p&gt;Su velocidad relativa provoca desplazamiento Doppler en la señal, mientras cambian continuamente distancia, retardo y geometría del enlace.&lt;/p&gt;

&lt;p&gt;La red tiene que compensar todo eso mientras intenta ofrecer al teléfono una experiencia que se parezca, en lo posible, a conectarse a una red móvil convencional.&lt;/p&gt;

&lt;p&gt;De la red terrestre a las NTN&lt;/p&gt;

&lt;p&gt;Aquí entran las Non-Terrestrial Networks (NTN).&lt;/p&gt;

&lt;p&gt;La evolución de las redes móviles está integrando cada vez más componentes terrestres y satelitales.&lt;/p&gt;

&lt;p&gt;Eso abre una posibilidad interesante:&lt;/p&gt;

&lt;p&gt;En ciudades y lugares con alta demanda seguimos utilizando infraestructura terrestre por su enorme capacidad.&lt;/p&gt;

&lt;p&gt;Pero cuando esa cobertura desaparece, una red satelital podría convertirse en una capa adicional de conectividad.&lt;/p&gt;

&lt;p&gt;No significa “Internet ilimitado desde cualquier lugar”.&lt;/p&gt;

&lt;p&gt;La capacidad sigue siendo limitada y existen requisitos de espectro, compatibilidad, regulación y acuerdos con operadores.&lt;/p&gt;

&lt;p&gt;Pero incluso poder mantener mensajería o determinados servicios donde antes había cero conectividad cambia bastante las cosas.&lt;/p&gt;

&lt;p&gt;Hicimos un episodio para explicarlo&lt;/p&gt;

&lt;p&gt;En el nuevo episodio de Tu Código Cotidiano, Javier y Laura explican Direct to Cell desde cero:&lt;/p&gt;

&lt;p&gt;LEO&lt;br&gt;
espectro móvil&lt;br&gt;
Doppler&lt;br&gt;
estaciones base en el espacio&lt;br&gt;
NTN&lt;br&gt;
limitaciones actuales&lt;br&gt;
cobertura rural&lt;/p&gt;

&lt;p&gt;Todo en menos de cuatro minutos y sin asumir conocimientos avanzados de telecomunicaciones.&lt;/p&gt;

&lt;p&gt;🎧 Escuchar episodio:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tucodigocotidiano.yarumaltech.com/escuchar-podcast/tu-celular-conectado-directamente-a-satelites-como-es-posible/" rel="noopener noreferrer"&gt;https://tucodigocotidiano.yarumaltech.com/escuchar-podcast/tu-celular-conectado-directamente-a-satelites-como-es-posible/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La pregunta que más me interesa es esta:&lt;/p&gt;

&lt;p&gt;¿Crees que la conectividad satelital terminará siendo simplemente otra capa de nuestras redes móviles, hasta el punto de que los usuarios ni siquiera notemos cuándo cambiamos de una torre terrestre a un satélite?&lt;/p&gt;

</description>
      <category>telecommunications</category>
      <category>networking</category>
      <category>5g</category>
      <category>satellite</category>
    </item>
    <item>
      <title>How to Organize Python Code with Modules and Packages — A Practical Beginner Guide</title>
      <dc:creator>Tu codigo cotidiano</dc:creator>
      <pubDate>Thu, 03 Sep 2026 15:54:20 +0000</pubDate>
      <link>https://dev.to/tu_codigocotidiano_f173d/how-to-organize-python-code-with-modules-and-packages-a-practical-beginner-guide-4cp5</link>
      <guid>https://dev.to/tu_codigocotidiano_f173d/how-to-organize-python-code-with-modules-and-packages-a-practical-beginner-guide-4cp5</guid>
      <description>&lt;p&gt;A Python program can work perfectly and still become difficult to maintain.&lt;/p&gt;

&lt;p&gt;That usually happens when one file slowly starts doing everything:&lt;/p&gt;

&lt;p&gt;program.py&lt;/p&gt;

&lt;p&gt;├── register expenses&lt;br&gt;
├── save CSV files&lt;br&gt;
├── calculate totals&lt;br&gt;
├── generate reports&lt;br&gt;
└── run the program&lt;/p&gt;

&lt;p&gt;Nothing is necessarily broken.&lt;/p&gt;

&lt;p&gt;The problem is that finding and changing one responsibility starts requiring you to understand several unrelated parts of the file.&lt;/p&gt;

&lt;p&gt;The first useful question&lt;/p&gt;

&lt;p&gt;When a Python project grows, don't start by asking:&lt;/p&gt;

&lt;p&gt;How many lines should a file have?&lt;/p&gt;

&lt;p&gt;A better question is:&lt;/p&gt;

&lt;p&gt;Which responsibilities belong together, and which ones should be able to change separately?&lt;/p&gt;

&lt;p&gt;For example, an expense tracker could evolve from one large file into:&lt;/p&gt;

&lt;p&gt;expense_tracker/&lt;br&gt;
├── main.py&lt;br&gt;
└── finance/&lt;br&gt;
    ├── &lt;strong&gt;init&lt;/strong&gt;.py&lt;br&gt;
    ├── expenses.py&lt;br&gt;
    ├── files.py&lt;br&gt;
    └── reports.py&lt;/p&gt;

&lt;p&gt;Now the structure itself tells us something:&lt;/p&gt;

&lt;p&gt;expenses.py handles expense logic.&lt;/p&gt;

&lt;p&gt;files.py handles persistence.&lt;/p&gt;

&lt;p&gt;reports.py handles calculations and summaries.&lt;/p&gt;

&lt;p&gt;main.py coordinates the program.&lt;/p&gt;

&lt;p&gt;That is the real value of modules and packages: they help the code communicate its structure.&lt;/p&gt;

&lt;p&gt;A tiny example&lt;/p&gt;

&lt;p&gt;Instead of keeping every function in main.py, we can create a module:&lt;/p&gt;

&lt;h1&gt;
  
  
  file: finance/expenses.py
&lt;/h1&gt;

&lt;p&gt;def add_expense(expenses, date, category, amount):&lt;br&gt;
    expenses.append({&lt;br&gt;
        "date": date,&lt;br&gt;
        "category": category,&lt;br&gt;
        "amount": amount&lt;br&gt;
    })&lt;/p&gt;

&lt;p&gt;Then use it from another file:&lt;/p&gt;

&lt;h1&gt;
  
  
  file: main.py
&lt;/h1&gt;

&lt;p&gt;from finance.expenses import add_expense&lt;/p&gt;

&lt;p&gt;expenses = []&lt;/p&gt;

&lt;p&gt;add_expense(&lt;br&gt;
    expenses,&lt;br&gt;
    "2026-09-02",&lt;br&gt;
    "Food",&lt;br&gt;
    18000&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;The behavior is simple, but the important change is architectural:&lt;/p&gt;

&lt;p&gt;the responsibility now has a clear home.&lt;/p&gt;

&lt;p&gt;The mistake to avoid&lt;/p&gt;

&lt;p&gt;Learning modules doesn't mean creating one file for every function.&lt;/p&gt;

&lt;p&gt;This:&lt;/p&gt;

&lt;p&gt;calculator/&lt;br&gt;
├── add.py&lt;br&gt;
├── subtract.py&lt;br&gt;
├── multiply.py&lt;br&gt;
└── divide.py&lt;/p&gt;

&lt;p&gt;is not automatically better than:&lt;/p&gt;

&lt;p&gt;calculator.py&lt;/p&gt;

&lt;p&gt;More files do not always mean better organization.&lt;/p&gt;

&lt;p&gt;The goal is not fragmentation.&lt;/p&gt;

&lt;p&gt;The goal is clarity.&lt;/p&gt;

&lt;p&gt;Want the full visual walkthrough?&lt;/p&gt;

&lt;p&gt;I wrote a complete step-by-step guide in Spanish on TuCódigoCotidiano.&lt;/p&gt;

&lt;p&gt;It covers:&lt;/p&gt;

&lt;p&gt;modules and packages;&lt;/p&gt;

&lt;p&gt;import;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;init&lt;/strong&gt;.py;&lt;/p&gt;

&lt;p&gt;if &lt;strong&gt;name&lt;/strong&gt; == "&lt;strong&gt;main&lt;/strong&gt;";&lt;/p&gt;

&lt;p&gt;absolute and relative imports;&lt;/p&gt;

&lt;p&gt;circular imports;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;pycache&lt;/strong&gt;;&lt;/p&gt;

&lt;p&gt;when to split code — and when not to.&lt;/p&gt;

&lt;p&gt;👉 Read the complete guide:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tucodigocotidiano.yarumaltech.com/leer_guias/modulos-y-paquetes-organiza-tu-codigo-sin-perderte/" rel="noopener noreferrer"&gt;https://tucodigocotidiano.yarumaltech.com/leer_guias/modulos-y-paquetes-organiza-tu-codigo-sin-perderte/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're moving from small Python scripts to projects with multiple files, this is exactly the transition the guide is designed to explain.&lt;/p&gt;

</description>
      <category>python</category>
      <category>beginners</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>¿Qué ocurre realmente cuando ejecutas un contenedor Docker?</title>
      <dc:creator>Tu codigo cotidiano</dc:creator>
      <pubDate>Mon, 31 Aug 2026 15:10:41 +0000</pubDate>
      <link>https://dev.to/tu_codigocotidiano_f173d/que-ocurre-realmente-cuando-ejecutas-un-contenedor-docker-5396</link>
      <guid>https://dev.to/tu_codigocotidiano_f173d/que-ocurre-realmente-cuando-ejecutas-un-contenedor-docker-5396</guid>
      <description>&lt;h1&gt;
  
  
  ¿Qué ocurre realmente cuando ejecutas un contenedor Docker?
&lt;/h1&gt;

&lt;p&gt;Escribes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Unos segundos después nginx está funcionando.&lt;/p&gt;

&lt;p&gt;Puede parecer que Docker acaba de crear una pequeña computadora dentro de tu computador.&lt;/p&gt;

&lt;p&gt;Pero eso no es realmente lo que ocurre.&lt;/p&gt;

&lt;h2&gt;
  
  
  Todo comienza con una imagen
&lt;/h2&gt;

&lt;p&gt;Docker necesita una imagen que contenga los elementos necesarios para ejecutar la aplicación.&lt;/p&gt;

&lt;p&gt;Las imágenes normalmente están construidas mediante capas.&lt;/p&gt;

&lt;p&gt;Eso permite reutilizar partes que ya existen en el sistema y evita descargar o almacenar todo nuevamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Después aparece el contenedor
&lt;/h2&gt;

&lt;p&gt;Docker utiliza la imagen como base y crea un entorno donde ejecutará la aplicación.&lt;/p&gt;

&lt;p&gt;Aquí aparece una diferencia fundamental:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;una imagen y un contenedor no son lo mismo.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La imagen es reutilizable.&lt;/p&gt;

&lt;p&gt;El contenedor es una instancia creada a partir de ella.&lt;/p&gt;

&lt;h2&gt;
  
  
  En el fondo hay procesos
&lt;/h2&gt;

&lt;p&gt;En Linux, un contenedor no necesita ejecutar un sistema operativo completo independiente.&lt;/p&gt;

&lt;p&gt;La aplicación se ejecuta como uno o varios procesos que comparten el kernel del host.&lt;/p&gt;

&lt;p&gt;Entonces, ¿cómo consigue Docker que parezca un entorno independiente?&lt;/p&gt;

&lt;h2&gt;
  
  
  Namespaces: aislamiento
&lt;/h2&gt;

&lt;p&gt;Linux dispone de mecanismos llamados namespaces.&lt;/p&gt;

&lt;p&gt;Gracias a ellos, un proceso puede tener una visión aislada de elementos como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;procesos&lt;/li&gt;
&lt;li&gt;interfaces de red&lt;/li&gt;
&lt;li&gt;puntos de montaje&lt;/li&gt;
&lt;li&gt;usuarios&lt;/li&gt;
&lt;li&gt;hostname&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para la aplicación, parece que existe dentro de su propio entorno.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cgroups: controlar recursos
&lt;/h2&gt;

&lt;p&gt;También necesitamos evitar que un contenedor consuma todos los recursos de la máquina.&lt;/p&gt;

&lt;p&gt;Para eso Linux dispone de los cgroups.&lt;/p&gt;

&lt;p&gt;Permiten gestionar y contabilizar recursos como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU&lt;/li&gt;
&lt;li&gt;memoria&lt;/li&gt;
&lt;li&gt;entrada y salida&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Docker utiliza estos mecanismos para aplicar límites a los contenedores.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué ocurre con la red?
&lt;/h2&gt;

&lt;p&gt;Docker también puede crear redes virtuales.&lt;/p&gt;

&lt;p&gt;Por ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:80 nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aquí estamos indicando que el tráfico recibido en el puerto 8080 del host pueda llegar al puerto 80 utilizado por nginx dentro del contenedor.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Y los datos?
&lt;/h2&gt;

&lt;p&gt;Un contenedor puede eliminarse.&lt;/p&gt;

&lt;p&gt;Pero nuestros datos muchas veces deben sobrevivir.&lt;/p&gt;

&lt;p&gt;Para eso existen los volúmenes.&lt;/p&gt;

&lt;p&gt;Los volúmenes permiten almacenar información fuera de la capa efímera del contenedor.&lt;/p&gt;

&lt;p&gt;Son especialmente importantes cuando trabajamos con bases de datos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entonces, ¿qué hay detrás de &lt;code&gt;docker run&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;Podemos visualizarlo así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IMAGEN
   ↓
PROCESO
   ↓
AISLAMIENTO
   ↓
CONTROL DE RECURSOS
   ↓
RED
   ↓
ALMACENAMIENTO
   ↓
CONTENEDOR
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Docker hace que toda esta coordinación parezca sencilla.&lt;/p&gt;

&lt;p&gt;Y esa es precisamente una de sus mayores virtudes.&lt;/p&gt;

&lt;p&gt;🎧 En &lt;strong&gt;Tu Código Cotidiano&lt;/strong&gt; preparé un episodio corto explicando todo este recorrido:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué ocurre dentro de Docker cuando ejecutas un contenedor?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tucodigocotidiano.yarumaltech.com/escuchar-podcast/que-ocurre-dentro-de-docker-cuando-ejecutas-un-contenedor/" rel="noopener noreferrer"&gt;https://tucodigocotidiano.yarumaltech.com/escuchar-podcast/que-ocurre-dentro-de-docker-cuando-ejecutas-un-contenedor/&lt;/a&gt;&lt;/p&gt;

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

</description>
      <category>docker</category>
      <category>linux</category>
      <category>devops</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Tu programa funciona… pero olvida todo: persistencia de datos con Python</title>
      <dc:creator>Tu codigo cotidiano</dc:creator>
      <pubDate>Thu, 27 Aug 2026 20:16:50 +0000</pubDate>
      <link>https://dev.to/tu_codigocotidiano_f173d/tu-programa-funciona-pero-olvida-todo-persistencia-de-datos-con-python-516n</link>
      <guid>https://dev.to/tu_codigocotidiano_f173d/tu-programa-funciona-pero-olvida-todo-persistencia-de-datos-con-python-516n</guid>
      <description>&lt;h1&gt;
  
  
  Tu programa funciona… pero olvida todo
&lt;/h1&gt;

&lt;p&gt;Imagina que estás creando un pequeño programa en Python para registrar gastos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;gastos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="n"&gt;gastos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;categoria&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;Comida&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;valor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;18000&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="n"&gt;gastos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Todo funciona.&lt;/p&gt;

&lt;p&gt;Pero cierras el programa, lo ejecutas nuevamente y &lt;code&gt;gastos&lt;/code&gt; vuelve a estar vacío.&lt;/p&gt;

&lt;p&gt;¿Por qué?&lt;/p&gt;

&lt;p&gt;Porque tener información dentro de una variable no significa haberla guardado permanentemente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memoria no es persistencia
&lt;/h2&gt;

&lt;p&gt;Mientras nuestro programa está ejecutándose puede trabajar con listas, diccionarios, números y otros objetos.&lt;/p&gt;

&lt;p&gt;Pero si queremos encontrar esa información después de cerrar el programa necesitamos representarla fuera de ese ciclo de ejecución.&lt;/p&gt;

&lt;p&gt;Una de las formas más sencillas de hacerlo es utilizando archivos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nota.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;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&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;archivo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;archivo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Mi primer dato persistente&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora la información puede continuar existiendo incluso después de que Python termine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tres letras importantes: r, w y a
&lt;/h2&gt;

&lt;p&gt;Cuando empezamos a trabajar con archivos hay tres modos especialmente útiles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;r → leer
w → escribir desde cero
a → añadir
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hay que tener especial cuidado con &lt;code&gt;w&lt;/code&gt;: si el archivo ya contenía información, podemos reemplazarla.&lt;/p&gt;

&lt;p&gt;Si queremos añadir algo sin borrar lo anterior:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nota.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;a&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&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;archivo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;archivo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Otra línea&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ¿TXT, CSV o JSON?
&lt;/h2&gt;

&lt;p&gt;Una forma sencilla de pensarlo es observar la estructura de nuestros datos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TXT&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Útil cuando queremos guardar texto sencillo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CSV&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tiene sentido cuando nuestros datos se parecen a una tabla:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fecha,categoria,valor
2026-08-27,Comida,18000
2026-08-27,Transporte,6500
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Python incluye el módulo &lt;code&gt;csv&lt;/code&gt;, por lo que no necesitamos construir el archivo concatenando comas manualmente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JSON&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Empieza a resultar interesante cuando nuestros datos contienen claves, listas, números, booleanos o estructuras anidadas.&lt;/p&gt;

&lt;p&gt;La decisión no consiste simplemente en memorizar tres extensiones.&lt;/p&gt;

&lt;p&gt;Consiste en preguntarnos:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿qué forma tienen mis datos?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ese cambio de perspectiva hace mucho más sencillo entender la persistencia.&lt;/p&gt;

&lt;p&gt;Preparé una guía completa en español donde desarrollamos el recorrido desde memoria y archivos TXT hasta CSV y JSON, con ejemplos paso a paso:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://tucodigocotidiano.yarumaltech.com/leer_guias/archivos-de-texto-csv-y-json-datos-que-sobreviven-al-programa/" rel="noopener noreferrer"&gt;https://tucodigocotidiano.yarumaltech.com/leer_guias/archivos-de-texto-csv-y-json-datos-que-sobreviven-al-programa/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una frase resume bastante bien todo el concepto:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;El programa puede terminar. Los datos no tienen por qué desaparecer.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>programming</category>
    </item>
    <item>
      <title>Python Didn't Crash. The Result Was Still Wrong.</title>
      <dc:creator>Tu codigo cotidiano</dc:creator>
      <pubDate>Wed, 26 Aug 2026 20:50:27 +0000</pubDate>
      <link>https://dev.to/tu_codigocotidiano_f173d/python-didnt-crash-the-result-was-still-wrong-30ck</link>
      <guid>https://dev.to/tu_codigocotidiano_f173d/python-didnt-crash-the-result-was-still-wrong-30ck</guid>
      <description>&lt;p&gt;One of the most dangerous bugs isn't a SyntaxError.&lt;/p&gt;

&lt;p&gt;It isn't an exception.&lt;/p&gt;

&lt;p&gt;It doesn't even produce a traceback.&lt;/p&gt;

&lt;p&gt;Sometimes Python executes your entire program successfully...&lt;/p&gt;

&lt;p&gt;…and gives you the wrong answer.&lt;/p&gt;

&lt;p&gt;Consider this:&lt;/p&gt;

&lt;p&gt;def calcular_total(precios, descuento):&lt;br&gt;
    subtotal = sum(precios)&lt;br&gt;
    total = subtotal - descuento&lt;br&gt;
    return total&lt;/p&gt;

&lt;p&gt;precios = [120000, 80000]&lt;br&gt;
descuento = 0.10&lt;/p&gt;

&lt;p&gt;print(calcular_total(precios, descuento))&lt;/p&gt;

&lt;p&gt;Expected:&lt;/p&gt;

&lt;p&gt;180000&lt;/p&gt;

&lt;p&gt;Actual:&lt;/p&gt;

&lt;p&gt;199999.9&lt;/p&gt;

&lt;p&gt;Python isn't broken.&lt;/p&gt;

&lt;p&gt;Our assumption is.&lt;/p&gt;

&lt;p&gt;And that's where debugging becomes much more interesting.&lt;/p&gt;

&lt;p&gt;A mistake I made when learning to debug was asking:&lt;/p&gt;

&lt;p&gt;“What should I print?”&lt;/p&gt;

&lt;p&gt;A better question is:&lt;/p&gt;

&lt;p&gt;“What do I need to observe to prove or reject my hypothesis?”&lt;/p&gt;

&lt;p&gt;That changes debugging from guessing into an experiment:&lt;/p&gt;

&lt;p&gt;Reproduce → Hypothesis → Measure → Evidence → Conclusion&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;Are the inputs correct?&lt;br&gt;
Is subtotal correct?&lt;br&gt;
Is descuento what we expect?&lt;br&gt;
At which exact operation does the state become wrong?&lt;/p&gt;

&lt;p&gt;Once you know that:&lt;/p&gt;

&lt;p&gt;subtotal = 200000 ✓&lt;br&gt;
descuento = 0.10 ✓&lt;/p&gt;

&lt;p&gt;the search space becomes tiny.&lt;/p&gt;

&lt;p&gt;The suspicious operation is now:&lt;/p&gt;

&lt;p&gt;subtotal - descuento&lt;/p&gt;

&lt;p&gt;That's the real goal of debugging:&lt;/p&gt;

&lt;p&gt;Turn “something is wrong” into one small, testable question.&lt;/p&gt;

&lt;p&gt;I wrote a practical guide showing this process with print(), type(), repr(), breakpoint() and step-by-step state inspection.&lt;/p&gt;

&lt;p&gt;Full guide:&lt;br&gt;
&lt;a href="https://tucodigocotidiano.yarumaltech.com/leer_guias/depuracion-aprende-a-encontrar-el-error-antes-de-culpar-a-python/" rel="noopener noreferrer"&gt;https://tucodigocotidiano.yarumaltech.com/leer_guias/depuracion-aprende-a-encontrar-el-error-antes-de-culpar-a-python/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>debugging</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Python Exceptions: From a Crashing Program to Controlled Error Handling</title>
      <dc:creator>Tu codigo cotidiano</dc:creator>
      <pubDate>Mon, 24 Aug 2026 23:50:50 +0000</pubDate>
      <link>https://dev.to/tu_codigocotidiano_f173d/python-exceptions-from-a-crashing-program-to-controlled-error-handling-4gbp</link>
      <guid>https://dev.to/tu_codigocotidiano_f173d/python-exceptions-from-a-crashing-program-to-controlled-error-handling-4gbp</guid>
      <description>&lt;p&gt;What should your Python program do when reality doesn’t follow the happy path?&lt;/p&gt;

&lt;p&gt;I published a new practical guide on errors and exceptions in Python.&lt;/p&gt;

&lt;p&gt;Instead of starting by memorizing try, except, else, and finally, the guide begins with a program that crashes because of unexpected input and builds the solution step by step.&lt;/p&gt;

&lt;p&gt;It covers traceback reading, ValueError, ZeroDivisionError, specific exception handling, else, finally, raise, common mistakes, and a final program that survives invalid input.&lt;/p&gt;

&lt;p&gt;The main idea:&lt;/p&gt;

&lt;p&gt;Exception handling is not about hiding errors. It is about designing what your program should do when something goes wrong.&lt;/p&gt;

&lt;p&gt;Full guide in Spanish:&lt;br&gt;
&lt;a href="https://tucodigocotidiano.yarumaltech.com/leer_guias/errores-y-excepciones-en-python-evita-que-tu-programa-muera-en-el-intento/" rel="noopener noreferrer"&gt;https://tucodigocotidiano.yarumaltech.com/leer_guias/errores-y-excepciones-en-python-evita-que-tu-programa-muera-en-el-intento/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>beginners</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>De Ionic a PostgreSQL: qué ocurre realmente cuando creamos una tarea</title>
      <dc:creator>Tu codigo cotidiano</dc:creator>
      <pubDate>Tue, 18 Aug 2026 20:41:48 +0000</pubDate>
      <link>https://dev.to/tu_codigocotidiano_f173d/de-ionic-a-postgresql-que-ocurre-realmente-cuando-creamos-una-tarea-3co1</link>
      <guid>https://dev.to/tu_codigocotidiano_f173d/de-ionic-a-postgresql-que-ocurre-realmente-cuando-creamos-una-tarea-3co1</guid>
      <description>&lt;h1&gt;
  
  
  De Ionic a Posts una tarea
&lt;/h1&gt;

&lt;p&gt;Aprender Django, Angular o PostgreSQL por separado es relativamente sencillo.&lt;/p&gt;

&lt;p&gt;El verdadero salto ocurre cuando intentamos entender &lt;strong&gt;cómo todas esas tecnologías colaboran dentro de una aplicación real&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Supongamos que tenemos una aplicación móvil para administrar tareas y el usuario pulsa:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Crear tarea&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;¿Qué ocurre después?&lt;/p&gt;

&lt;p&gt;La respuesta completa se parece a esto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ionic / Angular
      ↓
   HTTP + JSON
      ↓
Django REST Framework
      ↓
   Django ORM
      ↓
PostgreSQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  1. Angular recoge la información
&lt;/h2&gt;

&lt;p&gt;El formulario mantiene temporalmente valores como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;título;&lt;/li&gt;
&lt;li&gt;descripción;&lt;/li&gt;
&lt;li&gt;estado;&lt;/li&gt;
&lt;li&gt;fecha límite.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pero esos datos todavía no forman parte del estado permanente del sistema.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. El cliente construye una petición HTTP
&lt;/h2&gt;

&lt;p&gt;Angular utiliza un servicio para enviar los datos hacia nuestra API.&lt;/p&gt;

&lt;p&gt;El frontend no debería conectarse directamente a PostgreSQL.&lt;/p&gt;

&lt;p&gt;Su trabajo es solicitar una operación al backend.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Django REST Framework recibe el JSON
&lt;/h2&gt;

&lt;p&gt;Aquí comienza una de las partes más importantes.&lt;/p&gt;

&lt;p&gt;El servidor no debería confiar ciegamente en lo enviado desde la interfaz.&lt;/p&gt;

&lt;p&gt;Django REST Framework valida el contrato de la petición y permite que las reglas del dominio permanezcan centralizadas en el servidor.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. El backend aplica las reglas
&lt;/h2&gt;

&lt;p&gt;Una tarea puede tener, por ejemplo, solamente tres estados válidos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pendiente;&lt;/li&gt;
&lt;li&gt;pospuesta;&lt;/li&gt;
&lt;li&gt;completada.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;También podemos implementar reglas como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;identificar tareas próximas a vencer;&lt;/li&gt;
&lt;li&gt;conservar información de auditoría;&lt;/li&gt;
&lt;li&gt;asignar usuarios;&lt;/li&gt;
&lt;li&gt;realizar eliminación lógica en lugar de destruir registros.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estas decisiones pertenecen al dominio de la aplicación, no simplemente a la interfaz.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. El ORM persiste la información
&lt;/h2&gt;

&lt;p&gt;Una vez validada la operación, Django utiliza su ORM para escribir los cambios en PostgreSQL.&lt;/p&gt;

&lt;p&gt;Ahora sí existe una representación persistente de la tarea.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. La API responde
&lt;/h2&gt;

&lt;p&gt;Django REST Framework serializa nuevamente la entidad y devuelve JSON al cliente.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Ionic actualiza la interfaz
&lt;/h2&gt;

&lt;p&gt;Angular recibe la respuesta y actualiza el estado visible de la aplicación.&lt;/p&gt;

&lt;p&gt;Tenemos entonces un ciclo completo:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;interfaz → API → reglas → persistencia → API → interfaz&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Y esa misma arquitectura puede reutilizarse cuando llevamos la aplicación a Android utilizando Ionic y Capacitor.&lt;/p&gt;




&lt;p&gt;Construí un tutorial completo donde implementamos este proyecto paso a paso utilizando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Django REST Framework&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Angular&lt;/li&gt;
&lt;li&gt;Ionic&lt;/li&gt;
&lt;li&gt;CaD, filtros, soft delete, auditoría, cambios de estado y tareas próximas a vencer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;Tutorial completo en español:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tucodigocotidiano.yarumaltech.com/leer_tutoriales/construye-una-app-fullstack-con-django-rest-postgresql-angular-ionic-y-android/" rel="noopener noreferrer"&gt;https://tucodigocotidiano.yarumaltech.com/leer_tutoriales/construye-una-app-fullstack-con-django-rest-postgresql-angular-ionic-y-android/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si estás aprendiendo arquitectura fullstack, mi recomendación es que no te concentres únicamente en hacer funcionar cada tecnología.&lt;/p&gt;

&lt;p&gt;Intenta seguir &lt;strong&gt;el recorrido completo de una sola operación desde la pantalla hasta la base de datos y de vuelta&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ahí es donde muchas piezas empiezan a tener sentido.&lt;/p&gt;

</description>
      <category>django</category>
      <category>angular</category>
      <category>ionic</category>
      <category>postgres</category>
    </item>
    <item>
      <title>What Physically Happens When You Ask an AI a Question?</title>
      <dc:creator>Tu codigo cotidiano</dc:creator>
      <pubDate>Tue, 11 Aug 2026 22:18:14 +0000</pubDate>
      <link>https://dev.to/tu_codigocotidiano_f173d/what-physically-happens-when-you-ask-an-ai-a-question-5503</link>
      <guid>https://dev.to/tu_codigocotidiano_f173d/what-physically-happens-when-you-ask-an-ai-a-question-5503</guid>
      <description>&lt;p&gt;We often think about artificial intelligence as something purely digital.&lt;/p&gt;

&lt;p&gt;You type a question.&lt;/p&gt;

&lt;p&gt;Press Enter.&lt;/p&gt;

&lt;p&gt;A few seconds later, an answer appears.&lt;/p&gt;

&lt;p&gt;But physically, a surprising amount of infrastructure has been involved during those few seconds.&lt;/p&gt;

&lt;p&gt;Your question first travels through networking infrastructure toward a data center. There, the text is transformed into tokens that can be processed by an AI model.&lt;/p&gt;

&lt;p&gt;Specialized hardware—often GPUs or other accelerators—performs billions of mathematical operations to calculate what should come next.&lt;/p&gt;

&lt;p&gt;That computation requires electricity.&lt;/p&gt;

&lt;p&gt;Electricity produces heat.&lt;/p&gt;

&lt;p&gt;Heat requires cooling.&lt;/p&gt;

&lt;p&gt;And all of this happens while networking systems move information between your device, servers, memory, storage and computing accelerators.&lt;/p&gt;

&lt;p&gt;In other words, an AI response is not simply “generated by software.”&lt;/p&gt;

&lt;p&gt;It is the result of a physical chain involving:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Networks&lt;/li&gt;
&lt;li&gt;Data centers&lt;/li&gt;
&lt;li&gt;GPUs and accelerators&lt;/li&gt;
&lt;li&gt;Memory&lt;/li&gt;
&lt;li&gt;Electricity&lt;/li&gt;
&lt;li&gt;Cooling systems&lt;/li&gt;
&lt;li&gt;Large-scale distributed computing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I recently explored this idea in a new episode of &lt;strong&gt;TuCodigoCotidiano&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;🎧 &lt;strong&gt;¿Qué ocurre físicamente cuando le preguntas algo a una IA?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tucodigocotidiano.yarumaltech.com/escuchar-podcast/que-ocurre-fisicamente-cuando-le-preguntas-algo-a-una-ia/" rel="noopener noreferrer"&gt;https://tucodigocotidiano.yarumaltech.com/escuchar-podcast/que-ocurre-fisicamente-cuando-le-preguntas-algo-a-una-ia/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The episode is in Spanish and focuses on understanding the physical infrastructure behind something we now do every day: asking an AI a question.&lt;/p&gt;

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

&lt;h1&gt;
  
  
  ai #machinelearning #computerscience #technology
&lt;/h1&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>deeplearning</category>
      <category>technology</category>
    </item>
  </channel>
</rss>
