<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Andres Ramirez</title>
    <description>The latest articles on DEV Community by Andres Ramirez (@gara501).</description>
    <link>https://dev.to/gara501</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%2F17215%2Fcb6b0970-3d4a-4ad1-bf41-aaec0a38c80d.jpeg</url>
      <title>DEV Community: Andres Ramirez</title>
      <link>https://dev.to/gara501</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gara501"/>
    <language>en</language>
    <item>
      <title>The End of "Vibe Coding": Why Spec-Driven Development is the Future</title>
      <dc:creator>Andres Ramirez</dc:creator>
      <pubDate>Wed, 03 Dec 2025 16:34:27 +0000</pubDate>
      <link>https://dev.to/gara501/the-end-of-vibe-coding-why-spec-driven-development-is-the-future-3hpa</link>
      <guid>https://dev.to/gara501/the-end-of-vibe-coding-why-spec-driven-development-is-the-future-3hpa</guid>
      <description>&lt;h2&gt;
  
  
  Spec Driven Development
&lt;/h2&gt;

&lt;p&gt;In the rapidly evolving world of software development, a new term has emerged to describe the current state of AI-assisted programming: &lt;strong&gt;"Vibe Coding."&lt;/strong&gt; It refers to the unstructured, chaotic process of chatting with an LLM (like Claude or ChatGPT), pasting code back and forth, and hoping the AI "gets the vibe" of what you're trying to build.&lt;/p&gt;

&lt;p&gt;While fun for prototypes, vibe coding is a nightmare for complex or long-term projects. Context gets lost, requirements drift, and you end up with a "spaghetti chat" history that no one can audit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enter OpenSpec
&lt;/h3&gt;

&lt;p&gt;In a recent deep-dive, I explored &lt;strong&gt;OpenSpec&lt;/strong&gt;, a new open-source tool that brings engineering discipline back to AI coding through &lt;strong&gt;Spec-Driven Development (SDD)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Unlike context-driven frameworks (like BMAT) which can be overly complex, OpenSpec is lightweight and focuses on one core principle: &lt;strong&gt;Agree on the plan before writing the code.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;p&gt;OpenSpec flips the script. Instead of asking an AI to "write a function," you ask it to "create a proposal."&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Proposal:&lt;/strong&gt; The AI generates a structured plan (&lt;code&gt;proposal.md&lt;/code&gt;) and a task list (&lt;code&gt;tasks.md&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Review:&lt;/strong&gt; You (the human) review these files. This is your chance to catch logic errors before a single line of code is written.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Implementation:&lt;/strong&gt; Once approved, the AI agent (works with Cloud Code, Windsurf, Cursor, etc.) executes the plan step-by-step.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Archive:&lt;/strong&gt; The change is merged and archived, keeping your active context clean.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Why OpenSpec Wins for Beginners
&lt;/h3&gt;

&lt;p&gt;Many AI tools require you to start a project from scratch ("Greenfield"). OpenSpec, however, can be initialized in a repository with thousands of lines of code (Similar to GitHub SpecKit but simpler). It respects your existing structure; it only adds a &lt;code&gt;.openspec&lt;/code&gt; folder to manage future changes and all the definitions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;If you are tired of repeating yourself to your AI assistant, it's time to adopt a spec-driven workflow. OpenSpec offers a professional, scalable, and free way to harness the power of AI without losing control of your codebase.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ready to try it? Check out the &lt;a href="https://github.com/Fission-AI/OpenSpec" rel="noopener noreferrer"&gt;Fission-AI/OpenSpec&lt;/a&gt; repository on GitHub.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>openspec</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>Amazon Q - Kiro-dev</title>
      <dc:creator>Andres Ramirez</dc:creator>
      <pubDate>Tue, 25 Nov 2025 03:15:10 +0000</pubDate>
      <link>https://dev.to/gara501/amazon-q-kiro-dev-faj</link>
      <guid>https://dev.to/gara501/amazon-q-kiro-dev-faj</guid>
      <description>&lt;p&gt;Of all the IDEs, CLIs, and systems in general that allow process automation through agents that I’ve tested, Kirodev has definitely been a great surprise. I decided to create a very simple test application: I obtained a dashboard-style template and replicated the components and look and feel as closely as possible.&lt;/p&gt;

&lt;p&gt;When installing the IDE, I found a new tab showing the enhanced tools: Specs, Hooks, Agent Steering, and MCP (I’ll explain this in more detail later). On the right side, the chat window, very similar to any other chat, like Kilocode, Continue, Windsurf, etc.&lt;/p&gt;

&lt;p&gt;But what makes it innovative? In my opinion, the simplified implementation of SDD (Spec Driven Development) is very well executed. Unlike GitHub’s version (GitHub Spec Kit), which is more complex and requires more definitions, Kiro integrates a simplified version that allows maximum control over the project’s development. You could say it’s vibe coding with steroids and a police officer watching every step. To me, this is truly the next step in the evolution of programming, where the machine handles the routine work and developers focus on the logic and architecture of the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  SDD (Spec Driven Development)
&lt;/h2&gt;

&lt;p&gt;Programming through specs basically means you first define the specifications (specs)—a clear document describing what a functionality must do and how it should behave—and then you write code based on those specifications.&lt;/p&gt;

&lt;p&gt;To program using SDD in Kiro, we need to define 3 base files:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;requirements.md&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here, we define user stories and acceptance criteria, just as we do in Jira or any other ticketing tool, but using the EARS (Easy Approach to Requirements Syntax) notation. This notation looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;THE&lt;/span&gt; &lt;span class="k"&gt;SYSTEM&lt;/span&gt; &lt;span class="n"&gt;SHALL&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;expected&lt;/span&gt; &lt;span class="n"&gt;behavior&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This way of defining requirements allows greater clarity and traceability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;design.md&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this file, we define the entire architecture—everything we need for implementation, diagrams, etc.&lt;br&gt;
Here, we define how our system will work in terms of components and their interactions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;tasks.md&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is our implementation plan. Here we define the list of tasks to follow, step by step. Each task must be well defined and must specify what will be received. We must also specify whether we have dependencies (external libraries or other resources).&lt;br&gt;
One advantage is that this file runs task by task, allowing more granular control over the changes made.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PBT (Property Based Tests)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Another interesting feature of KIRO is PBTs, which in short are a more complete way of testing our development.&lt;/p&gt;

&lt;p&gt;Usually unit tests focus on testing specific functionalities without considering the broader context; this is exactly what PBT aims to fix.&lt;br&gt;
Properties are defined as the functionalities that must be fulfilled in our system. (For example, if we define a login, the user should be able to log in.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example of a PBT:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Traditional test: The user adds car #5 to favorites, car #5 appears in their favorites list.&lt;/p&gt;

&lt;p&gt;Property-based test: For any user and any car, WHEN the user adds the car to favorites, THE system MUST display it in their favorites list.&lt;/p&gt;

&lt;p&gt;KIRO extracts the properties automatically from our requirements.md file and generates the test cases, trying to cover as many scenarios as possible.&lt;/p&gt;
&lt;h2&gt;
  
  
  Agent Steering
&lt;/h2&gt;

&lt;p&gt;If the specs define what needs to be created, agent steering defines how it must be created. This allows controlling the agents and telling them how to generate the implementation following specific rules.&lt;/p&gt;

&lt;p&gt;For example, if I have a project using React + Vite + Tailwind + TypeScript, I could define an agent steering file like the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tailwind&lt;/span&gt;
  &lt;span class="na"&gt;layout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;responsive&lt;/span&gt;
  &lt;span class="na"&gt;propsValidation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TypeScript interfaces&lt;/span&gt;
  &lt;span class="na"&gt;interaction&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hooks only&lt;/span&gt;

&lt;span class="na"&gt;files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;structure&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;src/components&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;src/features&lt;/span&gt;
  &lt;span class="na"&gt;namingConvention&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PascalCase for components&lt;/span&gt;

&lt;span class="na"&gt;pages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;mustInclude&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Header&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Sidebar&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;MainContentLayout&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In short, specs are the map and steering is the driver.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hooks
&lt;/h2&gt;

&lt;p&gt;Another interesting addition is hooks, which are functions that trigger through events—events tied to creating, editing, or deleting a file, or even triggered manually.&lt;/p&gt;

&lt;p&gt;Hooks receive a prompt as a parameter and, depending on their trigger, can be very useful for code review, documentation, security review, automated commit message generation, and much more.&lt;br&gt;
An example of a manual hook would be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;Review the current file for&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="s"&gt;1. Code quality issues&lt;/span&gt;
&lt;span class="s"&gt;2. Potential bugs&lt;/span&gt;
&lt;span class="s"&gt;3. Performance optimizations&lt;/span&gt;
&lt;span class="s"&gt;4. Security vulnerabilities&lt;/span&gt;
&lt;span class="s"&gt;5. Accessibility concerns&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This hook would be executed manually on whichever file we choose.&lt;/p&gt;

&lt;p&gt;While there is an ocean of tools like this right now (Cursor, TRAE, Windsurf, Antigravity, etc.), KIRO has something in its favor: integration with AWS and its simplified definition of Spec Driven Development.&lt;br&gt;
Despite being a good tool, it is not exempt from errors—like all tools. Sometimes agent execution gets stuck, and lately, due to high demand, it takes a long time to execute some processes.&lt;/p&gt;

&lt;p&gt;We’ll see in a few months whether it manages to position itself as a leading tool in the market.&lt;/p&gt;

</description>
      <category>ia</category>
      <category>generative</category>
      <category>amazonq</category>
      <category>kirodev</category>
    </item>
    <item>
      <title>Agentic Context Engineering (ACE): una nueva forma de mejorar los LLMs sin tocar sus pesos</title>
      <dc:creator>Andres Ramirez</dc:creator>
      <pubDate>Fri, 10 Oct 2025 15:59:39 +0000</pubDate>
      <link>https://dev.to/gara501/agentic-context-engineering-ace-una-nueva-forma-de-mejorar-los-llms-sin-tocar-sus-pesos-2ke8</link>
      <guid>https://dev.to/gara501/agentic-context-engineering-ace-una-nueva-forma-de-mejorar-los-llms-sin-tocar-sus-pesos-2ke8</guid>
      <description>&lt;p&gt;Los modelos de lenguaje grandes (LLMs) han demostrado un potencial enorme, pero también sus límites. Una de las preguntas más importantes hoy es: ¿cómo podemos hacer que un modelo mejore sin tener que volver a entrenarlo desde cero?&lt;/p&gt;

&lt;p&gt;Este &lt;a href="https://www.arxiv.org/pdf/2510.04618" rel="noopener noreferrer"&gt;artículo&lt;/a&gt; presenta una respuesta interesante: Agentic Context Engineering (ACE), un nuevo marco de trabajo diseñado para potenciar el rendimiento de los LLMs a través de una idea simple pero poderosa: no cambiar el modelo, sino cambiar su contexto.&lt;/p&gt;

&lt;h2&gt;
  
  
  El problema con los enfoques actuales
&lt;/h2&gt;

&lt;p&gt;Cuando hablamos de adaptar un modelo a nuevas tareas, la mayoría de los métodos actuales se centran en ajustar los pesos del modelo o en reescribir los prompts. Pero eso tiene sus límites. ACE identifica dos grandes problemas en estas estrategias:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sesgo de brevedad (Brevity Bias):&lt;/strong&gt; Los modelos tienden a preferir instrucciones cortas y concisas, lo que a menudo elimina detalles valiosos o heurísticas específicas del dominio. Resultado: un modelo más rápido, sí, pero menos preciso en tareas complejas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Colapso del contexto (Context Collapse):&lt;/strong&gt; Cada vez que un modelo reescribe o resume su propio contexto, tiende a simplificarlo demasiado. Con el tiempo, la información importante se degrada, y el rendimiento cae.&lt;/p&gt;

&lt;h2&gt;
  
  
  La propuesta de ACE: contextos que aprenden
&lt;/h2&gt;

&lt;p&gt;ACE parte de una idea inspirada en cómo aprendemos los humanos: experimentar, reflexionar y consolidar.&lt;br&gt;
En lugar de tratar el contexto como un texto estático o un simple resumen, ACE lo concibe como un “playbook” vivo, que evoluciona con cada interacción.&lt;/p&gt;

&lt;p&gt;Este proceso se organiza en tres componentes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generador (Generator):&lt;/strong&gt; Produce trayectorias de razonamiento frente a nuevas consultas, revelando patrones útiles y errores comunes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reflector (Reflector):&lt;/strong&gt; Analiza esas trayectorias y extrae lecciones, refinándolas con iteraciones sucesivas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Curador (Curator):&lt;/strong&gt; Sintetiza esas lecciones en actualizaciones incrementales del contexto, que se integran sin perder coherencia.&lt;/p&gt;

&lt;p&gt;De esta forma, el modelo no solo responde mejor, sino que aprende de su propio desempeño sin requerir supervisión constante.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ojo a estos resultados:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En las evaluaciones realizadas, ACE mostró mejoras notables frente a los enfoques tradicionales:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rendimiento superior:&lt;/strong&gt; obtuvo una ganancia promedio del 10.6% en tareas de agentes y del 8.6% en benchmarks especializados como análisis financiero.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auto-mejora sin supervisión:&lt;/strong&gt; fue capaz de construir contextos útiles basándose únicamente en retroalimentación de ejecución, sin etiquetas humanas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mayor eficiencia:&lt;/strong&gt; redujo los costos y la latencia de adaptación, permitiendo una mejora continua con mínima sobrecarga.&lt;/p&gt;

&lt;p&gt;ACE representa un cambio de enfoque: pasamos de diseñar prompts a diseñar contextos dinámicos que evolucionan junto al modelo.&lt;br&gt;
Esto abre la puerta a sistemas de IA más adaptativos, escalables y, sobre todo, capaces de mejorar por sí mismos con el tiempo.&lt;/p&gt;

&lt;p&gt;En un mundo donde los LLMs ya son parte central de la innovación, frameworks como ACE nos recuerdan que el futuro de la inteligencia artificial no siempre pasa por modelos más grandes, sino por modelos que aprenden a aprender mejor.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>spanish</category>
      <category>llm</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Modelos de Lenguaje Grandes (LLMs) y su Potencial Malicioso</title>
      <dc:creator>Andres Ramirez</dc:creator>
      <pubDate>Wed, 24 Sep 2025 16:51:15 +0000</pubDate>
      <link>https://dev.to/gara501/modelos-de-lenguaje-grandes-llms-y-su-potencial-malicioso-5aci</link>
      <guid>https://dev.to/gara501/modelos-de-lenguaje-grandes-llms-y-su-potencial-malicioso-5aci</guid>
      <description>&lt;p&gt;La proliferación y el avance de los Modelos de Lenguaje Grandes (LLMs) han transformado significativamente el panorama tecnológico, ofreciendo capacidades sin precedentes en procesamiento de lenguaje natural y generación de contenido. Sin embargo, este progreso no está exento de desafíos, particularmente en lo que respecta al uso indebido de estas tecnologías. Un estudio exhaustivo realizado por Maximilian Mozes y su equipo profundiza en las implicaciones de seguridad de los LLMs, categorizando sus riesgos en amenazas, medidas de prevención y vulnerabilidades. Este análisis busca proporcionar una comprensión estructurada de cómo los LLMs pueden ser explotados y qué estrategias se están implementando para mitigar dichos riesgos.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Las Amenazas Intrínsecas de los LLMs: Un Análisis de su Potencial Malicioso&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Las capacidades generativas de los LLMs, si bien son la base de su utilidad, también constituyen la fuente principal de las amenazas que el estudio identifica. Estas amenazas se manifiestan a través de diversas modalidades de explotación, detalladas a continuación:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Fraude, Suplantación de Identidad e Ingeniería Social&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La sofisticación en la generación de texto por parte de los LLMs ha elevado el riesgo de fraude, suplantación de identidad y ataques de ingeniería social. Estos modelos permiten la creación de correos electrónicos de phishing y mensajes engañosos altamente personalizados y contextualmente relevantes, lo que dificulta su detección por parte de los usuarios. La eficiencia y el bajo costo asociados a la generación masiva de este tipo de contenido, facilitados por herramientas especializadas como WormGPT y FraudGPT, democratizan el acceso a tácticas ciberdelictivas, permitiendo su ejecución incluso por individuos con conocimientos técnicos limitados.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Generación de Malware&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Los LLMs poseen la capacidad de generar código informático, lo que incluye la creación de software malicioso. Esta funcionalidad reduce significativamente la barrera de entrada para el desarrollo de malware, posibilitando que actores sin experiencia en programación elaboren herramientas para ciberataques. Esta democratización del desarrollo de código malicioso representa un desafío considerable para la ciberseguridad global.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Mala Conducta Científica&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En el ámbito académico y de investigación, la capacidad de los LLMs para producir contenido original que puede eludir los sistemas de detección de plagio plantea serias preocupaciones sobre la integridad y la autoría. El uso de LLMs para la generación de ensayos, artículos o resúmenes sin la debida atribución o supervisión puede socavar la credibilidad de la producción científica y educativa, afectando la confianza en los procesos de evaluación y publicación.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Desinformación&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Los LLMs son herramientas extremadamente potentes para la generación de desinformación a gran escala. Su habilidad para producir narrativas coherentes y persuasivas, indistinguibles en muchos casos del contenido generado por humanos, facilita la propagación de noticias falsas, propaganda y contenido engañoso. Este fenómeno contribuye a la polarización social, erosiona la confianza en las fuentes de información y dificulta la distinción entre hechos y ficción, con profundas implicaciones para la cohesión social y el discurso público.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Memorización de Datos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Durante su proceso de entrenamiento, los LLMs pueden memorizar fragmentos específicos de los vastos conjuntos de datos que procesan. Si estos datos contienen información personal identificable (PII) o datos sensibles, existe el riesgo de que el modelo los revele involuntariamente durante la generación de respuestas. La probabilidad de esta fuga de información aumenta en modelos de mayor tamaño y en aquellos entrenados con datos duplicados, lo que subraya la necesidad de una gestión rigurosa de la privacidad en los conjuntos de entrenamiento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Envenenamiento de Datos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;El envenenamiento de datos implica la introducción deliberada de ejemplos maliciosos o sesgados en los conjuntos de entrenamiento de los LLMs. El objetivo es manipular el comportamiento del modelo, induciéndolo a generar resultados no deseados o a facilitar ataques de puerta trasera (backdoor attacks). En estos ataques, el modelo es condicionado para ejecutar una acción maliciosa específica cuando se le presenta un "disparador" particular. Esta forma de sabotaje compromete la fiabilidad y la seguridad del modelo desde su fase de entrenamiento, afectando su rendimiento y su comportamiento ético.&lt;/p&gt;

&lt;h3&gt;
  
  
  Estrategias de Defensa: Medidas de Prevención Contra el Mal Uso de los LLMs
&lt;/h3&gt;

&lt;p&gt;Frente a las amenazas identificadas, la comunidad científica y tecnológica ha desarrollado y está implementando diversas estrategias para salvaguardar la integridad y la seguridad de los LLMs. Estas medidas buscan mitigar los riesgos asociados a su uso malicioso y fortalecer su robustez.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Detección de Contenido&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Una línea fundamental de defensa es la capacidad de discernir entre contenido generado por humanos y por IA. Esto es crucial para combatir la desinformación y el plagio. Técnicas como el watermarking (marca de agua digital) permiten incrustar una huella digital imperceptible en el texto generado por LLMs, facilitando su identificación algorítmica. Asimismo, se emplean enfoques discriminatorios, que utilizan modelos de clasificación binaria para diferenciar el texto humano del artificial. No obstante, la efectividad de estas medidas puede verse comprometida por técnicas de parafraseo o la reescritura del contenido por otros LLMs, lo que exige una evolución constante de los métodos de detección.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Red Teaming&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;El red teaming es una metodología proactiva que implica la formación de equipos (compuestos por humanos o incluso otros LLMs) con la misión de identificar y explotar deliberadamente las debilidades de seguridad de un LLM. Al simular ataques y explorar vulnerabilidades, los desarrolladores pueden fortalecer las defensas del modelo contra la generación de contenido dañino o comportamientos indeseados. Esta práctica es esencial para descubrir fallos antes de que sean explotados por actores maliciosos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Filtrado de Contenido de LLM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Más allá de la detección post-generación, el filtrado de contenido busca prevenir que los LLMs produzcan lenguaje inapropiado o dañino. Esto se logra mediante la implementación de filtros y reglas que guían el comportamiento del modelo, a menudo a través de un ajuste fino (fine-tuning) que inculca principios de seguridad y ética. El objetivo es que el LLM internalice estas restricciones y evite la generación de contenido perjudicial.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Salvaguarda Mediante Aprendizaje por Refuerzo a partir de la Retroalimentación Humana (RLHF)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;El RLHF es una técnica avanzada que adapta directamente el comportamiento de los LLMs. A través de la retroalimentación humana, el modelo aprende a preferir respuestas que son consideradas útiles y seguras, y a rechazar aquellas que son dañinas. Sin embargo, el estudio advierte sobre el riesgo de un "comportamiento de seguridad exagerado", donde el modelo puede volverse excesivamente cauteloso y negarse a responder a consultas legítimas, comprometiendo su utilidad en aras de una seguridad extrema. El desafío reside en encontrar un equilibrio óptimo entre la utilidad y la seguridad.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Seguridad Mediante el Seguimiento de Instrucciones&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Esta línea de investigación explora la capacidad de los LLMs para autocorregirse moralmente a través de instrucciones explícitas proporcionadas en el prompt. Se ha observado que los modelos de mayor escala demuestran una mayor aptitud para seguir estas directrices y ajustar su comportamiento en consecuencia, lo que sugiere un potencial para la implementación de códigos de conducta directamente en la interacción con el usuario.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Métodos para Evitar la Memorización&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para contrarrestar la fuga de información sensible, se están desarrollando métodos que reducen la propensión de los LLMs a memorizar datos de entrenamiento. Esto incluye técnicas de aprendizaje por refuerzo que promueven la parafraseo en lugar de la repetición literal, y el prompt-tuning con preservación de la privacidad, diseñado para ajustar el modelo sin comprometer la confidencialidad de los datos. El objetivo es garantizar la inteligencia del modelo sin sacrificar la privacidad.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Métodos para Evitar el Envenenamiento de Datos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La protección contra el envenenamiento de datos y los ataques de puerta trasera es crucial. Las defensas incluyen el uso de puntuaciones de perplejidad para identificar patrones anómalos, la aplicación de perturbaciones robustas para reducir la sensibilidad del modelo a modificaciones maliciosas, y el análisis detallado de las representaciones internas y características del modelo. También se exploran defensas basadas en gradientes y atribución, que buscan rastrear el origen de las influencias en el comportamiento del modelo, con el fin de construir LLMs resilientes al sabotaje y capaces de identificar y rechazar información maliciosa en sus datos de entrenamiento.&lt;/p&gt;

&lt;h3&gt;
  
  
  Puntos de Explotación: Vulnerabilidades en la Arquitectura de los LLMs
&lt;/h3&gt;

&lt;p&gt;A pesar de la implementación de medidas preventivas, los LLMs presentan vulnerabilidades inherentes que pueden ser explotadas por actores maliciosos para eludir las salvaguardas establecidas. El estudio destaca dos categorías principales de estas vulnerabilidades:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Inyección de Prompts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La inyección de prompts es una técnica mediante la cual un usuario malintencionado manipula o extrae las instrucciones internas (el "prompt del sistema") que guían el comportamiento de un LLM. Esta vulnerabilidad se manifiesta de dos formas principales:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Secuestro de Objetivo (Goal Hijacking): Consiste en la introducción de un prompt que anula o sobrescribe las directrices originales del sistema, forzando al modelo a generar contenido que, bajo sus reglas preestablecidas, debería rechazar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fuga de Prompt (Prompt Leaking): Implica inducir al LLM a revelar su propio prompt del sistema. El conocimiento de estas instrucciones internas puede facilitar a los atacantes la identificación de métodos más efectivos para eludir las defensas del modelo. Es importante señalar que estos ataques pueden ser indirectos, ocultando prompts maliciosos en fuentes de datos externas (como el código HTML de sitios web) que el LLM procesa. Incluso se ha demostrado la inyección de prompts en modelos multimodales, donde elementos como imágenes o sonidos pueden contener la "inyección" maliciosa.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Jailbreaking&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;El jailbreaking se refiere a la creación de prompts diseñados para eludir los filtros de seguridad de los LLMs, induciéndolos a generar contenido no deseado o inapropiado. A diferencia de la inyección de prompts, el jailbreaking no siempre requiere acceso al prompt del sistema, sino que se basa en la manipulación de la interacción para sortear las restricciones del modelo. Ejemplos notables incluyen el uso de técnicas como "DAN" (Do Anything Now) o la simulación de personalidades que carecen de restricciones éticas.&lt;/p&gt;

&lt;p&gt;Un aspecto preocupante del jailbreaking es su potencial para ser "universal" (efectivo en múltiples modelos) y "transferible" (si funciona en un modelo, es probable que funcione en otros). Además, se ha descubierto que el jailbreaking no solo puede utilizarse para generar lenguaje dañino, sino también para extraer información personal identificable (PII) que el modelo haya memorizado. El estudio atribuye estas vulnerabilidades a la existencia de "objetivos en conflicto" dentro del modelo (la tensión entre ser útil y ser seguro) y a una "generalización desajustada" (la incapacidad del modelo para manejar ciertos tipos de prompts maliciosos para los que no fue específicamente entrenado).&lt;/p&gt;

&lt;h3&gt;
  
  
  Consideraciones Finales: El Futuro de la Seguridad en la Inteligencia Artificial
&lt;/h3&gt;

&lt;p&gt;La rápida adopción y la visibilidad pública de los LLMs, ejemplificadas por el crecimiento exponencial de plataformas como ChatGPT, han puesto de manifiesto tanto su extraordinario potencial como los profundos desafíos éticos y de seguridad que conllevan. El estudio de Mozes et al. subraya la imperativa necesidad de una investigación rigurosa y continua para abordar estas complejidades.&lt;/p&gt;

&lt;p&gt;Es fundamental que la comunidad científica y tecnológica priorice la investigación revisada por pares para validar y contextualizar las amenazas reales que los LLMs presentan en la actualidad. La velocidad con la que emergen nuevas investigaciones, a menudo sin el escrutinio de la revisión por pares, puede generar una percepción distorsionada de los riesgos, desviando la atención de problemas tangibles como la desinformación masiva o el fraude automatizado. La validación científica es crucial para asegurar que los esfuerzos de mitigación se dirijan a los desafíos más pertinentes y urgentes.&lt;/p&gt;

&lt;p&gt;Las limitaciones inherentes a la seguridad de los LLMs reflejan un dilema fundamental: la tensión entre la maximización de la utilidad y la garantía de la seguridad. No existe una solución única que elimine completamente los comportamientos no deseados sin introducir nuevas vulnerabilidades o comprometer la funcionalidad del modelo. El futuro de la seguridad habilitada por LLMs plantea interrogantes complejos sobre la adicción tecnológica, la privacidad de los datos, la equidad en el acceso a estas tecnologías y la posibilidad de que los propios LLMs desarrollen comportamientos engañosos o sean susceptibles a la persuasión.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implicaciones y Responsabilidades
&lt;/h3&gt;

&lt;p&gt;Para los usuarios, es esencial desarrollar un pensamiento crítico y una alfabetización digital avanzada para evaluar la información generada por IA. Para los desarrolladores y las organizaciones, la responsabilidad de diseñar, implementar y desplegar LLMs de manera segura y ética es primordial. Para la sociedad en su conjunto, se requiere un compromiso sostenido con la investigación, el diálogo interdisciplinario y la formulación de políticas públicas informadas que permitan navegar este complejo paisaje tecnológico de manera responsable.&lt;/p&gt;

&lt;p&gt;Los LLMs son herramientas transformadoras que están redefiniendo nuestra interacción con el conocimiento y la tecnología. Comprender sus riesgos y trabajar proactivamente para mitigarlos es un paso indispensable para asegurar que su impacto sea, en última instancia, beneficioso y constructivo para la humanidad.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fuentes&lt;/strong&gt;&lt;br&gt;
Use of LLMs for Illicit Purposes: Threats, Prevention Measures, and&lt;br&gt;
Vulnerabilities, Maximilian Mozes, Xuanli He, Bennett Kleinberg, Lewis D. Griffin, Aug 2023.&lt;/p&gt;

</description>
      <category>ia</category>
      <category>security</category>
      <category>programming</category>
    </item>
    <item>
      <title>Fractals and Amazon Q Developer</title>
      <dc:creator>Andres Ramirez</dc:creator>
      <pubDate>Tue, 06 May 2025 04:14:39 +0000</pubDate>
      <link>https://dev.to/gara501/fractals-and-amazon-q-c58</link>
      <guid>https://dev.to/gara501/fractals-and-amazon-q-c58</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/aws-amazon-q-v2025-04-30"&gt;Amazon Q Developer "Quack The Code" Challenge&lt;/a&gt;: That's Entertainment!&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I did an interactive application using ThreeJS, Audio API, and Shaders, 9 scenes show different interactive fractals and effects applied.&lt;br&gt;
You can access it from a cellphone or a computer. I recommend using headphones to enjoy the experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  URL Parameters
&lt;/h2&gt;

&lt;p&gt;You can switch between different initial visual modes using URL parameters, this will apply only to the first scene:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;?effect=basic&lt;/code&gt; - Basic 3D scene with objects&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;?effect=psychedelic&lt;/code&gt; - Psychedelic shader effect&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;?effect=crt&lt;/code&gt; - CRT distortion effect (default)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://gara501.github.io/amazonqchallenge/" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Repository
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/gara501/amazonqchallenge" rel="noopener noreferrer"&gt;Code&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Amazon Q Developer
&lt;/h2&gt;

&lt;p&gt;I created a super big prompt following some rules like: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assigning a personality to the IA (You are a WebGL Expert)&lt;/li&gt;
&lt;li&gt;Detailed instructions in each scene to create the screens and the shaders&lt;/li&gt;
&lt;li&gt;Added a basic structure and mapped the audio files, I get the files from pixabay (royalty free files).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prompt
&lt;/h2&gt;

&lt;p&gt;You are an expert in Shaders, webGL and ThreeJS. Create a minimal HTML file for a WebGL-based demo using Three.js. The canvas must fill the entire browser window with no scrollbars and load a JavaScript module named main.js. In main.js, do the following:&lt;/p&gt;

&lt;p&gt;Scene 1: Psychedelic Intro&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Create a full-screen plane using a custom ShaderMaterial.&lt;br&gt;
Pass u_time and u_resolution as uniforms to both vertex and fragment shaders.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Animate the scene using requestAnimationFrame.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write a basic vertex shader that directly passes the vertex position to gl_Position.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write a fragment shader that displays a colorful, animated, psychedelic effect using sine and cosine waves. Colors should change over time to evoke a retro 90s visual style.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Overlay a CRT-style distortion effect: simulate scanlines, screen curvature, and RGB channel offsets to mimic an old monitor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a scrolling text banner like the Star Wars intro (from bottom to top), using either HTML/CSS or a Three.js text mesh.&lt;br&gt;
Load and autoplay a looping background track (assets/music1.mp3). &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Handle browser autoplay restrictions and add a button to mute/unmute the music.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Scenes 2 to 6: Interactive Fractal Visuals&lt;br&gt;
For each of the following five full-screen WebGL scenes, use a new fragment shader and its own background music:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In Scene 2 (Sierpinski): X-axis controls scale, Y-axis controls variation

&lt;ul&gt;
&lt;li&gt;In Scene 3 (Julia): Mouse position changes the constants in the Julia set equation&lt;/li&gt;
&lt;li&gt;In Scene 4 (Mandelbrot): Mouse position changes the view offset&lt;/li&gt;
&lt;li&gt;In Scene 5 (Newton-Raphson): X-axis controls polynomial degree, Y-axis controls relaxation factor&lt;/li&gt;
&lt;li&gt;In Scene 6 (Menger Sponge): X-axis controls scale, Y-axis controls variation&lt;/li&gt;
&lt;li&gt;In Scene 7 (Koch Curve): X-axis controls scale, Y-axis controls iterations&lt;/li&gt;
&lt;li&gt;In Scene 8 (Blood Vessels): X-axis controls scale, Y-axis controls detail&lt;/li&gt;
&lt;li&gt;In Scene 9 (Atoms): X-axis controls atom size, Y-axis controls number of electrons&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;For all fractal scenes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use ShaderMaterial with full-screen fragment shaders.&lt;/li&gt;
&lt;li&gt;Use u_time, u_resolution, and u_mouse as uniforms.&lt;/li&gt;
&lt;li&gt;Update fractal constants dynamically based on mouse movement.&lt;/li&gt;
&lt;li&gt;Each scene should render and update in real time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Navigation&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a menu on the main page to switch between all the scenes.&lt;/li&gt;
&lt;li&gt;When a scene loads, the corresponding music file should also load and autoplay.&lt;/li&gt;
&lt;li&gt;For each scene containing a fractal, implement real-time dynamic interaction based on mouse movement. The mouse position should modify the constants used in the fractal’s equation. Each shader must include u_time and u_resolution uniforms, and the fractal should be rendered in real time. Create a navigation button on the main page that links to each individual fractal scene. Additionally, load and play the corresponding .mp3 audio file for each scene when it loads.&lt;/li&gt;
&lt;li&gt;In all scenes that display fractals, add a fixed text element centered on the screen. This text should show the mathematical formula of the corresponding fractal. Ensure the text has a legible color with sufficient contrast against the background. Additionally, implement a subtle flowing animation (e.g., shimmer or gentle wave) triggered when the user hovers the mouse over the text.&lt;/li&gt;
&lt;li&gt; Add this text in the center of the screen in the scene 9: "In the sacred dance of the universe, fractals mirror the infinite within the finite, each pattern echoing the breath of creation. Quantum physics whispers that reality is not solid, but woven from probabilities—just as fractals emerge from simple laws into endless complexity. In this harmony, spirit and science converge, revealing that the cosmos may be a divine self-reflecting dream." This quote won't overlap the formula text,&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Notes
&lt;/h2&gt;

&lt;p&gt;Check the README in github to see all the documentation, which algorithms used, etc. &lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>awschallenge</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Permit Io in game development? why not!</title>
      <dc:creator>Andres Ramirez</dc:creator>
      <pubDate>Fri, 02 May 2025 05:11:03 +0000</pubDate>
      <link>https://dev.to/gara501/permit-io-in-game-development-why-not-55c0</link>
      <guid>https://dev.to/gara501/permit-io-in-game-development-why-not-55c0</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/permit_io"&gt;Permit.io Authorization Challenge&lt;/a&gt;: API-First Authorization Reimagined&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;My intention with this project is to have a different approach to create Role Games in Javascript (or any other language in the front side, like Python, Lua, even Unity), I made a set or roles and resources based on a simple definition of elements, in this case a super basic role game with 4 different characters (Elf, Wizard, Warrior, Dwarf), each character has its abilities, weapons, curses, etc.&lt;/p&gt;

&lt;p&gt;This approach isolates the logic of abilities, weapons, and other stuff for each character from the game logic. If I want to change a character's abilities, I only need to go to Permit IO Interface and change the policies, which will be reflected directly in the game without touching the game code. &lt;/p&gt;

&lt;p&gt;The API returns the list of Resources (abilities, weapons, armor, etc) and players (roles in Permit IO).&lt;/p&gt;

&lt;p&gt;The free version of Permit IO doesn't allow me to create resourceTypes using the SDK (nodejs). I tried this approach that could be implemented in the full version, allowing the application to be more dynamic, avoiding using Permit IO UI.&lt;/p&gt;

&lt;p&gt;Finally, I made a &lt;em&gt;backend&lt;/em&gt; using Express and NodeJS, &lt;em&gt;frontend&lt;/em&gt; using React/Tailwind/DaisyUI to show the data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

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

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

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

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

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

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/mW5r1emQWrw"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Repo
&lt;/h2&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/gara501/permithackaton" rel="noopener noreferrer"&gt;Permit Hackaton&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My Journey
&lt;/h2&gt;

&lt;p&gt;I like to organize logic into layers, and my approach to this project was based on that principle. I began by researching different ways to integrate Permit.io and decided to try something unique by applying its authorization logic to a role-playing game (RPG) configurator, since I enjoy creating video games.&lt;/p&gt;

&lt;p&gt;Initially, I encountered problems when attempting to use ES Modules in Node.js. Each time I enabled "type": "module" and utilized import statements, the Permit.io library would fail. After investing almost six hours trying to fix it, I ultimately reverted to the require method—a more conventional CommonJS approach, which functioned reliably.&lt;/p&gt;

&lt;p&gt;Second, when finally my backend worked, I built a Node.js API and tested a few basic calls following Permit.io’s documentation. Once I had a working prototype, I explored more advanced ideas, such as dynamically creating resources and policies. Unfortunately, that part didn’t work as expected, so I reviewed the latest version of the Permit.io API to troubleshoot and adapt.&lt;/p&gt;

&lt;p&gt;Third, I created a screen that displays players along with their roles and access permissions. These settings will later be reflected directly in the gameplay, forming the foundation for role-based interactions in the RPG.&lt;/p&gt;

&lt;p&gt;Fourth, I created the frontend using React/Typescript/Tailwind/Vite to provide a good option for showing the resources, players, and configurations. Only the admins can change elements in this interface. Permit IO and Clerk (to manage User Login and JWT) also manage this logic, which works well with Permit IO. &lt;/p&gt;

&lt;h2&gt;
  
  
  API-First Authorization
&lt;/h2&gt;

&lt;p&gt;Based on the number of characters in my game, I added four &lt;em&gt;Roles&lt;/em&gt;, each Role represents a character in my game.&lt;br&gt;
These roles have different rules, the rules are related to the items (an item can be an ability, a weapon, a magic, a curse, etc). These items are saved in Permit IO as a &lt;em&gt;Resources&lt;/em&gt;.&lt;br&gt;
All this configuration is possible using the SDK via my Backend. With my UI connected to those services, I'm calling different functions to create roles and assign permissions to them.&lt;br&gt;
You can find this functionality in two sections: &lt;code&gt;create character&lt;/code&gt; and &lt;code&gt;create actions&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This approach gives me much flexibility if I need to change each character's abilities, weapons, etc. without touching my frontend/backend code, which is perfect when I need to manage &lt;em&gt;separation of concerns&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I created a middleware in my backend to verify the access via Permit IO, using &lt;code&gt;permit.check&lt;/code&gt;.&lt;br&gt;
I get the Resources using &lt;code&gt;permit.api.resources.list()&lt;/code&gt;&lt;br&gt;
I get the Players using &lt;code&gt;permit.api.roles.list()&lt;/code&gt;&lt;br&gt;
I create new Players from the UI using &lt;code&gt;permit.api.roles.create()&lt;/code&gt;&lt;br&gt;
I create new items and actions for a player using &lt;code&gt;permit.api.updateRole&lt;/code&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>permitchallenge</category>
      <category>webdev</category>
      <category>security</category>
    </item>
    <item>
      <title>Recursos para crear Juegos</title>
      <dc:creator>Andres Ramirez</dc:creator>
      <pubDate>Wed, 24 Jul 2024 15:18:45 +0000</pubDate>
      <link>https://dev.to/gara501/recursos-para-crear-juegos-3j1l</link>
      <guid>https://dev.to/gara501/recursos-para-crear-juegos-3j1l</guid>
      <description>&lt;p&gt;De las cosas mas complejas al iniciar a crear juegos es saber como abordar la gran cantidad de perfiles que se necesitan, desde el sonido hasta el script sin olvidar la parte gráfica.&lt;/p&gt;

&lt;p&gt;Esta es una lista de algunos recursos que he usado para crear juegos en 2D, cabe resaltar que puede servir también para juegos en 3D, pero mi experiencia es mas orientada hacia lo primero.&lt;/p&gt;

&lt;p&gt;Para empezar debemos tener en cuenta, que hay que cubrir una cantidad considerable de aristas, también dependiendo de la técnica que pensemos usar (Rotoscopia, Pixelart, etc):&lt;/p&gt;

&lt;p&gt;Esta lista es solo una propuesta, en la mayoría con software open source o con costos muy bajos.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Graficos&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Si vamos a usar pixelart, tenemos opciones como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.aseprite.org/" rel="noopener noreferrer"&gt;Aseprite&lt;/a&gt; (Mi preferida)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.piskelapp.com/" rel="noopener noreferrer"&gt;Piskel&lt;/a&gt; (Buena opcion gratis)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.pixilart.com/" rel="noopener noreferrer"&gt;Pixilart&lt;/a&gt; (Online)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.adobe.com/products/photoshop.html?clickref=1101lyLxN8fY&amp;amp;mv=affiliate&amp;amp;mv2=pz&amp;amp;as_camptype=&amp;amp;as_channel=affiliate&amp;amp;as_source=partnerize&amp;amp;as_campaign=artturijalli" rel="noopener noreferrer"&gt;Photoshop&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para edición de assets, tenemos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.gimp.org/" rel="noopener noreferrer"&gt;Gimp&lt;/a&gt; (Open source)&lt;/li&gt;
&lt;li&gt;Photoshop (De pago)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Sonidos&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.reaper.fm/" rel="noopener noreferrer"&gt;Reaper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.audacityteam.org/" rel="noopener noreferrer"&gt;Audacity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sfxr.me/" rel="noopener noreferrer"&gt;Sfxr&lt;/a&gt; (Para crear sonidos de 8 bits, genial para juegos retro)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Motor de desarrollo&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://unity.com/" rel="noopener noreferrer"&gt;Unity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://godotengine.org/" rel="noopener noreferrer"&gt;Godot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.construct.net/en" rel="noopener noreferrer"&gt;Construct&lt;/a&gt; (De pago)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://defold.com/" rel="noopener noreferrer"&gt;Defold&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rpgmakerweb.com/" rel="noopener noreferrer"&gt;RPG Maker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gamemaker.io/en" rel="noopener noreferrer"&gt;Game Maker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.unrealengine.com/en-US" rel="noopener noreferrer"&gt;Unreal Engine&lt;/a&gt; (Solo 3D)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Storyboard&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.office.com/" rel="noopener noreferrer"&gt;Microsoft Word&lt;/a&gt; o cualquier otro editor de texto, acá lo mas importante es aprender a ensamblar una historia coherente, aprender a crear personajes, este &lt;a href="https://www.spacedraft.com/knowledge-base/video-game-script-writing-html/" rel="noopener noreferrer"&gt;post puede servir como guia&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Assets&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Muchas veces no tenemos tiempo o el conocimiento para crear toda la parte artistica desde 0, estos son algunos recursos de assets para juegos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://opengameart.org/" rel="noopener noreferrer"&gt;Open Game Art&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://itch.io/" rel="noopener noreferrer"&gt;Itch Io&lt;/a&gt; (Mi preferida)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kenney.nl/" rel="noopener noreferrer"&gt;Kenney&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://craftpix.net/" rel="noopener noreferrer"&gt;CraftPix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.artstation.com/marketplace/game-dev/assets" rel="noopener noreferrer"&gt;ArtStation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.gamedevmarket.net/" rel="noopener noreferrer"&gt;DevMarket&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Project Management&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Para llevar las tareas y tiempos de nuestro proyecto tenemos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://monday.com/" rel="noopener noreferrer"&gt;Monday&lt;/a&gt; (Tiene version gratis)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.notion.so/" rel="noopener noreferrer"&gt;Notion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://trello.com/" rel="noopener noreferrer"&gt;Trello&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.airtable.com/" rel="noopener noreferrer"&gt;Airtable&lt;/a&gt; (Tiene version gratis)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Documentación&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Es importante siempre documentar el proceso, desde &lt;a href="https://gamedevbeginner.com/how-to-write-a-game-design-document-with-examples/" rel="noopener noreferrer"&gt;nuestro GDD&lt;/a&gt; hasta el postmortem. En esta &lt;a href="https://gamescrye.com/resources/game-design-documents/" rel="noopener noreferrer"&gt;lista&lt;/a&gt; hay varios GDD de juegos AAA que sirven de ejemplo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.dundoc.com/" rel="noopener noreferrer"&gt;Dundoc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chatgpt.com/g/g-ITsZga7Ed-game-design-document-gdd-maker" rel="noopener noreferrer"&gt;ChatGPT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://milanote.com/guide/game-design-document" rel="noopener noreferrer"&gt;Milanote&lt;/a&gt; (Esta es una plataforma completa)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Seguramente muchas buenas herramientas se me quedan por fuera de este listado, sientase libre de aportar mas que usted conozca. &lt;/p&gt;

&lt;p&gt;Happy Coding!&lt;/p&gt;

</description>
      <category>videogames</category>
      <category>indie</category>
    </item>
    <item>
      <title>Motivation, the neglected superpower.</title>
      <dc:creator>Andres Ramirez</dc:creator>
      <pubDate>Fri, 19 Apr 2024 17:05:20 +0000</pubDate>
      <link>https://dev.to/gara501/motivation-the-neglected-superpower-2m4g</link>
      <guid>https://dev.to/gara501/motivation-the-neglected-superpower-2m4g</guid>
      <description>&lt;p&gt;I have many years working in the tech world, as a programmer, analyst, hardware, etc, and my last 20 years as a software developer. So many hours in front of a screen that I lost track of how many weekends I spent reading documentation or just writing code for fun, is my decision, and I don't have regrets about it. But sometimes is hard to keep the energy up, and maintain the mindset, sometimes we just need a break from everything and organize my mind mess, I started to study when we didn't have social networks, using tech books and meeting with other people interested in the same things. &lt;/p&gt;

&lt;p&gt;I was full of expectations about the future, young, and energized, but maintaining that mindset through the years is not an easy job, I felt burned a couple of times due to some projects, 35 hours days, and no weekends for months, I thought I could manage this level forever, I was wrong, my body started to feel bad, to many hours seated destroyed my back, I use glasses now too and yes, overweight and bad habits (yeyyy pizza nights overtime) was killing me.&lt;/p&gt;

&lt;p&gt;All these variables were affecting me in so many ways, I started to lose motivation to learn, to do my job, spend too much time using social networks, sleep badly, consume innutritious food, and another important factor, I'm not in my 20s.&lt;/p&gt;

&lt;p&gt;This lack of motivation and energy forced me to make a change, I started to learn a little bit about neuroscience, habits, and how the brain works. &lt;br&gt;
This is the core of everything, how your mind is affected by your behavior, how a simple action day after day starts to build how you react and think, and this affects every single aspect of your life, not only in your job, this affects all your life layers.&lt;/p&gt;

&lt;p&gt;But let's talk about motivation, currently is too diminished by gurus who say: "Motivation is not important, is temporary, what you need is discipline". &lt;/p&gt;

&lt;p&gt;Motivation by definition: Motivation refers to the psychological forces that drive and direct our behavior toward achieving a particular goal or outcome. This force can be intrinsic or extrinsic, intrinsic is how you feel about the goal, and extrinsic is what you will win with the goal (recognition, fame, etc). Is a fundamental skill to interact with the world, all animals share the motivation to obtain their basic needs, including food, water, sex, and social interaction.&lt;/p&gt;

&lt;p&gt;Motivation is directly related to brain functionality and can be affected by two different frames, pathologies like schizophrenia and affective disorders and pathologic behavior problems like addictions or affective disorders.&lt;/p&gt;

&lt;p&gt;Now you have a better idea about my point. To be motivated you need to accomplish a couple of points, and these points are based on how motivation works in the brain. &lt;br&gt;
How the brain interprets motivation could be defined as:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Costs: How much effort will you need to finish the task? This includes time, pain, discomfort, lost opportunities, etc.&lt;/li&gt;
&lt;li&gt;Benefits: What will do I win with this?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In between of these you will find:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Physiological state: Deprivation, stress, health.&lt;/li&gt;
&lt;li&gt;Environment: availability of goal, response opportunity.&lt;/li&gt;
&lt;li&gt;Past history: Experience of goals, responses, and stimuli.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In terms of have a good state to be motivated, we need to have in mind these points:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Respect your body, yes, go to the gym, park, or in your home, but you need to spend at least 1 hour a day doing some exercise (strength exercise is highly recommended).
Check &lt;a href="https://www.muscleandstrength.com/workout-routines"&gt;these free workouts&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Eat better; food is your brain's fuel, and if you want a healthy brain, you need to eat healthy food. You can have a couple of &lt;a href="https://www.helpguide.org/articles/healthy-eating/healthy-eating.htm"&gt;ideas here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Sleep well, this is one of the most important points to having a healthy brain. &lt;a href="https://gmb.io/sleep/?utm_campaign=16382884749&amp;amp;utm_source=x&amp;amp;utm_medium=cpc&amp;amp;utm_content&amp;amp;utm_term&amp;amp;seg_aprod&amp;amp;ad_id&amp;amp;gad_source=1&amp;amp;gclid=CjwKCAjwrIixBhBbEiwACEqDJXCRJBg7Mkwxk3k3oXOiVXOynnMAErXsm3LTH5IzhCobVl2mTyxyphoCEQkQAvD_BwE"&gt;How to improve your sleep Habits&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Define your goals, and be concise, I know sometimes it is super boring to be structured, but this will give you a path to track your improvements. &lt;a href="https://www.atlassian.com/blog/productivity/how-to-write-smart-goals"&gt;SMART methodology is great for this&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Define your reasons for doing the things you want to do. Could be for fun or something to improve your career, but you need to be clear about why are you doing that task, this is directly related to intrinsic/extrinsic motivation and is a key point to maintaining energy.&lt;/li&gt;
&lt;li&gt;Don't punish yourself. You are a human, embrace the failure, learn, and start again with more knowledge. The problem is not to fail, is to punish yourself so badly, that it destroys your self-confidence. Check this article about &lt;a href="https://www.verywellmind.com/imposter-syndrome-and-social-anxiety-disorder-4156469"&gt;imposter syndrome&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Develop critical thinking. Critical thinking is the ability to evaluate facts and information, remain objective, and make a sound decision about how to move forward. This is a way to develop good emotional intelligence, this gives you the capacity to identify if your goal makes sense.&lt;/li&gt;
&lt;li&gt;Regulate time using social networks, porn, video games, and all the sources of dopamine, excessive dopamine segregation affects directly and hardly how motivation works in your brain. Check how &lt;a href="https://www.verywellmind.com/what-is-dopamine-5185621"&gt;dopamine works in the brain&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Motivation is not only the result of an internal voice that says: "go, you can do it", or consuming a lot of self-help books or videos, is how your brain works based on your beliefs, your habits, your knowledge, and your ideas, you can build a strong mind but you need to care your body too, everything is interconnected.&lt;/p&gt;

</description>
      <category>health</category>
      <category>programming</category>
      <category>habits</category>
    </item>
    <item>
      <title>Creando una máquina de Estados Finito en Godot</title>
      <dc:creator>Andres Ramirez</dc:creator>
      <pubDate>Sun, 12 Nov 2023 04:16:34 +0000</pubDate>
      <link>https://dev.to/gara501/creando-una-maquina-de-estados-finito-en-godot-1e7o</link>
      <guid>https://dev.to/gara501/creando-una-maquina-de-estados-finito-en-godot-1e7o</guid>
      <description>&lt;p&gt;Dentro de las multiples técnicas para desarrollar la lógica de un personaje y la interacción entre las diferentes acciones que realiza en nuestro juego, encontramos un patrón muy interesante y es el de  las maquinas de estado finito. Pero primero definamos que es una maquina de estádo finito.&lt;/p&gt;

&lt;h2&gt;
  
  
  Máquinas de estádo Finito
&lt;/h2&gt;

&lt;p&gt;Las máquinas de estádo finito también llamado Automata finito, es una abstracción computacional que describe el comportamiento de un sistema reactivo mediante un número determinado de Estados y un número determinado de Transiciones entre dicho Estados.&lt;/p&gt;

&lt;p&gt;Las Transiciones de un estado a otro se generan en respuesta a eventos de entrada externos e internos; a su vez estas transiciones y/o subsecuentes estados pueden generar otros eventos de salida. Esta dependencia de las acciones (respuesta) del sistema a los eventos de entrada hace que las Máquinas de Estádo Finito (MEF) sean una herramienta adecuada para el diseño de Sistemas Reactivos y la Programación Conducida por Eventos (Event Driven Programming), cual es el caso de la mayoría de los sistemas embebidos basados en microcontroladores o microprocesadores.&lt;/p&gt;

&lt;p&gt;En nuestro caso especifico, aplicamos este patrón en el desarrollo de videojuegos, para definir las diferentes acciones (y animaciones) de un personaje.&lt;/p&gt;

&lt;p&gt;Pero para entender mejor este concepto, definamos un personaje en Godot y definamos también 3 acciones básicas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Idle: Es la acción estática de nuestro personaje, va a tener una animación de "respirar".&lt;/li&gt;
&lt;li&gt;Move: Es la acción de mover nuestro personaje, y la animación va a corresponder a una serie de frames que simulan el efecto de correr.&lt;/li&gt;
&lt;li&gt;Jump: Acción de saltar, nuestra animación va a constar de 2 o mas frames que simulan la acción de salto.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Definiendo el Proyecto
&lt;/h2&gt;

&lt;p&gt;Primero, vamos a descargar una serie de assets gratuitos para poder hacer nuestra práctica, los pueden &lt;a href="https://pixelfrog-assets.itch.io/pixel-adventure-1"&gt;encontrar acá&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Luego vamos a crear un nuevo proyecto, y en la ventana de nodo, vamos a agregar un nodo de tipo character body 2D.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aB7lYqxW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kd9pewpzdnk9u506241l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aB7lYqxW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kd9pewpzdnk9u506241l.png" alt="1" width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Despues adicionamos tres subnodos mas: 

&lt;ul&gt;
&lt;li&gt;Sprite2D, el cual va a contener nuestros sprites.&lt;/li&gt;
&lt;li&gt;AnimationPlayer: El cual va a contener nuestras animaciones.&lt;/li&gt;
&lt;li&gt;CollisionShape2D: El que va a definir nuestro marco de colisión.&lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5zl74LAG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r5q6hcg2r9rqwuzrvmqs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5zl74LAG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r5q6hcg2r9rqwuzrvmqs.png" alt="2" width="800" height="505"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Luego creamos una carpeta Assets en la raíz del proyecto y arrastramos todos los archivos que hemos descargado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--syix21p7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8w75aah7qj0yr9hjn8am.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--syix21p7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8w75aah7qj0yr9hjn8am.png" alt="3" width="800" height="671"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El siguiente paso es renombrar nuestro nodo principal por "Player" y vamos a adicionar un nuevo script. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fzoRJaWa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a5n4qzgyy573t0t1mupc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fzoRJaWa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a5n4qzgyy573t0t1mupc.png" alt="Adicionando Script" width="800" height="594"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ahora, creamos un nuevo nodo (no el 2D, el que viene solito) para definir nuestra máquina de estados y lo renombramos como "state machine"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tX8Sb2th--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1qe6xbiwm2hhj17l58tv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tX8Sb2th--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1qe6xbiwm2hhj17l58tv.png" alt="maquina de estados" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adicionamos los estádos como nodos hijo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XyMo_Soo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8qp842p4qjhk0zgt3xfd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XyMo_Soo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8qp842p4qjhk0zgt3xfd.png" alt="nodos hijo" width="777" height="722"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Procedemos a crear un script genéral, es decir, este script no va a depender de un nodo, lo cual nos va a permitir rehusarlo si así lo requerimos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VAEYhW48--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rou7s3jtnfwsyh1i2ygq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VAEYhW48--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rou7s3jtnfwsyh1i2ygq.png" alt="script" width="800" height="657"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cGpZ45l2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ukyl26uqc8pgo345xlyh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cGpZ45l2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ukyl26uqc8pgo345xlyh.png" alt="script2" width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;En este archivo lo que haremos será crear una clase padre de la cual los estados independientes van a heredar su funcionalidad, en las funciones que vamos a definir, vamos a recibir los llamados a las funciones nativas del &lt;a href="https://docs.godotengine.org/en/stable/classes/class_node.html"&gt;ciclo de vida de Godot&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---4U1jKeL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c13t4v737et65hk4oi33.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---4U1jKeL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c13t4v737et65hk4oi33.png" alt="functions" width="800" height="772"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ahora vamos a crear una nueva clase llamada StateMachine, hay que recordar que al usar la definición class_name podremos referenciar nuestras clases desde otras clases.
En esta clase vamos a tener un poco mas de complejidad, lo primero es definir un Signal que se llama changeState, aca puedes ver que es un &lt;a href="https://docs.godotengine.org/en/stable/classes/class_signal.html#:~:text=Signal%20is%20a%20built%2Din,without%20directly%20referencing%20one%20another."&gt;Signal en Godot&lt;/a&gt; Este Signal nos va a permitir escuchar el cambio de estádo.
Luego definimos una variable initialState de tipo NodePath(), esto  lo definimos usando @export lo que en Godot significa que podemos anclar archivos o elementos desde el editor, es lo mismo que hacemos en Unity al exponer una variable en el editor, esta variable va a estar ligada a los estados que ya definimos en nuestros nodos.
Luego, creamos una variable state de tipo State (recuerden la clase que habiamos creado previamente) y va a recibir nuestra variable initialState, la cual contiene el nodo (donde estan definidos los estádos en el editor).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3fkAk0gs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n8031dywbzk7rs0zj7yr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3fkAk0gs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n8031dywbzk7rs0zj7yr.png" alt="StateMachine" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hasta acá vamos con la primera parte del tutorial, se que es un tema un poco denso especialmente si somos novatos, pero es cuestión de analizar y replicar hasta poder interiorizar. &lt;/p&gt;

&lt;p&gt;En el siguiente post vamos a sobreescribir las funciones que necesitamos en el StateMachine, y también, las funciones de cada estádo.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Godot Juorney</title>
      <dc:creator>Andres Ramirez</dc:creator>
      <pubDate>Fri, 10 Nov 2023 03:44:35 +0000</pubDate>
      <link>https://dev.to/gara501/godot-juorney-318h</link>
      <guid>https://dev.to/gara501/godot-juorney-318h</guid>
      <description>&lt;p&gt;En el mundo del game development hay bastantes herramientas hoy en día, y si hablamos de herramientas, tenemos que diferenciar entre 2 grandes grupos: las librerias y los game engines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Librerias&lt;/strong&gt;&lt;br&gt;
Son una serie de funciones que nos permiten acelerar el proceso de desarrollo, dentro de este contexto podría hablar de PhaserJS que es una libreria de JavaScript para desarrollar juegos, o incluso React y React Fiber, que es una abstracción de ThreeJS para React, en python tendríamos pygame, cocos2d, y así podría nombrar infinidad de librerias en diferentes lenguajes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Game Engines&lt;/strong&gt;&lt;br&gt;
Es el software especializado para crear juegos, podría decirse que es un todo en uno, donde encontramos un editor y multiples funcionalidades para llevar a cabo nuestro cometido, dentro de este marco tenemos a Unity, Unreal Engine, Construct, Defold, Godot, y &lt;a href="https://en.wikipedia.org/wiki/List_of_game_engines"&gt;otros cuantos más&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Godot&lt;/strong&gt;&lt;br&gt;
Ahora, especificamente esta serie de posts va a ser orientada al desarrollo con Godot, escogí Godot por su facilidad, versatilidad y por que es open source, y su gran mejora desde la version 4.0 y después de la polemica que se &lt;a href="https://www.vidaextra.com/industria/siento-unity-se-disculpa-desarrolladores-modifica-su-polemica-tarifa-usar-motor-grafico"&gt;armó con Unity&lt;/a&gt;, en general lo que buscaba era un entorno fácil de entender y que fuera agradable de programar, y sin duda fue algo que encontré en Godot y su lenguaje de Scripting GDScript (muy similar a Python).&lt;/p&gt;

&lt;p&gt;Afortunadamente el panorama de Godot está creciendo bastante y ya se encuentran tutoriales y cursos realmente buenos sobre este gran engine, en mi caso pienso subir tutoriales sobre temas especificos y trataré de ir referenciando buenos videos sobre las bases del editor.&lt;/p&gt;

&lt;p&gt;Los siguientes links son una lista de referencia para iniciar con las bases de este engine.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=itKLmCwGeNs&amp;amp;list=PLJ690cxlZTgL4i3sjTPRQTyrJ5TTkYJ2_&amp;amp;ab_channel=GodotTutorials"&gt;GDScript, curso básico&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=6YNKi3hcS5U&amp;amp;ab_channel=GameDevArtisan"&gt;Godot bases y fundamentos&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.godotengine.org/en/stable/"&gt;Documentación oficial de Godot&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eso si, todo está en inglés (sorry not sorry).&lt;/p&gt;

&lt;p&gt;En mi siguiente post, vamos a iniciar con algo muy básico, empezando con desarrollo 2D, vamos a crear un personaje principal y una maquina de estados, la idea es aprender desde 0 como desarrollar buen código, organizado y modular.&lt;/p&gt;

</description>
      <category>godot</category>
      <category>gamedev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>La práctica hace al programador</title>
      <dc:creator>Andres Ramirez</dc:creator>
      <pubDate>Sun, 11 Sep 2022 01:22:56 +0000</pubDate>
      <link>https://dev.to/gara501/la-practica-hace-al-programador-187o</link>
      <guid>https://dev.to/gara501/la-practica-hace-al-programador-187o</guid>
      <description>&lt;h2&gt;
  
  
  Hacer por hacer
&lt;/h2&gt;

&lt;p&gt;Uno de los principales problemas cuando empezamos a programar, es saber aplicar los nuevos conocimientos adquiridos después de leer un libro o hacer un curso, a veces las ideas no fluyen y terminamos encajonados en el marco de lo aprendido.&lt;br&gt;
En twitter y otras redes he visto incontables hilos de recursos para realizar proyectos, debo decir hay unos bastante interesantes (mas adelante pondré varios recursos), pero en ese punto es donde comencé a ver un problema y es el de realizar proyectos por que si, sin un objetivo claro, debo decir que cualquier práctica que hagamos nos va a servir a largo plazo, pero a veces el embarcarnos en proyectos al azar terminaremos perdiendo tiempo, lo veo similar al problema de la "cursitis", es decir, acumular cursos sin hacer proyectos donde se implemente y se extienda el conocimiento adquirido.&lt;br&gt;
Hay que recordar que la forma en la que el cerebro aprende se fundamenta en 3 partes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Asimilación del tema, es decir, pasar de lo abstracto a lo entendible, para esto usamos comparaciones y similes con acciones o elementos que ya entendamos previamente.&lt;/li&gt;
&lt;li&gt;Conocimiento, en este punto ya entendemos la idea principal pero aún no somos capaces de aplicarla en otros contextos (acá es donde se quedan los que sufren de "cursitis").&lt;/li&gt;
&lt;li&gt;Entendimiento, en este punto ya estamos en capacidad de aplicar lo aprendido y extenderlo a nuevos conceptos, acá el cerebro ya domina el tema y puede crear nuevas vertientes de conocimiento.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Organización
&lt;/h3&gt;

&lt;p&gt;Para prevenir ese problema, lo que podemos hacer es tener un sistema interno, es decir, ordenar nuestras ideas, para eso me gusta mucho usar checklists, ya que me permiten aterrizar las ideas y darles un "paso a paso" que puedo ir realizando sin que nada se me pase por alto.&lt;br&gt;
Este checklist será el resultado del análisis del proyecto y que quiero realizar, pero antes del checklist, debo definir el objetivo, vamos a ver un ejemplo:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Objetivo:&lt;/strong&gt; Aprender a estructurar una página estática de forma semántica y agregar la parte visual por medio de CSS definiendo variables para los colores y las estructuras.&lt;br&gt;
&lt;strong&gt;Proyecto:&lt;/strong&gt; Clonación de una Landing Page existente&lt;br&gt;
&lt;strong&gt;Herramientas:&lt;/strong&gt; Visual Studio Code, Live Server, HTML y CSS&lt;br&gt;
&lt;strong&gt;Librerias:&lt;/strong&gt; Ninguna.&lt;br&gt;
&lt;strong&gt;Tiempo:&lt;/strong&gt; 1 día&lt;br&gt;
&lt;strong&gt;Fecha de Inicio:&lt;/strong&gt; 20/09/2022&lt;br&gt;
&lt;strong&gt;Referencia:&lt;/strong&gt; &lt;a href="https://www.frontendmentor.io/challenges/intro-section-with-dropdown-navigation-ryaPetHE5"&gt;Front End Mentor&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Este es un ejemplo de la definición básica del proyecto que queremos realizar, vamos a prácticar una definición semántica del HTML y la implementación del código CSS, el siguiente paso sería la definición del CheckList&lt;/p&gt;

&lt;h3&gt;
  
  
  Definiendo el CheckList
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Crear el proyecto en github&lt;/li&gt;
&lt;li&gt;Descargar la carpeta base del proyecto localmente&lt;/li&gt;
&lt;li&gt;Crear el archivo index.html y styles.css&lt;/li&gt;
&lt;li&gt;Crear el markup base de forma semántica de la pagina HTML&lt;/li&gt;
&lt;li&gt;Probar live server&lt;/li&gt;
&lt;li&gt;Crear los elementos internos del markup&lt;/li&gt;
&lt;li&gt;Adicionar el &lt;a href="https://elad2412.github.io/the-new-css-reset/"&gt;código reset&lt;/a&gt; en el CSS &lt;/li&gt;
&lt;li&gt;Adicionar las variables CSS de los colores y otros valores.&lt;/li&gt;
&lt;li&gt;Revisar el proyecto localmente&lt;/li&gt;
&lt;li&gt;Crear el sitio en github pages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Este sería un ejemplo de checkList, obviamente puede ser mas detallado y mejor aún, incluir los comandos necesarios en cada paso si se necesita (por ejemplo si necesitamos instalar librerias), el tener este "paso a paso" nos va a permitir también tener una especie de memoria para recordar como hicimos el proyecto.&lt;/p&gt;

&lt;h2&gt;
  
  
  No dispares con escopeta si necesitas un rifle
&lt;/h2&gt;

&lt;p&gt;Sentarnos a definir que queremos practicar o aprender, con tiempos claros y un objetivo especifico, permitirá que aprovechemos mejor nuestro tiempo, adicionalmente tendremos una especie de documentación del proceso y una bitacora, a medida que los temas se hacen mas complejos, se incluyan mas librerias, herramientas, conceptos, etc, se hace mas necesario tener un documento claro donde podamos acudir si algo se nos olvida a futuro, este documento sería la definición y el checkList.&lt;/p&gt;

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

&lt;p&gt;Si lo que se quiere es realizar practicas en desarrollo web, les dejo algunos recursos e ideas interesantes, las cuales pueden aplicar para practicar los multiples temas que incluye esta disciplina.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://www.frontendmentor.io/"&gt;Front End Mentor&lt;/a&gt; aunque es de pago, tiene algunos proyectos grátis que se pueden realizar, me gusta por que es guiado y tiene bastantes opciones.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dribbble.com/"&gt;Dribble&lt;/a&gt; Sin duda de mis preferidas, hay miles de ejemplos y conceptos de diseños web y aplicaciones moviles que podrían ser muy interesantes de llevar a cabo.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://codepen.io/challenges/"&gt;Codepen Challenges&lt;/a&gt; Codepen tiene una sección con retos interesantes para llevar a cabo, adicionalmente la ventaja de no tener que instalar nada local.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.dailyui.co/"&gt;Daily UI&lt;/a&gt; Te suscribes y te llega un reto al correo. &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://codier.io/"&gt;Codier&lt;/a&gt; Otra página con retos interesantes.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Ideas para proyectos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Sistema POS para restaurantes&lt;/li&gt;
&lt;li&gt;Fitness APP&lt;/li&gt;
&lt;li&gt;Food planer APP&lt;/li&gt;
&lt;li&gt;Language Learning APP&lt;/li&gt;
&lt;li&gt;Criminal Alert (alertar por GPS si se está en una zona donde hayan sido reportados muchos robos)&lt;/li&gt;
&lt;li&gt;Personal Finance APP&lt;/li&gt;
&lt;li&gt;Supermarket Calculator APP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como conclusión, la práctica hace al maestro, pero la práctica bien orientada te llevará a la maestría sin tanto sufrimiento.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>React desde 0</title>
      <dc:creator>Andres Ramirez</dc:creator>
      <pubDate>Tue, 31 May 2022 03:56:27 +0000</pubDate>
      <link>https://dev.to/gara501/react-desde-0-5fmi</link>
      <guid>https://dev.to/gara501/react-desde-0-5fmi</guid>
      <description>&lt;h1&gt;
  
  
  Empezando con React, parte 1
&lt;/h1&gt;

&lt;p&gt;Mi intención con esta serie de posts que voy a realizar es establecer un path de estudio desde 0 con React, si bien hay muchos cursos allá afuera bastante completos, estos posts los hago con la intención de interiorizar un poco mas el conocimiento que ya tengo y de paso, que sirva como guía para los que están iniciando con este framework, aclaro que vale mucho la pena revisar la documentación de React (también está en español), es bastante completa, sin más, empecemos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Indice
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Fundamentos&lt;/li&gt;
&lt;li&gt;Elementos del DOM
&lt;/li&gt;
&lt;li&gt;Agregando clases a un elemento&lt;/li&gt;
&lt;li&gt;ReactDOM&lt;/li&gt;
&lt;li&gt;
JSX

&lt;ul&gt;
&lt;li&gt;Anidando componentes&lt;/li&gt;
&lt;/ul&gt;


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

&lt;h2&gt;
  
  
  Fundamentos
&lt;/h2&gt;

&lt;p&gt;React se basa, al igual que muchos otros frameworks hoy en día, en el concepto de componentes.&lt;br&gt;
Un componente es una pieza de código que puede ser reutilizada cuantas veces sea necesario, incluso entre proyectos (depende de como se escriba), esto permite reducir considerablemente la cantidad de código y sigue el principio DRY (dont repeat yourself). Veamos un ejemplo simple:&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;NewButton&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Se retorna un nuevo elemento del DOM&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// Renderiza el componente&lt;/span&gt;
&lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;NewButton&lt;/span&gt; &lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Save&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;app&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;p&gt;Vemos dos elementos clave acá, una función en JavaScript plano que retorna un elemento del DOM, en este caso un botón, vemos una propiedad "props.label" que es básicamente un valor que se le pasa a ese componente y vemos también algo llamado ReactDOM.render, que es la forma en como React renderiza nuestro componente en una posición que nosotros establecemos, en este caso esa posición sería en el nodo "app". &lt;/p&gt;

&lt;p&gt;Las páginas que hacemos con React se llaman SPA (Single page application), mas adelante ahondaré en este concepto y en las diversas formas en las que podemos usar React para crear diferentes tipos de aplicaciones.&lt;br&gt;
Con React, evitamos interactuar directamente con el api del DOM, React lo hace por nosotros, podría decirse que es como un intermediario, esto se hace para poder tener un buen rendimiento al hacer modificaciones en esos elementos del DOM que queremos cambiar, en otras palabras, no interactuamos directamente con esos elementos del DOM si no con elementos de React (React elements).&lt;/p&gt;

&lt;p&gt;Recordemos que es &lt;a href="https://developer.mozilla.org/es/docs/Web/API/Document_Object_Model/Introduction"&gt;el DOM y que es el Api del DOM&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Elementos del DOM
&lt;/h2&gt;

&lt;p&gt;React usa una función llamada createElement para representar un elemento del DOM, ejemplo:&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="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;h2&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;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;subtitle&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Subtitulo de la página&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;p&gt;El primer argumento define el tipo de elemento, el segundo las propiedades, en este caso el Id sería "subtitle", y el tercer argumento representa el hijo del elemento, puede ser un nodo cualquiera envuelto entre &amp;lt;&amp;gt;, en este caso es solo el texto "subtitulo de la página".&lt;br&gt;
Al renderizar React mostrará:&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;subtitle&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;subtitulo&lt;/span&gt; &lt;span class="nx"&gt;de&lt;/span&gt; &lt;span class="nx"&gt;la&lt;/span&gt; &lt;span class="nx"&gt;página&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como vemos, las propiedades son adicionadas como atributos, el hijo, es agregado como texto plano dentro del elemento, básicamente, un elemento de React es un literal de JavaScript que le dice a React como construir un elemento del DOM, si hacemos un console.log al elemento, veríamos algo como esto:&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="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;$$typeof&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;h2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;key&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ref&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;props&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="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;subtitle&lt;/span&gt;&lt;span class="dl"&gt;"&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;subtitulo de la página&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;_owner&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;_store&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;p&gt;En este caso, el type le dice a React que tipo de elemento es, HTML o un SVG, props contiene los datos y los nodos hijos que van a ser construidos, la propiedad children se usa para mostrar otros nodos anidados como texto en este caso.&lt;/p&gt;

&lt;h2&gt;
  
  
  ReactDOM
&lt;/h2&gt;

&lt;p&gt;Una vez el elemento ha sido generado, ReactDOM contiene lo necesario para poder renderizar ese elemento en el navegador, esto lo hacemos usando ReactDOM.render, para poder renderizar el elemento, necesitamos 2 argumentos, el elemento a renderizar como primer argumento y en donde lo vamos a renderizar como segundo argumento.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;subtitle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;h2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;subtitulo de la página&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;subtitle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;app&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;p&gt;Al renderizar, quedaría algo como 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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;app&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;subtitulo&lt;/span&gt; &lt;span class="nx"&gt;de&lt;/span&gt; &lt;span class="nx"&gt;la&lt;/span&gt; &lt;span class="nx"&gt;página&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/body&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para renderizar elementos internamente, React usa los props.children, en este ejemplo, el texto que renderiza &lt;em&gt;subtitulo de la página&lt;/em&gt;, que es hijo del elemento h2, sería nuestro &lt;em&gt;children&lt;/em&gt;, pero estos &lt;em&gt;children&lt;/em&gt; no son solo un elemento, son un arbol de elementos (element tree) que contiene un elemento padre y de ahí en adelante crece. Por ejemplo para renderizar una lista sería algo como 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;ul&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Elemento 1&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Elemento 2&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Elemento 3&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ul&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;li&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Elemento 1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;li&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Elemento 2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;li&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Elemento 3&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;p&gt;Vemos el nodo principal &lt;em&gt;ul&lt;/em&gt; y los hijos, que serían los &lt;em&gt;li&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agregando clases a un elemento
&lt;/h3&gt;

&lt;p&gt;Class es una palabra reservada de JavaScript, por eso React usa className para recibir los nombres de las clases en un componente, ejemplo:&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="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ul&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;className&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;elements&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; 
  &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;li&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Elemento 1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;li&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Elemento 2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;li&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Elemento 3&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;p&gt;Ya renderizado quedaría algo como 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;ul&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"elements"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Elemento 1&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Elemento 2&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Elemento 3&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este punto al ver el código es posible que esté confundido/a, ya que se ve diferente al código usualmente usado con React, mas complejo y tortuoso, bueno, el código que he puesto en los ejemplos es el que maneja React directamente, pero para facilitarnos la vida vamos a trabajar con JSX, JSX podría decirse que es una combinación de JavaScript y XML, y nos permite definir elementos de React usando una sintaxis basada en etiquetas directamente en nuestro código JavaScript, es decir, ya no necesitamos complicarnos la vida con la sintaxis compleja de &lt;em&gt;createElement&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  JSX
&lt;/h2&gt;

&lt;p&gt;JSX también funciona con componentes, silo que de una forma mucho mas simple, nuestro componente tendrá un nombre definido que es el que usaremos en la etiqueta, hasta cierto punto es similar a crear un &lt;a href="https://developer.mozilla.org/es/docs/Web/Web_Components"&gt;web component&lt;/a&gt;&lt;br&gt;
Por ejemplo, el código moderno de un componente simple sería algo como esto:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ul&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
     &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="err"&gt;}
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ul&lt;/span&gt;&lt;span class="err"&gt;&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y para usarlo lo definiríamos en el componente padre así:&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;App&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Users&lt;/span&gt; &lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Anidando componentes
&lt;/h3&gt;

&lt;p&gt;Siguiendo con el ejemplo anterior, si quisiera algo mas granular y definir cada &lt;em&gt;li&lt;/em&gt; como un componente independiente al cual le pueda definir mas propiedades, podemos hacerlo de la siguiente manera:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
       &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En el componente padre, que ahora sería &lt;em&gt;Users&lt;/em&gt;, tendriamos que importar el subcomponente e integrarlo&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;User&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;./User&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;Users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ul&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
     &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="err"&gt;}
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ul&lt;/span&gt;&lt;span class="err"&gt;&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;App&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Users&lt;/span&gt; &lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este caso vemos como podemos ir anidando componentes hasta el nivel que necesitemos, en los ejemplos anteriores he usado algo como esto &lt;em&gt;{name}&lt;/em&gt;, esto se conoce como JavaScript expressions, y es la forma en como podemos mostrar datos dinámicos en los componentes.&lt;br&gt;
Otro punto importante, es que al mapear arrays, necesitamos usar un KEY, este identificador es usado por React para su referencia interna, lo pueden ver en los ejemplos al usar &lt;em&gt;map&lt;/em&gt;, le paso al elemento una etiqueta &lt;em&gt;key={i}&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Cual es el inconveniente de usar JSX? que el navegador no lo entiende, por eso toca usar compiladores como &lt;a href="https://dev.toBabel"&gt;https://babeljs.io/&lt;/a&gt; que convertirán el código de React a JavaScript puro. (Mas adelante voy a explicar esto a fondo).&lt;/p&gt;
&lt;h2&gt;
  
  
  React Fragments
&lt;/h2&gt;

&lt;p&gt;Todo componente de React necesita estar dentro de un solo contenedor, usualmente usamos un div para envolver todo la estructura, pero si no deseamos que se renderice un elemento y queremos que solo se muestre el contenido, React nos ofrece una opción llamada fragmentos.&lt;br&gt;
Para definir un fragmento lo podemos hacer de dos formas:&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Fragment&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/React.Fragment&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;o de la forma simplificada&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="o"&gt;&amp;lt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ese elemento no será visible en el DOM.&lt;/p&gt;

</description>
      <category>react</category>
    </item>
  </channel>
</rss>
