<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Derlys</title>
    <description>The latest articles on Forem by Derlys (@derlys).</description>
    <link>https://forem.com/derlys</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F375762%2F5c1dc5d8-5244-451a-a432-13995700188c.png</url>
      <title>Forem: Derlys</title>
      <link>https://forem.com/derlys</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/derlys"/>
    <language>en</language>
    <item>
      <title>La Aventura de construir Kungu con Solana y IA</title>
      <dc:creator>Derlys</dc:creator>
      <pubDate>Sun, 05 Apr 2026 10:47:49 +0000</pubDate>
      <link>https://forem.com/derlys/la-aventura-de-construir-kungu-con-solana-y-ia-gcd</link>
      <guid>https://forem.com/derlys/la-aventura-de-construir-kungu-con-solana-y-ia-gcd</guid>
      <description>&lt;p&gt;¡Hola, comunidad! Hoy les traigo un caso de estudio completo sobre la creación de &lt;strong&gt;Kungu&lt;/strong&gt;, una app de directorios de comunidades hispanas sobre Solana. Este no es un tutorial lineal; es una crónica de un proceso de desarrollo real, lleno de prompts de IA, pivotes de diseño y soluciones a errores inesperados.&lt;/p&gt;

&lt;p&gt;El objetivo es mostrar cómo, partiendo de un template, se puede llegar a una aplicación con una identidad visual única, usando la IA como un copiloto de desarrollo.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. El Stack Tecnológico: La Caja de Herramientas
&lt;/h2&gt;

&lt;p&gt;La elección de herramientas fue clave para la agilidad del proyecto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Base:&lt;/strong&gt; &lt;a href="https://github.com/beeman/solana-mobile-monorepo" rel="noopener noreferrer"&gt;Solana Mobile Monorepo de Beeman&lt;/a&gt;, instalado con &lt;code&gt;bun&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Generación de UI:&lt;/strong&gt; Prototipado inicial con &lt;a href="https://www.magicpatterns.com/" rel="noopener noreferrer"&gt;Magic Patterns&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Asistente de Código:&lt;/strong&gt; &lt;strong&gt;Codex&lt;/strong&gt; (o un asistente similar) integrado en el editor (WebStorm).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Styling:&lt;/strong&gt; Una configuración moderna y específica: &lt;strong&gt;Uniwind&lt;/strong&gt; (para usar clases de Tailwind en React Native), &lt;code&gt;tailwind-variants&lt;/code&gt; y &lt;code&gt;heroui-native&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Navegación:&lt;/strong&gt; &lt;strong&gt;Expo Router&lt;/strong&gt;, que permite una navegación basada en la estructura de archivos.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Animación:&lt;/strong&gt; &lt;code&gt;react-native-reanimated&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. El Kick-off: Clonar el Monorepo y Preparar la IA
&lt;/h2&gt;

&lt;p&gt;El primer paso fue establecer la base. El monorepo de Solana nos da toda la lógica de conexión de wallets lista para usar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Clonar el template&lt;/span&gt;
bun x create-seed@latest &lt;span class="nt"&gt;-t&lt;/span&gt; gh:beeman/solana-mobile-monorepo

&lt;span class="c"&gt;# 2. Abrir el proyecto en el editor&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Lección Clave:&lt;/strong&gt; Para que la IA (Codex) sea realmente útil, debemos usarla &lt;strong&gt;dentro del editor de código&lt;/strong&gt;. De esta forma, tiene acceso a la estructura de archivos del proyecto, el &lt;code&gt;package.json&lt;/code&gt; y el código existente, lo que permite generar respuestas mucho más precisas.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Fase 1: Creando el "Community Rolodex"
&lt;/h2&gt;

&lt;p&gt;La idea inicial era mostrar las comunidades en un formato de tarjetas apiladas, como un Rolodex. Para ello, usamos un prompt muy detallado dirigido a la IA.&lt;/p&gt;

&lt;h3&gt;
  
  
  El Prompt para Crear el Componente
&lt;/h3&gt;

&lt;p&gt;Este prompt se ejecutó en el chat del editor, especificando la ruta exacta (&lt;code&gt;apps/native&lt;/code&gt;) y las restricciones para no alterar la lógica de Solana.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Act as a React Native expert. I want to implement a 'Rolodex' style community directory in this specific project.&lt;br&gt;
&lt;strong&gt;Project Context:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Location:&lt;/strong&gt; &lt;code&gt;apps/native&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Routing:&lt;/strong&gt; Expo Router (file-based)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target File:&lt;/strong&gt; &lt;code&gt;apps/native/app/(drawer)/(tabs)/index.tsx&lt;/code&gt;
&lt;strong&gt;Tasks:&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Create a Component:&lt;/strong&gt; Create a new file &lt;code&gt;apps/native/components/CommunityRolodex.tsx&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Component Logic:&lt;/strong&gt; Define a &lt;code&gt;COMMUNITIES&lt;/code&gt; array (name, logoUrl, link). Use a &lt;code&gt;FlatList&lt;/code&gt; with a stacked card visual. Ensure it only renders for authenticated users.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Styling:&lt;/strong&gt; Use the project's existing styling solution (&lt;code&gt;uniwind&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Interaction:&lt;/strong&gt; Use &lt;code&gt;Linking.openURL&lt;/code&gt; for the external links."&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  El Reto del Estilo: Uniwind vs NativeWind
&lt;/h3&gt;

&lt;p&gt;Pronto descubrimos que el proyecto no usaba &lt;code&gt;NativeWind&lt;/code&gt;, sino &lt;code&gt;uniwind&lt;/code&gt;. Esto requirió un nuevo prompt enfocado exclusivamente en el estilo, indicándole a la IA que usara &lt;code&gt;className&lt;/code&gt; y se basara en los componentes de &lt;code&gt;heroui-native&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Fase 2: El Pivote de Diseño hacia el Neo-Brutalismo
&lt;/h2&gt;

&lt;p&gt;El efecto Rolodex se sentía apretado en móvil. En lugar de forzarlo, tomamos una decisión de diseño audaz: adoptar un estilo &lt;strong&gt;Neo-Brutalista&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;El Neo-Brutalismo en UI se caracteriza por colores de alto contraste, bordes y sombras duras, y una tipografía fuerte. Prioriza la honestidad de los materiales digitales.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Esto implicó unificar toda la UI de la app bajo esta nueva dirección visual, desechando el look &amp;amp; feel inicial del template.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Fase 3: Reestructuración de la Navegación y la UI
&lt;/h2&gt;

&lt;p&gt;Con el nuevo estilo definido, la estructura de la app también debía cambiar.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;De Drawer a Tab Bar:&lt;/strong&gt; Reemplazamos el menú lateral (Drawer) por una barra de navegación inferior (Bottom Tab Bar), un estándar de oro en UX móvil.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Home como Wallet:&lt;/strong&gt; Nos inspiramos en la distribución de la interfaz de &lt;strong&gt;Jupiter (Jup.ag)&lt;/strong&gt; para rediseñar la pantalla de inicio, enfocándonos en la utilidad y la visualización de activos, pero manteniendo nuestra estética Neo-Brutalista.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Ajuste de Iconos y Fuentes:&lt;/strong&gt; Un reto común fue que los iconos y textos del nuevo Tab Bar eran demasiado grandes. Se necesitó un prompt específico para que la IA ajustara los tamaños y los alineara con el nuevo diseño compacto y minimalista.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  6. Troubleshooting: Resolviendo Errores del Mundo Real
&lt;/h2&gt;

&lt;p&gt;Ningún proyecto está exento de errores. Aquí los dos más importantes que surgieron:&lt;/p&gt;

&lt;h3&gt;
  
  
  Error de Build en Android (Gradle Cache)
&lt;/h3&gt;

&lt;p&gt;Al compilar, apareció un error en la carpeta &lt;code&gt;.../android/app/build/intermediates/...&lt;/code&gt;. Esto no tenía que ver con el código de React Native, sino con la caché de Gradle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solución rápida desde la terminal:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;android &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ./gradlew clean &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ..
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Inconsistencia en el Modo Oscuro/Claro
&lt;/h3&gt;

&lt;p&gt;Al implementar el cambio de tema, &lt;code&gt;bun run check-types&lt;/code&gt; arrojó un error de tipos en TypeScript. El sistema no podía asegurar que el &lt;code&gt;systemColorScheme&lt;/code&gt; fuera siempre &lt;code&gt;'light'&lt;/code&gt; o &lt;code&gt;'dark'&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solución (Mapeo Seguro):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Mapeo seguro para que TypeScript no se queje&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;themeToSet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;systemColorScheme&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;light&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;systemColorScheme&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
  &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;systemColorScheme&lt;/span&gt; 
  &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Default a 'dark' si el valor es inesperado&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusión: Un Proceso Orgánico Guiado por la IA
&lt;/h2&gt;

&lt;p&gt;Kungu evolucionó de una simple idea de "tarjetas Rolodex" a una aplicación Web3 con una identidad visual fuerte y una estructura profesional. La lección más importante fue no tener miedo a pivotar. El diseño inicial no funcionó, pero nos llevó a una solución mucho más interesante y única.&lt;/p&gt;

&lt;p&gt;Usar la IA como un copiloto nos permitió externalizar la generación de código repetitivo y enfocarnos en las decisiones estratégicas de UX y diseño. &lt;/p&gt;

&lt;p&gt;¡Espero que esta crónica detallada te sirva de inspiración para tus propios proyectos! ¿Te animas a probar el Neo-Brutalismo en tus apps? ¡Te leo en los comentarios! 🚀&lt;/p&gt;

</description>
      <category>solana</category>
      <category>reactnative</category>
      <category>ai</category>
      <category>web3</category>
    </item>
    <item>
      <title>Onelingo MVP: Lo que aprendí cuando mi app de idiomas no salió como esperaba (Post-Mortem)</title>
      <dc:creator>Derlys</dc:creator>
      <pubDate>Tue, 17 Mar 2026 10:43:10 +0000</pubDate>
      <link>https://forem.com/derlys/onelingo-mvp-lo-que-aprendi-cuando-mi-app-de-idiomas-no-salio-como-esperaba-post-mortem-1em4</link>
      <guid>https://forem.com/derlys/onelingo-mvp-lo-que-aprendi-cuando-mi-app-de-idiomas-no-salio-como-esperaba-post-mortem-1em4</guid>
      <description>&lt;h2&gt;
  
  
  Onelingo MVP: Lo que aprendí cuando mi app de idiomas no salió como esperaba
&lt;/h2&gt;

&lt;p&gt;¡Hola a todos! Hoy no vengo a traerles el típico tutorial donde todo sale perfecto a la primera. Vengo a contarles la historia de &lt;strong&gt;Onelingo&lt;/strong&gt;, una app de micro-desafíos diarios de idiomas que intenté construir usando &lt;strong&gt;Hugging Face Spaces&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Aunque el resultado final no fue exactamente lo que visualicé inicialmente, el proceso me dejó lecciones invaluables sobre despliegue, autenticación y la importancia de una arquitectura limpia. Aquí les comparto mi "Post-Mortem" técnico.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. El concepto: Onelingo
&lt;/h2&gt;

&lt;p&gt;La idea era crear una alternativa a Duolingo pero sin niveles infinitos: solo 3 micro-desafíos diarios (Reading, Listening y Speaking).&lt;/p&gt;

&lt;h3&gt;
  
  
  El stack elegido:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Hosting:&lt;/strong&gt; Hugging Face Spaces (Static SDK).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;IA de apoyo:&lt;/strong&gt; HuggingChat (Llama 3 / Qwen).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Frontend:&lt;/strong&gt; HTML/JS/CSS con Tailwind vía CDN.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. El primer obstáculo: El "Rito de Iniciación" de Git
&lt;/h2&gt;

&lt;p&gt;Al intentar mover el código desde el editor web de Hugging Face a mi entorno local (WebStorm), me topé con el error que detiene a muchos principiantes:&lt;br&gt;
&lt;code&gt;remote: Invalid username or password. fatal: Authentication failed&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  El aprendizaje:
&lt;/h3&gt;

&lt;p&gt;Hugging Face no usa tu contraseña de usuario para las operaciones de Git. Necesitas un &lt;strong&gt;Access Token&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  La solución técnica:
&lt;/h3&gt;

&lt;p&gt;Si te sucede esto, debes forzar la URL del remoto para incluir tu token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote set-url origin https://TU_USUARIO:TU_TOKEN_HF@huggingface.co/spaces/TU_USUARIO/onelingo-mvp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Tip: Genera tu token en Settings &amp;gt; Access Tokens con permisos de "Write".&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3. El error de lógica: El "Esqueleto" sin cerebro
&lt;/h2&gt;

&lt;p&gt;inicialmente, la app se veía genial con Tailwind, pero al hacer clic en las opciones de respuesta, no pasaba nada. El código generado por la IA era visualmente correcto pero funcionalmente vacío.&lt;/p&gt;

&lt;h3&gt;
  
  
  El Aprendizaje:
&lt;/h3&gt;

&lt;p&gt;No confíes ciegamente en el primer bloque de código que te da una IA. Siempre verifica que las funciones de validación de estado (como el manejo de respuestas correctas/incorrectas) estén implementadas.&lt;/p&gt;

&lt;h3&gt;
  
  
  La solución futura:
&lt;/h3&gt;

&lt;p&gt;Para evitar esto, mi recomendación es separar la lógica en archivos distintos desde el principio:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;index.html&lt;/code&gt;: Estructura.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;style.css&lt;/code&gt;: Diseño.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;app.js&lt;/code&gt;: El "cerebro" (validación de desafíos y Web Speech API).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Implementando speaking: El reto del Navegador
&lt;/h2&gt;

&lt;p&gt;Intentamos usar la &lt;strong&gt;Web Speech API&lt;/strong&gt; para el reconocimiento de voz. Aunque funciona bien en Chrome de escritorio, puede ser muy inestable en navegadores móviles o integrados (como el de Instagram o Twitter).&lt;/p&gt;

&lt;h3&gt;
  
  
  Aprendizaje clave:
&lt;/h3&gt;

&lt;p&gt;Si tu app depende del micrófono, asegúrate de manejar los errores de permisos y de informar al usuario si su navegador no es compatible.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. ¿Qué haría diferente la próxima vez?
&lt;/h2&gt;

&lt;p&gt;Si estás pensando en crear un MVP similar, aquí te dejo mi hoja de ruta mejorada:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Arquitectura modular:&lt;/strong&gt; No metas todo en un solo &lt;code&gt;index.html&lt;/code&gt;. Usa una estructura de carpetas clara para que sea fácil de depurar.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Validación de IA:&lt;/strong&gt; En lugar de pedir "hazme la app", pide "hazme la lógica de validación para un array de objetos JSON". Es mucho más preciso.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Hugging Face vs Vercel:&lt;/strong&gt; Hugging Face es increíble para demos de IA, pero si tu app es puramente frontend (Static), Vercel o Netlify ofrecen un flujo de Git mucho más amigable para principiantes.&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;A veces, el éxito de un proyecto no está en el despliegue final, sino en los &lt;strong&gt;bugs que lograste entender&lt;/strong&gt;. Onelingo me enseñó que la autenticación con tokens y la estructura de archivos son los cimientos de cualquier proyecto serio.&lt;/p&gt;

&lt;p&gt;¿Has tenido algún proyecto que no salió como esperabas? ¡Cuéntame tu experiencia en los comentarios y qué aprendiste de ello! 🚀&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Este tutorial es parte de mi serie de aprendizaje continuo como desarrolladora nómada. ¡Sigamos construyendo!&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>learnings</category>
      <category>beginners</category>
    </item>
    <item>
      <title>YouCanChef: ¿Cómo creé mi propio asistente de cocina nómada con IA?</title>
      <dc:creator>Derlys</dc:creator>
      <pubDate>Sat, 14 Mar 2026 11:53:32 +0000</pubDate>
      <link>https://forem.com/derlys/youcanchef-como-cree-mi-propio-asistente-de-cocina-nomada-con-ia-495l</link>
      <guid>https://forem.com/derlys/youcanchef-como-cree-mi-propio-asistente-de-cocina-nomada-con-ia-495l</guid>
      <description>&lt;h2&gt;
  
  
  YouCanChef: ¿Cómo creé mi propio asistente de cocina nómada con IA?
&lt;/h2&gt;

&lt;p&gt;¡Hola, nómadas y amantes de la cocina! Como alguien que viaja constantemente por el mundo, me encanta replicar las recetas que pruebo en los restaurantes locales. Sin embargo, el gran reto es: &lt;strong&gt;¿Cómo encuentro estos ingredientes en un país diferente?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hoy les comparto cómo construí &lt;strong&gt;"YouCanChef"&lt;/strong&gt;, una herramienta que analiza ingredientes y te dice si son fáciles de encontrar en tu ubicación actual o cómo reemplazarlos.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. El concepto: gastro-mapping e inteligencia de sustitución
&lt;/h2&gt;

&lt;p&gt;La idea es simple pero poderosa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Input:&lt;/strong&gt; Nombre del plato o lista de ingredientes + Tu ubicación actual.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Proceso:&lt;/strong&gt; La IA analiza la "Cultura de Mercado" local.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Output:&lt;/strong&gt; Un semáforo de disponibilidad (🟢 Fácil, 🟡 Especialidad, 🔴 Inexistente) y sugerencias de sustitutos inteligentes.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. El stack tecnológico (100% Gratuito)
&lt;/h2&gt;

&lt;p&gt;Para este proyecto, utilicé herramientas que permiten prototipar a velocidad luz sin gastar un centavo:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Componente&lt;/th&gt;
&lt;th&gt;Herramienta&lt;/th&gt;
&lt;th&gt;¿Por qué?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cerebro (IA)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://aistudio.google.com/" rel="noopener noreferrer"&gt;Google AI Studio (Gemini)&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Capa gratuita generosa y excelente razonamiento.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prototipado Rápido&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://bolt.new/" rel="noopener noreferrer"&gt;Bolt.new&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Genera aplicaciones completas a partir de prompts.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Editor de Código&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;WebStorm / VS Code&lt;/td&gt;
&lt;td&gt;Para refinamiento técnico y control de versiones.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Despliegue&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vercel&lt;/td&gt;
&lt;td&gt;Hosting rápido y gratuito para proyectos personales.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  3. El Plan de acción: Del MVP a Pro
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Fase 1: El MVP "Lean"
&lt;/h3&gt;

&lt;p&gt;En lugar de conectar APIs de inventarios de supermercados (que es complejo), usamos la &lt;strong&gt;base de conocimiento de la IA&lt;/strong&gt; para estimar la probabilidad de encontrar un ingrediente.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Ejemplo:&lt;/strong&gt; &lt;em&gt;"¿Qué tan probable es encontrar Achiote en Madrid?"&lt;/em&gt; -&amp;gt; IA: &lt;em&gt;"90% en tiendas latinas de Lavapiés, 20% en supermercados comunes"&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Superando retos técnicos (Tips para devs)
&lt;/h2&gt;

&lt;p&gt;Durante la creación, me encontré con un par de "clásicos" que te ahorrarán tiempo:&lt;/p&gt;

&lt;h3&gt;
  
  
  El Error de la API Key en Bolt.new
&lt;/h3&gt;

&lt;p&gt;Si usas Bolt.new, a veces el código no detecta tu &lt;code&gt;GEMINI_API_KEY&lt;/code&gt; aunque esté en el archivo &lt;code&gt;.env&lt;/code&gt;.&lt;br&gt;
&lt;strong&gt;Solución:&lt;/strong&gt; Asegúrate de que la variable esté declarada con el prefijo &lt;code&gt;VITE_&lt;/code&gt; si estás usando Vite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tempKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VITE_GEMINI_API_KEY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  El modelo "Fantasma" (404 Not Found)
&lt;/h3&gt;

&lt;p&gt;Google actualiza sus modelos constantemente. Si recibes un error 404 al llamar a la API, verifica el nombre del modelo. Actualmente, &lt;code&gt;gemini-1.5-flash&lt;/code&gt; es la opción más estable, pero en entornos de preview podrías necesitar &lt;code&gt;gemini-3-flash-preview&lt;/code&gt; (según tu región y acceso).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;genAI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getGenerativeModel&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gemini-1.5-flash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. De bolt.new a producción
&lt;/h2&gt;

&lt;p&gt;Una vez que el prototipo funcionó en Bolt, el siguiente paso fue llevarlo a mi entorno local para tener control total:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Clonar el repo:&lt;/strong&gt; &lt;code&gt;git clone &amp;lt;tu-repo-de-bolt&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Instalar dependencias:&lt;/strong&gt; &lt;code&gt;npm install&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Configurar Git:&lt;/strong&gt; Si descargaste el ZIP, inicializa con &lt;code&gt;git init&lt;/code&gt; y conecta tu origen.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Deploy:&lt;/strong&gt; Conecta tu cuenta de GitHub con Vercel y ¡listo!&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;&lt;strong&gt;YouCanChef&lt;/strong&gt; no es solo una app, es un compañero de viaje. Me enseñó que con la IA adecuada, las fronteras culinarias desaparecen. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué sigue?&lt;/strong&gt; Estoy trabajando en un motor de "Sustitución de sabores" que analice perfiles de sabor para sugerir reemplazos exactos cuando un ingrediente es imposible de hallar.&lt;/p&gt;

&lt;p&gt;¿Te animas a construir tu propio asistente de viajes? ¡Cuéntame en los comentarios qué otra utilidad le darías a la IA para nómadas! 🌍✈️&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; No esperes a tener la app perfecta. Lanza el MVP, prueba si la IA te da buenos consejos de cocina y luego añade las fotos y los mapas.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>nomad</category>
      <category>gemini</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Explicándole blockchain a mi mamá: Guía para principiantes</title>
      <dc:creator>Derlys</dc:creator>
      <pubDate>Fri, 13 Mar 2026 12:37:51 +0000</pubDate>
      <link>https://forem.com/derlys/explicandole-blockchain-a-mi-mama-guia-para-principiantes-2i19</link>
      <guid>https://forem.com/derlys/explicandole-blockchain-a-mi-mama-guia-para-principiantes-2i19</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;📚 &lt;strong&gt;Serie: Explicándole blockchain a mi mamá&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Introducción a la economía &lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Explicándole blockchain a mi mamá: Guía para principiantes
&lt;/h2&gt;

&lt;p&gt;¡Hola a todos! A veces, los conceptos más complejos de la tecnología son más fáciles de entender cuando intentamos explicárselos a alguien que no tiene experiencia previa en el área. &lt;/p&gt;

&lt;p&gt;En este tutorial, basado en el primer episodio de mi serie "Explicándole blockchain a mi mamá", vamos a desglosar los pilares fundamentales de la economía actual y por qué la tecnología &lt;strong&gt;Blockchain&lt;/strong&gt; es una alternativa tan revolucionaria.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. El problema: Inflación y carestía
&lt;/h2&gt;

&lt;p&gt;Antes de hablar de tecnología, debemos entender el contexto económico. Seguramente has escuchado a tus padres o abuelos decir: &lt;em&gt;"Antes, con este mismo billete, compraba el doble de cosas"&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;A este fenómeno lo llamamos &lt;strong&gt;inflación&lt;/strong&gt; o, en términos más sencillos, &lt;strong&gt;carestía&lt;/strong&gt;. Es el proceso por el cual el dinero pierde su valor adquisitivo con el tiempo.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué sucede?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Emisión desmedida:&lt;/strong&gt; Los bancos centrales imprimen más dinero del que la economía puede respaldar.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Devaluación:&lt;/strong&gt; Al haber más dinero en circulación pero la misma cantidad de productos, los precios suben.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. El sistema tradicional: Centralización bancaria
&lt;/h2&gt;

&lt;p&gt;Hoy en día, dependemos de los bancos para mover nuestro dinero. Este es un sistema &lt;strong&gt;centralizado&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Característica&lt;/th&gt;
&lt;th&gt;Sistema Bancario Tradicional&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Control&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;El banco decide si aprueba o bloquea tus transacciones.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Privacidad&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tu información financiera es privada para el público, pero totalmente visible para el banco y el gobierno.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Intermediarios&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Siempre necesitas a un tercero para validar que tienes el dinero.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  3. ¿Qué es blockchain? La revolución de la transparencia
&lt;/h2&gt;

&lt;p&gt;Imagina un libro contable donde se anotan todas las transacciones del mundo, pero con tres reglas mágicas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Es público:&lt;/strong&gt; Cualquiera puede ver las transacciones (aunque no necesariamente quién las hizo).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Es inmutable:&lt;/strong&gt; Una vez que algo se escribe, no se puede borrar ni modificar.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Es descentralizado:&lt;/strong&gt; No le pertenece a un solo banco; miles de computadoras en todo el mundo guardan una copia de ese libro.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  La analogía del libro de cuentas
&lt;/h3&gt;

&lt;p&gt;En la blockchain, si yo te envío una "moneda digital", toda la red verifica que yo realmente tenía esa moneda antes de validar la transferencia. No necesitamos un banco que diga "sí, él tiene el dinero"; la propia red lo confirma mediante matemáticas y criptografía.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Seguridad y empoderamiento
&lt;/h2&gt;

&lt;p&gt;Uno de los puntos más debatidos es el &lt;strong&gt;control&lt;/strong&gt;. En el sistema tradicional, el banco es el dueño de la infraestructura. Si el banco cae o decide congelar tu cuenta, pierdes acceso a tus fondos.&lt;/p&gt;

&lt;p&gt;En la &lt;strong&gt;Blockchain&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Tú eres tu propio banco:&lt;/strong&gt; Tienes el control total de tus activos a través de llaves privadas.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Transparencia Total:&lt;/strong&gt; Al ser un registro público, es mucho más difícil cometer fraudes sin que alguien lo note.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Seguridad:&lt;/strong&gt; La descentralización hace que sea casi imposible hackear todo el sistema a la vez.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusión: El primer paso
&lt;/h2&gt;

&lt;p&gt;Este es solo el comienzo. Entender que el dinero actual tiene fallas (como la inflación) y que existe una tecnología capaz de devolvernos el control de forma transparente es el primer paso para entrar al mundo de la Web3.&lt;/p&gt;

&lt;p&gt;En el próximo episodio, veremos &lt;strong&gt;cómo crear tu primera wallet&lt;/strong&gt; y empezar a interactuar con este nuevo ecosistema.&lt;/p&gt;

&lt;p&gt;¡Gracias por leer! Si tienes alguna pregunta sobre cómo explicarle esto a tus amigos o familiares, déjala en los comentarios. 🚀&lt;/p&gt;




</description>
      <category>blockchain</category>
      <category>solana</category>
      <category>education</category>
      <category>spanish</category>
    </item>
    <item>
      <title>CanguDev: ¿Cómo construí mi propio mentor de inglés técnico con Next.js y Gemini AI?</title>
      <dc:creator>Derlys</dc:creator>
      <pubDate>Fri, 13 Mar 2026 11:07:39 +0000</pubDate>
      <link>https://forem.com/derlys/cangudev-como-construi-mi-propio-mentor-de-ingles-tecnico-con-nextjs-y-gemini-ai-mmk</link>
      <guid>https://forem.com/derlys/cangudev-como-construi-mi-propio-mentor-de-ingles-tecnico-con-nextjs-y-gemini-ai-mmk</guid>
      <description>&lt;h2&gt;
  
  
  CanguDev: Cómo construí mi propio mentor de inglés técnico con Next.js y Gemini AI
&lt;/h2&gt;

&lt;p&gt;¡Hola, comunidad! Hoy quiero compartir con ustedes el proceso de creación de &lt;strong&gt;CanguDev&lt;/strong&gt;, una aplicación que nació de una necesidad personal: mejorar mi inglés técnico para alcanzar un nivel C1, enfocado específicamente en el mundo del desarrollo de software.&lt;/p&gt;

&lt;p&gt;En este tutorial, te guiaré paso a paso por el proceso de construcción, desde la idea inicial hasta el despliegue como una PWA (Progressive Web App).&lt;/p&gt;

&lt;h2&gt;
  
  
  1. El concepto: ¿Por qué CanguDev?
&lt;/h2&gt;

&lt;p&gt;Como desarrolladores, el inglés es nuestra "lengua materna" técnica. Sin embargo, pasar del nivel intermedio al avanzado requiere práctica constante con terminología real. &lt;strong&gt;CanguDev&lt;/strong&gt; actúa como un mentor que analiza textos técnicos y te proporciona feedback instantáneo, correcciones y explicaciones gramaticales contextualizadas.&lt;/p&gt;

&lt;h3&gt;
  
  
  El stack tecnológico
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Framework:&lt;/strong&gt; &lt;a href="https://nextjs.org/" rel="noopener noreferrer"&gt;Next.js&lt;/a&gt; (App Router)&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Lenguaje:&lt;/strong&gt; TypeScript&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Estilos:&lt;/strong&gt; Tailwind CSS&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;IA:&lt;/strong&gt; &lt;a href="https://ai.google.dev/" rel="noopener noreferrer"&gt;Google Generative AI&lt;/a&gt; (Gemini 1.5 Flash)&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Despliegue:&lt;/strong&gt; Vercel&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Inicialización del proyecto
&lt;/h2&gt;

&lt;p&gt;Primero, creamos nuestro proyecto base de Next.js. En la terminal, ejecutamos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-next-app@latest cangudev &lt;span class="nt"&gt;--typescript&lt;/span&gt; &lt;span class="nt"&gt;--tailwind&lt;/span&gt; &lt;span class="nt"&gt;--eslint&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Durante la configuración, asegúrate de seleccionar el uso de &lt;code&gt;App Router&lt;/code&gt; y &lt;code&gt;src/ directory&lt;/code&gt; si así lo prefieres.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Integrando el "Cerebro": Gemini AI
&lt;/h2&gt;

&lt;p&gt;Para que CanguDev pueda analizar inglés, necesitamos conectarlo con el modelo de Google.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paso A: Obtener la API Key
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; Ve a &lt;a href="https://aistudio.google.com/" rel="noopener noreferrer"&gt;Google AI Studio&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt; Crea un nuevo proyecto y genera tu API Key.&lt;/li&gt;
&lt;li&gt; En la raíz de tu proyecto, crea un archivo &lt;code&gt;.env.local&lt;/code&gt; y guarda tu llave:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GOOGLE_GENERATIVE_AI_API_KEY=Tu_API_Key_Aqui
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Paso B: Instalación de la SDK
&lt;/h3&gt;

&lt;p&gt;Instalamos la librería oficial de Google:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm add @google/generative-ai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Creando el analizador (Route Handler)
&lt;/h2&gt;

&lt;p&gt;En Next.js, creamos un endpoint en &lt;code&gt;app/api/analyze/route.ts&lt;/code&gt; que se encargará de procesar las peticiones. Aquí es donde ocurre la magia del &lt;strong&gt;Prompt Engineering&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;GoogleGenerativeAI&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@google/generative-ai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;genAI&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;GoogleGenerativeAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;GOOGLE_GENERATIVE_AI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;POST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;genAI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getGenerativeModel&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gemini-1.5-flash&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
      Actúa como un mentor de inglés técnico nivel C1 para desarrolladores.
      Analiza el siguiente texto y devuelve un JSON con:
      1. Correcciones gramaticales.
      2. Sugerencias de vocabulario técnico más avanzado.
      3. Una breve explicación del "por qué" de los cambios.

      Texto a analizar: "&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"
    `&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generateContent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;analysis&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error en la IA:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error procesando la IA&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. La experiencia de usuario: PWA e interfaz
&lt;/h2&gt;

&lt;p&gt;Queremos que CanguDev se sienta como una app nativa en nuestro móvil. Para ello, configuramos las capacidades de &lt;strong&gt;PWA&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuración del manifest
&lt;/h3&gt;

&lt;p&gt;Creamos un archivo &lt;code&gt;public/manifest.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CanguDev Mentor"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"short_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CanguDev"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Analizador de inglés técnico C1 para devs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"start_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"display"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"standalone"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"background_color"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#f8fafc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"theme_color"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#2563eb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"icons"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"src"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/logo.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"sizes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"192x192"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"image/png"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configuración del layout
&lt;/h3&gt;

&lt;p&gt;En &lt;code&gt;app/layout.tsx&lt;/code&gt;, añadimos los metadatos necesarios:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;CanguDev&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AI Technical English Mentor&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;manifest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/manifest.json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;appleWebApp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;capable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;statusBarStyle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;default&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;CanguDev&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Desafíos y aprendizajes
&lt;/h2&gt;

&lt;p&gt;Durante el desarrollo, me encontré con algunos obstáculos interesantes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Conflictos de Node:&lt;/strong&gt; Aprendí que mezclar &lt;code&gt;npm&lt;/code&gt; y &lt;code&gt;pnpm&lt;/code&gt; puede causar errores de "lock file". La solución fue limpiar &lt;code&gt;node_modules&lt;/code&gt; y elegir un solo gestor.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Depuración de la IA:&lt;/strong&gt; Inicialmente, el modelo me devolvía errores de formato. Ajustar el &lt;code&gt;System Prompt&lt;/code&gt; y verificar que la API Key estuviera correctamente cargada en Vercel fue clave.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Instalación en iOS:&lt;/strong&gt; A diferencia de Android, en iOS los usuarios deben usar la opción "Añadir a pantalla de inicio" desde Safari para instalar la PWA.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  7. Despliegue
&lt;/h2&gt;

&lt;p&gt;Finalmente, subí el código a GitHub y lo conecté con &lt;strong&gt;Vercel&lt;/strong&gt;. ¡En menos de 2 minutos la app estaba en producción!&lt;/p&gt;




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

&lt;p&gt;Construir CanguDev no solo me ayudó a mejorar mi inglés, sino que me permitió entender mejor cómo integrar IA en aplicaciones modernas de forma gratuita (usando el tier gratuito de Gemini).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué sigue?&lt;/strong&gt; Planeo añadir reconocimiento de voz para practicar la pronunciación y un historial de errores comunes.&lt;/p&gt;

&lt;p&gt;Mira el repositorio 👉🏽 &lt;a href="https://github.com/Derlys/cangudev" rel="noopener noreferrer"&gt;aquí&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;¡Espero que este tutorial te inspire a crear tu propia herramienta personalizada! Si tienes dudas, déjalas en los comentarios. 🚀&lt;/p&gt;




</description>
      <category>nextjs</category>
      <category>ai</category>
      <category>tutorial</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Utilizando la librería Mongoose</title>
      <dc:creator>Derlys</dc:creator>
      <pubDate>Wed, 08 Jan 2025 15:48:14 +0000</pubDate>
      <link>https://forem.com/derlys/utilizando-la-libreria-mongoose-34ad</link>
      <guid>https://forem.com/derlys/utilizando-la-libreria-mongoose-34ad</guid>
      <description>&lt;p&gt;Si ya tienes una base de datos creada en &lt;code&gt;nestjs&lt;/code&gt; este tutorial es para ti con tan solo 6 simples pasos tienes la conexión a &lt;code&gt;Mongo&lt;/code&gt; que necesitas.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Si te gustaría seguir un tutorial desde cero donde creemos los mudulos y esquemas antes de la conexión te recomiento &lt;a href="https://dev.tourl"&gt;este&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;En este tutorial crearemos un &lt;code&gt;DatabaseModule&lt;/code&gt; que se basa en el paquete &lt;code&gt;Mongoose&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 1
&lt;/h2&gt;

&lt;p&gt;Instala la librería de &lt;code&gt;Mongoose&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; npm install --save mongoose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Paso 2
&lt;/h2&gt;

&lt;p&gt;Establece la conexión con tu base de datos utilizando la función &lt;code&gt;connect ()&lt;/code&gt; esta función te devuelve una promesa, por eso debes generar un proveedor asíncrono.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Crea un archivo llamado &lt;code&gt;database.provider.ts&lt;/code&gt; y escribe este código
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import * as mongoose from 'mongoose';

export const databaseProviders = [
  {
    provide: 'DATABASE_CONNECTION',
    useFactory: (): Promise&amp;lt;typeof mongoose&amp;gt; =&amp;gt;
      mongoose.connect('mongodb://localhost/nest'),
  },
];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;exporta el archivo anterior para que sea accesible al resto de la app, haz esto en el archivo &lt;code&gt;database.module.ts&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Paso 3
&lt;/h2&gt;

&lt;p&gt;Inyecta el objeto &lt;code&gt;Connection&lt;/code&gt; usando el decorador &lt;code&gt;@Inject()&lt;/code&gt; y, ya que en Mongo todo es un derivado de un esquema, defínelo en tu esquema, en este caso &lt;code&gt;cat.schema.ts&lt;/code&gt; y quedaría así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
import * as mongoose from 'mongoose';

export const CatSchema = new mongoose.Schema({
  name: String,
  age: Number,
  breed: String,
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Paso 4
&lt;/h2&gt;

&lt;p&gt;El &lt;code&gt;CatsSchema&lt;/code&gt; pertenece a una carpeta llamada &lt;code&gt;cats&lt;/code&gt; y este representa al &lt;code&gt;CatsModule&lt;/code&gt; ahora crea un modelo &lt;code&gt;provider&lt;/code&gt; genere un archivo llamado &lt;code&gt;cats.provider.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { CatSchema } from './schemas/cat.schema';

export const catsProviders = [
  {
    provide: 'CAT_MODEL',
    useFactory: (connection) =&amp;gt; connection.model('Cat', CatSchema),
    inject: ['DATABASE_CONNECTION'],
  },
];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Paso 5
&lt;/h2&gt;

&lt;p&gt;En el archivo &lt;code&gt;cats.service.ts&lt;/code&gt; usa el modelo en el servicio, inyectándolo con el decorador &lt;code&gt;@inject()&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
import { Injectable, Dependencies } from '@nestjs/common';

@Injectable()
@Dependencies('CAT_MODEL')
export class CatsService {
  constructor(catModel) {
    this.catModel = catModel;
  }

  async create(createCatDto) {
    const createdCat = new this.catModel(createCatDto);
    return createdCat.save();
  }

  async findAll() {
    return this.catModel.find().exec();
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;📝 Nota: Tu puedes crear una interfaz de &lt;code&gt;Cat&lt;/code&gt; y de esa manera extender el &lt;code&gt;Document&lt;/code&gt; desde el paquete &lt;code&gt;Mongoose&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Paso 6
&lt;/h2&gt;

&lt;p&gt;Por último, en el archivo &lt;code&gt;cats.module.ts&lt;/code&gt; importa el &lt;code&gt;CatsProvider&lt;/code&gt; y el &lt;code&gt;CatsService&lt;/code&gt; así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
import { catsProviders } from './cats.providers';
import { DatabaseModule } from '../database/database.module';

@Module({
  imports: [DatabaseModule],
  controllers: [CatsController],
  providers: [
    CatsService,
    ...catsProviders,
  ],
})
export class CatsModule {}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y así puedes usar esta librería que es superútil al momento de conectar tu base de datos. Yo aprendí a usar &lt;code&gt;mongo&lt;/code&gt; recientemente y junto con &lt;code&gt;nestjs&lt;/code&gt; son buenos aliados para hacer una conexión rápida y sencilla.&lt;/p&gt;

&lt;p&gt;Únete a la comunidad de &lt;a href="https://discord.gg/MG4qsJzu" rel="noopener noreferrer"&gt;mododificildevs&lt;/a&gt; y aprendamos juntos. &lt;/p&gt;

</description>
      <category>mongodb</category>
      <category>nestjs</category>
      <category>tutorial</category>
      <category>developer</category>
    </item>
    <item>
      <title>Enviar y recibir Tokens en Solana</title>
      <dc:creator>Derlys</dc:creator>
      <pubDate>Mon, 19 Feb 2024 12:38:56 +0000</pubDate>
      <link>https://forem.com/derlys/enviar-y-recibir-tokens-en-solana-oid</link>
      <guid>https://forem.com/derlys/enviar-y-recibir-tokens-en-solana-oid</guid>
      <description>&lt;p&gt;Esta página describe cómo recibir y enviar tokens SOL utilizando las herramientas de línea de comandos con una wallet de línea de comandos como una wallet de papel, una wallet de sistema de archivos o una wallet de hardware. Antes de empezar, asegúrese de haber creado un monedero y de tener acceso a su dirección (pubkey) y al par de claves de firma. Consulte nuestras convenciones para introducir pares de claves para distintos tipos de monederos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pruebe su Wallet
&lt;/h2&gt;

&lt;p&gt;Antes de compartir tu clave pública con otros, es posible que quieras asegurarte primero de que la clave es válida y de que realmente posees la clave privada correspondiente.&lt;/p&gt;

&lt;p&gt;En este ejemplo, crearemos un segundo monedero además de tu primer monedero, y luego transferiremos algunos tokens a él. Esto confirmará que puedes enviar y recibir tokens en el tipo de monedero que elijas.&lt;/p&gt;

&lt;p&gt;Este ejemplo de prueba utiliza nuestra Developer Testnet, llamada devnet. Los tokens emitidos en devnet no tienen valor, así que no te preocupes si los pierdes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Airdrop algunos tokens para empezar
&lt;/h3&gt;

&lt;p&gt;Primero, envía algunas airdrops a la red de devnet( red de desarrollo).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;solana airdrop 1 &amp;lt;RECIPIENT_ACCOUNT_ADDRESS&amp;gt; --url https://api.devnet.solana.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Donde remplazas el texto &lt;code&gt;&amp;lt;RECIPIENT_ACCOUNT_ADDRESS&amp;gt;&lt;/code&gt; por la dirección de su public key (clave pública)/wallet address en base58.&lt;/p&gt;

&lt;p&gt;Se devolverá una respuesta con la firma de la transacción. Si el saldo de la dirección no cambia por la cantidad esperada, ejecute el siguiente comando para obtener más información sobre lo que potencialmente salió mal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;solana confirm -v &amp;lt;TRANSACTION_SIGNATURE&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Compruebe su saldo
&lt;/h3&gt;

&lt;p&gt;Confirma que el AirDrop se ha realizado correctamente comprobando el saldo de la cuenta. Debería salir 1 SOL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;solana balance &amp;lt;ACCOUNT_ADDRESS&amp;gt; --url https://api.devnet.solana.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Crear una segunda dirección de monedero
&lt;/h3&gt;

&lt;p&gt;Necesitaremos una nueva dirección para recibir nuestros tokens. Crea un segundo par de claves y registra su pubkey:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;solana-keygen new --no-passphrase --no-outfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La salida contendrá la dirección después del texto &lt;code&gt;pubkey:&lt;/code&gt;. Copie la dirección. La utilizaremos en el siguiente paso.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pubkey: GKvqsuNcnwWqPzzuhLmGi4rzzh55FhJtGizkhHaEJqiV
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También puede generar un segundo (o más) monedero de cualquier tipo: papel, sistema de archivos o hardware.&lt;/p&gt;

&lt;h3&gt;
  
  
  Transfiere tokens de tu primer monedero a la segunda dirección
&lt;/h3&gt;

&lt;p&gt;A continuación, demuestra que eres el propietario de los tokens aéreos( Airdrops) transfiriéndolos. El clúster Solana solo aceptará la transferencia si firmas la transacción con el par de claves privadas correspondiente a la clave pública del remitente en la transacción.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;solana transfer --from &amp;lt;KEYPAIR&amp;gt; &amp;lt;RECIPIENT_ACCOUNT_ADDRESS&amp;gt; 0.5 --allow-unfunded-recipient --url https://api.devnet.solana.com --fee-payer &amp;lt;KEYPAIR&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Donde sustituyes  por la ruta a un par de claves en tu primer monedero, y sustituyes  por la dirección de tu segundo monedero.&lt;/p&gt;

&lt;p&gt;Confirme los saldos actualizados con solana balance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;solana balance &amp;lt;ACCOUNT_ADDRESS&amp;gt; --url http://api.devnet.solana.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;donde  es la clave pública de tu par de claves o la clave pública del destinatario.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ejemplo completo de transferencia de pruebas
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ solana-keygen new --outfile my_solana_wallet.json   # Creating my first wallet, a file system wallet
Generating a new keypair
For added security, enter a passphrase (empty for no passphrase):
Wrote new keypair to my_solana_wallet.json
==========================================================================
pubkey: DYw8jCTfwHNRJhhmFcbXvVDTqWMEVFBX6ZKUmG5CNSKK                          # Here is the address of the first wallet
==========================================================================
Save this seed phrase to recover your new keypair:
width enhance concert vacant ketchup eternal spy craft spy guard tag punch    # If this was a real wallet, never share these words on the internet like this!
==========================================================================

$ solana airdrop 1 DYw8jCTfwHNRJhhmFcbXvVDTqWMEVFBX6ZKUmG5CNSKK --url https://api.devnet.solana.com  # Airdropping 1 SOL to my wallet's address/pubkey
Requesting airdrop of 1 SOL from 35.233.193.70:9900
1 SOL

$ solana balance DYw8jCTfwHNRJhhmFcbXvVDTqWMEVFBX6ZKUmG5CNSKK --url https://api.devnet.solana.com # Check the address's balance
1 SOL

$ solana-keygen new --no-outfile  # Creating a second wallet, a paper wallet
Generating a new keypair
For added security, enter a passphrase (empty for no passphrase):
====================================================================
pubkey: 7S3P4HxJpyyigGzodYwHtCxZyUQe9JiBMHyRWXArAaKv                   # Here is the address of the second, paper, wallet.
====================================================================
Save this seed phrase to recover your new keypair:
clump panic cousin hurt coast charge engage fall eager urge win love   # If this was a real wallet, never share these words on the internet like this!
====================================================================

$ solana transfer --from my_solana_wallet.json 7S3P4HxJpyyigGzodYwHtCxZyUQe9JiBMHyRWXArAaKv 0.5 --allow-unfunded-recipient --url https://api.devnet.solana.com --fee-payer my_solana_wallet.json  # Transferring tokens to the public address of the paper wallet
3gmXvykAd1nCQQ7MjosaHLf69Xyaqyq1qw2eu1mgPyYXd5G4v1rihhg1CiRw35b9fHzcftGKKEu4mbUeXY2pEX2z  # This is the transaction signature

$ solana balance DYw8jCTfwHNRJhhmFcbXvVDTqWMEVFBX6ZKUmG5CNSKK --url https://api.devnet.solana.com
0.499995 SOL  # The sending account has slightly less than 0.5 SOL remaining due to the 0.000005 SOL transaction fee payment

$ solana balance 7S3P4HxJpyyigGzodYwHtCxZyUQe9JiBMHyRWXArAaKv --url https://api.devnet.solana.com
0.5 SOL  # The second wallet has now received the 0.5 SOL transfer from the first wallet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Recibir tokens
&lt;/h2&gt;

&lt;p&gt;Para recibir tokens, necesitarás una dirección a la que otros puedan enviar tokens. En Solana, la dirección del monedero es la clave pública de un par de claves. Hay una variedad de técnicas para generar pares de claves. El método que elijas dependerá de cómo elijas almacenar los pares de claves. Los pares de claves se almacenan en monederos. Antes de recibir tokens, tendrá que crear un monedero. Una vez creada, deberá tener una clave pública para cada par de claves que haya generado. La clave pública es una larga cadena de caracteres base58. Su longitud varía entre 32 y 44 caracteres.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enviar tokens
&lt;/h2&gt;

&lt;p&gt;Si ya tienes SOL y quieres enviar tokens a alguien, necesitarás una ruta a tu par de claves, su clave pública codificada en base58 y un número de tokens para transferir. Una vez que tengas todo esto, puedes transferir tokens con el comando solana transfer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;solana transfer --from &amp;lt;KEYPAIR&amp;gt; &amp;lt;RECIPIENT_ACCOUNT_ADDRESS&amp;gt; &amp;lt;AMOUNT&amp;gt; --fee-payer &amp;lt;KEYPAIR&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Confirme los saldos actualizados con solana balance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;solana balance &amp;lt;ACCOUNT_ADDRESS&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A excepción de algunos links actualizados y párrafos, este tutorial fue escrito en el idioma inglés por &lt;a href="https://docs.solana.com/"&gt;Solana docs&lt;/a&gt;. Muchas gracias por crear este tipo de contenido.&lt;/p&gt;

&lt;p&gt;Espero esta traducción le sea de ayuda a la comunidad Hispanohablante que usa &lt;a href="https://solana.com/"&gt;Solana&lt;/a&gt; que está creciendo enormemente.&lt;/p&gt;

&lt;p&gt;Haz parte de la comunidad &lt;a href="https://discord.gg/sPVaqarbxY"&gt;SOLANA LATAM&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://t.me/+Axat5MuV6ow5NWY0"&gt;HispanaSol&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Generar direcciones personalizadas en Solana</title>
      <dc:creator>Derlys</dc:creator>
      <pubDate>Wed, 10 Jan 2024 17:04:58 +0000</pubDate>
      <link>https://forem.com/derlys/generar-direcciones-personalizadas-en-solana-1na5</link>
      <guid>https://forem.com/derlys/generar-direcciones-personalizadas-en-solana-1na5</guid>
      <description>&lt;p&gt;Las direcciones personalizadas dan cierta legibilidad a la cadena aleatoria de letras y números conocida como dirección del monedero Solana.&lt;/p&gt;

&lt;p&gt;Si alguna vez ha realizado una sola transacción en la blockchain Solana, hay una probabilidad muy alta de que haya interactuado antes con una de estas direcciones de vanidad. Algunos de los programas más conocidos utilizan una dirección, como estás:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://solscan.io/account/TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"&gt;TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA&lt;/a&gt;- SPL Token program&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://solscan.io/account/TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"&gt;TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb&lt;/a&gt;- SPL Token 2022 program&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://solscan.io/account/whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc"&gt;whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc &lt;/a&gt;- Orca Whirlpools&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://solscan.io/account/srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX"&gt;srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX&lt;/a&gt;- Openbook&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Observará que cada una de las direcciones de cuenta comienza con algunas palabras legibles (o partes de ellas). Todas son "Vanity Address".&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;¿Inmersión técnica?&lt;/p&gt;

&lt;p&gt;Puede leer todo acerca de &lt;a href="https://nick.af/articles/derive-solana-addresses"&gt;cómo se derivan y generan las direcciones Solana&lt;/a&gt; en mi profundización técnica al respecto. Incluyendo la comprensión de la "ruta de derivación" utilizada para generar direcciones vanidad con la Solana CLI. Cosas bastante interesantes 😀.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Cómo generar una dirección personalizada
&lt;/h2&gt;

&lt;p&gt;La manera más fácil y común de generar direcciones vanity es usando el &lt;a href="https://dev.to/derlys/introduccion-a-la-cli-de-solana-5e1m"&gt;CLI de Solana&lt;/a&gt;. Así que eso es lo que voy a demostrar aquí también.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Instale el Solana CLI&lt;/p&gt;

&lt;p&gt;Si usted no tiene el Solana CLI ya instalada y configurado en su computadora, entonces usted puede leer mi otro artículo sobre &lt;a href="https://dev.to/derlys/introduccion-a-la-cli-de-solana-5e1m"&gt;Como Instalar y Configurar el Solana CLI&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Asegúrese de que tiene el programa &lt;strong&gt;solana-keygen&lt;/strong&gt; instalado y funcionando ejecutándolo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana-keygen &lt;span class="nt"&gt;--version&lt;/span&gt;

&lt;span class="c"&gt;# output (note the version)&lt;/span&gt;
&lt;span class="c"&gt;# solana-keygen 1.17.6 (src:61caae6b; feat:3073089885, client:SolanaLabs)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anote la versión que tiene instalada. Esto será importante si desea generar una dirección de vanidad para su uso en carteras web/navegadores como Phantom o Solflare. Más sobre esto en un momento.&lt;/p&gt;

&lt;p&gt;Utilizando el programa solana keygen, podemos buscar (es decir, generar por fuerza bruta) nuevas direcciones de vanidad que empiecen por, acaben por, o empiecen Y acaben por determinados caracteres.&lt;/p&gt;

&lt;p&gt;Para ver todas las opciones que puede utilizar para generar direcciones vanity aleatorias de Solana, consulte la ayuda de grind:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;solana-keygen grind --help
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Caracteres no admitidos
&lt;/h2&gt;

&lt;p&gt;Las direcciones públicas y las transacciones de Solana funcionan con el juego de caracteres base-58. Es decir, solo hay 58 caracteres posibles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;incluidas las mayúsculas A-Z, excluidas las mayúsculas &lt;strong&gt;O&lt;/strong&gt; e &lt;strong&gt;I&lt;/strong&gt;(como en &lt;strong&gt;Oscar&lt;/strong&gt; e &lt;strong&gt;India&lt;/strong&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;letras minúsculas de la A a la Z, excepto la &lt;strong&gt;l&lt;/strong&gt; minúscula (como en &lt;strong&gt;letter&lt;/strong&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;dígitos 1-9, (que no incluyen el &lt;strong&gt;0&lt;/strong&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estas letras específicas están &lt;strong&gt;excluidas&lt;/strong&gt; del conjunto de caracteres base-58, ya que pueden confundirse fácilmente con otros caracteres. Y si se utiliza el carácter equivocado, ¡la dirección de la cadena de bloques es completamente diferente!&lt;/p&gt;

&lt;p&gt;Así que cuando intente generar direcciones vanity usando uno de los 4 caracteres no soportados, el CLI de Solana le dará un error.&lt;/p&gt;

&lt;h2&gt;
  
  
  Velocidad de generación de las direcciones de vanidad
&lt;/h2&gt;

&lt;p&gt;En el momento actual, el CLI de Solana solo soporta este método de fuerza bruta para generar direcciones de vanidad con todos los hilos de las CPUs de tu ordenador. Así que cuanto más potente sea tu CPU, menos tiempo tardará.&lt;/p&gt;

&lt;p&gt;Dato: mi portátil de gama media con una CPU Intel i7 de 8 núcleos puede generar 1.000.000 de direcciones de clave privada cada ~6,3 segundos.&lt;/p&gt;

&lt;p&gt;El otro gran factor que influye en la velocidad de generación de direcciones es la cadena de caracteres que se busca. Cuanto más larga sea la cadena (por ejemplo, 4 caracteres frente a 8 caracteres) y si se ignoran las mayúsculas o minúsculas (por ejemplo, "n" frente a "Nnn"), más tiempo se tardará.&lt;/p&gt;

&lt;p&gt;El último factor importante es si estás intentando generar la frase mnemotécnica o solo la clave privada. Generar la frase mnemotécnica llevará SIGNIFICATIVAMENTE MÁS TIEMPO que sin.&lt;/p&gt;

&lt;p&gt;Dato: el mismo ordenador del dato anterior puede generar &lt;code&gt;1.000.000&lt;/code&gt; de direcciones de frases mnemotécnicas cada &lt;code&gt;~15-20 minutos&lt;/code&gt;. Mucho más tiempo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rectificado básico
&lt;/h2&gt;

&lt;p&gt;Para iniciar el proceso de &lt;code&gt;grind&lt;/code&gt; buscando una dirección que empiece por una cadena establecida:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;solana-keygen grind --starts-with nemesis:1 --ignore-case
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este simple comando se ejecutará hasta que se encuentre &lt;code&gt;1&lt;/code&gt;dirección de vanidad que empiece por &lt;code&gt;nemeisis&lt;/code&gt; (ignorando las mayúsculas y minúsculas). Bastante simple.&lt;/p&gt;

&lt;p&gt;También hay que tener en cuenta que, una vez encontrada una dirección que coincida, la clave privada (en forma de matriz de bytes) se guardará en el directorio de trabajo actual de su terminal con el archivo denominado &lt;code&gt;&amp;lt;GENERATED_PUBKEY&amp;gt;.json&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Coincidencia de varias cadenas
&lt;/h2&gt;

&lt;p&gt;El comando &lt;code&gt;grind&lt;/code&gt; también le permite especificar múltiples cadenas que desea buscar y comparar. Esta suele ser una forma más eficaz de buscar si está buscando más de una dirección de vanidad posible.&lt;/p&gt;

&lt;p&gt;Para buscar y hacer coincidir varias cadenas, basta con especificar varias veces el indicador &lt;code&gt;--starts-with&lt;/code&gt; o &lt;code&gt;--ends-with&lt;/code&gt; o &lt;code&gt;--starts-and-ends-with&lt;/code&gt; (con su valor). Por ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana-keygen grind &lt;span class="nt"&gt;--ignore-case&lt;/span&gt; &lt;span class="nt"&gt;--starts-with&lt;/span&gt; n:2 &lt;span class="nt"&gt;--starts-with&lt;/span&gt; fress:2 &lt;span class="nt"&gt;--ends-with&lt;/span&gt; dominguez:2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este proceso continuará hasta que se encuentren &lt;code&gt;2&lt;/code&gt; coincidencias para &lt;strong&gt;CADA&lt;/strong&gt; una de las comparaciones de cadena dadas. Al final, se generarán 6 direcciones.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generar con frase mnemotécnica
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Vanidad con ruta mnemotécnica y de derivación
&lt;/h2&gt;

&lt;p&gt;El uso de la opción &lt;code&gt;--derivation-path&lt;/code&gt; le permitirá establecer una ruta de derivación personalizada en la CLI de Solana. Si no especifica una ruta de derivación personalizada, este indicador utilizará una ruta codificada de &lt;code&gt;m/44'/501'/0'/0'&lt;/code&gt; (que está lista para utilizarse con Phantom y Solflare).&lt;/p&gt;

&lt;p&gt;A diferencia del valor predeterminado de la CLI de Solana, la ruta de derivación de &lt;code&gt;m/44'/501'&lt;/code&gt; (que NO es compatible con los monederos de navegador).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./solana/target/release/solana-keygen grind --use-mnemonic --derivation-path --starts-with nick:1 --no-passphrase
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si lo desea, también puede establecer una ruta de derivación personalizada como esta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./solana/target/release/solana-keygen grind --use-mnemonic --derivation-path m/44/117/0/0 --starts-with nick:1 --no-passphrase
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Añade tu dirección de vanidad en el monedero de tu navegador
&lt;/h3&gt;

&lt;p&gt;El mnemotécnico resultante de este comando puede introducirse en el monedero de su navegador y funcionará.&lt;/p&gt;

&lt;p&gt;A continuación, puede utilizar cualquiera de las otras banderas de &lt;code&gt;grind&lt;/code&gt; para personalizar las direcciones de vanidad que está buscando, y ser más utilizable en el resto de la blockchain Solana 🙃&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo genero las direcciones personalizadas
&lt;/h2&gt;

&lt;p&gt;La forma en que me gusta generar direcciones de vanidad con mnemónicos es creando una carpeta &lt;code&gt;grind_keys&lt;/code&gt; separada en mi ordenador. A continuación, la salida de los mnemónicos generados a un archivo de texto en mi ordenador.&lt;/p&gt;

&lt;p&gt;A continuación, envío la salida del proceso a un archivo de texto (también conocido como mnemónico) para su uso posterior.&lt;/p&gt;

&lt;p&gt;Así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir grinder_keys &amp;amp;&amp;amp; cd grind_keys
mkdir keys &amp;amp;&amp;amp; cd keys
./solana/target/release/solana-keygen grind --no-passphrase --use-mnemonic --derivation-path --ignore-case --starts-with nick:100 --starts-with more:100 &amp;gt;&amp;gt; ../mnemonics.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto me permite simplemente ejecutar el mismo comando &lt;code&gt;grind&lt;/code&gt;cada vez que inicio mi ordenador. Así puedo generar direcciones durante periodos de tiempo más largos, como días y semanas, en mi ordenador de sobremesa. Sin miedo a perder la mnemotecnia generada.&lt;/p&gt;

&lt;p&gt;A excepción de algunos links actualizados y párrafos, este tutorial fue creado en el idioma inglés por &lt;a href="https://twitter.com/nickfrosty"&gt;Nick Frostbutter&lt;/a&gt;. Muchas gracias por crear este tipo de contenido.&lt;/p&gt;

&lt;p&gt;Espero esta traducción le sea de ayuda a la comunidad Hispanohablante que usa &lt;a href="https://solana.com/"&gt;Solana&lt;/a&gt; que está creciendo enormemente.&lt;/p&gt;

&lt;p&gt;Haz parte de la comunidad &lt;a href="https://discord.gg/sPVaqarbxY"&gt;SOLANA LATAM&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://t.me/+Axat5MuV6ow5NWY0"&gt;HispanaSol&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>2023: El año de la comunidad Solana</title>
      <dc:creator>Derlys</dc:creator>
      <pubDate>Fri, 22 Dec 2023 14:52:16 +0000</pubDate>
      <link>https://forem.com/derlys/la-comunidad-de-solana-en-2023-cki</link>
      <guid>https://forem.com/derlys/la-comunidad-de-solana-en-2023-cki</guid>
      <description>&lt;p&gt;¿Ya estamos en otro Solsticio de Solana? 2023 parece haber pasado volando: un año lleno de acontecimientos, marcado por retos y oportunidades. Y ahora que la comunidad echa la vista atrás, es importante recordar lo lejos que hemos llegado.&lt;/p&gt;

&lt;p&gt;El comienzo de 2023 fue la profundidad de los inviernos más fríos, un momento difícil para la gente en todo el ecosistema Solana y la comunidad blockchain en general. La comunidad Solana no solo se mantuvo firme, sino que se redobló.&lt;/p&gt;

&lt;p&gt;Un grito de guerra orgánico, "solo es posible con Solana", resumía la actitud de quienes seguían construyendo. El ecosistema de Solana puede ser el lugar donde las tarifas bajas y el alto rendimiento abren nuevos casos de uso, por supuesto, pero también es el lugar donde una comunidad comprometida, vibrante y orgánica lidera por encima de todo. Los aspectos más destacados y las victorias de 2023 no son obra de ningún equipo ni de ningún individuo, sino que pertenecen al gran colectivo de constructores, artistas, líderes y usuarios que hacen que Solana sea Solana.&lt;/p&gt;

&lt;p&gt;Solana les pertenece. De parte de los que trabajamos en la Fundación Solana, gracias.&lt;/p&gt;

&lt;p&gt;Así es como hiciste de 2023 el año de la comunidad de Solana.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un resurgimiento liderado por la comunidad
&lt;/h2&gt;

&lt;p&gt;En diciembre de 2022, la gente empezó a recibir algo extraño en sus carteras (wallets): un token con el logotipo de un shiba inu. Los recibían por usar dApps y proyectos de Solana, por unirse a eventos y por ser participantes activos en la comunidad de Solana.&lt;/p&gt;

&lt;p&gt;Un año después, la manía Bonk ha arrasado el mundo de la web3.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1735344728995139609-860" src="https://platform.twitter.com/embed/Tweet.html?id=1735344728995139609"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1735344728995139609-860');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1735344728995139609&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;La historia de Bonk es la historia del renacimiento del ecosistema de Solana en 2023, y de cómo lo lideró la comunidad. Los planes que se habían trazado meses o años antes empezaron a dar sus frutos, y las personas que se quedaron y construyeron durante tiempos inciertos se convirtieron en los nuevos líderes de la comunidad. Tras un año de impulso, el ecosistema de Solana volvió a despegar.&lt;/p&gt;

&lt;p&gt;Por ejemplo, 2023 fue el año en que &lt;strong&gt;Saga&lt;/strong&gt;, de Solana Mobile, salió al mercado. A pesar de la expectación suscitada por el anuncio y el lanzamiento iniciales, no fue hasta que estalló el entusiasmo de la comunidad cuando el dispositivo móvil web3-nativo, insignia, se agotó en diciembre de 2023.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1735835498025832651-852" src="https://platform.twitter.com/embed/Tweet.html?id=1735835498025832651"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1735835498025832651-852');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1735835498025832651&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;En febrero, la comunidad de Helium votó a favor de migrar de su propia blockchain de capa-1 a Solana. La migración tuvo lugar a finales de marzo... y se produjo sin contratiempos, demostrando que Solana tiene un hogar para los proyectos de infraestructuras descentralizadas y allanando el camino para que futuros equipos den el salto por sí mismos.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1648725076571766786-596" src="https://platform.twitter.com/embed/Tweet.html?id=1648725076571766786"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1648725076571766786-596');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1648725076571766786&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Este ha sido el año de Solana DeFi 2.0: nuevos conjuntos de herramientas y proyectos, liderados por la comunidad descentralizada, que hacen posible la próxima generación de finanzas: &lt;strong&gt;Maple Finance&lt;/strong&gt; volvió a Solana con tokenized t-bills; Pyth se trasladó a la gobernanza comunitaria de su Solana Permissioned Environment; TBTC trajo BTC a Solana; &lt;strong&gt;Armada&lt;/strong&gt; lanzó una infraestructura de tokens de código abierto; el lanzamiento de múltiples nuevas stablecoins; y mucho más. Hace unos días, el volumen DEX de 24 horas de Solana superó al de Ethereum por primera vez en la historia.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1735842380257869974-528" src="https://platform.twitter.com/embed/Tweet.html?id=1735842380257869974"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1735842380257869974-528');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1735842380257869974&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Y la infraestructura de validadores dirigida por la comunidad siguió avanzando. Como una de las cadenas más descentralizadas en web3 por el coeficiente de Nakamoto, los clientes validadores alternativos como &lt;strong&gt;Firedancer&lt;/strong&gt; de Jump Crypto, el cliente de &lt;strong&gt;Jito Labs&lt;/strong&gt; y **Tinydancer **continuaron diversificando y asegurando la pila tecnológica de Solana.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1719310929593057720-861" src="https://platform.twitter.com/embed/Tweet.html?id=1719310929593057720"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1719310929593057720-861');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1719310929593057720&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  Desarrolladores que innovan
&lt;/h2&gt;

&lt;p&gt;Las innovaciones dentro del ecosistema Solana avanzaron a un ritmo vertiginoso en 2023, ya que los equipos colaboraron para introducir nuevos estándares y herramientas para toda la comunidad. Quizá nada lo ejemplifique mejor que el equipo de todo el ecosistema que trabaja para implantar la compresión de estados, una innovación que utiliza árboles de Merkle para reducir significativamente el coste del alquiler en la red Solana.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1643972968433975296-814" src="https://platform.twitter.com/embed/Tweet.html?id=1643972968433975296"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1643972968433975296-814');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1643972968433975296&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Del mismo modo, Solana Labs introdujo un plugin que permitía a la IA interactuar con la cadena de bloques Solana, permitiendo a los desarrolladores crear herramientas útiles que unían el poder de la cadena de bloques y la inteligencia artificial.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1650955017585606656-957" src="https://platform.twitter.com/embed/Tweet.html?id=1650955017585606656"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1650955017585606656-957');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1650955017585606656&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;No sólo trabajaron los grandes equipos: la comunidad de desarrolladores de Solana siguió creciendo. Dos &lt;a href="https://solana.com/hackathon"&gt;hackathones de Solana&lt;/a&gt;, &lt;strong&gt;Grizzlython&lt;/strong&gt; e &lt;strong&gt;Hyperdrive&lt;/strong&gt;, registraron un número récord de solicitudes y propuestas. En Hyperdrive se presentaron más de 900 proyectos, el mayor número hasta la fecha, a pesar de las difíciles condiciones del mercado.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1720579154737873218-647" src="https://platform.twitter.com/embed/Tweet.html?id=1720579154737873218"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1720579154737873218-647');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1720579154737873218&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Todo se debe a que la experiencia de los desarrolladores al construir sobre Solana sigue mejorando: en lugar del viejo meme de que construir sobre la blockchain Solana es como masticar vidrio, hoy es más como surfear sobre vidrio. Los &lt;strong&gt;nuevos recursos y herramientas para desarrolladores&lt;/strong&gt; han permitido a miles de desarrolladores crear la aplicación descentralizada de sus sueños. Más información en &lt;a href="https://solana.com/developers"&gt;el portal para desarrolladores de Solana.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/zTddk2pf2yI"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Las instituciones se apoyan en Solana
&lt;/h2&gt;

&lt;p&gt;A medida que la vibrante comunidad de Solana proseguía su labor, las instituciones empezaron a tomar nota. En 2023, varias grandes empresas y firmas tradicionales empezaron a explorar el ecosistema de Solana.&lt;/p&gt;

&lt;p&gt;En abril, &lt;strong&gt;Mastercard&lt;/strong&gt;, en colaboración con la Fundación Solana, trabajó en herramientas para ayudar a asegurar las transacciones entre instituciones web2 y web3.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1652003395052380160-581" src="https://platform.twitter.com/embed/Tweet.html?id=1652003395052380160"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1652003395052380160-581');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1652003395052380160&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Visa&lt;/strong&gt; amplió su programa piloto de stablecoin USDC a la red Solana, tras meses de investigación exhaustiva sobre la pila tecnológica y las ventajas de la cadena de bloques Solana.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1699031109080945049-512" src="https://platform.twitter.com/embed/Tweet.html?id=1699031109080945049"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1699031109080945049-512');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1699031109080945049&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Solana Pay, un protocolo de pagos entre pares descentralizado y de código abierto construido sobre la cadena de bloques Solana por Solana Labs, se integró con &lt;strong&gt;Shopify&lt;/strong&gt; - desbloqueando pagos USDC a millones de empresas como una integración de aplicación aprobada.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1694336131599393186-254" src="https://platform.twitter.com/embed/Tweet.html?id=1694336131599393186"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1694336131599393186-254');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1694336131599393186&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boba Guys&lt;/strong&gt;, una popular tienda de té, llevó a cabo una prueba piloto de su programa de fidelización basado en Solana en una tienda de San Francisco. ¿Los resultados? &lt;a href="https://cointelegraph.com/news/boba-guys-shopify-users-showcase-adoption-web3-tools-solana-breakpoint"&gt;Un 67% más&lt;/a&gt; de visitas mensuales entre los participantes en el programa de fidelización y un 65% más de consumo. El programa se extendió a todo el país en noviembre.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/yoZ2eF6Na7w"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Más allá de los productos dirigidos a consumidores y empresas, las grandes instituciones de infraestructuras también empezaron a integrar el soporte para la blockchain Solana. &lt;strong&gt;Google Cloud&lt;/strong&gt; integró los datos de &lt;a href="https://solana.com/news/solana-data-live-on-google-cloud-bigquery"&gt;Solana onchain en BigQuery&lt;/a&gt;, desbloqueando nuevos casos de uso.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1680654353357582337-853" src="https://platform.twitter.com/embed/Tweet.html?id=1680654353357582337"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1680654353357582337-853');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1680654353357582337&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Amazon Web Services&lt;/strong&gt; también anunció que la &lt;a href="https://solana.com/news/solana-blockchain-node-development-blueprints-available-on-aws"&gt;compatibilidad con los nodos de red Solana&lt;/a&gt; estaba disponible para su despliegue.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/wqADZnNPSV0"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Reunirse IRL (In real life)
&lt;/h2&gt;

&lt;p&gt;A pesar de las frías condiciones de la industria, en 2023 la comunidad de Solana tomó el mando. En ningún lugar esto fue más evidente que en las reuniones de la vida real de creadores, usuarios y fanáticos del ecosistema de Solana que tuvieron lugar en todo el mundo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Breakpoint&lt;/strong&gt;, la conferencia anual de la comunidad Solana organizada por la Fundación Solana, congregó a más de 3.000 asistentes en el Campus Solana, a las afueras de Ámsterdam, durante una semana de construcción y creación de redes. Pero fueron los actos organizados por la comunidad que proliferaron en el campus y fuera de él, desde conferencias como &lt;strong&gt;Block Zero&lt;/strong&gt;, &lt;strong&gt;DRiP Haus&lt;/strong&gt; y &lt;strong&gt;The Network State&lt;/strong&gt; hasta actos paralelos de &lt;strong&gt;Superteam&lt;/strong&gt; y otros proyectos del ecosistema, los que encarnaron el verdadero espíritu comunitario.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/0MoYSUxYDFk"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Las Solanas Hacker Houses&lt;/strong&gt;, que muestran el trabajo del ecosistema Solana en ciudades de todo el mundo, vieron a más de 6.000 desarrolladores enviar y aprender colectivamente&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1620458593563574277-966" src="https://platform.twitter.com/embed/Tweet.html?id=1620458593563574277"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1620458593563574277-966');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1620458593563574277&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AthensDAOx&lt;/strong&gt;, un evento organizado por el equipo de DeansListDAO, causó sensación con un fin de semana centrado en la gobernanza.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1734927545156669615-293" src="https://platform.twitter.com/embed/Tweet.html?id=1734927545156669615"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1734927545156669615-293');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1734927545156669615&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Mientras tanto, &lt;strong&gt;Solana Crossroads&lt;/strong&gt; -una conferencia independiente en Estambul, organizada por Step Finance- mostró la creciente comunidad de constructores en Turquía.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1649042474449637382-95" src="https://platform.twitter.com/embed/Tweet.html?id=1649042474449637382"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1649042474449637382-95');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1649042474449637382&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;mtnDAO&lt;/strong&gt;, el hacker house comunitario de Salt Lake City, acogió una semana de talleres, aprendizaje y mucho más sobre el ecosistema Solana.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1625981076593348608-768" src="https://platform.twitter.com/embed/Tweet.html?id=1625981076593348608"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1625981076593348608-768');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1625981076593348608&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;La comunidad de creadores del ecosistema Solana &lt;a href="https://solana.com/art-basel"&gt;hizo su debut&lt;/a&gt; en &lt;strong&gt;Art Basel Miami Beach&lt;/strong&gt;, con artistas que organizaron estudios y crearon piezas en directo y experiencias organizadas por equipos de apoyo a los creadores de todo el ecosistema Solana.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1734653445171273838-893" src="https://platform.twitter.com/embed/Tweet.html?id=1734653445171273838"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1734653445171273838-893');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1734653445171273838&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Estos eventos no fueron los únicos. Desde festivales como &lt;strong&gt;PlayGG&lt;/strong&gt; hasta &lt;strong&gt;reuniones informales de la comunidad, desde Vancouver hasta Tokio&lt;/strong&gt;, la comunidad Solana demostró su fuerza en todo el mundo.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Y ahora qué?
&lt;/h2&gt;

&lt;p&gt;Según todos los indicios, la comunidad de Solana no ha hecho más que empezar. Si 2023 fue el año del renacimiento del ecosistema de Solana, 2024 volverá a ser el verano de Solana.&lt;/p&gt;

&lt;p&gt;Pero para que eso ocurra, la comunidad tiene que liderar, construir y seguir avanzando. Es un momento emocionante para el ecosistema Solana, con nuevos proyectos y noticias que aparecen a diario. Pero todo depende de ti.&lt;/p&gt;

&lt;p&gt;El impulso hacia adelante que la comunidad Solana está experimentando en este momento puede continuar, pero requiere un enfoque implacable y priorización.  Sigue escribiendo código innovador, sigue creando la próxima generación de arte, sigue esforzándote por encontrar el próximo caso de uso en el mundo real y sigue mostrando al mundo el poder de una blockchain que se mueve a la velocidad de la luz.&lt;/p&gt;

&lt;p&gt;El mejor momento para dar el paso y comenzar su proyecto Solana es ahora. ¿Qué vas a construir?&lt;/p&gt;

&lt;p&gt;Este tutorial fue creado en el idioma inglés por &lt;a href="https://solana.com/news/solana-solstice-2023-community-review"&gt;Solana&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Espero esta traducción le sea de ayuda a la comunidad Hispanohablante que usa &lt;a href="https://solana.com/"&gt;Solana&lt;/a&gt; que está creciendo enormemente.&lt;/p&gt;

&lt;p&gt;Haz parte de la comunidad &lt;a href="https://discord.gg/sPVaqarbxY"&gt;SOLANA LATAM&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Configurar Solana en Linux</title>
      <dc:creator>Derlys</dc:creator>
      <pubDate>Mon, 18 Dec 2023 17:14:49 +0000</pubDate>
      <link>https://forem.com/derlys/configurar-solana-en-linux-5f70</link>
      <guid>https://forem.com/derlys/configurar-solana-en-linux-5f70</guid>
      <description>&lt;p&gt;En este tutorial vamos a: Instalar las herramientas, crear una billetera local y crear un ejemplo de hola mundo. Programa para probar que está correctamente configurado.&lt;/p&gt;

&lt;p&gt;Configure su entorno de desarrollo Solana en Linux con esta guía de instalación completa&lt;/p&gt;

&lt;p&gt;Para configurar e instalar Solana en Linux, necesitará para instalar lo siguiente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NodeJS y Yarn&lt;/li&gt;
&lt;li&gt;Varios paquetes y bibliotecas del sistema Linux&lt;/li&gt;
&lt;li&gt;Rust and Cargo (usando Rustup)&lt;/li&gt;
&lt;li&gt;El conjunto de herramientas CLI de Solana&lt;/li&gt;
&lt;li&gt;El marco &lt;code&gt;Anchor&lt;/code&gt; (no es realmente necesario, ¡pero sí muy recomendable!)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Aviso: Es posible que se encuentre con errores del compilador o del generador durante el proceso de configuración, dependiendo de qué bibliotecas y dependencias ya tenga su sistema Linux instalado.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Instalar NodeJS y Yarn
&lt;/h2&gt;

&lt;p&gt;Seamos realistas, el mundo de web 3 y blockchain se está construyendo con Aplicaciones basadas en JavaScript/TypeScript. De los cuales, NodeJS y el paquete NPM  está a la vanguardia.&lt;/p&gt;

&lt;p&gt;Así que simplemente &lt;a href="https://nodejs.org/en"&gt;instala NodeJS&lt;/a&gt; (si eres uno de esos desarrolladores cripto curiosos que aún no lo tienen instalado). En Linux/Ubuntu, recomiendo instalar NodeJS usando &lt;a href="https://github.com/nvm-sh/nvm"&gt;administrador de versiones de nodo&lt;/a&gt;(también conocido como NVM). ¡Actualizar las versiones de Node es lo más sencillo posible!&lt;/p&gt;

&lt;p&gt;A continuación, recomiendo encarecidamente instalar el &lt;a href="https://www.npmjs.com/package/yarn"&gt;Administrador de paquetes de Yarn&lt;/a&gt;. Mucha gente está usando &lt;code&gt;Yarn&lt;/code&gt; en el ecosistema Solana. (¡&lt;a href="https://twitter.com/derlys_paola"&gt;Incluyéndome&lt;/a&gt; y al equipo &lt;code&gt;Anchor&lt;/code&gt;!):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;npm i -g yarn
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Instalar librerías y paquetes de Linux
&lt;/h2&gt;

&lt;p&gt;Para comenzar esta fiesta de Solana, asegúrese de que su sistema Linux esté actualizado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;sudo apt-get update &amp;amp;&amp;amp; sudo apt-get upgrade
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada distribución de Linux es diferente. Y dependiendo del tipo de Linux que uses se están ejecutando, es posible que necesite instalar más o menos paquetes adicionales en tu sistema.&lt;/p&gt;

&lt;p&gt;La instalación de los siguientes paquetes debería cubrir la mayoría de los casos para sistemas basados ​​en Ubuntu o Debian:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;sudo apt-get install -y pkg-config build-essential libudev-dev libssl-dev
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Nota: En el pasado usaba Edición Parrot OS Home (Debian y apt) como mi conductor diario, y estos paquetes también eran necesarios para comenzar en el desarrollo de Solana.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Las personas a menudo se encuentran con varios errores al configurar la variedad de Solana. Herramientas de desarrollo en sistemas operativos basados ​​en Linux como Ubuntu o Parrot OS (que es lo que me gusta usar). Esto generalmente se debe a que falta en su sistema algunas dependencias diversas. Lo bueno es que si tienes algún problema al instalar o crear programas Solana, &lt;code&gt;Anchor&lt;/code&gt; y/o &lt;code&gt;Solana&lt;/code&gt;, su salida del terminal suele ser lo suficientemente descriptiva como para indicarle qué paquete/dependencia te falta. ¡Hermoso!&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalar Rust y Cargo
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A medida que avanza a través de este asistente de instalación de &lt;code&gt;Rust&lt;/code&gt;, se le dará algunas opciones al instalar. Cuando se le solicite, recomiendo seleccionar la opción de construcción &lt;code&gt;nocturna&lt;/code&gt;(nightly). Esto parece funcionar mejor con el conjunto de herramientas Solana CLI.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nota: Este comando de instalación de &lt;code&gt;Rustup&lt;/code&gt; proviene directamente del sitio web &lt;a href="https://rustup.rs/"&gt;Rustup.rs&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Instale la CLI de Solana
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;sh -c "$&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;curl &lt;span class="nt"&gt;-sSfL&lt;/span&gt; https://release.solana.com/stable/install&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Nota: Este comando de instalación para el conjunto de herramientas Solana CLI proviene directamente de los documentos oficiales de Solana.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Instalar Anchor Lang para Solana
&lt;/h2&gt;

&lt;p&gt;Anchor es el framework más popular para crear programas Solana. Es un proyecto de código abierto que puede ayudar a simplificar tus programas, además de hacerlos más seguros.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nota: El equipo de Anchor recomienda &lt;a href="https://www.anchor-lang.com/docs/installation"&gt;instalar Anchor&lt;/a&gt; usando la herramienta Anchor Version Manager, AVM, ¡así que eso es lo que usaremos aquí! Este proceso construirá AVM desde el código fuente y puede llevar un poco de tiempo, dependiendo del hardware de tu ordenador.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Una vez que haya instalado Cargo, puede instalar AVM con el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;cargo install --git https://github.com/coral-xyz/anchor avm --locked --force
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A continuación, podemos usar &lt;code&gt;AVM&lt;/code&gt; para instalar &lt;code&gt;Anchor CLI&lt;/code&gt; (esto puede tardar un poco), ya que &lt;code&gt;Cargo&lt;/code&gt; compilará la CLI durante la instalación):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;avm install latest
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finalmente, indique que configure la última versión de &lt;code&gt;Anchor&lt;/code&gt; como predeterminada de su sistema y verifique tu versión:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;avm use latest &amp;amp;&amp;amp; anchor --version
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Crea una billetera Solana local
&lt;/h2&gt;

&lt;p&gt;Una de las últimas cosas que necesitará desarrollar (más específicamente implementar) Los programas Solana son una billetera. No profundizaré en los detalles del uso de la Solana CLI aquí, sino más bien una comprensión superficial de los comandos para empezar a desarrollar.&lt;/p&gt;

&lt;h2&gt;
  
  
  TLDR;
&lt;/h2&gt;

&lt;p&gt;Las billeteras del sistema de archivos guardarán la clave privada de su billetera en un archivo local en su computadora&lt;br&gt;
debe seleccionar la red Solana correcta que desea mediante la CLI necesitarás enviar el token SOL a tu billetera&lt;/p&gt;
&lt;h2&gt;
  
  
  Crear una billetera Solana
&lt;/h2&gt;

&lt;p&gt;Cree una nueva billetera del sistema de archivos llamada "demo-wallet":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;solana-keygen new --outfile ~/.config/solana/demo-wallet.json
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Seleccione la red Solana
&lt;/h2&gt;

&lt;p&gt;Seleccione Solana "testnet" red y configure su nueva billetera del sistema de archivos como la predeterminada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;solana config set --url testnet --keypair ~/.config/solana/demo-wallet.json
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Verifique sus ajustes de configuración
&lt;/h2&gt;

&lt;p&gt;Lea la configuración de su CLI de Solana para verificar que su billetera esté correctamente configurado y estás en la red correcta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;solana config get
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El resultado debería ser algo parecido a esto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Config File: /Users/derlys/.config/solana/cli/config.yml
RPC URL: https://api.devnet.solana.com
WebSocket URL: wss://api.devnet.solana.com/ (computed)
Keypair Path: /Users/derlys/.config/solana/id.json
Commitment: confirmed
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Yo utilice la red &lt;code&gt;devnet&lt;/code&gt; que es donde puedes hacer pruebas y solicitar &lt;code&gt;airDrop&lt;/code&gt;(sol para para probar tus DApps). En la &lt;code&gt;testdev&lt;/code&gt; también puedes solicitarlos sin embargo se usa mas que todo para comprobar que tus transacciones esten llegando correctamente.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Financia tu billetera con un AirDrop
&lt;/h2&gt;

&lt;p&gt;Obtenga un token SOL gratuito lanzado desde el AirDrop (también conocido como depositado) en su nueva billetera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;solana airdrop 1 &amp;lt;RECIPIENT_ACCOUNT_ADDRESS&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;si ejecutas el comando sin especificar la direccion( publickey) te carga los soles en la billetera (wallet) que tengas configurada por defecto.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para comprobar el saldo de la billetera de su sistema de archivos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;solana balance &amp;lt;RECIPIENT_ACCOUNT_ADDRESS&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ¿Qué sigue?
&lt;/h2&gt;

&lt;p&gt;Ahora que tiene todas las herramientas de desarrollo de Solana necesarias instaladas en su entorno local, ¡está listo para comenzar a crear sus primeros programas Solana!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/derlys/introduccion-a-la-cli-de-solana-5e1m"&gt;Introducción a Solana CLI&lt;/a&gt;: obtenga más información sobre comandos importantes y cómo navegar por la CLI de Solana.&lt;/p&gt;

&lt;p&gt;Implemente un programa Solana (próximamente): cree, edite, implemente y vuelva a implementar su primer programa Solana para blockchain.&lt;/p&gt;

&lt;p&gt;A excepción de algunos links y párrafos, este tutorial fue creado en el idioma inglés por &lt;a href="https://twitter.com/nickfrosty"&gt;Nick Frostbutter&lt;/a&gt;. Muchas gracias por producir este tipo de contenido.&lt;/p&gt;

&lt;p&gt;Espero esta traducción le sea de ayuda a la comunidad Hispanohablante que usa &lt;a href="https://solana.com/"&gt;Solana&lt;/a&gt; que está creciendo enormemente.&lt;/p&gt;

&lt;p&gt;Haz parte de la comunidad &lt;a href="https://discord.gg/sPVaqarbxY"&gt;SOLANA LATAM&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>espanol</category>
      <category>solana</category>
      <category>blockchain</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Introducción a la CLI de Solana</title>
      <dc:creator>Derlys</dc:creator>
      <pubDate>Wed, 13 Dec 2023 16:45:24 +0000</pubDate>
      <link>https://forem.com/derlys/introduccion-a-la-cli-de-solana-5e1m</link>
      <guid>https://forem.com/derlys/introduccion-a-la-cli-de-solana-5e1m</guid>
      <description>&lt;p&gt;Como parte de su viaje de desarrollo de Solana, deberá familiarizarse con la CLI de Solana.&lt;/p&gt;

&lt;p&gt;Es muy poderoso y muy importante comprender algunos comandos para realizar algunas tareas específicas:&lt;/p&gt;

&lt;p&gt;1️⃣ Crear billeteras&lt;br&gt;
2️⃣ Actualizar la configuración de su red Solana&lt;br&gt;
3️⃣ SOL gratuito desde el AirDrop (también conocido como fondos en su cuenta)&lt;br&gt;
4️⃣ Ejecutar un validador de prueba&lt;br&gt;
5️⃣ Implementar programas Solana&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;PD: También hay un &lt;a href="https://www.youtube.com/watch?v=pNzT3hgFbpg"&gt;video de YouTube&lt;/a&gt; para este tutorial de Solana.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Aprenda a utilizar la CLI de Solana
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Esta guía asume que ya tiene instalada la CLI de Solana. Si no es así, &lt;a href="https://solanacookbook.com/es/getting-started/installation.html#instalacion-de-cli"&gt;consulte esta guía sobre cómo instalar Solana CLI en  Linux&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Crea una billetera Solana para el desarrollo
&lt;/h2&gt;

&lt;p&gt;Para implementar programas Solana en la cadena de bloques (ya sea un validador local o un RPC remoto), necesitará crear una billetera Solana.&lt;/p&gt;

&lt;p&gt;Para simplificar, generaremos una billetera con sistema de archivos que almacenará nuestra clave privada (privateKey) en un archivo en su computadora. De esta manera, podemos decirle fácilmente a Solana CLI y/o Anchor CLI que usen esta billetera para implementar nuestros programas Solana.&lt;/p&gt;

&lt;p&gt;La billetera del sistema de archivos predeterminada generalmente se encuentra en &lt;code&gt;~/.config/solana/id.json&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Cuando crea nuevas wallets de sistema de archivos, puede especificar cualquier ubicación de archivo específica con el indicador &lt;code&gt;--outfile /path/to/file&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para generar una nueva wallet (billetera) Solana utiliza este comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;solana-keygen new --outfile ~/.config/solana/solfate-dev.json
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Al generar cada wallet (billetera), también puedes establecer una frase de contraseña (como un archivo de claves SSH).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;¡RECOMIENDO ENCARECIDAMENTE establecer una frase de contraseña para la billetera, especialmente para cualquier billetera que pueda usar en producción en algún momento!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Para efectos de este tutorial he decidido no usar esta frase de contraseña.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;p&gt;Una vez creada su billetera, obtendrá una lectura de su &lt;code&gt;pubkey&lt;/code&gt; (también conocida como dirección de su billetera) y su frase inicial. No olvides escribir tu frase inicial en un lugar seguro si realmente vas a conservar esta dirección de billetera.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lea la configuración de Solana
&lt;/h2&gt;

&lt;p&gt;Para lograr cualquier cosa en la cadena de bloques de Solana, incluso con un validador de prueba local, deberá asegurarse de que su CLI de Solana esté configurada para conectarse a la red Solana RPC correcta y con la billetera correcta.&lt;/p&gt;

&lt;p&gt;Para ver la configuración actual de Solana CLI, ejecute este comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;solana config get
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Debería obtener una lectura como esta:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Config File: /home/nick/.config/solana/cli/config.yml&lt;br&gt;
RPC URL: https://api.testnet.solana.com&lt;br&gt;
WebSocket URL: wss://api.testnet.solana.com/ (computed)&lt;br&gt;
Keypair Path: /home/nick/.config/solana/id.json&lt;br&gt;
Commitment: confirmed&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Las configuraciones son MUY importantes son la &lt;code&gt;URL RPC&lt;/code&gt; y el archivo &lt;code&gt;Keypair Path&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;RPC URL: le indica a la CLI a qué &lt;a href="https://solanacookbook.com/es/core-concepts/transactions.html#hechos"&gt;clúster&lt;/a&gt; de red Solana desea conectarse. Generalmente, para el desarrollo local, debe configurar su propio validador de pruebas local (también conocido como localnet). Solo los RPC de la “red principal” utilizarán realmente tokens SOL reales y, por lo tanto, dinero real.&lt;/p&gt;

&lt;p&gt;Keypair Path: la clave privada de la billetera (como la que creamos anteriormente) para usar para implementar programas e interactuar con el RPC.&lt;/p&gt;
&lt;h2&gt;
  
  
  Actualice su configuración de Solana
&lt;/h2&gt;

&lt;p&gt;Cuando desee cambiar la configuración de su red Solana o cambiar el archivo de clave de billetera predeterminado, deberá actualizar su configuración con la CLI de Solana.&lt;/p&gt;

&lt;p&gt;Al configurar su URL RPC (también conocido como cambiar su red Solana), puede usar el nombre corto de la red (como “mainnet”, “testnet”, etc.) o la URL completa para un nodo RPC activo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;solana config set --url testnet
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para cambiar el archivo de la clave de billetera que utiliza la CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;solana config set --keypair /path/to/file
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Consulta el saldo de tu billetera
&lt;/h2&gt;

&lt;p&gt;Necesitará SOL para interactuar con la cadena de bloques, incluso durante el desarrollo. Siempre puede consultar fácilmente el saldo de su billetera (o la de cualquier persona) utilizando la CLI de Solana.&lt;/p&gt;

&lt;p&gt;Para verificar el saldo de la dirección de su billetera configurada por CLI (también conocida como la que ha configurado con el archivo de claves de su sistema de archivos):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;solana balance
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para consultar el saldo de cualquier otra billetera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;solana balance WALLET_ADDRESS_HERE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;El comando &lt;code&gt;solana balance&lt;/code&gt;solo verificará el saldo de la billetera determinada en la red Solana actualmente seleccionada.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Financia tu billetera a través de AirDrop
&lt;/h2&gt;

&lt;p&gt;Con su nueva configuración de billetera y seleccionada en la red RPC correcta, deberá depositar fondos en su billetera con SOL.&lt;/p&gt;

&lt;p&gt;Este SOL se utilizará para implementar programas en la cadena de bloques, así como para pagar el alquiler y las transacciones mientras desarrolla programas.&lt;/p&gt;

&lt;p&gt;Periódicamente, a medida que implemente o interactúe con los programas de Solana, deberá financiar su billetera con SOL (el token nativo de Solana).&lt;/p&gt;

&lt;p&gt;Puede depositar fondos en su cuenta utilizando dos métodos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;AirDrop a través de Solana CLI&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para solicitar un AirDrop gratuito a su billetera seleccionada actualmente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;solana airdrop 1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;El comando &lt;code&gt;solana airdrop&lt;/code&gt; de solana tiene un límite en la cantidad de SOL que se puede lanzar. Cualquier solicitud que supere este límite hará que la transacción falle. Al momento de escribir esto, el límite es 5.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tal como habrás adivinado, el AirDrop se producirá en la red que estás seleccionado en la configuración de Solana. Y no, el lanzamiento aéreo no funciona en la red principal. No seas tonto.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;AirDrop a través de Solfate faucet&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Otra manera fácil de obtener su SOL devnet y/o testnet gratuito en su billetera es usar un grifo público. Aquí en Solfate operamos un grifo público &lt;a href="https://faucet.solana.com/"&gt;Solana faucet&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Todo lo que necesita hacer es ingresar la dirección de su billetera y hacer clic en el botón de la red Solana que desee: devnet o testnet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ejecute el validador de pruebas de Solana
&lt;/h2&gt;

&lt;p&gt;Como mencioné anteriormente, cuando desarrolle sus programas Solana localmente, lo más probable es que desee ejecutar una versión de host local de la cadena de bloques Solana llamada “validador de prueba”(test validator). Tal como puede pensar, esto le permitirá tener una versión completa de la cadena de bloques Solana directamente en su computadora local.&lt;/p&gt;

&lt;p&gt;Ejecutar y desarrollar usando el validador de pruebas es excelente (y recomendado) por varias razones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Transacciones aún más rápidas (¡tú eres el único que las realiza!)&lt;/li&gt;
&lt;li&gt;Menor riesgo de transacciones rechazadas&lt;/li&gt;
&lt;li&gt;sin limitación desde puntos finales RPC públicos&lt;/li&gt;
&lt;li&gt;fácil acceso a los registros del programa Solana (a través de la macro "msg" en Rust)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para ejecutar el validador de pruebas de Solana, abra una nueva ventana de terminal y ejecute el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;solana-test-validator
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esta red localhost, también conocida como “localnet”, que se ejecuta en su terminal, enviará todos los mensajes que su programa Solana envíe a la cadena de bloques. Lo cual es una excelente manera de ayudar a depurar sus programas.&lt;/p&gt;

&lt;p&gt;A excepción de algunos links actualizados y párrafos, este tutorial fue escrito en el idioma inglés por &lt;a href="https://twitter.com/nickfrosty"&gt;Nick Frostbutter&lt;/a&gt;. Muchas gracias por crear este tipo de contenido.&lt;/p&gt;

&lt;p&gt;Espero esta traducción le sea de ayuda a la comunidad Hispanohablante que usa &lt;a href="https://solana.com/"&gt;Solana&lt;/a&gt; que está creciendo enormemente.&lt;/p&gt;

&lt;p&gt;Haz parte de la comunidad &lt;a href="https://discord.gg/sPVaqarbxY"&gt;SOLANA LATAM&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://t.me/+Axat5MuV6ow5NWY0"&gt;HispanaSol&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>solana</category>
      <category>web3</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Tutorial 2: Creando una aplicación Angular V17 con Tailwind</title>
      <dc:creator>Derlys</dc:creator>
      <pubDate>Sun, 03 Dec 2023 15:26:55 +0000</pubDate>
      <link>https://forem.com/derlys/creando-una-aplicacion-angular-v17-con-tailwind-21c2</link>
      <guid>https://forem.com/derlys/creando-una-aplicacion-angular-v17-con-tailwind-21c2</guid>
      <description>&lt;p&gt;En este tutorial, aprenderás a usar Tailwind para dar estilo a aplicaciones Angular CLI.&lt;/p&gt;

&lt;p&gt;El objetivo es construir un diseño de aplicación con un encabezado y pie de página con sus respectivas rutas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requisitos
&lt;/h2&gt;

&lt;p&gt;Asegúrate de tener las siguientes herramientas instaladas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node JS y NPM, visite &lt;a href="https://nodejs.org/en/"&gt;su página&lt;/a&gt; para ver las instrucciones.

&lt;ul&gt;
&lt;li&gt;Ejecute node -v para verificar que tiene la versión 20 o superior.&lt;/li&gt;
&lt;li&gt;Ejecute &lt;code&gt;npm -v&lt;/code&gt; para comprobar que tiene la versión 10 o superior.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Angular CLI (npm install -g @angular/cli)

&lt;ul&gt;
&lt;li&gt;Ejecute &lt;code&gt;ng version&lt;/code&gt; para revisar que tiene la versión 17.&lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;Si prefiere usar &lt;code&gt;yarn&lt;/code&gt;, &lt;a href="https://dev.to/ruslangonzalez/configurar-yarn-en-tus-proyectos-de-angular-video-goj"&gt;primero configure el administrador de paquetes predeterminado de Angular CLI&lt;/a&gt;. Esto asegura que la aplicación generada tenga un archivo &lt;code&gt;yarn.lock&lt;/code&gt; en lugar de un &lt;code&gt;paquete-lock.json&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Crea una nueva aplicación
&lt;/h2&gt;

&lt;p&gt;Abra una terminal y ejecute el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ng new angular17
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El comando &lt;code&gt;ng new&lt;/code&gt; genera una aplicación Angular básica en una carpeta llamada &lt;code&gt;angular17&lt;/code&gt; e instala las dependencias.&lt;/p&gt;

&lt;p&gt;La ejecución de este comando te da un recorrido por varias preguntas que configuran tu app con los estilos que quieras.&lt;/p&gt;

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

&lt;p&gt;Además, una de las nuevas actualizaciones de Angular V17 es que nos permite desde el comienzo crear nuestro &lt;code&gt;server side rendering&lt;/code&gt; algo increíblemente útil.&lt;/p&gt;

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

&lt;p&gt;Al final de la configuración, la CLI de Angular también inicializa un repositorio git y hace un commit inicial.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Abrir la aplicación en modo de desarrollo
&lt;/h2&gt;

&lt;p&gt;Después que la instalación haya finalizado, ejecuta el siguiente comando e ingresa a la carpeta de tu proyecto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd angular17
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En la carpeta del proyecto tú puedes iniciar el servidor de desarrollo usando el comando  &lt;code&gt;ng serve&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;** El servidor de desarrollo de Angular utiliza el &lt;code&gt;localhost:4200&lt;/code&gt;, abre tu navegador en &lt;a href="https://dev.toocalhost:4200"&gt;localhost:4200&lt;/a&gt;**&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Haz clic en el enlace anterior y comprueba que funciona. ¡Ahora si la aplicación está lista para utilizar algunos estilos 🤗!&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Instala Tailwind
&lt;/h2&gt;

&lt;p&gt;Ejecuta los siguientes dos comandos en la carpeta de tu proyecto para instalar Tailwind.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn add -D tailwindcss postcss autoprefixer
yarn add tailwindcss init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Después que finalice el proceso, abre el archivo &lt;code&gt;tailwind.config.js&lt;/code&gt; y agrega lo siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/** @type {import('tailwindcss').Config} */&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./src/**/*.{html,ts}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Abre el archivo &lt;code&gt;styles.css&lt;/code&gt; y agrega las siguientes directivas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@tailwind&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@tailwind&lt;/span&gt; &lt;span class="n"&gt;components&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@tailwind&lt;/span&gt; &lt;span class="n"&gt;utilities&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Si quieres comprobar que Tailwind se instalo haz un cambio pequeño en tu &lt;code&gt;app.component.html&lt;/code&gt;, prueba agregando esto:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;h1&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-3xl font-bold underline"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  Hello world!
&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;MD Tip 💡&lt;br&gt;
Recuerda que no debes eliminar la etiqueta &lt;code&gt;&amp;lt;router-outlet&amp;gt;&amp;lt;/router-outlet&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;MDato 🗃️&lt;br&gt;
Angular ahora no tiene modulos y en los siguientes pasos del tutorial te daras cuenta por que&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  4. Configura el layout de la aplicación
&lt;/h2&gt;

&lt;p&gt;En este paso generaremos 3 componentes &lt;code&gt;layout&lt;/code&gt;, &lt;code&gt;header&lt;/code&gt; y &lt;code&gt;footer&lt;/code&gt; dentro de una carpeta llamada &lt;code&gt;ui&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Es una buena idea mantener la UI (Interfaz de ususario) separada del resto de la aplicacion. Esta &lt;code&gt;Separacion de tareas&lt;/code&gt; tambien te permite reutilizar facilmente la UI en otros proyectos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ejecuta el comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ng generate component ui/layout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto te generará una carpeta que se llama &lt;code&gt;ui&lt;/code&gt; y dentro de esta un componente llamado &lt;code&gt;layout&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A partir de aquí crearemos el componente &lt;code&gt;header&lt;/code&gt; y &lt;code&gt;footer&lt;/code&gt; dentro de esta carpeta, ejecutando estos 2 comandos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ng generate component ui/header
ng generate component ui/footer

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

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;MDato&lt;br&gt;
💡 El comando &lt;code&gt;ng generate&lt;/code&gt; acepta abreviaturas: usa &lt;code&gt;ng g c&lt;/code&gt; Para generar un componente, &lt;code&gt;ng g s&lt;/code&gt; para generar un servicio, etc.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  4.1 Implementa el LayoutComponent
&lt;/h2&gt;

&lt;p&gt;Abre &lt;code&gt;src/app/ui/layout/layout.component.html&lt;/code&gt; y remplaza su contenido por lo siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"flex flex-col h-full justify-between"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;app-header&amp;gt;&amp;lt;/app-header&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;'flex-grow  py-4 px-16 text-center bg-pink-300 
    text-pink-900 '&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-pink-500 text-3xl"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;router-outlet&amp;gt;&amp;lt;/router-outlet&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;app-footer&amp;gt;&amp;lt;/app-footer&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Vas a notar que las etiquetas de &lt;code&gt;header&lt;/code&gt; &lt;code&gt;footer&lt;/code&gt; y &lt;code&gt;router-outlet&lt;/code&gt; se colocan rojas, eso es porque debes importarlas en el respectivo componentes donde las uses&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Abre &lt;code&gt;src/app/ui/layout/layout.component.ts&lt;/code&gt; y agrega esto en los imports:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;HeaderComponent&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../header/header.component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;FooterComponent&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../footer/footer.component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;RouterOutlet&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/router&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app-layout&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;standalone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;HeaderComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;FooterComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;RouterOutlet&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;templateUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./layout.component.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;styleUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./layout.component.scss&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LayoutComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4.2 Usa el LayoutComponent
&lt;/h2&gt;

&lt;p&gt;Abra el archivo &lt;code&gt;src/app/app-routes.ts&lt;/code&gt; y agrega el siguiente código que es una lista de objetos que irán dentro del array de &lt;code&gt;routes&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;LayoutComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="c1"&gt;// Here we will add our application pages&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para que puedas usar el LayoutComponent debes importarlo en este mismo archivo en la parte superior.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;LayoutComponent&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./ui/layout/layout.component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Abre el archivo &lt;code&gt;app.component.html&lt;/code&gt; y deja solo la etiqueta &lt;code&gt;router-outlet&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Guarda y deberías ver en tu navegador el  &lt;code&gt;HeaderComponent&lt;/code&gt;&lt;br&gt;
y &lt;code&gt;FooterComponent&lt;/code&gt; renderizados.&lt;/p&gt;
&lt;h2&gt;
  
  
  4.3 Implementa el Header
&lt;/h2&gt;

&lt;p&gt;Abre el archivo &lt;code&gt;header.component.html&lt;/code&gt; y pega este código&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;'p-4 bg-violet-900 text-violet-300'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"flex justify-between align-items"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;LOGO&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"flex space-x-4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

      &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt;
        &lt;span class="na"&gt;routerLinkActive=&lt;/span&gt;&lt;span class="s"&gt;"active"&lt;/span&gt; &lt;span class="na"&gt;routerLink=&lt;/span&gt;&lt;span class="s"&gt;"/home"&lt;/span&gt; 
        &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bg-pink-500 text-white rounded-md px-3 py-2 
        text-sm font-medium"&lt;/span&gt; &lt;span class="na"&gt;aria-current=&lt;/span&gt;&lt;span class="s"&gt;"page"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Home&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt;
        &lt;span class="na"&gt;routerLinkActive=&lt;/span&gt;&lt;span class="s"&gt;"active"&lt;/span&gt; &lt;span class="na"&gt;routerLink=&lt;/span&gt;&lt;span class="s"&gt;"/blog"&lt;/span&gt; 
        &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-gray-300 hover:bg-pink-500 hover:text- 
        white rounded-md px-3 py-2 text-sm font- 
        medium"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Blog&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt;
        &lt;span class="na"&gt;routerLinkActive=&lt;/span&gt;&lt;span class="s"&gt;"active"&lt;/span&gt; &lt;span class="na"&gt;routerLink=&lt;/span&gt;&lt;span class="s"&gt;"/contact"&lt;/span&gt; 
        &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-gray-300 hover:bg-pink-500 hover:text- 
        white rounded-md px-3 py-2 text-sm font- 
        medium"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Contact&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Importa &lt;code&gt;RoterLink&lt;/code&gt; y &lt;code&gt;RoterLinkActive&lt;/code&gt; en el archivo &lt;code&gt;header.component.ts&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; imports: [RouterLink, RouterLinkActive],
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4.4 Implementa el Footer
&lt;/h2&gt;

&lt;p&gt;Abre el archivo &lt;code&gt;footer.component.html&lt;/code&gt; y pega este código&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;'p-4 text-center bg-violet-900 text-violet-300'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  COPYRIGHT &lt;span class="ni"&gt;&amp;amp;copy;&lt;/span&gt; 2069
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Agrega páginas a tu aplicación
&lt;/h2&gt;

&lt;p&gt;Con el layout en su lugar es momento de agregar páginas a nuestra app.&lt;/p&gt;

&lt;p&gt;Ejecuta el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ng g c pages/home
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Abre el siguiente archivo en la ruta &lt;code&gt;src/app/pages/home/home.component.html&lt;/code&gt; y remplaza el contenido por esto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bg-white px-6 py-24 sm:py-32 lg:px-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mx-auto max-w-2xl text-center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mt-2 text-4xl font-bold tracking-tight text-gray-900 sm:text-6xl"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;This is my home&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mt-6 text-lg leading-8 text-gray-600"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Anim aute id magna aliqua ad ad non deserunt sunt. Qui irure qui lorem cupidatat commodo. Elit sunt amet fugiat veniam occaecat fugiat aliqua.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Recuerdas que habiamos configurado nuestro layout en el archivo &lt;code&gt;app-routes.ts&lt;/code&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Agrega tu primera ruta&lt;code&gt;Home&lt;/code&gt; que es hija del layout el cual es compartido en cualquiera de las rutas, copia y pega lo siguiente el archivo &lt;code&gt;app-routes.ts&lt;/code&gt; dentro del array&lt;code&gt;children:&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;home&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;HomeComponent&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y ahora, si das clic en la ruta &lt;code&gt;Home&lt;/code&gt; en tu navegador te mostrará el &lt;code&gt;Homecomponent&lt;/code&gt; que acabaste de diseñar en el punto anterior.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;MDato 🗃️&lt;br&gt;
Puedes investigar mas acerca de rutas hijas o Nesting routes &lt;a href="https://angular.dev/guide/routing/common-router-tasks#nesting-routes"&gt;aqui&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  5.1  Crea la página blog
&lt;/h2&gt;

&lt;p&gt;Ejecuta el comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ng g c pages/blog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Abre el archivo &lt;code&gt;blog.component.html&lt;/code&gt; y copia esto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"relative isolate overflow-hidden bg-white px-6 py-24 sm:py-32 lg:px-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"absolute inset-0 -z-10 bg-[radial-gradient(45rem_50rem_at_top,theme(colors.indigo.100),white)] opacity-20"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"absolute inset-y-0 right-1/2 -z-10 mr-16 w-[200%] origin-bottom-left skew-x-[-30deg] bg-white shadow-xl shadow-indigo-600/10 ring-1 ring-indigo-50 sm:mr-28 lg:mr-0 xl:mr-16 xl:origin-center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mx-auto max-w-2xl lg:max-w-4xl"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mx-auto h-12"&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://tailwindui.com/img/logos/workcation-logo-indigo-600.svg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;figure&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mt-10"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;blockquote&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-center text-xl font-semibold leading-8 text-gray-900 sm:text-2xl sm:leading-9"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;“Lorem ipsum dolor sit amet consectetur adipisicing elit. Nemo expedita voluptas culpa sapiente alias molestiae. Numquam corrupti in laborum sed rerum et corporis.”&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/blockquote&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;figcaption&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mt-10"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mx-auto h-10 w-10 rounded-full"&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://images.unsplash.com/photo-1494790108377-be9c29b29330?ixlib=rb-1.2.1&amp;amp;ixid=eyJhcHBfaWQiOjEyMDd9&amp;amp;auto=format&amp;amp;fit=facearea&amp;amp;facepad=2&amp;amp;w=256&amp;amp;h=256&amp;amp;q=80"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mt-4 flex items-center justify-center space-x-3 text-base"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"font-semibold text-gray-900"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Judith Black&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;svg&lt;/span&gt; &lt;span class="na"&gt;viewBox=&lt;/span&gt;&lt;span class="s"&gt;"0 0 2 2"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"3"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"3"&lt;/span&gt; &lt;span class="na"&gt;aria-hidden=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"fill-gray-900"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;circle&lt;/span&gt; &lt;span class="na"&gt;cx=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;cy=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;r=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-gray-600"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;CEO of Workcation&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/figcaption&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/figure&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Abre nuevamente el archivo de tus rutas&lt;code&gt;app-routes.ts&lt;/code&gt; y agrega la nueva ruta de &lt;code&gt;blog&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;home&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;HomeComponent&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;blog&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;BlogComponent&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 Recuerda que cada ruta que agregues la debes importar en la parte superior de este mismo archivo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  5.2  Crea la página contact
&lt;/h2&gt;

&lt;p&gt;Ejecuta el comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ng g c pages/contact
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Abre el archivo &lt;code&gt;contact.component.html&lt;/code&gt; y copia esto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt; &lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;[formGroup]=&lt;/span&gt;&lt;span class="s"&gt;"form"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mx-auto mt-16 max-w-xl sm:mt-20"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"grid grid-cols-1 gap-x-8 gap-y-6 sm:grid-cols-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"sm:col-span-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"block text-sm font-semibold leading-6 text-white"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Email&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mt-2.5"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt;  &lt;span class="na"&gt;formControlName=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;autocomplete=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"block w-full rounded-md border-0 px-3.5 py-2 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"sm:col-span-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"block text-sm font-semibold leading-6 text-white"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Password&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mt-2.5"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;formControlName=&lt;/span&gt;&lt;span class="s"&gt;"password"&lt;/span&gt;  &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"password"&lt;/span&gt; &lt;span class="na"&gt;autocomplete=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"block w-full rounded-md border-0 px-3.5 py-2 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mt-10"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt; &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"submit()"&lt;/span&gt; &lt;span class="na"&gt;[disabled]=&lt;/span&gt;&lt;span class="s"&gt;"!form.value"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"block w-full rounded-md bg-pink-500 px-3.5 py-2.5 text-center text-sm font-semibold text-white shadow-sm hover:bg-pink-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Let's talk&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Abre nuevamente el archivo de tus rutas &lt;code&gt;app.routes.ts&lt;/code&gt; y agrega la nueva ruta de &lt;code&gt;contact&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;home&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;HomeComponent&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;blog&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;BlogComponent&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;contact&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ContactComponent&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para que nuestro formulario reactivo funcione debemos hacer algunos cambios en el archivo &lt;code&gt;contact.component.ts&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;Copia y pega lo siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;FormControl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;FormGroup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ReactiveFormsModule&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/forms&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app-contact&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;standalone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;ReactiveFormsModule&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;templateUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./contact.component.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;styleUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./contact.component.scss&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ContactComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormGroup&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;

    &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormControl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormControl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;submit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Redirigir la ruta raíz
&lt;/h2&gt;

&lt;p&gt;Abre el archivo &lt;code&gt;app.routes.ts&lt;/code&gt; y agrega el siguiente objeto en el array de &lt;code&gt;Routes&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// If this path is the 'full' match...&lt;/span&gt;
    &lt;span class="nx"&gt;pathMatch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;full&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// ...redirect to this route.&lt;/span&gt;
    &lt;span class="nx"&gt;redirectTo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;home&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Que hacer a partir de aquí?
&lt;/h2&gt;

&lt;p&gt;Como se explica en la introducción, este es un punto de partida y debe ser sencillo mejorar esta app como te parezca&lt;/p&gt;

&lt;p&gt;Tailwind es un framework de CSS poderoso y con muchas alternativas para colocar estilos a una app de forma rápida, después que aprendas a manejar su sintaxis podrás usarla a tu favor.&lt;/p&gt;

&lt;p&gt;Te dejo por &lt;a href="https://tailwindui.com/"&gt;aquí&lt;/a&gt; su página oficial para que explores un poco más.&lt;/p&gt;

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

&lt;p&gt;En este tutorial has aprendido a crear una aplicación básica y utilizar tailwind para crear un diseño con encabezado(header) y pie de página(footer) la aplicación tiene varias páginas, así que esta es una oportunidad para que apliques carga perezosa(Lazy loading).&lt;/p&gt;

&lt;p&gt;Puedes guiarte por la nueva documentación de Angular V17 en la sección &lt;a href="https://angular.dev/guide/ngmodules/lazy-loading#verify-lazy-loading"&gt;Guías detalladas(In depth Guides)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si tienes alguna pregunta no dudes en dejar un comentario en DEV o enviarme un mensaje al &lt;a href="https://twitter.com/derlys_paola"&gt;X&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Muchas gracias a &lt;a href="https://twitter.com/beeman_nl"&gt;Beeman&lt;/a&gt; por revisar este post.&lt;/p&gt;

&lt;p&gt;Nos vemos en otro post ✋🏽&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
