<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>DevLog</title><description>Artículos sobre desarrollo web, PHP, JS y tooling</description><link>https://hugocl01-devlog.netlify.app/</link><item><title>Novedades en el blog: Astro 6, Tailwind 4 y mucho más</title><link>https://hugocl01-devlog.netlify.app/blog/post-000016/</link><guid isPermaLink="true">https://hugocl01-devlog.netlify.app/blog/post-000016/</guid><description>Descubre las últimas actualizaciones del blog: migración a Astro 6, implementación de Tailwind CSS 4 y mejoras en la experiencia de usuario.</description><pubDate>Sun, 29 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;el-blog-se-renueva-novedades-astro-6-tailwind-4-y-mucho-más&quot;&gt;¡El blog se renueva! Novedades: Astro 6, Tailwind 4 y mucho más&lt;/h2&gt;
&lt;p&gt;Bienvenidos a una nueva etapa del blog. Recientemente he realizado una serie de actualizaciones técnicas profundas para mejorar no solo la apariencia visual, sino también el rendimiento y la mantenibilidad de este espacio.&lt;/p&gt;
&lt;p&gt;Aquí te cuento los cambios más significativos que he implementado:&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;1-migración-a-astro-6&quot;&gt;1. Migración a Astro 6&lt;/h3&gt;
&lt;p&gt;Hemos dado el salto a &lt;strong&gt;Astro 6&lt;/strong&gt;, la última versión mayor de este increíble framework. Esto nos permite aprovechar las nuevas mejoras en el motor de renderizado, optimización de assets y una experiencia de desarrollo mucho más fluida. Astro sigue siendo nuestra elección número uno por su enfoque en el rendimiento y su arquitectura de “islas”.&lt;/p&gt;
&lt;h3 id=&quot;2-tailwind-css-4-el-futuro-del-diseño&quot;&gt;2. Tailwind CSS 4: El futuro del diseño&lt;/h3&gt;
&lt;p&gt;Este blog ahora utiliza &lt;strong&gt;Tailwind CSS 4&lt;/strong&gt;. Esta nueva versión de Tailwind simplifica la configuración y mejora drásticamente los tiempos de compilación. Gracias a su nuevo motor, el diseño es más coherente y nos permite iterar sobre la interfaz con una velocidad sin precedentes.&lt;/p&gt;
&lt;h3 id=&quot;3-actualización-a-react-19&quot;&gt;3. Actualización a React 19&lt;/h3&gt;
&lt;p&gt;En las partes interactivas del blog ahora estamos utilizando &lt;strong&gt;React 19&lt;/strong&gt;. Esto nos garantiza el acceso a las últimas API de React, mejorando la gestión del estado y la interactividad de componentes como el menú de navegación y el selector de temas.&lt;/p&gt;
&lt;h3 id=&quot;4-mejoras-en-la-experiencia-de-usuario-ux&quot;&gt;4. Mejoras en la Experiencia de Usuario (UX)&lt;/h3&gt;
&lt;p&gt;No todo ha sido “bajo el capó”. También he pulido varios aspectos visuales:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Modo Oscuro Mejorado&lt;/strong&gt;: Una paleta de colores más equilibrada y descansada para la vista.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tipografía Refinada&lt;/strong&gt;: Mejor legibilidad en todos los dispositivos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rendimiento de Carga&lt;/strong&gt;: Gracias a las optimizaciones de Astro 6, el blog carga casi instantáneamente.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;5-qué-sigue-para-el-devlog&quot;&gt;5. ¿Qué sigue para el Devlog?&lt;/h3&gt;
&lt;p&gt;Este es solo el comienzo. Mi objetivo es seguir compartiendo contenido sobre desarrollo web, ciberseguridad y las últimas tendencias tecnológicas. Con esta nueva base técnica, será mucho más fácil añadir nuevas funcionalidades y tipos de contenido en el futuro.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;¿Qué te parecen estos cambios?&lt;/strong&gt; Si tienes alguna sugerencia o has encontrado algún detalle que mejorar, ¡no dudes en contactarme!&lt;/p&gt;
&lt;p&gt;¡Gracias por leer!&lt;/p&gt;</content:encoded><category>Astro</category><category>Tailwind CSS</category><category>React</category><category>Desarrollo web</category><category>Actualizaciones</category><author>Hugo Cayón Laso</author></item><item><title>Cómo construí mi blog con Astro: arquitectura, componentes y trucos</title><link>https://hugocl01-devlog.netlify.app/blog/post-000015/</link><guid isPermaLink="true">https://hugocl01-devlog.netlify.app/blog/post-000015/</guid><description>Explicación técnica y ejemplos de código de mi blog en Astro.</description><pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Crear este blog con Astro ha sido una de las mejores decisiones que he tomado como desarrollador. En este artículo quiero compartir cómo lo construí, qué decisiones tomé a nivel técnico y partes del código que se utiliza en mi estructura actual. Mi objetivo es que cualquier persona pueda replicarlo o inspirarse para crear el suyo.&lt;/p&gt;
&lt;h2 id=&quot;por-qué-astro&quot;&gt;¿Por qué Astro?&lt;/h2&gt;
&lt;p&gt;Elegí Astro por varias razones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generación estática ultra rápida.&lt;/li&gt;
&lt;li&gt;Soporte integrado de Markdown + MDX.&lt;/li&gt;
&lt;li&gt;Posibilidad de usar componentes de React, Svelte, Vue… solo donde hace falta.&lt;/li&gt;
&lt;li&gt;Su arquitectura de islas, que optimiza la carga y el rendimiento.&lt;/li&gt;
&lt;li&gt;Un sistema de contenido: astro:content.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;estructura-general-del-proyecto&quot;&gt;Estructura general del proyecto&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;src&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  components&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  layouts&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  pages&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    blog&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    tags&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  content&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    posts&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A continuación explico qué papel juega cada carpeta y por qué la organicé así:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;src/components/&lt;/strong&gt;
Aquí guardo todos los componentes reutilizables que voy creando para el blog: tarjetas de posts, botones, navegación, componentes UI, etc. Mi objetivo es que cualquier pieza visual que se repita en varias páginas esté centralizada en este directorio.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;src/layouts/&lt;/strong&gt;
Esta carpeta contiene los layouts del blog. Un layout define la estructura general de una página (cabecera, pie, estilos base, tipografía…), así que tenerlos separados me permite reutilizar la misma estructura en todas las publicaciones sin duplicar código.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;src/pages/&lt;/strong&gt;
Astro utiliza un sistema de enrutado basado en archivos, así que todo lo que esté aquí se convierte automáticamente en una ruta pública.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;pages/blog/&lt;/strong&gt;
Incluye el listado de posts, la paginación y la lógica que genera las páginas individuales del blog.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pages/tags/&lt;/strong&gt;
Las páginas de etiquetas se generan desde aquí. Me interesa tenerlas separadas para mejorar la navegación del blog y permitir al lector filtrar contenido por temas.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;src/content/&lt;/strong&gt;
Esta es la parte donde vive todo el contenido del blog.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;content/posts/&lt;/strong&gt;
Aquí es donde guardo cada post como un archivo Markdown independiente.
Cada post está escrito en Markdown y validado con Content Collections de Astro, lo que me asegura tipado, metadatos coherentes y un sistema más ordenado para gestionar las publicaciones.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Gracias a esta estructura, el proyecto se mantiene limpio y escalable. Cada pieza tiene su lugar y puedo añadir nuevas funciones o componentes sin complicar la organización general.&lt;/p&gt;
&lt;h2 id=&quot;1-arquitectura-de-datos-content-collections&quot;&gt;1. Arquitectura de Datos: Content Collections&lt;/h2&gt;
&lt;p&gt;El corazón del blog es el sistema de &lt;strong&gt;Content Collections&lt;/strong&gt;. No solo guardamos archivos Markdown, sino que definimos un contrato estricto mediante un esquema de &lt;strong&gt;Zod&lt;/strong&gt;. Esto nos permite validar que cada post tenga título, fecha y etiquetas antes de que el sitio se construya, evitando errores en producción.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// src/content/config.ts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { defineCollection, z } &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;astro:content&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; posts&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; defineCollection&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  type: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  schema&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: ({ &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;image&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    z.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;object&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      title: z.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      description: z.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      date: z.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;date&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      author: z.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      tags: z.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;array&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(z.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()).&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;optional&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      cover: &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;image&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;optional&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      draft: z.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;boolean&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;default&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; collections&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { posts };&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;2-flujo-de-generación-y-rutado-dinámico&quot;&gt;2. Flujo de Generación y Rutado Dinámico&lt;/h2&gt;
&lt;p&gt;Astro genera el blog de forma estática (SSG) para un rendimiento imbatible. Para las páginas de cada post (&lt;code&gt;src/pages/blog/[slug].astro&lt;/code&gt;), utilizamos &lt;code&gt;getStaticPaths&lt;/code&gt; para mapear cada archivo de la colección a una URL única.&lt;/p&gt;
&lt;p&gt;Este es un ejemplo real de cómo gestionamos la lógica de &lt;strong&gt;Navegación Relativa&lt;/strong&gt; (Anterior/Siguiente) y el cálculo del &lt;strong&gt;Tiempo de Lectura&lt;/strong&gt; in-situ:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;astro&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;// src/pages/blog/[slug].astro&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;import { getCollection } from &quot;astro:content&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;import PostLayout from &quot;@/layouts/PostLayout.astro&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;import { calculateReadingTime } from &quot;@/utils/readingTime&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;export async function getStaticPaths() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; posts&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;await&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; getCollection&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;posts&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    .&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;filter&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;post&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; !&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;post.data.draft)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    .&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sort&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;b&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; a.data.date.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;getTime&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; b.data.date.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;getTime&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; posts.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;post&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;index&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    params: { slug: post.slug },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    props: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      post,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      prev: posts[index &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;??&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      next: posts[index &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;??&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;const { post, prev, next } = Astro.props;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;const { Content } = await post.render();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;PostLayout&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  {&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;post.data}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  prev&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={prev}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  next&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={next}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  readingTime&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={post.body &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; calculateReadingTime&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(post.body) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; undefined&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;Content&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;PostLayout&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;3-jerarquía-de-layouts-y-herencia-de-metadatos&quot;&gt;3. Jerarquía de Layouts y Herencia de Metadatos&lt;/h2&gt;
&lt;p&gt;La estructura visual sigue una jerarquía de composición clara:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;main.astro&lt;/code&gt;&lt;/strong&gt;: El layout “Shell”. Configura el HTML base, fuentes, &lt;code&gt;ClientRouter&lt;/code&gt; y los metadatos globales (OpenGraph, Twitter).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;BlogLayout.astro&lt;/code&gt;&lt;/strong&gt;: Layout intermedio para listados y categorías.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;PostLayout.astro&lt;/code&gt;&lt;/strong&gt;: El layout especializado. Gestiona la lógica de artículos, inyecta &lt;strong&gt;JSON-LD&lt;/strong&gt; para SEO semántico y maneja componentes complejos como la galería de imágenes con &lt;code&gt;astro:assets&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;3-jerarquía-de-layouts-la-estructura-del-blog&quot;&gt;3. Jerarquía de Layouts: La estructura del Blog&lt;/h2&gt;
&lt;p&gt;La arquitectura visual se divide en tres niveles de responsabilidad, utilizando la composición de Astro para maximizar la reutilización y el rendimiento.&lt;/p&gt;
&lt;h3 id=&quot;31-el-layout-shell-mainastro&quot;&gt;3.1. El Layout “Shell” (&lt;code&gt;main.astro&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;Este es el punto de entrada de todas las páginas. Gestiona el &lt;code&gt;document&lt;/code&gt; HTML, el SEO global, las fuentes y el sistema de transiciones.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;astro&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;// src/layouts/main.astro&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;import &quot;../styles/global.css&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;import Header from &quot;../components/Header.astro&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;import Footer from &quot;../components/Footer.astro&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;import { ClientRouter } from &quot;astro:transitions&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;const { title, description, image &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;/og-image.png&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, type &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;website&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; } = Astro.props;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;const imageUrl = new URL(image, Astro.site).toString();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; lang&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;es&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;scroll-smooth&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; charset&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;utf-8&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;viewport&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; content&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;width=device-width, initial-scale=1&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; content&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={description} /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;robots&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; content&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;index, follow&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;link&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; rel&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;canonical&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={Astro.url} /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    &amp;#x3C;!-- Open Graph --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; property&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;og:title&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; content&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={title} /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; property&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;og:description&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; content&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={description} /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; property&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;og:type&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; content&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={type} /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; property&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;og:url&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; content&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={Astro.url} /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; property&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;og:image&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; content&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={imageUrl} /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; property&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;og:image:alt&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; content&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={title} /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; property&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;og:locale&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; content&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;es_ES&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; property&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;og:site_name&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; content&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;DevLog&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    &amp;#x3C;!-- Twitter Card --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;twitter:card&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; content&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;summary_large_image&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;twitter:title&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; content&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={title} /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;twitter:description&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; content&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={description} /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;twitter:image&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; content&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={imageUrl} /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    &amp;#x3C;!-- Favicons --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;link&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; rel&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;icon&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;image/svg+xml&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;/favicon.svg&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;link&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; rel&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;icon&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;image/png&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;/favicon.png&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    &amp;#x3C;!-- RSS Feed Discovery --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;link&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; rel&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;alternate&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;application/rss+xml&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; title&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;DevLog RSS Feed&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;/rss.xml&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;{title}&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;slot&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;head&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;ClientRouter&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;head&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;min-h-screen grid grid-rows-[auto_1fr_auto] bg-background text-foreground antialiased font-sans&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;Header&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; transition:animate&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;fade&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;slot&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;Footer&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;32-el-layout-de-listado-bloglayoutastro&quot;&gt;3.2. El Layout de Listado (&lt;code&gt;BlogLayout.astro&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;Un pequeño wrapper que simplifica la creación de páginas de índice y etiquetas, heredando del Shell.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;astro&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;// src/layouts/BlogLayout.astro&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;import BaseLayout from &quot;@/layouts/main.astro&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;const { title &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Blog&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, description &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Últimos artículos&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, image, type &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;website&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; } = Astro.props;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;BaseLayout&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; title&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={title} &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;description&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={description} &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;image&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={image} &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={type}&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;slot&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;BaseLayout&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;33-el-layout-de-artículo-postlayoutastro&quot;&gt;3.3. El Layout de Artículo (&lt;code&gt;PostLayout.astro&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;Este es el componente más rico. Gestiona el SEO semántico, la portada optimizada, la barra de lectura y la navegación entre artículos.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;astro&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;// src/layouts/PostLayout.astro&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;import BaseLayout from &quot;@/layouts/main.astro&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;import type { CollectionEntry } from &quot;astro:content&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;import { Badge } from &quot;@/components/ui/badge&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;import { ChevronLeft, ChevronRight, Link2, Check } from &quot;@lucide/astro&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;import { Image } from &quot;astro:assets&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;import { tagUrl } from &quot;@/utils/tag&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;const { title, description, date, author, tags, cover, prev, next, readingTime } = Astro.props;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;const formattedDate = date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  ? new Date(date).toLocaleDateString(&quot;es-ES&quot;, { &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;dateStyle&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;long&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  : &quot;Fecha desconocida&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;const coverImage = typeof cover === &quot;string&quot; ? cover : cover?.src;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;BaseLayout&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; title&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={title} &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;description&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={description} &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;article&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; image&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={coverImage}&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;Fragment&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; slot&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;head&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;application/ld+json&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; set:html&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;JSON&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;stringify&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      &quot;@context&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;https://schema.org&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      &quot;@type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;BlogPosting&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      &quot;headline&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: title,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      &quot;description&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: description,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      &quot;datePublished&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: date &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Date&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(date).&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;toISOString&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; undefined&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      &quot;url&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: Astro.url.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;toString&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;      ...&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(author &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;author&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: { &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;@type&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Person&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: author } }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    })} /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;Fragment&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;article&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;max-w-4xl mx-auto px-4 py-20 reveal&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    {cover &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;figure&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;mb-12 max-h-[400px] overflow-hidden rounded-xl&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;Image&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;          src&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{coverImage &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; any&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;          alt&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;`Imagen de portada: ${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;          width&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1200&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;          height&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;630&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;          class&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;w-full object-cover&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;figure&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    )}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;header&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;max-w-3xl mx-auto mb-12 pb-6 border-b border-gray-200/50 dark:border-gray-700/50&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2 text-sm text-muted-foreground mb-4&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;time&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;tabular-nums&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;Publicado el {formattedDate} {readingTime &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; `• ${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;readingTime&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;} min de lectura`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;time&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        {author &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;font-medium&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;Por &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;strong&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;{author}&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;strong&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;text-4xl sm:text-5xl font-extrabold tracking-tight mb-4&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;{title}&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;flex flex-wrap gap-2&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        {(tags &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;??&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; []).&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;tag&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;            href&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;`/tags/${&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;tagUrl&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;tag&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;            class&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;relative z-20 hover:opacity-80 transition-all duration-300 hover:scale-105 active:scale-95&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          &gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;Badge&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; variant&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;secondary&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;{tag}&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;Badge&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        ))}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;header&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;max-w-3xl mx-auto prose prose-lg dark:prose-invert&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;slot&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    &amp;#x3C;!-- Compartir --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;max-w-3xl mx-auto mt-8 py-5 border-t border-gray-200/50 dark:border-gray-700/50 flex flex-col sm:flex-row items-center justify-between gap-4&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;font-medium text-foreground&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;¿Te ha gustado? ¡Compártelo!&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;flex gap-2&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;`https://www.linkedin.com/shareArticle?mini=true&amp;#x26;url=${&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;encodeURIComponent&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Astro&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;toString&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;())&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}&amp;#x26;title=${&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;encodeURIComponent&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;_blank&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; rel&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;noopener noreferrer&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;inline-flex h-9 w-9 items-center justify-center rounded-md border border-input bg-background hover:bg-accent transition-colors group&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;svg&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;h-4 w-4 transition-transform group-hover:scale-110&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; fill&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;currentColor&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; viewBox&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;0 0 24 24&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;path&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; d&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;path&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;svg&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;copy-link-btn&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; data-url&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;={Astro.url.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;toString&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()} &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;inline-flex h-9 w-9 items-center justify-center rounded-md border border-input bg-background hover:bg-accent transition-colors&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;Link2&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;h-4 w-4&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;copy-icon-link&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;Check&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;h-4 w-4 text-green-500 hidden&quot;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;copy-icon-check&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    &amp;#x3C;!-- Navegación --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;nav&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;max-w-3xl mx-auto mt-8 pt-8 border-t border-gray-200/50 dark:border-gray-700/50 flex justify-between gap-4&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      {prev &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;`/blog/${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;prev&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;slug&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;group block flex-1 rounded-lg border border-border bg-card p-5 transition-all duration-500 ease-premium hover:shadow-premium hover:border-primary/30 hover:-translate-y-1 hover:scale-[1.05] max-w-sm&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;text-xs text-muted-foreground&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;Anterior&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;h3&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;text-lg font-semibold group-hover:text-primary&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;{prev.data.title}&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;h3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      )}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      {next &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;`/blog/${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;slug&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}`&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;group block flex-1 rounded-lg border border-border bg-card p-5 transition-all duration-500 ease-premium hover:shadow-premium hover:border-primary/30 hover:-translate-y-1 hover:scale-[1.05] text-right max-w-sm&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;text-xs text-muted-foreground&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;Siguiente&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;          &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;h3&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;text-lg font-semibold group-hover:text-primary&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;{next.data.title}&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;h3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;      )}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;nav&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;article&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;BaseLayout&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;4-componentes-e-islas-de-interactividad&quot;&gt;4. Componentes e Islas de Interactividad&lt;/h2&gt;
&lt;p&gt;El blog es casi 100% estático, lo que garantiza una puntuación de 100 en Lighthouse. Cargamos JavaScript solo mediante &lt;strong&gt;Islas de Interactividad&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Interactividad Reactiva&lt;/strong&gt;: El &lt;code&gt;HeaderMenu.tsx&lt;/code&gt; usa React para un menú móvil fluido, activado con &lt;code&gt;client:load&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scripts Nativos&lt;/strong&gt;: Para funciones como “Copiar Enlace”, usamos scripts ligeros que se reinicializan con el evento &lt;code&gt;astro:page-load&lt;/code&gt;, asegurando compatibilidad con los &lt;strong&gt;View Transitions&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;5-el-corazón-de-la-estética-tailwind-v4s&quot;&gt;5. El Corazón de la Estética: Tailwind v4s&lt;/h2&gt;
&lt;p&gt;El diseño visual no es solo “cosmético”; es una parte integral de la arquitectura. Utilizamos &lt;strong&gt;Tailwind CSS v4&lt;/strong&gt; con el espacio de color &lt;strong&gt;OKLCH&lt;/strong&gt;, lo que permite una gestión del Modo Oscuro basada en la percepción real de la luz:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;/* src/styles/global.css */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;@theme&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; inline {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  --ease-premium: cubic-bezier(0&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.16&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, 1, 0&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, 1);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  --animate-slide-up: &lt;/span&gt;&lt;span style=&quot;color:#85E89D&quot;&gt;slide-up&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.8s&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; var(--ease-premium) forwards;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  --shadow-premium: 0 20px 25px -5px var(--shadow-color), 0 8px 10px -6px var(--shadow-color);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;:root&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --background&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;oklch&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --foreground&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;oklch&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.145&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --primary&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;oklch&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.205&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --shadow-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;oklch&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(from &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--primary&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) l c h / &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;.dark&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --background&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;oklch&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.145&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --foreground&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;oklch&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.985&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --primary&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;oklch&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.922&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;  --shadow-color&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;oklch&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(from &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--primary&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) l c h / &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0.25&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;@layer&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; utilities {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  .reveal&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    opacity&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    animation&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;--animate-slide-up&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;script&gt;
  const setupCopyBtn = () =&gt; {
    const copyBtn = document.getElementById(&quot;copy-link-btn&quot;);
    if (!copyBtn || copyBtn.dataset.listener) return;
    copyBtn.dataset.listener = &quot;true&quot;;

    copyBtn.addEventListener(&quot;click&quot;, async () =&gt; {
      const url = copyBtn.getAttribute(&quot;data-url&quot;);
      if (!url) return;
      try {
        await navigator.clipboard.writeText(url);
        const iconLink = document.getElementById(&quot;copy-icon-link&quot;);
        const iconCheck = document.getElementById(&quot;copy-icon-check&quot;);
        if (iconLink &amp;&amp; iconCheck) {
          iconLink.classList.add(&quot;hidden&quot;);
          iconCheck.classList.remove(&quot;hidden&quot;);
          setTimeout(() =&gt; {
            iconLink.classList.remove(&quot;hidden&quot;);
            iconCheck.classList.add(&quot;hidden&quot;);
          }, 2000);
        }
      } catch (e) { console.error(e); }
    });
  };
  setupCopyBtn();
  document.addEventListener(&quot;astro:page-load&quot;, setupCopyBtn);
&lt;/script&gt;
&lt;h2 id=&quot;6-automatización-y-build&quot;&gt;6. Automatización y Build&lt;/h2&gt;
&lt;p&gt;Para que el blog sea mantenible, automatizamos las tareas repetitivas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;RSS Feed&lt;/strong&gt;: Generado automáticamente en &lt;code&gt;src/pages/rss.xml.ts&lt;/code&gt; incluyendo el contenido completo de los posts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Imágenes&lt;/strong&gt;: El componente &lt;code&gt;&amp;#x3C;Image /&gt;&lt;/code&gt; de Astro redimensiona y convierte las imágenes de portada a formatos modernos como WebP/AVIF en tiempo de construcción.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sitemap&lt;/strong&gt;: Generado automáticamente para mejorar el rastreo de Google.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Este blog esta diseñado para ser rápido, accesible y fácil de mantener. Aprovechamos lo mejor de &lt;strong&gt;Astro&lt;/strong&gt; para el rendimiento y la flexibilidad de &lt;strong&gt;React&lt;/strong&gt; y &lt;strong&gt;Tailwind v4&lt;/strong&gt; para una experiencia de usuario premium.&lt;/p&gt;</content:encoded><category>Astro</category><category>Proyectos</category><category>Desarrollo web</category><author>Hugo Cayón Laso</author></item><item><title>¿Qué es Docker y por qué todo desarrollador debería entenderlo?</title><link>https://hugocl01-devlog.netlify.app/blog/post-000014/</link><guid isPermaLink="true">https://hugocl01-devlog.netlify.app/blog/post-000014/</guid><description>Descubre qué es Docker, cómo funcionan los contenedores y por qué entender esta tecnología es fundamental para cualquier desarrollador moderno.</description><pubDate>Sun, 08 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;introducción&quot;&gt;Introducción&lt;/h2&gt;
&lt;p&gt;Si llevas tiempo desarrollando software, seguro que has vivido esta situación:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;En tu máquina funciona.&lt;/li&gt;
&lt;li&gt;En la de tu compañero no.&lt;/li&gt;
&lt;li&gt;En producción falla.&lt;/li&gt;
&lt;li&gt;En staging se comporta distinto.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Durante años, la configuración de entornos ha sido uno de los mayores puntos de fricción en el desarrollo. Versiones distintas, conflictos con dependencias, diferencias entre sistemas operativos, bases de datos mal configuradas…&lt;/p&gt;
&lt;p&gt;Aquí es donde aparece Docker.&lt;/p&gt;
&lt;p&gt;Docker no es simplemente otra herramienta del ecosistema DevOps. Es una tecnología que cambió radicalmente la forma en la que construimos, distribuimos y ejecutamos aplicaciones.&lt;/p&gt;
&lt;p&gt;En este artículo vamos a ver qué es Docker realmente, qué problema resuelve y por qué entenderlo ya no es opcional para un desarrollador moderno.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;qué-es-docker&quot;&gt;¿Qué es Docker?&lt;/h2&gt;
&lt;p&gt;Docker es una plataforma que permite crear, empaquetar y ejecutar aplicaciones dentro de contenedores.&lt;/p&gt;
&lt;p&gt;Un contenedor es un entorno aislado que incluye:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;El código de tu aplicación&lt;/li&gt;
&lt;li&gt;El runtime (Node, Python, PHP, etc.)&lt;/li&gt;
&lt;li&gt;Las dependencias&lt;/li&gt;
&lt;li&gt;Librerías del sistema&lt;/li&gt;
&lt;li&gt;Variables de entorno&lt;/li&gt;
&lt;li&gt;Configuración necesaria&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Todo empaquetado de forma que puede ejecutarse exactamente igual en cualquier máquina que tenga Docker instalado.&lt;/p&gt;
&lt;p&gt;La idea central es simple pero poderosa:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Si funciona dentro del contenedor, funcionará en cualquier entorno.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;el-problema-que-existía-antes-de-docker&quot;&gt;El problema que existía antes de Docker&lt;/h2&gt;
&lt;p&gt;Antes de Docker, el flujo típico era algo así:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Instalar el lenguaje necesario (Node, Java, Python, PHP…).&lt;/li&gt;
&lt;li&gt;Configurar la versión correcta.&lt;/li&gt;
&lt;li&gt;Instalar dependencias.&lt;/li&gt;
&lt;li&gt;Instalar y configurar la base de datos.&lt;/li&gt;
&lt;li&gt;Ajustar variables de entorno.&lt;/li&gt;
&lt;li&gt;Resolver conflictos con otros proyectos.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Y si el proyecto cambiaba de servidor o de equipo… comenzaban los problemas.&lt;/p&gt;
&lt;p&gt;Los errores más comunes eran:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Diferencias de versión.&lt;/li&gt;
&lt;li&gt;Dependencias que no estaban instaladas.&lt;/li&gt;
&lt;li&gt;Configuraciones inconsistentes.&lt;/li&gt;
&lt;li&gt;“Funciona en mi máquina”.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Docker nace precisamente para eliminar esa fricción.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;qué-es-exactamente-un-contenedor&quot;&gt;¿Qué es exactamente un contenedor?&lt;/h2&gt;
&lt;p&gt;Un contenedor no es una máquina virtual.&lt;/p&gt;
&lt;p&gt;Esta es una confusión muy común.&lt;/p&gt;
&lt;h3 id=&quot;máquina-virtual&quot;&gt;Máquina virtual&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Virtualiza un sistema operativo completo.&lt;/li&gt;
&lt;li&gt;Necesita un hipervisor.&lt;/li&gt;
&lt;li&gt;Consume más recursos.&lt;/li&gt;
&lt;li&gt;Es más pesada.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;contenedor&quot;&gt;Contenedor&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Comparte el kernel del sistema operativo.&lt;/li&gt;
&lt;li&gt;Solo aísla procesos y dependencias.&lt;/li&gt;
&lt;li&gt;Es mucho más ligero.&lt;/li&gt;
&lt;li&gt;Arranca en segundos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Por eso Docker revolucionó la infraestructura: permitió ejecutar aplicaciones aisladas sin el coste de virtualizar sistemas completos.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;conceptos-clave-de-docker&quot;&gt;Conceptos clave de Docker&lt;/h2&gt;
&lt;p&gt;Para entender Docker necesitas dominar tres conceptos fundamentales.&lt;/p&gt;
&lt;h3 id=&quot;1-imagen&quot;&gt;1. Imagen&lt;/h3&gt;
&lt;p&gt;Una imagen es una plantilla inmutable que contiene todo lo necesario para ejecutar una aplicación.&lt;/p&gt;
&lt;p&gt;Se construye a partir de un archivo llamado &lt;code&gt;Dockerfile&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;La imagen no se ejecuta directamente; sirve como base para crear contenedores.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;2-contenedor&quot;&gt;2. Contenedor&lt;/h3&gt;
&lt;p&gt;Un contenedor es una instancia en ejecución de una imagen.&lt;/p&gt;
&lt;p&gt;Puedes crear múltiples contenedores a partir de la misma imagen.&lt;/p&gt;
&lt;p&gt;Es el equivalente a decir:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Imagen → Clase&lt;/li&gt;
&lt;li&gt;Contenedor → Objeto&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;3-dockerfile&quot;&gt;3. Dockerfile&lt;/h3&gt;
&lt;p&gt;Es el archivo donde defines cómo se construye tu imagen.&lt;/p&gt;
&lt;p&gt;Ejemplo básico para una aplicación Node.js:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;dockerfile&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; node:20&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;WORKDIR&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; /app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; package*.json ./&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; npm install&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;COPY&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; . .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;EXPOSE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; 3000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;CMD&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;npm&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;start&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Con este archivo puedes generar una imagen reproducible y ejecutarla en cualquier máquina.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;qué-es-docker-compose&quot;&gt;¿Qué es Docker Compose?&lt;/h3&gt;
&lt;p&gt;En proyectos reales rara vez tienes un solo servicio.&lt;/p&gt;
&lt;p&gt;Normalmente necesitas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Backend&lt;/li&gt;
&lt;li&gt;Base de datos&lt;/li&gt;
&lt;li&gt;Servicio de colas&lt;/li&gt;
&lt;li&gt;Frontend&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aquí entra Docker Compose.&lt;/p&gt;
&lt;p&gt;Docker Compose permite definir múltiples servicios en un solo archivo &lt;code&gt;docker-compose.yml&lt;/code&gt; y levantarlos con un único comando:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; compose&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; up&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Esto simplifica enormemente el desarrollo local y el onboarding de nuevos desarrolladores.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;qué-problemas-resuelve-docker-en-el-día-a-día&quot;&gt;¿Qué problemas resuelve Docker en el día a día?&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Entornos idénticos&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Desarrollo, testing y producción pueden ser prácticamente iguales.&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Aislamiento de dependencias&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Cada proyecto puede tener su propia versión de:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Node&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sin conflictos entre ellos.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Onboarding rápido&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Un nuevo miembro del equipo puede levantar el proyecto en minutos.&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Portabilidad&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Puedes mover tu aplicación a:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un VPS&lt;/li&gt;
&lt;li&gt;Un servidor físico&lt;/li&gt;
&lt;li&gt;Un proveedor cloud&lt;/li&gt;
&lt;li&gt;Un entorno de CI/CD&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sin modificar la configuración interna.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;por-qué-todo-desarrollador-debería-entender-docker&quot;&gt;¿Por qué todo desarrollador debería entender Docker?&lt;/h3&gt;
&lt;p&gt;Aquí es donde la parte técnica se convierte en estratégica.&lt;/p&gt;
&lt;p&gt;Es un estándar de la industria&lt;/p&gt;
&lt;p&gt;Hoy en día, la mayoría de empresas medianas y grandes trabajan con contenedores.&lt;/p&gt;
&lt;p&gt;No entender Docker limita tu crecimiento profesional.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;es-la-base-de-arquitecturas-modernas&quot;&gt;Es la base de arquitecturas modernas&lt;/h3&gt;
&lt;p&gt;Microservicios, CI/CD, despliegues automatizados, escalabilidad horizontal…&lt;/p&gt;
&lt;p&gt;Todo esto parte de contenedores.&lt;/p&gt;
&lt;p&gt;Si en el futuro quieres trabajar con orquestadores o infraestructura más avanzada, Docker es el primer paso.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;mejora-tu-mentalidad-como-desarrollador&quot;&gt;Mejora tu mentalidad como desarrollador&lt;/h3&gt;
&lt;p&gt;Trabajar con Docker te obliga a:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Separar responsabilidades.&lt;/li&gt;
&lt;li&gt;Pensar en servicios independientes.&lt;/li&gt;
&lt;li&gt;Diseñar aplicaciones más limpias.&lt;/li&gt;
&lt;li&gt;Tener entornos reproducibles.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Te profesionaliza.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;aumenta-tu-valor-en-el-mercado-laboral&quot;&gt;Aumenta tu valor en el mercado laboral&lt;/h3&gt;
&lt;p&gt;Saber programar está bien.&lt;/p&gt;
&lt;p&gt;Saber programar y además entender cómo se despliega y ejecuta tu aplicación en producción es otro nivel.&lt;/p&gt;
&lt;p&gt;Muchas empresas valoran más a desarrolladores que entienden infraestructura básica que a perfiles puramente centrados en código.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;debe-aprender-docker-un-desarrollador-junior&quot;&gt;¿Debe aprender Docker un desarrollador junior?&lt;/h3&gt;
&lt;p&gt;Sí, pero con enfoque correcto.&lt;/p&gt;
&lt;p&gt;No necesitas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dominar Kubernetes.&lt;/li&gt;
&lt;li&gt;Saber optimización avanzada de imágenes.&lt;/li&gt;
&lt;li&gt;Diseñar clusters complejos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sí necesitas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Entender qué es una imagen.&lt;/li&gt;
&lt;li&gt;Crear un Dockerfile básico.&lt;/li&gt;
&lt;li&gt;Mapear puertos.&lt;/li&gt;
&lt;li&gt;Usar volúmenes.&lt;/li&gt;
&lt;li&gt;Levantar servicios con Docker Compose.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Eso ya te diferencia bastante.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;docker-es-solo-para-backend&quot;&gt;¿Docker es solo para backend?&lt;/h3&gt;
&lt;p&gt;No.&lt;/p&gt;
&lt;p&gt;Se usa en:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Frontend (control de versiones de Node).&lt;/li&gt;
&lt;li&gt;Testing automatizado.&lt;/li&gt;
&lt;li&gt;Data engineering.&lt;/li&gt;
&lt;li&gt;Machine learning.&lt;/li&gt;
&lt;li&gt;DevOps.&lt;/li&gt;
&lt;li&gt;Microservicios.&lt;/li&gt;
&lt;li&gt;Entornos para demos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Docker no pertenece a un stack concreto. Es una herramienta transversal.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;tiene-sentido-aprender-docker-en-2026&quot;&gt;¿Tiene sentido aprender Docker en 2026?&lt;/h3&gt;
&lt;p&gt;Absolutamente.&lt;/p&gt;
&lt;p&gt;Mientras existan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Entornos distintos.&lt;/li&gt;
&lt;li&gt;Equipos distribuidos.&lt;/li&gt;
&lt;li&gt;Aplicaciones complejas.&lt;/li&gt;
&lt;li&gt;Despliegues automatizados.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Docker seguirá siendo relevante.&lt;/p&gt;
&lt;p&gt;Puede que las herramientas evolucionen, pero el concepto de contenedores ya forma parte estructural del desarrollo moderno.&lt;/p&gt;
&lt;p&gt;Entender Docker no es solo aprender una herramienta más, es dar un paso hacia una forma más profesional de desarrollar software. Si quieres crecer como desarrollador, empieza por dominar las bases que realmente utiliza la industria.&lt;/p&gt;</content:encoded><category>Docker</category><category>DevOps</category><category>Backend</category><category>Contenedores</category><category>Infraestructura</category><author>Hugo Cayón Laso</author></item><item><title>Tendencias de lenguajes de programación en 2026: qué está subiendo, por qué y dónde se usan</title><link>https://hugocl01-devlog.netlify.app/blog/post-000013/</link><guid isPermaLink="true">https://hugocl01-devlog.netlify.app/blog/post-000013/</guid><description>Análisis actualizado de los 15 lenguajes de programación más populares según el índice TIOBE de febrero de 2026, con sectores y usos comunes.</description><pubDate>Sat, 14 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;introducción&quot;&gt;Introducción&lt;/h2&gt;
&lt;p&gt;Elegir qué lenguaje de programación aprender o usar en un proyecto es una decisión estratégica que debe basarse en tendencias globales, sectores de aplicación y perspectivas de crecimiento. El &lt;strong&gt;TIOBE Programming Community Index&lt;/strong&gt; es uno de los indicadores más seguidos para medir la &lt;strong&gt;popularidad de los lenguajes de programación&lt;/strong&gt; a partir de búsquedas y referencias en motores de búsqueda y recursos en línea.&lt;/p&gt;
&lt;p&gt;En este artículo analizamos el &lt;strong&gt;top 15 del índice TIOBE de febrero de 2026&lt;/strong&gt;, lo que significa que no solo cubrimos los clásicos del top 10, sino también lenguajes relevantes que están ganando tracción o manteniendo nichos sólidos.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;tabla-ranking-de-lenguajes-de-programación-tiobe-index-febrero-2026&quot;&gt;Tabla: Ranking de lenguajes de programación (TIOBE Index, febrero 2026)&lt;/h2&gt;





















































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Posición&lt;/th&gt;&lt;th&gt;Lenguaje&lt;/th&gt;&lt;th&gt;Popularidad (%)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Python&lt;/td&gt;&lt;td&gt;21.81%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;11.05%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;C++&lt;/td&gt;&lt;td&gt;8.55%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;Java&lt;/td&gt;&lt;td&gt;8.12%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;C#&lt;/td&gt;&lt;td&gt;6.83%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;JavaScript&lt;/td&gt;&lt;td&gt;2.92%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;Visual Basic&lt;/td&gt;&lt;td&gt;2.85%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;R&lt;/td&gt;&lt;td&gt;2.19%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;SQL&lt;/td&gt;&lt;td&gt;1.93%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;Delphi / Object Pascal&lt;/td&gt;&lt;td&gt;1.88%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;Perl&lt;/td&gt;&lt;td&gt;1.67%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;Fortran&lt;/td&gt;&lt;td&gt;1.64%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;PHP&lt;/td&gt;&lt;td&gt;1.34%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;Rust&lt;/td&gt;&lt;td&gt;1.32%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;Scratch&lt;/td&gt;&lt;td&gt;1.30%&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Fuente: &lt;a href=&quot;https://www.tiobe.com/tiobe-index/&quot;&gt;TIOBE Programming Community Index, febrero 2026&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;lenguajes-más-usados-y-sus-sectores&quot;&gt;Lenguajes más usados y sus sectores&lt;/h2&gt;
&lt;h3 id=&quot;python&quot;&gt;Python&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Usos comunes:&lt;/strong&gt; backend web, ciencia de datos, machine learning e inteligencia artificial, automatización, scripting.
&lt;strong&gt;Sectores:&lt;/strong&gt; startups tecnológicas, fintech, consultoras TI, investigación científica, educación.&lt;/p&gt;
&lt;p&gt;Python mantiene una amplia ventaja en popularidad, liderando el ranking con más del doble de participación que el siguiente competidor. Su sintaxis clara y su ecosistema lo hacen ideal para proyectos de análisis de datos o prototipos rápidos.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;c&quot;&gt;C&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Usos comunes:&lt;/strong&gt; sistemas operativos, firmware, drivers, programación embebida.
&lt;strong&gt;Sectores:&lt;/strong&gt; electrónica, automoción, telecomunicaciones industriales, sistemas embebidos.&lt;/p&gt;
&lt;p&gt;C ocupa una posición firme en segundo lugar gracias a su eficiencia y control sobre hardware, lo que lo hace imprescindible en entornos donde el rendimiento y la cercanía al sistema son cruciales.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;c-1&quot;&gt;C++&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Usos comunes:&lt;/strong&gt; motores de videojuegos, aplicaciones de alto rendimiento, simulación, realidad virtual.
&lt;strong&gt;Sectores:&lt;/strong&gt; entretenimiento digital, fintech de alta frecuencia, simulación avanzada.&lt;/p&gt;
&lt;p&gt;C++ añade abstracción orientada a objetos sin comprometer el rendimiento, lo que lo mantiene relevante para aplicaciones exigentes en tiempo real.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;java&quot;&gt;Java&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Usos comunes:&lt;/strong&gt; backend empresarial, aplicaciones Android, sistemas distribuidos.
&lt;strong&gt;Sectores:&lt;/strong&gt; banca, seguros, telecomunicaciones, grandes corporativos.&lt;/p&gt;
&lt;p&gt;Java sigue siendo una pieza clave en software de misión crítica para empresas grandes debido a su estabilidad, escalabilidad y portabilidad.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;c-2&quot;&gt;C#&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Usos comunes:&lt;/strong&gt; aplicaciones de escritorio y web con .NET, desarrollo de videojuegos con Unity.
&lt;strong&gt;Sectores:&lt;/strong&gt; entretenimiento digital, corporativo, desarrollo de software multiplataforma.&lt;/p&gt;
&lt;p&gt;C# continúa su ascenso como lenguaje versátil para backend, aplicaciones empresariales y juegos, y fue destacado como &lt;em&gt;Language of the Year&lt;/em&gt; por su crecimiento reciente.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;javascript&quot;&gt;JavaScript&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Usos comunes:&lt;/strong&gt; desarrollo web frontend, aplicaciones full‑stack con Node.js, SPA.
&lt;strong&gt;Sectores:&lt;/strong&gt; desarrollo web, ecommerce, SaaS, startups tecnológicas.&lt;/p&gt;
&lt;p&gt;JavaScript sigue siendo el estándar para la web por su uso universal en navegadores y soporte en frameworks modernos.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;visual-basic&quot;&gt;Visual Basic&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Usos comunes:&lt;/strong&gt; aplicaciones empresariales de escritorio, herramientas internas.
&lt;strong&gt;Sectores:&lt;/strong&gt; empresas con software legacy, automatización de procesos internos.&lt;/p&gt;
&lt;p&gt;Aunque antiguo, Visual Basic aún se mantiene en el top debido a su base instalada en aplicaciones corporativas tradicionales.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;r&quot;&gt;R&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Usos comunes:&lt;/strong&gt; análisis estadístico, visualización de datos, investigación académica.
&lt;strong&gt;Sectores:&lt;/strong&gt; ciencia de datos, biotecnología, investigación científica y análisis avanzado.&lt;/p&gt;
&lt;p&gt;R ha recuperado relevancia gracias a su especialización en estadísticas complejas y análisis de datos intensivo.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;sql&quot;&gt;SQL&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Usos comunes:&lt;/strong&gt; gestión y consulta de bases de datos relacionales.
&lt;strong&gt;Sectores:&lt;/strong&gt; prácticamente todos los sectores basados en datos (retail, banca, logística).&lt;/p&gt;
&lt;p&gt;SQL sigue siendo indispensable para cualquier proyecto que requiera interacción con bases de datos.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;delphi--object-pascal&quot;&gt;Delphi / Object Pascal&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Usos comunes:&lt;/strong&gt; desarrollo de aplicaciones de escritorio y software legado.
&lt;strong&gt;Sectores:&lt;/strong&gt; empresas con aplicaciones históricas que requieren mantenimiento.&lt;/p&gt;
&lt;p&gt;Este lenguaje tradicional aún aparece en el top debido a su presencia continua en sistemas corporativos y aplicaciones especializadas.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;perl&quot;&gt;Perl&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Usos comunes:&lt;/strong&gt; scripting, administración de sistemas, procesamiento de texto.
&lt;strong&gt;Sectores:&lt;/strong&gt; infraestructura de TI, bioinformática, administración de servidores.&lt;/p&gt;
&lt;p&gt;Perl ha vuelto a aparecer en posiciones medias del ranking, probablemente vinculado a su uso histórico en scripts y herramientas de automatización.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;fortran&quot;&gt;Fortran&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Usos comunes:&lt;/strong&gt; cómputo científico, simulaciones numéricas, ingeniería.
&lt;strong&gt;Sectores:&lt;/strong&gt; investigación científica, ingeniería aeroespacial, modelado numérico.&lt;/p&gt;
&lt;p&gt;Aunque antiguo, Fortran sigue presente en entornos científicos de alto rendimiento que dependen de su eficiencia en cálculos numéricos.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;php&quot;&gt;PHP&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Usos comunes:&lt;/strong&gt; desarrollo web backend, sistemas de gestión de contenido (CMS).
&lt;strong&gt;Sectores:&lt;/strong&gt; agencias web, sitios de contenido dinámico, ecommerce.&lt;/p&gt;
&lt;p&gt;A pesar de no estar en el top 10, PHP sigue siendo ampliamente utilizado en desarrollo web tradicional, especialmente en sistemas como WordPress y frameworks como Laravel.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;rust&quot;&gt;Rust&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Usos comunes:&lt;/strong&gt; desarrollo de sistemas seguros, concurrencia, software de backend.
&lt;strong&gt;Sectores:&lt;/strong&gt; software de infraestructura, seguridad, servicios de alto rendimiento.&lt;/p&gt;
&lt;p&gt;Rust ha ganado visibilidad por su enfoque en seguridad y control de memoria sin sacrificar rendimiento, aunque su porcentaje aún es moderado.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;scratch&quot;&gt;Scratch&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Usos comunes:&lt;/strong&gt; educación y enseñanza de programación básica.
&lt;strong&gt;Sectores:&lt;/strong&gt; educación primaria y secundaria, introducción a la programación para principiantes.&lt;/p&gt;
&lt;p&gt;Scratch no destaca por uso profesional, pero sigue siendo popular en la educación para introducir conceptos de lógica y programación.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;El ranking de &lt;strong&gt;15 lenguajes de programación en 2026&lt;/strong&gt; muestra un equilibrio entre &lt;strong&gt;clasicos bien establecidos&lt;/strong&gt; y &lt;strong&gt;lenguajes especializados con nichos fuertes&lt;/strong&gt;. Lenguajes como Python, C, Java y C# dominan por su versatilidad y adopción en múltiples sectores, mientras que otros como R o Rust se destacan en áreas más específicas como ciencia de datos o sistemas seguros.&lt;/p&gt;
&lt;p&gt;Este tipo de tendencias ayudan no solo a decidir qué aprender, sino también a entender &lt;strong&gt;qué tecnologías son más relevantes según el tipo de proyecto o sector en el que te mueves&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Nos vemos en el próximo post, y mientras tanto, sigue experimentando y aprendiendo con los lenguajes que más te interesen.&lt;/p&gt;</content:encoded><category>Programación</category><category>Lenguajes de programación</category><category>TIOBE Index</category><category>Desarrollo de software</category><author>Hugo Cayón Laso</author></item><item><title>Mi sistema de apuntes como desarrollador</title><link>https://hugocl01-devlog.netlify.app/blog/post-000012/</link><guid isPermaLink="true">https://hugocl01-devlog.netlify.app/blog/post-000012/</guid><description>Cómo organizo mis apuntes técnicos combinando papel y Obsidian para aprender mejor, recordar más y tomar mejores decisiones como desarrollador.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;El desarrollo web no solo avanza rápido, también genera una cantidad abrumadora de información. Documentación, tutoriales, vídeos, posts técnicos… el contenido nunca se acaba. El problema no es encontrar qué aprender, sino &lt;strong&gt;qué hacer con todo lo que aprendes y cómo lo procesas&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Durante mucho tiempo tomé apuntes sin un criterio claro. Guardaba enlaces “por si acaso”, copiaba fragmentos de documentación y escribía notas que parecían útiles en el momento, pero que rara vez volvía a leer. Cuando necesitaba consultar algo, encontrar la nota concreta era tedioso. Tenía muchas notas, pero poco conocimiento realmente consolidado.&lt;/p&gt;
&lt;p&gt;Con el tiempo empecé a notar un patrón frustrante: volvía a investigar cosas que ya había aprendido antes, repetía errores y dudaba sobre decisiones técnicas que ya había tomado en el pasado. Mis apuntes no me estaban ayudando a pensar mejor, solo a almacenar información.&lt;/p&gt;
&lt;p&gt;Ahí entendí que el problema no era la herramienta, sino &lt;strong&gt;la falta de un sistema&lt;/strong&gt;. Necesitaba una forma de tomar apuntes que me ayudara a entender, filtrar y conectar ideas para tomar mejores decisiones como desarrollador.&lt;/p&gt;
&lt;p&gt;Este post explica cómo funciona mi sistema de apuntes usando Obsidian, qué principios sigo y cómo lo aplico en el día a día.&lt;/p&gt;
&lt;h2 id=&quot;1-por-qué-uso-obsidian-para-mis-apuntes&quot;&gt;1. Por qué uso Obsidian para mis apuntes&lt;/h2&gt;
&lt;p&gt;Obsidian no es una herramienta mágica, pero encaja muy bien con cómo me gusta trabajar.&lt;/p&gt;
&lt;p&gt;Lo que más valoro es que:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mis notas son archivos Markdown normales&lt;/li&gt;
&lt;li&gt;No dependo de una plataforma externa&lt;/li&gt;
&lt;li&gt;Puedo enlazar ideas fácilmente&lt;/li&gt;
&lt;li&gt;Es rápido y no me distrae&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Obsidian no impone una estructura concreta. Eso significa que &lt;strong&gt;el sistema lo defines tú&lt;/strong&gt;, y eso es justo lo que buscaba.&lt;/p&gt;
&lt;h2 id=&quot;2-los-principios-de-mi-sistema-de-apuntes&quot;&gt;2. Los principios de mi sistema de apuntes&lt;/h2&gt;
&lt;p&gt;Antes de hablar de carpetas o notas, hay algunas ideas clave que guían todo el sistema.&lt;/p&gt;
&lt;h3 id=&quot;escribo-para-entender-no-para-guardar&quot;&gt;Escribo para entender, no para guardar&lt;/h3&gt;
&lt;p&gt;Si una nota es solo un copia y pega de documentación, no me sirve. Escribir es parte del proceso de comprensión.&lt;/p&gt;
&lt;h3 id=&quot;menos-notas-mejor-pensadas&quot;&gt;Menos notas, mejor pensadas&lt;/h3&gt;
&lt;p&gt;Prefiero pocas notas útiles que muchas notas mediocres que nunca volveré a abrir.&lt;/p&gt;
&lt;h3 id=&quot;escribo-para-mi-yo-del-futuro&quot;&gt;Escribo para mi yo del futuro&lt;/h3&gt;
&lt;p&gt;Mis notas no están pensadas para ser formales, sino claras. Las escribo como si me explicara algo a mí mismo dentro de seis meses.&lt;/p&gt;
&lt;h3 id=&quot;las-notas-deben-ayudarme-a-decidir&quot;&gt;Las notas deben ayudarme a decidir&lt;/h3&gt;
&lt;p&gt;Una buena nota me ahorra tiempo en el futuro: evita que vuelva a investigar lo mismo o que dude sobre decisiones ya tomadas.&lt;/p&gt;
&lt;h2 id=&quot;3-cómo-organizo-mis-apuntes-en-obsidian&quot;&gt;3. Cómo organizo mis apuntes en Obsidian&lt;/h2&gt;
&lt;p&gt;Mi estructura es sencilla a propósito. No quiero perder tiempo decidiendo dónde va cada cosa.&lt;/p&gt;
&lt;p&gt;Las carpetas principales que uso son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;conceptos&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;herramientas&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;snippets&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;decisiones&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ideas&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;proyectos&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Las carpetas solo aportan contexto general. La verdadera organización viene de los &lt;strong&gt;enlaces entre notas&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;4-tipos-de-notas-que-utilizo&quot;&gt;4. Tipos de notas que utilizo&lt;/h2&gt;
&lt;h3 id=&quot;notas-de-conceptos&quot;&gt;Notas de conceptos&lt;/h3&gt;
&lt;p&gt;Aquí explico ideas clave con mis propias palabras.&lt;/p&gt;
&lt;p&gt;Por ejemplo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Qué es un concepto&lt;/li&gt;
&lt;li&gt;Cuándo tiene sentido usarlo&lt;/li&gt;
&lt;li&gt;Cuándo no&lt;/li&gt;
&lt;li&gt;Con qué otros conceptos se relaciona&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No busco definiciones perfectas, sino comprensión real.&lt;/p&gt;
&lt;h3 id=&quot;notas-de-herramientas&quot;&gt;Notas de herramientas&lt;/h3&gt;
&lt;p&gt;Cada herramienta que uso tiene su propia nota.&lt;/p&gt;
&lt;p&gt;Incluyen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Para qué la uso&lt;/li&gt;
&lt;li&gt;Cosas que suelo olvidar&lt;/li&gt;
&lt;li&gt;Problemas comunes&lt;/li&gt;
&lt;li&gt;Decisiones que he tomado al usarla&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Estas notas evolucionan con el tiempo, igual que mi experiencia.&lt;/p&gt;
&lt;h3 id=&quot;snippets-con-contexto&quot;&gt;Snippets con contexto&lt;/h3&gt;
&lt;p&gt;No guardo código suelto sin más.&lt;/p&gt;
&lt;p&gt;Cada snippet va acompañado de:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Qué problema resuelve&lt;/li&gt;
&lt;li&gt;Cuándo usarlo&lt;/li&gt;
&lt;li&gt;Por qué existe&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El código sin contexto pierde valor muy rápido.&lt;/p&gt;
&lt;h3 id=&quot;decisiones-técnicas&quot;&gt;Decisiones técnicas&lt;/h3&gt;
&lt;p&gt;Este tipo de nota es de las más valiosas.&lt;/p&gt;
&lt;p&gt;Aquí dejo constancia de decisiones como:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Por qué elegí una tecnología frente a otra&lt;/li&gt;
&lt;li&gt;Qué alternativas descarté&lt;/li&gt;
&lt;li&gt;Qué compromisos acepté&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Meses después, estas notas evitan muchas dudas.&lt;/p&gt;
&lt;h3 id=&quot;ideas&quot;&gt;Ideas&lt;/h3&gt;
&lt;p&gt;Aquí guardo pensamientos sueltos, ideas de posts, mejoras o proyectos futuros.&lt;/p&gt;
&lt;p&gt;Muchas no llegan a nada, pero algunas conectan con otras notas y acaban creciendo.&lt;/p&gt;
&lt;h2 id=&quot;5-cómo-tomo-apuntes-en-la-práctica-mi-flujo-actual&quot;&gt;5. Cómo tomo apuntes en la práctica (mi flujo actual)&lt;/h2&gt;
&lt;p&gt;Con el tiempo me di cuenta de que escribir directamente en Obsidian no siempre era la mejor forma de pensar. Ahora mi proceso tiene &lt;strong&gt;dos fases claras&lt;/strong&gt;: primero escribo a mano y después consolido en Obsidian.&lt;/p&gt;
&lt;h3 id=&quot;primera-fase-cuaderno-y-papel&quot;&gt;Primera fase: cuaderno y papel&lt;/h3&gt;
&lt;p&gt;Cuando estoy aprendiendo algo nuevo —leyendo documentación, viendo un vídeo o resolviendo un problema— anoto a mano lo que considero importante:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ideas clave&lt;/li&gt;
&lt;li&gt;Dudas&lt;/li&gt;
&lt;li&gt;Conceptos que no termino de entender&lt;/li&gt;
&lt;li&gt;Frases que me ayudan a hacer clic”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El cuaderno es rápido, imperfecto y sin estructura. No busco orden, solo &lt;strong&gt;pensar y entender&lt;/strong&gt;. Muchas de esas notas nunca llegarán a Obsidian, y está bien así.&lt;/p&gt;
&lt;h3 id=&quot;segunda-fase-obsidian-como-apunte-definitivo&quot;&gt;Segunda fase: Obsidian como apunte definitivo&lt;/h3&gt;
&lt;p&gt;Más tarde, normalmente con algo de distancia, reviso esas notas y hago un filtro consciente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;¿Esto merece la pena conservarlo?&lt;/li&gt;
&lt;li&gt;¿Es algo que quiero recordar en el futuro?&lt;/li&gt;
&lt;li&gt;¿Me ayudará a tomar mejores decisiones?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Solo entonces creo la nota en Obsidian.
Ahí sí escribo con calma, con mis propias palabras y conectando la idea con otros conceptos o notas existentes.&lt;/p&gt;
&lt;p&gt;Obsidian no es donde pienso por primera vez, sino donde &lt;strong&gt;dejo el conocimiento ya procesado&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;qué-ventaja-tiene-este-enfoque&quot;&gt;Qué ventaja tiene este enfoque&lt;/h3&gt;
&lt;p&gt;Este flujo me obliga a:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No guardar información innecesaria&lt;/li&gt;
&lt;li&gt;Entender antes de documentar&lt;/li&gt;
&lt;li&gt;Quedarme solo con lo realmente importante&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mis notas en Obsidian son menos, pero mucho más valiosas. No son apuntes en bruto, sino conocimiento destilado.&lt;/p&gt;
&lt;h2 id=&quot;6-errores-que-cometí-al-principio&quot;&gt;6. Errores que cometí al principio&lt;/h2&gt;
&lt;p&gt;Como casi todo el mundo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Creé demasiadas carpetas&lt;/li&gt;
&lt;li&gt;Escribí notas demasiado largas&lt;/li&gt;
&lt;li&gt;Copié información sin procesarla&lt;/li&gt;
&lt;li&gt;Busqué el sistema perfecto&lt;/li&gt;
&lt;li&gt;Perdí tiempo ajustando plugins&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El sistema mejoró cuando dejé de optimizarlo y empecé a &lt;strong&gt;usarlo de verdad&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;7-qué-me-aporta-este-sistema&quot;&gt;7. Qué me aporta este sistema&lt;/h2&gt;
&lt;p&gt;Gracias a este enfoque:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Aprendo con menos fricción&lt;/li&gt;
&lt;li&gt;Recuerdo mejor lo importante&lt;/li&gt;
&lt;li&gt;Tomo decisiones técnicas con más claridad&lt;/li&gt;
&lt;li&gt;Evito repetir errores&lt;/li&gt;
&lt;li&gt;Escribir posts técnicos me resulta más natural&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mis apuntes no son un archivo muerto, son una extensión de cómo pienso.&lt;/p&gt;
&lt;h2 id=&quot;conclusión&quot;&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Tomar apuntes no va de capturar toda la información que consumes, sino de &lt;strong&gt;transformarla en conocimiento propio&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Obsidian es solo la herramienta. El verdadero valor está en escribir para entender, filtrar lo importante y dejar rastro de tu proceso mental como desarrollador.&lt;/p&gt;
&lt;p&gt;No existe un sistema universal. Este es el mío, y funciona porque evoluciona conmigo.&lt;/p&gt;
&lt;p&gt;Si tienes tu propio sistema de apuntes o estás intentando construir uno, seguro que ya vas por buen camino.&lt;/p&gt;
&lt;p&gt;Sigue tomando notas, experimentando y adaptando tu sistema: al final, tus apuntes no son solo información, son la forma en que piensas y creces como desarrollador.&lt;/p&gt;</content:encoded><category>Obsidian</category><category>Aprendizaje</category><category>Desarrollo web</category><category>Productividad</category><author>Hugo Cayón Laso</author></item><item><title>La IA en el flujo de desarrollo: ¿herramienta imprescindible o fuente de incertidumbre?</title><link>https://hugocl01-devlog.netlify.app/blog/post-000011/</link><guid isPermaLink="true">https://hugocl01-devlog.netlify.app/blog/post-000011/</guid><description>Analizo cómo la inteligencia artificial está transformando el proceso de desarrollo de software en 2026, sus beneficios, riesgos y cómo puedes sacar provecho sin perder calidad.</description><pubDate>Sat, 31 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;la-ia-en-el-flujo-de-desarrollo-herramienta-imprescindible-o-fuente-de-incertidumbre&quot;&gt;La IA en el flujo de desarrollo: ¿herramienta imprescindible o fuente de incertidumbre?&lt;/h2&gt;
&lt;p&gt;La llegada de &lt;strong&gt;herramientas de inteligencia artificial al flujo de desarrollo&lt;/strong&gt; es, posiblemente, la transformación más importante del software en los últimos años. Ya no hablamos de asistentes que completan líneas de código: hablamos de sistemas que &lt;strong&gt;proponen soluciones completas, generan tests, sugieren arquitectura, corrigen errores e incluso planean tareas&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Pero no todo es color de rosa: aunque el uso ha crecido de forma espectacular, &lt;strong&gt;la confianza en lo que producen estas herramientas está bajando&lt;/strong&gt; entre la comunidad de desarrolladores.&lt;/p&gt;
&lt;p&gt;En este post veremos &lt;strong&gt;qué significa realmente esta era de IA integrada en el desarrollo&lt;/strong&gt;, cómo influye en el workflow, y cómo aprovecharla de forma responsable y productiva en 2026.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;1-ia-como-asistente-integral-en-el-ciclo-de-vida-del-software&quot;&gt;1. IA como asistente integral en el ciclo de vida del software&lt;/h2&gt;
&lt;p&gt;Según datos de encuestas y estudios recientes, &lt;strong&gt;hasta el 84 % de los desarrolladores ya usan o planean usar IA en su workflow&lt;/strong&gt;, y más de la mitad la utiliza a diario.&lt;/p&gt;
&lt;p&gt;Herramientas como &lt;strong&gt;GitHub Copilot, Claude Code o CodeWhisperer&lt;/strong&gt; ya no se limitan a completar líneas de código:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Generan funciones completas&lt;/strong&gt;, basadas en descripciones de alto nivel.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ayudan a detectar y corregir errores automáticamente.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pueden sugerir pruebas unitarias, documentación o refactorizaciones.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Algunos sistemas incluso analizan patrones de arquitectura y recomiendan estructura de proyecto.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;qué-aporta-esto-a-tu-día-a-día&quot;&gt;¿Qué aporta esto a tu día a día?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mayor productividad&lt;/strong&gt;: tareas que antes llevaban horas pueden completarse en minutos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automatización de rutinas&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mejor calidad de código&lt;/strong&gt; cuando se usa sabiamente.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Onboarding acelerado&lt;/strong&gt; de nuevos miembros en proyectos complejos.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;2-el-lado-oscuro-confianza-en-las-respuestas-de-ia&quot;&gt;2. El lado oscuro: confianza en las respuestas de IA&lt;/h2&gt;
&lt;p&gt;Aunque la adopción es alta, también hay un fenómeno curioso: &lt;strong&gt;la confianza en lo que generan estas herramientas está cayendo&lt;/strong&gt;. En una encuesta reciente, menos de la mitad de los desarrolladores confiaba plenamente en el código sugerido por IA, y muchos reportaron que el resultado a menudo estaba “casi bien, pero con errores sutiles”.&lt;/p&gt;
&lt;h3 id=&quot;problemas-habituales&quot;&gt;Problemas habituales&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Código “casi correcto”&lt;/strong&gt; que compila pero falla en casos límite.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sugerencias con bugs no evidentes al principio.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Respuestas que dependen de contexto parcial o mal interpretado.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dependencia de prompts mal formulados.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esto ha generado un debate interesante: &lt;strong&gt;¿la IA está realmente elevando la calidad del software o solo la velocidad con la que se produce código mediocre?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Por el momento es innegable que la IA sirve como soporte y ayuda, dando solución a pequeños problemas o dudas al desarrollador. De esta manera, se agiliza el trabajo y se es más productivo.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;3-la-ia-cambia-tu-rol-como-desarrollador&quot;&gt;3. La IA cambia tu rol como desarrollador&lt;/h2&gt;
&lt;p&gt;Entonces, si la IA puede escribir código por ti… ¿qué papel queda para el desarrollador?&lt;/p&gt;
&lt;p&gt;La respuesta que ha surgido en la industria es &lt;strong&gt;que el rol del desarrollador está evolucionando&lt;/strong&gt;: ya no se trata solo de &lt;em&gt;escribir código manualmente&lt;/em&gt;, sino de &lt;strong&gt;diseñar, supervisar, orquestar y corregir el output que generan las IA&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;habilidades-que-están-creciendo-en-importancia&quot;&gt;Habilidades que están creciendo en importancia&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Arquitectura de sistemas&lt;/strong&gt;: diseñar cómo encajan los módulos y dependencias.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pensamiento crítico&lt;/strong&gt;: evaluar si la solución propuesta por IA es adecuada.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Testing exhaustivo&lt;/strong&gt;: validar que el código funciona en todos los casos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CI/CD y DevOps automatizado&lt;/strong&gt;: la infraestructura se despliega sola, pero &lt;strong&gt;debes validarla y optimizarla&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Seguridad DevSecOps&lt;/strong&gt;: incorporar pruebas y controles de seguridad desde la primera línea.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En otras palabras, &lt;strong&gt;la IA está subiendo el listón de lo que se espera de un buen desarrollador&lt;/strong&gt;: no es solo &lt;em&gt;saber un lenguaje&lt;/em&gt;, sino &lt;em&gt;saber cómo usar la IA para planear, validar y entregar software robusto&lt;/em&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;4-nuevas-metodologías-ai-first-y-agentic-workflows&quot;&gt;4. Nuevas metodologías: AI-First y Agentic Workflows&lt;/h2&gt;
&lt;p&gt;En 2026 está emergiendo un nuevo concepto: &lt;strong&gt;AI-First development&lt;/strong&gt; — donde se considera que los flujos de trabajo comienzan con IA y se construyen alrededor de ella.&lt;/p&gt;
&lt;p&gt;Esto incluye:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AI agents&lt;/strong&gt; que no solo sugieren código, sino que &lt;strong&gt;ejecutan tareas completas&lt;/strong&gt;, como crear tests, abrir PRs o analizar dependencias.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workflow orientado a prompts&lt;/strong&gt; en lugar de tareas manuales secuenciales.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generación automática de documentación y diagramas arquitectónicos&lt;/strong&gt; a medida que se actualiza el código.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esto redefine &lt;em&gt;cómo&lt;/em&gt; y &lt;em&gt;dónde&lt;/em&gt; las personas y máquinas colaboran: tú ya no eres “la fuente de todo código”, sino el &lt;strong&gt;director de la orquesta&lt;/strong&gt;, mientras la IA asume tareas de ejecución.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;5-recomendaciones-para-usar-ia-responsablemente&quot;&gt;5. Recomendaciones para usar IA responsablemente&lt;/h2&gt;
&lt;p&gt;Si vas a integrar IA en tu flujo de trabajo —y hoy practicamente todo equipo lo hace— esta es una guía breve para hacerlo bien:&lt;/p&gt;
&lt;h3 id=&quot;siempre-revisa-y-prueba&quot;&gt;Siempre revisa y prueba&lt;/h3&gt;
&lt;p&gt;No aceptes sugerencias sin &lt;em&gt;code review&lt;/em&gt; y validación, porque los entornos reales exigen &lt;em&gt;robustez, no velocidad pura&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id=&quot;integra-con-testing-automatizado&quot;&gt;Integra con testing automatizado&lt;/h3&gt;
&lt;p&gt;Haz que la IA genere pruebas unitarias, pero &lt;strong&gt;ejecuta tú mismo pruebas integrales&lt;/strong&gt;, mocks y casos extremos.&lt;/p&gt;
&lt;h3 id=&quot;entrena-tu-propio-modelo-o-afinación&quot;&gt;Entrena tu propio modelo o afinación&lt;/h3&gt;
&lt;p&gt;Si usas IA en el stack de tu empresa, considera afinar modelos con tu propio código para mejorar precisión y seguridad.&lt;/p&gt;
&lt;h3 id=&quot;usa-ia-como-colaborador-no-reemplazo&quot;&gt;Usa IA como colaborador, no reemplazo&lt;/h3&gt;
&lt;p&gt;La IA &lt;strong&gt;acelera tareas repetitivas y tediosas&lt;/strong&gt;, pero &lt;strong&gt;no sustituye tu juicio profesional&lt;/strong&gt;; úsala para potenciarte, no para delegar todo.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Como apunte final, la IA ha dejado de ser &lt;em&gt;una herramienta extra&lt;/em&gt; y se ha convertido en &lt;strong&gt;una parte central del desarrollo&lt;/strong&gt;. Está redefiniendo la productividad, la forma de escribir código y el rol del desarrollador, y aunque &lt;strong&gt;la confianza en su output todavía está en debate&lt;/strong&gt;, su impacto es innegable.&lt;/p&gt;</content:encoded><category>IA</category><category>Desarrollo web</category><category>Productividad</category><category>Herramientas</category><author>Hugo Cayón Laso</author></item><item><title>Las principales tendencias tecnológicas que están marcando 2026 en desarrollo web</title><link>https://hugocl01-devlog.netlify.app/blog/post-000010/</link><guid isPermaLink="true">https://hugocl01-devlog.netlify.app/blog/post-000010/</guid><description>Un análisis de las tendencias tecnológicas actuales que están transformando el desarrollo web en 2026 y qué deberías dominar como desarrollador.</description><pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;las-principales-tendencias-tecnológicas-que-están-marcando-2026-en-desarrollo-web&quot;&gt;Las principales tendencias tecnológicas que están marcando 2026 en desarrollo web&lt;/h2&gt;
&lt;p&gt;El desarrollo web sigue evolucionando a un ritmo acelerado, y &lt;strong&gt;2026 viene cargado de tendencias que están redefiniendo cómo trabajamos y construimos productos digitales&lt;/strong&gt;. Desde la integración profunda de IA hasta nuevas formas de desplegar aplicaciones, entender estas tendencias te puede dar una ventaja competitiva como desarrollador.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;1-ia-integrada-en-el-flujo-de-desarrollo&quot;&gt;1. IA integrada en el flujo de desarrollo&lt;/h2&gt;
&lt;p&gt;Este año, la &lt;strong&gt;inteligencia artificial deja de ser una herramienta de ayuda y se convierte en parte integral del proceso de desarrollo&lt;/strong&gt;. Las tendencias recientes apuntan a que:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AI-driven coding ya no es futurista&lt;/strong&gt;: herramientas como Copilot, Gemini y asistentes de IA generan código, ayudan con pruebas y automatizan tareas repetitivas.&lt;/li&gt;
&lt;li&gt;Se deja de ver la IA como un “extra” y se adopta como una parte esencial del stack de desarrollo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esto implica que &lt;strong&gt;saber colaborar con IA, entender sus limitaciones y generar flujos de trabajo responsables&lt;/strong&gt; es cada vez más importante.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;2-innovación-tecnológica-acelerada&quot;&gt;2. Innovación tecnológica acelerada&lt;/h2&gt;
&lt;p&gt;Expertos de la industria coinciden en que &lt;strong&gt;2026 será un año de innovación intensa&lt;/strong&gt;, donde las tecnologías se adoptan y evolucionan más rápido que nunca. Esto no solo afecta frameworks o herramientas, sino &lt;strong&gt;cómo pensamos la arquitectura del software, la seguridad y la escalabilidad de nuestros proyectos web&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;3-edge-computing-y-arquitecturas-distribuidas&quot;&gt;3. Edge computing y arquitecturas distribuidas&lt;/h2&gt;
&lt;p&gt;Aunque no es una “noticia de última hora”, las &lt;strong&gt;arquitecturas edge y serverless&lt;/strong&gt; siguen consolidándose como tendencias centrales en 2026. El concepto de mover lógica cerca del usuario por medio de servicios como Cloudflare Workers o AWS Lambda@Edge &lt;strong&gt;reduce latencias y mejora rendimiento a nivel global&lt;/strong&gt;, algo crítico en aplicaciones web modernas.&lt;/p&gt;
&lt;p&gt;Este tipo de arquitectura está transformando la forma en que pensamos el &lt;strong&gt;renderizado de frontend, APIs y despliegues&lt;/strong&gt; (especialmente para aplicaciones con experiencia en tiempo real).&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;4-typescript-y-desarrollo-tipado-como-estándar&quot;&gt;4. TypeScript y desarrollo tipado como estándar&lt;/h2&gt;
&lt;p&gt;La práctica de usar tipado estático con TypeScript no es solo una moda, sino una &lt;strong&gt;verdad consolidada&lt;/strong&gt;. Al añadir seguridad de tipos al código JavaScript tradicional, &lt;strong&gt;los equipos reducen bugs, mejoran mantenibilidad y permiten flujos más predecibles en proyectos grandes&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Esto ha resultado en que muchos frameworks y herramientas modernas lo usen como opción por defecto, y que sea una competencia esperada en roles profesionales.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;5-pwas-headless-cms-y-apidriven&quot;&gt;5. PWAs, headless CMS y API‑driven&lt;/h2&gt;
&lt;p&gt;Las &lt;strong&gt;Progressive Web Apps (PWAs)&lt;/strong&gt; siguen ganando terreno como una forma eficiente de ofrecer experiencias nativas sin todas las limitaciones de las tiendas de apps. Combinadas con &lt;strong&gt;Headless CMS y arquitecturas API‑driven&lt;/strong&gt;, estas tendencias permiten:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Entregas de contenido escalables y multiplataforma&lt;/li&gt;
&lt;li&gt;Integración sencilla con SPAs o sitios estáticos&lt;/li&gt;
&lt;li&gt;Mejor experiencia offline y performance constante&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;6-nocode-y-lowcode-democratizando-el-desarrollo&quot;&gt;6. No‑code y low‑code democratizando el desarrollo&lt;/h2&gt;
&lt;p&gt;Aunque actualmente no reemplazan al desarrollo tradicional, las herramientas &lt;strong&gt;No‑code/Low‑code&lt;/strong&gt; se están volviendo parte del stack &lt;strong&gt;para prototipado rápido, MVPs y soluciones internas&lt;/strong&gt;. Estas herramientas están facilitando la creación de experiencias complejas a equipos más allá de los devs puros, lo cual tiene impacto en:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Entrega de proyectos&lt;/li&gt;
&lt;li&gt;Colaboración entre equipos&lt;/li&gt;
&lt;li&gt;Integración de soluciones sin código personalizado&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;7-el-mercado-de-desarrolladores-y-cómo-adaptarse&quot;&gt;7. El mercado de desarrolladores y cómo adaptarse&lt;/h2&gt;
&lt;p&gt;Más allá de las tendencias tecnológicas, la &lt;strong&gt;percepción del mercado de desarrolladores también está cambiando&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AI no reemplaza devs, pero redefine habilidades prioritarias&lt;/strong&gt;, saber usar IA y adaptarse a flujos simulados por herramientas inteligentes es crucial.&lt;/li&gt;
&lt;li&gt;El valor real ya no es solo conocer un lenguaje/framework, sino &lt;strong&gt;resolver problemas, entender arquitectura y construir productos confiables&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La conversación en comunidades técnicas indica que aunque hay ruido, la &lt;strong&gt;demanda de devs con capacidades amplias y fundamentos sólidos sigue fuerte&lt;/strong&gt; — especialmente para quien puede diseñar y construir soluciones completas.&lt;/p&gt;
&lt;p&gt;!Nos vemos en el próximo artículo!&lt;/p&gt;</content:encoded><category>Desarrollo web</category><category>IA</category><category>Inteligencia artificial</category><category>Productividad</category><category>Edge computing</category><author>Hugo Cayón Laso</author></item><item><title>Cloudflare adquiere al equipo de Astro: qué significa para el desarrollo web</title><link>https://hugocl01-devlog.netlify.app/blog/post-000009/</link><guid isPermaLink="true">https://hugocl01-devlog.netlify.app/blog/post-000009/</guid><description>Analizo la reciente compra del equipo de Astro por Cloudflare y por qué puede ser un punto de inflexión en frameworks web y edge computing en 2026.</description><pubDate>Thu, 22 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;cloudflare-adquiere-al-equipo-de-astro-un-antes-y-un-después-para-el-desarrollo-web&quot;&gt;Cloudflare adquiere al equipo de Astro: ¿un antes y un después para el desarrollo web?&lt;/h2&gt;
&lt;p&gt;En una &lt;strong&gt;movida estratégica que ha sorprendido a muchos en el ecosistema web&lt;/strong&gt;, Cloudflare —la empresa líder en servicios de CDN, seguridad y edge computing— ha anunciado la &lt;strong&gt;adquisición del equipo detrás de Astro&lt;/strong&gt;, uno de los frameworks más populares para construir sitios web rápidos y centrados en contenido.&lt;/p&gt;
&lt;p&gt;Astro ha ganado tracción rápidamente entre desarrolladores por su &lt;strong&gt;arquitectura “content-first”&lt;/strong&gt; y por permitir &lt;strong&gt;enviar cero JavaScript al cliente por defecto&lt;/strong&gt;, lo que mejora radicalmente el rendimiento de proyectos estáticos o JAMstack.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;por-qué-es-importante-esta-adquisición&quot;&gt;¿Por qué es importante esta adquisición?&lt;/h2&gt;
&lt;p&gt;La compra del equipo de Astro por parte de Cloudflare &lt;strong&gt;no es solo un movimiento corporativo más&lt;/strong&gt;; implica &lt;strong&gt;señales importantes sobre hacia dónde va la web en 2026&lt;/strong&gt;:&lt;/p&gt;
&lt;h3 id=&quot;refuerzo-del-edge-computing&quot;&gt;Refuerzo del edge computing&lt;/h3&gt;
&lt;p&gt;Cloudflare ya ofrece funciones de computación en el edge que permiten ejecutar lógica en servidores distribuidos globalmente, cerca del usuario y con Astro en su órbita, es probable que &lt;strong&gt;la integración entre frameworks y edge workflows sea cada vez más profunda&lt;/strong&gt;. Esto puede cambiar cómo pensemos en la renderización y despliegue de aplicaciones web.&lt;/p&gt;
&lt;h3 id=&quot;prioridad-al-rendimiento-y-experiencias-optimizadas&quot;&gt;Prioridad al rendimiento y experiencias optimizadas&lt;/h3&gt;
&lt;p&gt;Astro nació con un objetivo: &lt;strong&gt;mejorar el rendimiento real de los sitios web&lt;/strong&gt; enviando lo mínimo posible al navegador. Esta filosofía encaja perfectamente con lo que hoy exigen Core Web Vitals y las mejores prácticas de rendimiento web en 2026.&lt;/p&gt;
&lt;h3 id=&quot;competencia-con-stacks-tradicionales&quot;&gt;Competencia con stacks “tradicionales”&lt;/h3&gt;
&lt;p&gt;Si frameworks como React, Vue o Angular han dominado el espacio de aplicaciones interactivas, Astro representa una visión alternativa centrada en &lt;strong&gt;contenido y performance&lt;/strong&gt;. La entrada de un gigante como Cloudflare podría impulsar esta tendencia hacia &lt;strong&gt;mayores niveles de adopción&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;qué-puedes-esperar-como-desarrollador&quot;&gt;Qué puedes esperar como desarrollador&lt;/h2&gt;
&lt;p&gt;Esta adquisición abre varias posibilidades para tu workflow:&lt;/p&gt;
&lt;h3 id=&quot;integraciones-nativas-con-productos-de-cloudflare&quot;&gt;Integraciones nativas con productos de Cloudflare&lt;/h3&gt;
&lt;p&gt;Es probable que en el futuro veamos &lt;strong&gt;mejor integración de Astro con servicios como Workers, Pages o R2&lt;/strong&gt;, lo que facilitaría crear sitios ultra‑rápidos, escalables y con funciones avanzadas sin complicaciones.&lt;/p&gt;
&lt;h3 id=&quot;mejor-soporte-para-páginas-estáticas-y-jamstack&quot;&gt;Mejor soporte para Páginas Estáticas y Jamstack&lt;/h3&gt;
&lt;p&gt;Astro ya hacía esto bien; con Cloudflare detrás, podríamos ver &lt;strong&gt;mejoras en build pipelines, plugins y despliegue continuo&lt;/strong&gt; integrado con la red global del proveedor.&lt;/p&gt;
&lt;h3 id=&quot;comunidad-e-innovación&quot;&gt;Comunidad e innovación&lt;/h3&gt;
&lt;p&gt;Astro tiene una comunidad vibrante. Con recursos adicionales detrás, es posible que se acelere la &lt;strong&gt;creación de nuevas funciones, doc mejorada y herramientas complementarias&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;conclusión-deberías-usar-astro-en-tus-próximos-proyectos&quot;&gt;Conclusión: ¿deberías usar Astro en tus próximos proyectos?&lt;/h2&gt;
&lt;p&gt;Si buscas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rendimiento por defecto sin sacrificar experiencia de desarrollo.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sitios content first o estáticos ultra rápidos&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integración con edge computing moderno.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Actualmente Astro (ahora con respaldo de Cloudflare) es definitivamente una opción que &lt;strong&gt;vale la pena explorar&lt;/strong&gt; en 2026.&lt;/p&gt;
&lt;p&gt;Esta compra no solo valida la &lt;strong&gt;visión de Astro como framework moderno&lt;/strong&gt;, sino que también indica un &lt;strong&gt;movimiento importante hacia arquitecturas más rápidas, distribuidas y optimizadas para experiencias reales del usuario&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Hasta la próxima.&lt;/p&gt;</content:encoded><category>Astro</category><category>Cloudflare</category><category>Frameworks</category><category>Desarrollo web</category><author>Hugo Cayón Laso</author></item><item><title>Ahora tenemos RSS: qué es, cómo funciona y por qué te interesa</title><link>https://hugocl01-devlog.netlify.app/blog/post-000008/</link><guid isPermaLink="true">https://hugocl01-devlog.netlify.app/blog/post-000008/</guid><description>Te explico qué es un RSS feed, cómo funciona y por qué deberías suscribirte al feed de este blog para no perderte nada.</description><pubDate>Fri, 16 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;este-blog-ahora-tiene-rss&quot;&gt;Este blog ahora tiene RSS&lt;/h2&gt;
&lt;p&gt;Quiero contarte una mejora importante: este blog ya dispone de un &lt;a href=&quot;/rss.xml&quot;&gt;RSS feed&lt;/a&gt;. En este artículo te explico en detalle qué significa esto, cómo funciona y por qué puede ser una herramienta útil para mantenerte al día con el contenido sin necesidad de visitar el sitio de forma manual.&lt;/p&gt;
&lt;p&gt;RSS es un formato estandarizado que permite &lt;strong&gt;distribuir actualizaciones de contenido de forma automática&lt;/strong&gt;, de modo que aplicaciones o lectores especializados pueden detectar y organizar esas actualizaciones sin que tú tengas que visitar manualmente cada sitio que sigues.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;qué-es-un-rss&quot;&gt;¿Qué es un RSS?&lt;/h2&gt;
&lt;p&gt;RSS son las siglas de &lt;em&gt;Really Simple Syndication&lt;/em&gt;, que en español se traduce como “sindicación realmente simple”. Se trata de un &lt;strong&gt;formato estándar basado en XML que se utiliza para distribuir contenido actualizado de forma automática&lt;/strong&gt; desde sitios web que publican con frecuencia, como blogs, medios de noticias o canales de podcast.&lt;/p&gt;
&lt;p&gt;Un archivo RSS contiene, estructurado en formato XML, una lista de publicaciones recientes de un sitio web junto con metadatos importantes como:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;El título de la publicación.&lt;/li&gt;
&lt;li&gt;La descripción o un resumen.&lt;/li&gt;
&lt;li&gt;Autor o fuente del contenido.&lt;/li&gt;
&lt;li&gt;La fecha en la que se publicó.&lt;/li&gt;
&lt;li&gt;La dirección web (URL) para acceder al contenido completo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Este formato permite que &lt;strong&gt;cualquier lector de RSS pueda interpretar y mostrar estas actualizaciones de manera sistemática&lt;/strong&gt;, independientemente de la tecnología usada para generar el contenido original.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;cómo-funciona-un-rss&quot;&gt;¿Cómo funciona un RSS?&lt;/h2&gt;
&lt;p&gt;El funcionamiento de un RSS se basa en la periodicidad y la estandarización:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cada vez que publicamos un nuevo artículo en este blog, nuestro sistema genera entradas en el feed RSS correspondientes a esa publicación.&lt;/li&gt;
&lt;li&gt;Un lector de RSS es una herramienta que &lt;strong&gt;consulta periódicamente este archivo&lt;/strong&gt;, descargándolo y analizando su contenido para detectar cambios o nuevas entradas.&lt;/li&gt;
&lt;li&gt;Siempre que hay contenido nuevo, el lector te lo muestra organizado cronológicamente, sin que tengas que visitar el blog manualmente para comprobar si hay novedades.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Este proceso se realiza de forma automatizada y continua, de modo que tu lector siempre puede mostrarte las actualizaciones más recientes de todas las fuentes a las que estés suscrito.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;qué-necesito-para-usar-rss&quot;&gt;¿Qué necesito para usar RSS?&lt;/h2&gt;
&lt;p&gt;Para consumir contenido a través de un RSS necesitas un &lt;strong&gt;lector de feeds&lt;/strong&gt;. Un lector de RSS es un programa o servicio que descarga, organiza y muestra los contenidos de uno o varios feeds a los que te hayas suscrito. Existen distintos tipos de lectores:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lectores basados en la web, que funcionan desde un navegador o con aplicaciones móviles.&lt;/li&gt;
&lt;li&gt;Aplicaciones de escritorio, que funcionan localmente en tu equipo.&lt;/li&gt;
&lt;li&gt;Extensiones de navegador, que detectan automáticamente los feeds disponibles en los sitios que visitas.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Algunos ejemplos populares de lectores de RSS incluyen Feedly, Inoreader, y Reeder.&lt;/p&gt;
&lt;p&gt;El uso de un lector es muy sencillo: copias la URL del feed RSS del blog, la añades en tu lector y este empezará a revisar el feed de forma periódica para mostrarte las entradas nuevas.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;por-qué-seguir-un-rss-en-2026&quot;&gt;¿Por qué seguir un RSS en 2026?&lt;/h2&gt;
&lt;p&gt;Aunque RSS es una tecnología con décadas de existencia, mantiene una serie de ventajas que la hacen relevante en contextos donde se valora la &lt;strong&gt;organización, la independencia y el control sobre el contenido&lt;/strong&gt; que se consume.&lt;/p&gt;
&lt;h3 id=&quot;control-directo-de-lo-que-lees&quot;&gt;Control directo de lo que lees&lt;/h3&gt;
&lt;p&gt;Con RSS tú decides exactamente &lt;strong&gt;qué fuentes seguir&lt;/strong&gt;, sin depender de algoritmos que filtren o prioricen contenido en función de criterios distintos a la simple cronología o relevancia directa. Esto evita que contenidos importantes queden ocultos por decisiones automatizadas de plataformas.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;privacidad&quot;&gt;Privacidad&lt;/h3&gt;
&lt;p&gt;Los lectores de RSS no requieren que proporciones datos personales ni que te registres en servicios de terceros para consumir contenidos. Simplemente consultas el feed y recibes las publicaciones, sin seguimiento de comportamiento o registros de actividad.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;ahorro-de-tiempo&quot;&gt;Ahorro de tiempo&lt;/h3&gt;
&lt;p&gt;Con un lector de RSS puedes &lt;strong&gt;agrupar múltiples fuentes de información en un solo lugar&lt;/strong&gt;. En vez de revisar manualmente si hay contenido nuevo en cada sitio que sigues, tu lector te muestra automáticamente las actualizaciones de todos ellos en una sola interfaz, lo que supone una mejora considerable en eficiencia a la hora de consumir contenidos.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;organización-limpia&quot;&gt;Organización limpia&lt;/h3&gt;
&lt;p&gt;Los lectores de RSS presentan las actualizaciones de forma ordenada y libre de distracciones, lo que facilita la lectura y revisión de novedades sin banners ni elementos ajenos al contenido.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;uso-extendido-en-múltiples-contextos&quot;&gt;Uso extendido en múltiples contextos&lt;/h3&gt;
&lt;p&gt;Además de blogs, los RSS feeds se utilizan para distribuir actualizaciones de noticias, contenidos de podcasting y otros tipos de información que se actualiza con frecuencia. La estandarización del formato XML permite que estos contenidos sean consumidos por una amplia variedad de herramientas de lectura automática.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Un RSS feed es un &lt;strong&gt;formato estándar para distribuir contenido actualizado de forma automática&lt;/strong&gt;. Utilizar un lector de RSS te permite:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Agrupar en un solo lugar todas tus fuentes de interés.&lt;/li&gt;
&lt;li&gt;Evitar algoritmos de plataformas que deciden por ti qué contenidos mostrar.&lt;/li&gt;
&lt;li&gt;Mantener el control total sobre tu experiencia de lectura.&lt;/li&gt;
&lt;li&gt;Ahorrar tiempo al concentrar las publicaciones nuevas en una sola vista.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Este blog ahora cuenta con un RSS feed. Suscribirte a él te permitirá estar siempre informado de las publicaciones nuevas sin necesidad de visitar el sitio manualmente.&lt;/p&gt;
&lt;p&gt;¡Gracias por leer y nos vemos en el próximo artículo!&lt;/p&gt;</content:encoded><category>RSS</category><category>XML</category><category>Tecnología</category><author>Hugo Cayón Laso</author></item><item><title>Composer en PHP: guía completa para empezar</title><link>https://hugocl01-devlog.netlify.app/blog/post-000007/</link><guid isPermaLink="true">https://hugocl01-devlog.netlify.app/blog/post-000007/</guid><description>Aprende qué es Composer, cómo instalarlo y cómo gestionar dependencias en proyectos PHP de forma profesional.</description><pubDate>Sun, 11 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;qué-es-composer-y-para-qué-sirve&quot;&gt;¿Qué es Composer y para qué sirve?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Composer&lt;/strong&gt; es el &lt;strong&gt;gestor de dependencias de PHP&lt;/strong&gt;.
Permite instalar, actualizar y gestionar librerías externas de forma sencilla y controlada, similar a &lt;code&gt;npm&lt;/code&gt; en JavaScript o &lt;code&gt;pip&lt;/code&gt; en Python.&lt;/p&gt;
&lt;p&gt;Composer se basa en un archivo llamado &lt;strong&gt;&lt;code&gt;composer.json&lt;/code&gt;&lt;/strong&gt;, donde se definen las dependencias y la configuración del proyecto.&lt;/p&gt;
&lt;p&gt;Esto facilita la integración de librerías de terceros, asegurando que las versiones sean compatibles y que el proyecto se mantenga organizado.&lt;/p&gt;
&lt;h2 id=&quot;instalación-de-composer&quot;&gt;Instalación de Composer&lt;/h2&gt;
&lt;h3 id=&quot;macos-y-linux&quot;&gt;macOS y Linux&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;php&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -r&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;copy(&apos;https://getcomposer.org/installer&apos;, &apos;composer-setup.php&apos;);&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;php&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; composer-setup.php&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;php&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -r&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;unlink(&apos;composer-setup.php&apos;);&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;mv&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; composer.phar&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /usr/local/bin/composer&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;windows&quot;&gt;Windows&lt;/h3&gt;
&lt;p&gt;Descarga el instalador desde &lt;a href=&quot;https://getcomposer.org&quot;&gt;getcomposer.org&lt;/a&gt; y sigue las instrucciones del asistente.&lt;/p&gt;
&lt;h2 id=&quot;verificar-la-instalación&quot;&gt;Verificar la instalación&lt;/h2&gt;
&lt;p&gt;Para verificar que Composer se ha instalado correctamente, ejecuta:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;composer&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --version&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Deberías ver la versión de Composer instalada.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Composer&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; version&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 2.x.x&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 2024-01-01&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 12:00:00&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;estructura-básica-de-un-proyecto-con-composer&quot;&gt;Estructura básica de un proyecto con Composer&lt;/h2&gt;
&lt;p&gt;Un proyecto típico con Composer tiene la siguiente estructura:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── composer.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── composer.lock&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── vendor/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    └── autoload.php&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;composer.json&lt;/code&gt;: Define las dependencias y la configuración del proyecto.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer.lock&lt;/code&gt;: Registra las versiones exactas de las dependencias instaladas.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vendor/&lt;/code&gt;: Carpeta donde se instalan las dependencias.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;autoload.php&lt;/code&gt;: Archivo generado automáticamente para cargar las clases de las dependencias.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;crear-un-archivo-composerjson&quot;&gt;Crear un archivo composer.json&lt;/h2&gt;
&lt;p&gt;Puedes crear un archivo &lt;code&gt;composer.json&lt;/code&gt; manualmente o utilizando el comando:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;composer&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; init&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Este comando te guiará a través de una serie de preguntas para configurar tu proyecto.&lt;/p&gt;
&lt;p&gt;Un ejemplo básico de &lt;code&gt;composer.json&lt;/code&gt; podría ser:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;mi-proyecto/ejemplo&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;description&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;Un proyecto de ejemplo usando Composer&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;require&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;monolog/monolog&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;^2.0&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;guzzlehttp/guzzle&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;^7.0&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;autoload&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;psr-4&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;            &quot;App\\&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;src/&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;minimum-stability&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;stable&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;instalar-dependencias&quot;&gt;Instalar dependencias&lt;/h2&gt;
&lt;p&gt;Para instalar las dependencias definidas en &lt;code&gt;composer.json&lt;/code&gt;, ejecuta:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;composer&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Esto creará la carpeta &lt;code&gt;vendor/&lt;/code&gt; y descargará las librerías necesarias.&lt;/p&gt;
&lt;h2 id=&quot;instalar-una-nueva-dependencia&quot;&gt;Instalar una nueva dependencia&lt;/h2&gt;
&lt;p&gt;Para agregar una nueva dependencia a tu proyecto, usa el comando:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;composer&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; require&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nombre/dependencia&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;actualizar-dependencias&quot;&gt;Actualizar dependencias&lt;/h2&gt;
&lt;p&gt;Para actualizar las dependencias a las últimas versiones permitidas por las restricciones en &lt;code&gt;composer.json&lt;/code&gt;, usa:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;composer&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; update&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Este comando actualizará las librerías y modificará el archivo &lt;code&gt;composer.lock&lt;/code&gt; en consecuencia. Hay que tener cuidado al usarlo en proyectos en producción, ya que puede introducir cambios inesperados.&lt;/p&gt;
&lt;h2 id=&quot;autoloading&quot;&gt;Autoloading&lt;/h2&gt;
&lt;p&gt;Una de las características más útiles de Composer es el autoloading automático. Composer genera automáticamente un archivo que puedes incluir en tu proyecto para cargar las clases de las dependencias instaladas.&lt;/p&gt;
&lt;p&gt;Para usar el autoloading, simplemente incluye el siguiente código al inicio de tu script PHP:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;php&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;require&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;vendor/autoload.php&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;autoloading-de-las-clases-propias-psr-4&quot;&gt;Autoloading de las clases propias (PSR-4)&lt;/h2&gt;
&lt;p&gt;Si has configurado el autoloading en &lt;code&gt;composer.json&lt;/code&gt;, también se cargarán tus propias clases automáticamente, puedes usar el siguiente ejemplo:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;autoload&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;    &quot;psr-4&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;        &quot;App\\&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;&quot;src/&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Esto te permite utilizar las clases de las librerías instaladas sin necesidad de cargarlas manualmente.&lt;/p&gt;
&lt;p&gt;Después de modificar el &lt;code&gt;composer.json&lt;/code&gt; para agregar nuevas rutas de autoloading, asegúrate de ejecutar:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;composer&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; dump-autoload&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Estructura de carpetas recomendada:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── src/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;│   └── MiClase.php&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── composer.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── composer.lock&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;├── vendor/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    └── autoload.php&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ejemplo de uso:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;php&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// src/MiClase.php&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;?&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;php&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;namespace&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; App&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; MiClase&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    public&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; saludar&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;¡Hola desde MiClase!&quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;php&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// index.php&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;?&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;php&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;require&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &apos;vendor/autoload.php&apos;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; App\MiClase&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$miClase &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; MiClase&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;echo&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; $miClase&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;saludar&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(); &lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// Salida: ¡Hola desde MiClase!&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;comandos-útiles-de-composer&quot;&gt;Comandos útiles de Composer&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;composer install&lt;/code&gt;: Instala las dependencias del proyecto.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer update&lt;/code&gt;: Actualiza las dependencias a las últimas versiones permitidas.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer require nombre/dependencia&lt;/code&gt;: Agrega una nueva dependencia al proyecto.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer remove nombre/dependencia&lt;/code&gt;: Elimina una dependencia del proyecto.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer dump-autoload&lt;/code&gt;: Regenera el archivo de autoloading.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer show&lt;/code&gt;: Muestra las dependencias instaladas y sus versiones.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer outdated&lt;/code&gt;: Muestra las dependencias que tienen actualizaciones disponibles.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer validate&lt;/code&gt;: Valida el archivo &lt;code&gt;composer.json&lt;/code&gt; para asegurarse de que esté correctamente formateado.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer why nombre/dependencia&lt;/code&gt;: Muestra por qué una dependencia está instalada (qué otra dependencia la requiere).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer global require nombre/dependencia&lt;/code&gt;: Instala una dependencia de forma global en el sistema.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer global update&lt;/code&gt;: Actualiza las dependencias instaladas globalmente.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer licenses&lt;/code&gt;: Muestra las licencias de las dependencias instaladas.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer config&lt;/code&gt;: Permite ver y modificar la configuración de Composer.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer clear-cache&lt;/code&gt;: Limpia la caché de Composer para liberar espacio o solucionar problemas de instalación.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer clear-cache --all&lt;/code&gt;: Limpia toda la caché de Composer, incluyendo cachés de paquetes y metadatos.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer run-script nombre-script&lt;/code&gt;: Ejecuta un script definido en la sección &lt;code&gt;scripts&lt;/code&gt; del archivo &lt;code&gt;composer.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer help [comando]&lt;/code&gt;: Muestra la ayuda detallada para un comando específico de Composer.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer diagnose&lt;/code&gt;: Realiza un diagnóstico del entorno de Composer para identificar posibles problemas de configuración o instalación.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer init&lt;/code&gt;: Inicia un asistente para crear un nuevo archivo &lt;code&gt;composer.json&lt;/code&gt; desde cero.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer lock&lt;/code&gt;: Bloquea las versiones de las dependencias instaladas para garantizar la consistencia en diferentes entornos.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer require --dev nombre/dependencia&lt;/code&gt;: Agrega una dependencia solo para el entorno de desarrollo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer remove --dev nombre/dependencia&lt;/code&gt;: Elimina una dependencia del entorno de desarrollo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer update --lock&lt;/code&gt;: Actualiza solo el archivo &lt;code&gt;composer.lock&lt;/code&gt; sin modificar las dependencias instaladas.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer global show&lt;/code&gt;: Muestra las dependencias instaladas globalmente en el sistema.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer global outdated&lt;/code&gt;: Muestra las dependencias globales que tienen actualizaciones disponibles.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer global remove nombre/dependencia&lt;/code&gt;: Elimina una dependencia instalada globalmente.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;composer global dump-autoload&lt;/code&gt;: Regenera el archivo de autoloading para las dependencias instaladas globalmente.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;apuntes-finales&quot;&gt;Apuntes finales&lt;/h2&gt;
&lt;p&gt;Para acabar, Composer es una herramienta esencial para cualquier desarrollador PHP que busque gestionar dependencias de manera eficiente y profesional. Su uso adecuado mejora la organización del proyecto, facilita la integración de librerías externas y asegura la compatibilidad entre diferentes versiones de paquetes. Adoptar Composer en tus proyectos PHP es un paso fundamental hacia un desarrollo más estructurado y mantenible. ¡No dudes en explorar más sobre sus funcionalidades y sacarle el máximo provecho!&lt;/p&gt;
&lt;p&gt;Hasta la próxima.&lt;/p&gt;</content:encoded><category>PHP</category><category>Composer</category><category>Backend</category><author>Hugo Cayón Laso</author></item><item><title>Git desde cero: guía básica de control de versiones para desarrolladores</title><link>https://hugocl01-devlog.netlify.app/blog/post-000006/</link><guid isPermaLink="true">https://hugocl01-devlog.netlify.app/blog/post-000006/</guid><description>Aprende Git desde cero: qué es, para qué sirve y cómo usar los comandos básicos para gestionar versiones de tu código.</description><pubDate>Tue, 16 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;qué-es-git-y-para-qué-sirve&quot;&gt;¿Qué es Git y para qué sirve?&lt;/h2&gt;
&lt;p&gt;Git es un &lt;strong&gt;sistema de control de versiones distribuido&lt;/strong&gt; que permite registrar cambios en el código, colaborar con otros desarrolladores y volver atrás cuando algo falla.&lt;/p&gt;
&lt;p&gt;Git sirve para resolver problemas muy comunes en el desarrollo de software:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Guardar el historial del proyecto&lt;/strong&gt;
Permite volver a versiones anteriores si algo se rompe o deja de funcionar.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Trabajar sin miedo a equivocarte&lt;/strong&gt;
Puedes experimentar con el código sabiendo que siempre podrás deshacer los cambios.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Colaborar con otros desarrolladores&lt;/strong&gt;
Varias personas pueden trabajar en el mismo proyecto sin sobrescribir el trabajo de los demás.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Controlar quién hizo cada cambio&lt;/strong&gt;
Cada modificación queda asociada a una persona y a un momento concreto.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Organizar el desarrollo con ramas&lt;/strong&gt;
Facilita trabajar en nuevas funcionalidades, correcciones o pruebas sin afectar al código principal.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Integrarse con plataformas como GitHub o GitLab&lt;/strong&gt;
Permite compartir el código, revisar cambios y automatizar despliegues.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En resumen, Git es &lt;strong&gt;imprescindible en cualquier proyecto profesional&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;instalación-de-git&quot;&gt;Instalación de Git&lt;/h2&gt;
&lt;p&gt;Para instalar Git, sigue estos pasos según tu sistema operativo:&lt;/p&gt;
&lt;h3 id=&quot;windows&quot;&gt;Windows:&lt;/h3&gt;
&lt;p&gt;Descarga el instalador desde &lt;a href=&quot;https://git-scm.com/download/win&quot;&gt;git-scm.com&lt;/a&gt; y sigue las instrucciones.&lt;/p&gt;
&lt;h3 id=&quot;macos&quot;&gt;macOS:&lt;/h3&gt;
&lt;p&gt;Usa Homebrew: &lt;code&gt;brew install git&lt;/code&gt; o descarga el instalador desde &lt;a href=&quot;https://git-scm.com/download/mac&quot;&gt;git-scm.com&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;linux&quot;&gt;Linux:&lt;/h3&gt;
&lt;p&gt;Usa el gestor de paquetes de tu distribución, por ejemplo en Ubuntu: &lt;code&gt;sudo apt-get install git&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;configuración-inicial&quot;&gt;Configuración inicial&lt;/h2&gt;
&lt;p&gt;Git necesita saber quién eres para poder asociar los cambios a una persona concreta. Esta información se guarda en cada commit.&lt;/p&gt;
&lt;p&gt;Configura tu nombre y correo electrónico:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; config&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --global&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; user.name&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Tu Nombre&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; config&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --global&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; user.email&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;tu@email.com&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Esta configuración se hace una sola vez por equipo.&lt;/p&gt;
&lt;p&gt;Para verificar la configuración, usa:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; config&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --list&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;creación-de-un-repositorio-git&quot;&gt;Creación de un repositorio Git&lt;/h2&gt;
&lt;p&gt;Para iniciar un nuevo repositorio Git en tu proyecto, navega a la carpeta del proyecto y ejecuta:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; init&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Esto crea una carpeta oculta &lt;code&gt;.git&lt;/code&gt; donde Git almacenará toda la información del repositorio.&lt;/p&gt;
&lt;p&gt;Clonar un repositorio existente:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; clone&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; url-del-repositorio&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;estados-de-git&quot;&gt;Estados de Git&lt;/h2&gt;
&lt;p&gt;Git tiene cuatro estados principales para los archivos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Untracked&lt;/strong&gt;: Archivos nuevos no rastreados por Git.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modified&lt;/strong&gt;: Archivos que han sido modificados pero no preparados para commit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Staged&lt;/strong&gt;: Archivos preparados para el próximo commit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Committed&lt;/strong&gt;: Cambios guardados en el historial de Git.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;añadir-archivos-al-área-de-preparación-staging-area&quot;&gt;Añadir archivos al área de preparación (staging area)&lt;/h2&gt;
&lt;p&gt;Para preparar archivos para el próximo commit, usa:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nombre-del-archivo&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Para añadir todos los archivos modificados:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;hacer-un-commit&quot;&gt;Hacer un commit&lt;/h2&gt;
&lt;p&gt;Para guardar los cambios preparados en el historial de Git, usa:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; commit&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Mensaje descriptivo del commit&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El mensaje debe ser claro y describir los cambios realizados.&lt;/p&gt;
&lt;h2 id=&quot;ver-el-estado-del-repositorio&quot;&gt;Ver el estado del repositorio&lt;/h2&gt;
&lt;p&gt;Para ver el estado actual del repositorio y los archivos, usa:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;git status&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Historial de commits:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; log&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ver un historial más compacto:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; log&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --oneline&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;trabajar-con-ramas&quot;&gt;Trabajar con ramas&lt;/h2&gt;
&lt;p&gt;Las ramas permiten desarrollar nuevas funcionalidades o corregir errores sin afectar al código principal.&lt;/p&gt;
&lt;p&gt;Crear una nueva rama:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; branch&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nombre-de-la-rama&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cambiar a una rama existente:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; checkout&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nombre-de-la-rama&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Crear y cambiar a una nueva rama en un solo comando:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; checkout&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -b&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nombre-de-la-rama&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Listar todas las ramas:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; branch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Fusionar una rama en la rama actual:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; merge&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nombre-de-la-rama&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Eliminar una rama:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; branch&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -d&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nombre-de-la-rama&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;trabajar-con-repositorios-remotos&quot;&gt;Trabajar con repositorios remotos&lt;/h2&gt;
&lt;p&gt;Para conectar tu repositorio local con un repositorio remoto (por ejemplo, en GitHub), usa:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; remote&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; origin&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; url-del-repositorio&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Enviar cambios al repositorio remoto:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; push&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; origin&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nombre-de-la-rama&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Obtener cambios del repositorio remoto:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; pull&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; origin&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; nombre-de-la-rama&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;uso-de-gitignore&quot;&gt;Uso de .gitignore&lt;/h2&gt;
&lt;p&gt;El archivo &lt;code&gt;.gitignore&lt;/code&gt; permite evitar subir archivos innecesarios como:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;node_modules&lt;/li&gt;
&lt;li&gt;archivos de entorno (.env)&lt;/li&gt;
&lt;li&gt;builds&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ejemplo:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# build output&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;dist/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# generated types&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;.astro/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# dependencies&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;node_modules/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# logs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;npm-debug.log*&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;yarn-debug.log*&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;yarn-error.log*&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;pnpm-debug.log*&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;# environment variables&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;.env&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;.env.production&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;buenas-prácticas-con-git&quot;&gt;Buenas prácticas con Git&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Realiza commits frecuentes con mensajes claros, que describan los cambios realizados.&lt;/li&gt;
&lt;li&gt;Usa ramas para desarrollar nuevas funcionalidades.&lt;/li&gt;
&lt;li&gt;Revisa los cambios antes de hacer un commit.&lt;/li&gt;
&lt;li&gt;Mantén tu repositorio remoto actualizado.&lt;/li&gt;
&lt;li&gt;Evita subir archivos innecesarios (usa un archivo &lt;code&gt;.gitignore&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Colabora y revisa el código de otros desarrolladores.&lt;/li&gt;
&lt;li&gt;Aprende a resolver conflictos de fusión (merge conflicts).&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>Git</category><category>Versionado</category><category>Buenas prácticas</category><category>DevOps</category><category>Mantenimiento</category><author>Hugo Cayón Laso</author></item><item><title>Mi configuración para desarrollar aplicaciones</title><link>https://hugocl01-devlog.netlify.app/blog/post-000005/</link><guid isPermaLink="true">https://hugocl01-devlog.netlify.app/blog/post-000005/</guid><description>Así es el entorno que utilizo para desarrollar aplicaciones web: hardware, software, extensiones, herramientas y ajustes de productividad.</description><pubDate>Sun, 07 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A lo largo de los últimos años he ido refinando mi manera de trabajar hasta llegar a un entorno de desarrollo &lt;strong&gt;rápido, estable y muy enfocado a la productividad&lt;/strong&gt;.
En este post quiero compartir &lt;strong&gt;todo lo que uso&lt;/strong&gt;, desde el hardware hasta las herramientas, extensiones, terminales y configuraciones que me acompañan cada día al desarrollar proyectos con &lt;strong&gt;JavaScript, React, PHP y Laravel&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;hardware-que-utilizo&quot;&gt;Hardware que utilizo&lt;/h2&gt;
&lt;p&gt;He probado equipos muy distintos, pero hace un mes mi pareja me regaló un &lt;strong&gt;MacBook Air M4&lt;/strong&gt;, un equipo que llevaba tiempo queriendo probar. Después de varias semanas de uso intensivo, se ha convertido en mi herramienta principal.&lt;/p&gt;
&lt;h3 id=&quot;macbook-air-m4&quot;&gt;&lt;strong&gt;MacBook Air M4&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Mi equipo principal para la mayoría del desarrollo web.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Chip:&lt;/strong&gt; Apple Silicon M4 (10 núcleos CPU, 8 núcleos GPU, 16GB RAM y 256GB SSD)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ventajas:&lt;/strong&gt; rendimiento increíble, silencioso, ligero y autonomía enorme.&lt;/li&gt;
&lt;li&gt;Ideal para: Cualquier desarrollador web que busque un equipo potente, portátil y con buena autonomía.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;por-qué-lo-uso-para-desarrollo&quot;&gt;¿Por qué lo uso para desarrollo?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;El ecosistema UNIX muy sólido y estable, macOS facilita la instalación y gestión de herramientas de desarrollo.&lt;/li&gt;
&lt;li&gt;Gran rendimiento con aplicaciones de desarrollo y multitarea.&lt;/li&gt;
&lt;li&gt;Excelente duración de batería para largas sesiones de trabajo sin necesidad de estar conectado a la corriente.&lt;/li&gt;
&lt;li&gt;Portabilidad y ligereza, ideal para trabajar desde cualquier lugar.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A pesar de haber aprendido a usar Windows y Linux en el pasado, hoy en día macOS me ofrece un entorno más fluido.&lt;/p&gt;
&lt;h2 id=&quot;herramientas-y-software-principal&quot;&gt;Herramientas y software principal&lt;/h2&gt;
&lt;h3 id=&quot;visual-studio-code-como-editor-principal&quot;&gt;&lt;strong&gt;Visual Studio Code como editor principal&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;VS Code es mi editor de código, he probado otros como (Antigravity, TRAE, Cursor o Xcode), pero siempre vuelvo a &lt;strong&gt;VS Code&lt;/strong&gt; es con el que me siento más cómodo.&lt;/p&gt;
&lt;p&gt;Estas son las extensiones que considero imprescindibles:&lt;/p&gt;
&lt;h4 id=&quot;para-javascript--node--astro--react&quot;&gt;&lt;strong&gt;Para JavaScript / Node / Astro / React&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Astro&lt;/strong&gt; – soporte oficial para el framework&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ESLint&lt;/strong&gt; – análisis estático del código&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prettier&lt;/strong&gt; – formateo automático&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tailwind CSS IntelliSense&lt;/strong&gt; – autocompletado inteligente (cuando lo uso)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;para-php-y-laravel&quot;&gt;&lt;strong&gt;Para PHP y Laravel&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PHP Debug&lt;/strong&gt; – depuración paso a paso&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP Intelephense&lt;/strong&gt; – análisis avanzado para PHP&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DotENV&lt;/strong&gt; – resaltado para archivos &lt;code&gt;.env&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;otras-extensiones-útiles&quot;&gt;&lt;strong&gt;Otras extensiones útiles&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Error Lens&lt;/strong&gt; – muestra errores directamente en el editor&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better Comments&lt;/strong&gt; – comentarios más organizados&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Image Preview&lt;/strong&gt; – vista previa de imágenes en el código&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Material Icon Theme&lt;/strong&gt; y &lt;strong&gt;Fluent Icons&lt;/strong&gt; – iconos más agradables y rápidos de identificar&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Houston&lt;/strong&gt; - tema oficial de Astro, mi tema favorito&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trailing Spaces&lt;/strong&gt; – resalta espacios sobrantes&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;terminal&quot;&gt;&lt;strong&gt;Terminal&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Utilizo la terminal integrada de macOS.&lt;/p&gt;
&lt;h3 id=&quot;git-y-github&quot;&gt;&lt;strong&gt;Git y GitHub&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Trabajo con &lt;strong&gt;Git&lt;/strong&gt; para control de versiones y utilizo &lt;strong&gt;GitHub&lt;/strong&gt; para alojar mis repositorios&lt;/p&gt;
&lt;h3 id=&quot;bases-de-datos-y-entornos-backend&quot;&gt;&lt;strong&gt;Bases de datos y entornos backend&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Como trabajo tanto con MySQL como con PHP + Laravel, tengo una pequeña colección de herramientas que utilizo siempre:&lt;/p&gt;
&lt;h4 id=&quot;mysql-workbench&quot;&gt;&lt;strong&gt;MySQL Workbench&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Utilizo MySQL Workbench para gestionar mis bases de datos MySQL de manera visual.&lt;/p&gt;
&lt;h4 id=&quot;php-y-laravel&quot;&gt;PHP y Laravel&lt;/h4&gt;
&lt;p&gt;Son las tecnologías backend que más utilizo. Para gestionar proyectos Laravel, uso Composer y Artisan desde la terminal.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PHP 8.4&lt;/li&gt;
&lt;li&gt;Laravel 12&lt;/li&gt;
&lt;li&gt;Composer&lt;/li&gt;
&lt;li&gt;Artisan CLI&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;navegadores-web&quot;&gt;&lt;strong&gt;Navegadores web&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Utilizo principalmente &lt;strong&gt;Google Chrome&lt;/strong&gt;, &lt;strong&gt;Firefox&lt;/strong&gt; y &lt;strong&gt;Safari&lt;/strong&gt; para probar y depurar aplicaciones.&lt;/p&gt;
&lt;h3 id=&quot;otras-herramientas&quot;&gt;&lt;strong&gt;Otras herramientas&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Postman&lt;/strong&gt; para probar APIs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Homebrew&lt;/strong&gt; para gestionar paquetes y software en macOS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ChatGPT&lt;/strong&gt; para consultar dudas y obtener ayuda rápida.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Gracias por llegar hasta aquí.
Espero que este repaso a mi entorno de desarrollo te haya servido para descubrir nuevas herramientas o simplemente para inspirarte a optimizar el tuyo.&lt;/p&gt;</content:encoded><category>Desarrollo web</category><category>Herramientas</category><category>Productividad</category><category>Software</category><author>Hugo Cayón Laso</author></item><item><title>Cómo organizo mi aprendizaje como desarrollador web</title><link>https://hugocl01-devlog.netlify.app/blog/post-000004/</link><guid isPermaLink="true">https://hugocl01-devlog.netlify.app/blog/post-000004/</guid><description>Mi sistema personal para aprender nuevas tecnologías de forma constante, sin perder el rumbo ni la motivación.</description><pubDate>Mon, 01 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;El desarrollo web avanza tan rápido que es fácil sentirse desbordado. Cada semana aparece un nuevo framework, una librería revolucionaria o una forma más eficiente de resolver un problema ya resuelto. Durante mucho tiempo esto me generaba frustración: &lt;strong&gt;¿cómo organizo lo que aprendo sin sentir que siempre llego tarde?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Con los años desarrollé un sistema flexible centrado en tres pilares: &lt;strong&gt;claridad, constancia y práctica&lt;/strong&gt;. No es perfecto, pero me ha permitido avanzar sin ansiedad, mantener el foco y seguir disfrutando del aprendizaje.&lt;/p&gt;
&lt;p&gt;En este post comparto mi sistema, las herramientas que uso y cómo lo aplico día a día en mi ruta como desarrollador.&lt;/p&gt;
&lt;h2 id=&quot;1-crear-un-roadmap-flexible-pero-con-dirección&quot;&gt;1. Crear un roadmap flexible (pero con dirección)&lt;/h2&gt;
&lt;p&gt;No hablo del típico roadmap gigante que te deja paralizado.
El mío tiene &lt;strong&gt;tres niveles&lt;/strong&gt; claros:&lt;/p&gt;
&lt;h3 id=&quot;ahora-aprendizaje-activo&quot;&gt;Ahora (aprendizaje activo)&lt;/h3&gt;
&lt;p&gt;Lo que estoy estudiando en este momento y quiero dominar.&lt;/p&gt;
&lt;p&gt;Ejemplo real de mis últimos meses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Astro → para mi blog y proyectos personales&lt;/li&gt;
&lt;li&gt;Shadcn UI → para interfaces coherentes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Estas tecnologías están en mi radar diario.&lt;/p&gt;
&lt;h3 id=&quot;después-aprendizaje-programado&quot;&gt;Después (aprendizaje programado)&lt;/h3&gt;
&lt;p&gt;Tecnologías o conceptos que sé que estudiaré más adelante, pero &lt;strong&gt;no ahora&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Ejemplos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;Docker básico&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tener este bloque me evita caer en la tentación de “aprender todo a la vez”.&lt;/p&gt;
&lt;h3 id=&quot;cuando-pueda-aprendizaje-opcional&quot;&gt;Cuando pueda (aprendizaje opcional)&lt;/h3&gt;
&lt;p&gt;Cosas que me interesan, pero no impactan directamente mi trabajo inmediato.&lt;/p&gt;
&lt;p&gt;Ejemplos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Rust&lt;/li&gt;
&lt;li&gt;MonogDB&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Son ideas interesantes… pero no urgentes.&lt;/p&gt;
&lt;h2 id=&quot;2-aprender-haciendo-mini-proyectos-intencionados&quot;&gt;2. Aprender haciendo: mini-proyectos intencionados&lt;/h2&gt;
&lt;p&gt;Hacer un curso sin crear nada es absorber teoría sin convertirla en experiencia.
Por eso mi aprendizaje está orientado a &lt;strong&gt;mini-proyectos concretos&lt;/strong&gt; que resuelven una necesidad real o cumplen un objetivo muy específico.&lt;/p&gt;
&lt;h3 id=&quot;ejemplos-de-mini-proyectos-que-me-han-ayudado&quot;&gt;Ejemplos de mini-proyectos que me han ayudado:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Un blog con Astro&lt;/strong&gt; con tags, paginación y búsqueda&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Un dashboard React + Tailwind&lt;/strong&gt; con charts dinámicos&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cada mini-proyecto dura entre &lt;strong&gt;1 y 3 semanas&lt;/strong&gt;, máximo.
Esto es clave: lo termino, lo documento y paso al siguiente.&lt;/p&gt;
&lt;h2 id=&quot;3-documentar-lo-que-aprendo-mi-sistema-completo&quot;&gt;3. Documentar lo que aprendo (mi sistema completo)&lt;/h2&gt;
&lt;p&gt;Documentar no es solo escribir notas: es crear tu propia “base de conocimiento”.&lt;/p&gt;
&lt;h3 id=&quot;notas-estructuradas&quot;&gt;Notas estructuradas&lt;/h3&gt;
&lt;p&gt;Aquí guardo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cada proyecto lleva un README con:
&lt;ul&gt;
&lt;li&gt;qué intentaba aprender&lt;/li&gt;
&lt;li&gt;qué problema resolví&lt;/li&gt;
&lt;li&gt;qué entendí realmente&lt;/li&gt;
&lt;li&gt;qué debo repasar&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Explicaciones con mis propias palabras&lt;/li&gt;
&lt;li&gt;Resúmenes de conceptos complejos&lt;/li&gt;
&lt;li&gt;Ejemplos de código&lt;/li&gt;
&lt;li&gt;Enlaces útiles&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Con el tiempo, esta documentación se transforma en un mapa personal de lo que ya domino y lo que necesito reforzar.&lt;/p&gt;
&lt;h2 id=&quot;4-revisar-y-reajustar-cada-semana&quot;&gt;4. Revisar y reajustar cada semana&lt;/h2&gt;
&lt;p&gt;Este es el hábito más importante de todo mi sistema:
&lt;strong&gt;la revisión semanal&lt;/strong&gt;, normalmente los fines de semana.&lt;/p&gt;
&lt;h3 id=&quot;en-mi-revisión-miro&quot;&gt;En mi revisión miro:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Qué aprendí esta semana&lt;/li&gt;
&lt;li&gt;Qué conceptos siguen confusos&lt;/li&gt;
&lt;li&gt;Qué podría practicar mejor&lt;/li&gt;
&lt;li&gt;Si sigue teniendo sentido el roadmap&lt;/li&gt;
&lt;li&gt;Si debo cambiar prioridades&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Gracias a esto evito estancarme y mantengo un ritmo constante.&lt;/p&gt;
&lt;p&gt;A veces la revisión me hace mover tecnologías del bloque “Ahora” al bloque “Después”.
Otras veces me doy cuenta de que una tecnología ya la domino más de lo que pensaba.&lt;/p&gt;
&lt;p&gt;Esta revisión es lo que realmente me mantiene avanzando.&lt;/p&gt;
&lt;h2 id=&quot;conclusión&quot;&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;Organizar el aprendizaje no va de estudiar más, sino de estudiar mejor.
Mi sistema se basa en:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un roadmap flexible&lt;/li&gt;
&lt;li&gt;Mini-proyectos enfocados&lt;/li&gt;
&lt;li&gt;Documentación constante&lt;/li&gt;
&lt;li&gt;Revisiones semanales&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Gracias a esto siento que avanzo sin saturarme y disfruto mucho más del proceso.&lt;/p&gt;
&lt;p&gt;¡Feliz aprendizaje a tod@s!&lt;/p&gt;</content:encoded><category>Aprendizaje</category><category>Desarrollo web</category><category>Productividad</category><category>Estudio</category><category>Crecimiento</category><author>Hugo Cayón Laso</author></item><item><title>La Razón de Ser de JSON y TOON: Soluciones a Problemas de Época</title><link>https://hugocl01-devlog.netlify.app/blog/post-000003/</link><guid isPermaLink="true">https://hugocl01-devlog.netlify.app/blog/post-000003/</guid><description>Descubre por qué JSON reemplazó a XML y por qué el nuevo formato TOON está desafiando a JSON en el mundo de la Inteligencia Artificial.</description><pubDate>Sun, 30 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Cuando observamos la historia de los formatos de datos, vemos una tendencia clara: la &lt;strong&gt;serialización&lt;/strong&gt; siempre evoluciona para resolver el cuello de botella del momento. Para JSON, el cuello de botella era &lt;strong&gt;la complejidad de XML&lt;/strong&gt;; para TOON, es &lt;strong&gt;el costo del token&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;1-el-nacimiento-de-json-el-cansancio-de-xml-inicios-de-los-2000&quot;&gt;1. El Nacimiento de JSON: El Cansancio de XML (Inicios de los 2000)&lt;/h2&gt;
&lt;p&gt;La razón por la que &lt;strong&gt;JSON (JavaScript Object Notation)&lt;/strong&gt; surgió a principios de la década de 2000 se resume en una palabra: &lt;strong&gt;XML&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;el-problema-a-resolver-la-carga-pesada-de-xml&quot;&gt;El Problema a Resolver: La Carga Pesada de XML&lt;/h3&gt;
&lt;p&gt;A principios de siglo, la tecnología dominante para la transferencia de datos entre servidores y navegadores era &lt;strong&gt;XML (eXtensible Markup Language)&lt;/strong&gt;. El proceso de AJAX (Asynchronous JavaScript and XML) era el estándar, pero presentaba grandes desafíos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Verbosiadad:&lt;/strong&gt; XML es muy repetitivo. Cada dato requiere una etiqueta de apertura y otra de cierre. Esto significaba que la transferencia de datos triviales resultaba en paquetes muy grandes y lentos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Complejidad del Parsing:&lt;/strong&gt; Para que JavaScript pudiera leer datos de XML, era necesario manipular el DOM (Document Object Model) y recorrer la estructura de etiquetas, lo cual era lento y propenso a errores en los diferentes navegadores.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;la-solución-de-json-simplicidad-nativa&quot;&gt;La Solución de JSON: Simplicidad Nativa&lt;/h3&gt;
&lt;p&gt;El desarrollador &lt;strong&gt;Douglas Crockford&lt;/strong&gt; (junto con State Software) propuso un formato que eliminaba toda la complejidad:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Es Nativo de JavaScript:&lt;/strong&gt; JSON es, literalmente, la notación que JavaScript ya utiliza para sus objetos. Esto significó que los navegadores podían analizarlo (&lt;em&gt;parsearlo&lt;/em&gt;) instantáneamente, sin necesidad de librerías complejas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ligero y Conciso:&lt;/strong&gt; Eliminó las etiquetas repetidas, resultando en paquetes de datos mucho más pequeños.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;JSON nació para hacer que las aplicaciones web fueran &lt;strong&gt;más rápidas y fáciles de programar&lt;/strong&gt; al reemplazar el pesado y complejo &lt;strong&gt;XML&lt;/strong&gt; con una sintaxis simple y nativa de JavaScript.&lt;/p&gt;
&lt;h2 id=&quot;2-el-origen-de-toon-el-costo-oculto-de-los-tokens&quot;&gt;2. El Origen de TOON: El Costo Oculto de los Tokens&lt;/h2&gt;
&lt;p&gt;Casi 25 años después, la necesidad de optimización ha vuelto, pero esta vez no es por la velocidad de la red o la complejidad del código, sino por la &lt;strong&gt;eficiencia en el consumo de IA&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;el-problema-a-resolver-el-impuesto-de-tokens-de-json&quot;&gt;El Problema a Resolver: El Impuesto de Tokens de JSON&lt;/h3&gt;
&lt;p&gt;Con el auge de los LLMs, el nuevo recurso más valioso y limitado es el &lt;strong&gt;token&lt;/strong&gt; dentro de la ventana de contexto del modelo. JSON, a pesar de su concisión frente a XML, es increíblemente redundante en este nuevo contexto:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Consumo de Contexto:&lt;/strong&gt; Las estructuras repetitivas de JSON (comillas, llaves, comas y, sobre todo, la &lt;strong&gt;repetición de claves&lt;/strong&gt;) consumen tokens vitales que podrían usarse para transferir más información semántica.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Costo Directo:&lt;/strong&gt; Cada token consumido tiene un costo económico asociado. Usar JSON para grandes &lt;em&gt;arrays&lt;/em&gt; (por ejemplo, resultados de una base de datos) es pagar de más por la sintaxis.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;la-solución-de-toon-eficiencia-en-el-lenguaje-de-la-ia&quot;&gt;La Solución de TOON: Eficiencia en el Lenguaje de la IA&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;TOON (Token-Oriented Object Notation)&lt;/strong&gt; nació en &lt;strong&gt;2025&lt;/strong&gt; con el propósito claro de ser el formato más eficiente para transferir datos estructurados a los LLMs, maximizando el uso de cada token:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Eliminación de Redundancia:&lt;/strong&gt; Mediante sus &lt;strong&gt;Arrays Tabulares&lt;/strong&gt;, TOON declara las claves una sola vez y luego lista solo los valores, logrando una reducción de tokens de hasta el &lt;strong&gt;60%&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Limpieza Sintáctica:&lt;/strong&gt; Minimiza el uso de comillas y llaves, limpiando el ruido del &lt;em&gt;prompt&lt;/em&gt; y haciendo que la &lt;strong&gt;IA cometa menos errores&lt;/strong&gt; al analizar la estructura.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TOON nació para optimizar los &lt;strong&gt;costos y el rendimiento&lt;/strong&gt; de las aplicaciones de Inteligencia Artificial, corrigiendo la principal deficiencia de JSON en el mundo del &lt;em&gt;prompting&lt;/em&gt;: su excesiva verbosidad.&lt;/p&gt;
&lt;h3 id=&quot;una-evolución-constante&quot;&gt;Una Evolución Constante&lt;/h3&gt;
&lt;p&gt;Ambos formatos representan puntos clave en la historia del desarrollo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;JSON&lt;/strong&gt; liberó al desarrollador de la complejidad de la web.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TOON&lt;/strong&gt; busca liberar al agente de IA de las limitaciones y los costos del token.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La historia de la serialización de datos es, en última instancia, la historia de cómo los desarrolladores buscamos la &lt;strong&gt;máxima eficiencia&lt;/strong&gt; con las herramientas que tenemos a nuestra disposición.&lt;/p&gt;
&lt;p&gt;Hasta la próxima.&lt;/p&gt;</content:encoded><category>Historia</category><category>JSON</category><category>TOON</category><category>IA</category><category>Inteligencia artificial</category><category>LLMs</category><category>XML</category><author>Hugo Cayón Laso</author></item><item><title>De la Teoría a la Práctica: Mis 4 Meses Como Junior</title><link>https://hugocl01-devlog.netlify.app/blog/post-000002/</link><guid isPermaLink="true">https://hugocl01-devlog.netlify.app/blog/post-000002/</guid><description>Un relato honesto sobre lo que realmente significa empezar en el mundo profesional del desarrollo web: dudas, logros, aprendizajes y crecimiento.</description><pubDate>Sat, 15 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hola, soy &lt;strong&gt;Hugo&lt;/strong&gt;, y hace apenas unos meses di el salto al mundo profesional del desarrollo web. Lo que comenzó como emoción absoluta se transformó rápidamente en una mezcla de vértigo, orgullo, frustración, dudas y muchas ganas de aprender.&lt;/p&gt;
&lt;p&gt;Quería compartir cómo ha sido este inicio, sin filtros y sin adornos, porque &lt;em&gt;lo que te cuentan en los cursos no es lo que te encuentras cuando empiezas a trabajar de verdad&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;el-primer-golpe-el-código-real-no-se-parece-a-tus-proyectos&quot;&gt;El Primer Golpe: El Código Real No Se Parece a Tus Proyectos&lt;/h2&gt;
&lt;p&gt;Lo primero que descubrí fue que mis proyectos personales, por bonitos que fueran, no me preparaban para una base de código viva, grande y usada por miles de usuarios.&lt;/p&gt;
&lt;p&gt;De repente me encontré con:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;patrones que nunca había visto,&lt;/li&gt;
&lt;li&gt;archivos que parecían escritos por distintas personas,&lt;/li&gt;
&lt;li&gt;dependencias antiguas,&lt;/li&gt;
&lt;li&gt;abstracciones que tomaban tiempo entender.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No tenía que “crear cosas nuevas”: tenía que &lt;strong&gt;entender&lt;/strong&gt;.
Y entender es más difícil que escribir.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Aprendizaje:&lt;/strong&gt;
Saber programar no significa saber moverte en un proyecto real. La habilidad más valiosa al principio es leer código, seguir pistas y no desesperarte.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;el-primer-logro-aportar-aunque-sea-poco&quot;&gt;El Primer Logro: Aportar Aunque Sea Poco&lt;/h2&gt;
&lt;p&gt;Después de sentirme perdido, empezaron a llegar pequeñas victorias: corregir pequeños fallos de logica, mejorar una función, resolver un bug. Cosas aparentemente insignificantes, pero que aportaban valor real al equipo.&lt;/p&gt;
&lt;p&gt;El día que complete mi primer desarrollo grande sentí un orgullo ridículo… y totalmente válido.
Esas pequeñas victorias son las que empujan a seguir.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Aprendizaje:&lt;/strong&gt;
No subestimes las tareas simples. Te construyen criterio, confianza y te convierten en alguien útil para el equipo.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;el-enemigo-invisible-el-síndrome-del-impostor&quot;&gt;El Enemigo Invisible: El Síndrome del Impostor&lt;/h2&gt;
&lt;p&gt;Lo más difícil no fue aprender una librería o entender una arquitectura.
Fue lidiar con mi cabeza.&lt;/p&gt;
&lt;p&gt;Hubo días en los que creí que no estaba a la altura, en los que un error tonto hacía que me cuestionara si era “lo suficientemente bueno” para el trabajo. Es algo de lo que casi nadie habla, pero todos enfrentamos.&lt;/p&gt;
&lt;p&gt;Una de las cosas que más me ayudó fue entender que pedir ayuda &lt;strong&gt;no es un fracaso&lt;/strong&gt;, sino parte del proceso. Preguntar bien, explicar tu contexto, mostrar lo que intentaste… eso demuestra profesionalismo, no debilidad.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Aprendizaje:&lt;/strong&gt;
No eres menos desarrollador por no saber algo. Lo importante es tu capacidad de aprender, comunicar y avanzar.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;el-gran-cambio-ver-el-proyecto-como-un-todo&quot;&gt;El Gran Cambio: Ver el Proyecto Como Un Todo&lt;/h2&gt;
&lt;p&gt;En algún momento, las piezas empezaron a encajar.
Dejé de ver tareas sueltas y comencé a comprender cómo las diferentes partes del proyecto se conectaban entre sí:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;por qué usamos ciertas tecnologías,&lt;/li&gt;
&lt;li&gt;qué decisiones afectan el rendimiento,&lt;/li&gt;
&lt;li&gt;cómo un pequeño cambio puede romper una funcionalidad inesperada,&lt;/li&gt;
&lt;li&gt;y por qué la arquitectura existe como existe.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ya no me sentía un turista dentro del repositorio.
Empecé a sentirme parte del proyecto.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Aprendizaje:&lt;/strong&gt;
El crecimiento no llega de golpe. Llega un día en el que te das cuenta de que entiendes más de lo que entendías ayer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;consejo-final-para-otros-juniors&quot;&gt;Consejo Final Para Otros Juniors&lt;/h2&gt;
&lt;p&gt;Si tú también estás empezando:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ten paciencia contigo mismo.&lt;/strong&gt;
No te compares con personas que llevan años en esto.
No busques ser rápido: busca ser consistente.&lt;/p&gt;
&lt;p&gt;Aprenderás más de un pull request rechazado que de un tutorial de 10 horas.
Crecerás más resolviendo un bug pequeño que rehaciendo un clon de cualquier video de YouTube.
Y te harás mejor desarrollador cada vez que te atrevas a preguntar sin miedo.&lt;/p&gt;
&lt;p&gt;Aún estoy lejos de donde quiero llegar, pero estos primeros meses fueron suficientes para convencerme de algo:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Estoy exactamente donde tengo que estar.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Nos leemos en el próximo artículo.&lt;/p&gt;</content:encoded><category>Desarrollo web</category><category>Junior</category><category>Experiencia</category><category>Crecimiento</category><author>Hugo Cayón Laso</author></item><item><title>Bienvenido a mi blog</title><link>https://hugocl01-devlog.netlify.app/blog/post-000001/</link><guid isPermaLink="true">https://hugocl01-devlog.netlify.app/blog/post-000001/</guid><description>Un espacio donde comparto mis experiencias como desarrollador web, mis proyectos personales y curiosidades sobre tecnología.</description><pubDate>Thu, 13 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hola, soy &lt;strong&gt;Hugo&lt;/strong&gt;, desarrollador web apasionado por la tecnología, el código limpio y todo lo que tenga que ver con crear cosas útiles (y a veces solo divertidas) en Internet.&lt;/p&gt;
&lt;p&gt;He decidido abrir este espacio para compartir mi experiencia como desarrollador: los &lt;strong&gt;proyectos personales&lt;/strong&gt; en los que trabajo, los &lt;strong&gt;retos que enfrento&lt;/strong&gt; en el día a día y lo que voy &lt;strong&gt;aprendiendo en el camino&lt;/strong&gt;. También encontrarás &lt;strong&gt;curiosidades del mundo tech&lt;/strong&gt;, reflexiones sobre herramientas y lenguajes, y mi opinión sobre las &lt;strong&gt;tendencias que están dando forma al futuro del desarrollo web&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;La idea no es solo hablar de código, sino también de la &lt;strong&gt;parte humana detrás del teclado&lt;/strong&gt;: la motivación, la frustración cuando algo no compila, la alegría de ver un proyecto terminado… y todo lo que hay entre medio.&lt;/p&gt;
&lt;p&gt;Si te interesa el &lt;strong&gt;desarrollo web&lt;/strong&gt;, la &lt;strong&gt;innovación tecnológica&lt;/strong&gt; o simplemente te gusta leer sobre cómo otros viven este apasionante mundo digital, &lt;strong&gt;estás en el lugar correcto&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Gracias por pasarte por aquí.
Espero que disfrutes los artículos y que juntos aprendamos algo nuevo en cada publicación.&lt;/p&gt;
&lt;p&gt;Nos leemos pronto.&lt;/p&gt;</content:encoded><category>Desarrollo web</category><category>Tecnología</category><category>Proyectos</category><author>Hugo Cayón Laso</author></item></channel></rss>