<?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: Veritechie</title>
    <description>The latest articles on DEV Community by Veritechie (@veritechie).</description>
    <link>https://dev.to/veritechie</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%2F494933%2Fb0b66071-7b2d-4d68-b31c-4576834e902d.jpg</url>
      <title>DEV Community: Veritechie</title>
      <link>https://dev.to/veritechie</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/veritechie"/>
    <language>en</language>
    <item>
      <title>Behavior Driven Development [BDD]</title>
      <dc:creator>Veritechie</dc:creator>
      <pubDate>Fri, 18 Feb 2022 12:33:01 +0000</pubDate>
      <link>https://dev.to/veritechie/behavior-driven-development-bdd-4hj0</link>
      <guid>https://dev.to/veritechie/behavior-driven-development-bdd-4hj0</guid>
      <description>&lt;h2&gt;
  
  
  Propósito y beneficios de usar BDD
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;En lo más profundo, BDD se trata de tener &lt;strong&gt;conversaciones&lt;/strong&gt; para ayudar a los equipos a superar los requisitos mal interpretados y problemas de entrega&lt;/li&gt;
&lt;li&gt;Las ideas y conceptos se comparten discutiendo ejemplos concretos de la vida real de los requisitos y comportamientos del producto&lt;/li&gt;
&lt;li&gt;BDD permite que &lt;strong&gt;las partes interesadas&lt;/strong&gt;, clientes, devs, hablen en un idioma común (Gherkin) sobre la entrega.&lt;/li&gt;
&lt;li&gt;BDD valora la colaboración por encima de los documentos de requisitos que normalmente se pueden mal interpretar&lt;/li&gt;
&lt;li&gt;BDD permite creación de documentación para la solución técnica.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Por qué SHIFT LEFT
&lt;/h2&gt;

&lt;p&gt;Básicamente se trata de mover las actividades de testing más hacia la izquierda del proceso de desarrollo. La idea es anticipar y tener en cuenta el testing desde el principio.&lt;/p&gt;

&lt;p&gt;Ventaja 1. Las pruebas se hacen antes, por lo que el feedback se obtiene antes, los potenciales problemas se descubren y se pueden resolver antes mejorando así la calidad del producto final.&lt;/p&gt;

&lt;p&gt;ventaja 2. Seguramente este hecho apoye a que se desarrollen componentes testeables, más fáciles de probar y de automatizar. Esto aporta un gran valor.&lt;/p&gt;

&lt;p&gt;ventaja 3. Sharing is caring y se ha comprobado que cuando se testea solo se tiene menos cuidado, a diferencia de compartir las tareas fomentando la colaboración el éxito es mayor.&lt;/p&gt;

&lt;h2&gt;
  
  
  3 prácticas a aplicar
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Descubre a través de la colaboración&lt;/li&gt;
&lt;li&gt;Formulación (Documentación)&lt;/li&gt;
&lt;li&gt;Automatización de la documentación&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Términos clave
&lt;/h2&gt;

&lt;p&gt;Gherkin tiene 3 componentes clave: Feature, Scenario &amp;amp; Steps (GWT)&lt;/p&gt;

&lt;h4&gt;
  
  
  Feature (Elemento de alto nivel)
&lt;/h4&gt;

&lt;p&gt;Es la descripción de la funcionalidad a desarrollar.&lt;/p&gt;

&lt;h4&gt;
  
  
  Scenario (Elemento de tipo comportamiento)
&lt;/h4&gt;

&lt;p&gt;Una feature tiene uno o varios scenarios, que son distintas características que se tienen que desarrollar para poder conseguir lo que nos hemos propuesto entregar.&lt;/p&gt;

&lt;h4&gt;
  
  
  Steps (GWT) (Elementos de tipo acción)
&lt;/h4&gt;

&lt;p&gt;Given: Precondiciones para que se puedan ejecutar x acciones. Tu puedes tener varios "And" si se necesita para acumular acciones.&lt;br&gt;
When: Condiciones de las acciones que se van a ejecutar. &lt;br&gt;
Then: Resultado esperado de las acciones ejecutadas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ejemplo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Feature:&lt;/strong&gt; Inicio de sesión en udemy&lt;br&gt;
&lt;strong&gt;Scenario:&lt;/strong&gt; Inicio de sesión con usuario y password&lt;br&gt;
&lt;strong&gt;Given:&lt;/strong&gt; El usuario tiene que introducir de manera correcta el usuario y password, que ha registrado con anterioridad.&lt;br&gt;
&lt;strong&gt;When:&lt;/strong&gt; El usuario hace click en "iniciar sesión"&lt;br&gt;
&lt;strong&gt;Then:&lt;/strong&gt; El usuario inicia sesión de manera correcta.&lt;/p&gt;

&lt;p&gt;Gherkin&lt;br&gt;
Feature &amp;gt; User Story &amp;gt; Gherkin Feature &amp;gt; Scenario(s) &amp;gt; G.Steps&lt;/p&gt;

&lt;h1&gt;
  
  
  BDD Feature Best Practices
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Empieza con una persona. Recuerda que un cliente no es necesariamente un comprador.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Escribir "Declarative features"; Describir como si lo hiciera un usuario, de manera muy humana.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Insertar una narración; Describen en una oración lo que hace una feature. Las narrativas son importantes para imaginar por qué está implementando una función en primer lugar&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Escribe la feature con la intención de cambiar el comportamiento del cliente. Afectará al patrón de prueba.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;BDD se centra en featureFiles no en story files.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Las features deben de ser independientes entre si y proporcionar un cambio de comportamiento de la funcionalidad.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use &lt;em&gt;Story Mapping&lt;/em&gt; cuando una característica constituya un flujo de trabajo.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;p&gt;Todas las Gherkin features son independientes unas de otras.&lt;br&gt;
Cada feature o scenario deben ser ejecutadas independientemente.&lt;br&gt;
Todos los steps deben tener info independiente (y sin son steps entre 50 - 80 caracteres mucho mejor).&lt;/p&gt;

&lt;h2&gt;
  
  
  Cucumber
&lt;/h2&gt;

&lt;p&gt;La mejor forma de usar Gherkin es con Cucumber, un framework de testing con soporte para BDD, dónde las especificaciones BDD están escritas de acuerdo al patrón “Given-When-Then”. (Osease, en Gherkin)&lt;/p&gt;

&lt;p&gt;Cucumber, puede generarnos los casos de prueba de la aplicación y darnos una mayor velocidad en el desarrollo del software&lt;/p&gt;

&lt;p&gt;Este verifica que el software cumpla con la especificación y genera un informe que indica ✅ éxito o ❌ falla para cada scenario.&lt;/p&gt;

&lt;p&gt;Este es un primer contacto de lo que BDD puede ofrecer y parece muy poderoso. Veremos en los próximos pasos :)&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Bracket Pair Colorizer nativo en VSC</title>
      <dc:creator>Veritechie</dc:creator>
      <pubDate>Wed, 26 Jan 2022 15:33:55 +0000</pubDate>
      <link>https://dev.to/veritechie/bracket-pair-colorizer-nativo-en-vsc-bd3</link>
      <guid>https://dev.to/veritechie/bracket-pair-colorizer-nativo-en-vsc-bd3</guid>
      <description>&lt;p&gt;Soy super fan de la extensión &lt;a href="https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer"&gt;Bracket Pair Colorizer&lt;/a&gt; y ahora viene lo bueno...&lt;/p&gt;

&lt;p&gt;¡YA ES NATIVO EN VSC Y MUUUUCHO MÁS RÁPIDO!&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Elimina la extensión Bracket Pair Colorizer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Actualiza VSC&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vamos a añadir en settings.json la línea que nos permitirá usar nativamente esta extensión, ejecutamos:&lt;br&gt;
Windows - Ctrl + Shift ⇧ + P&lt;br&gt;
Mac - ⌘ + Shift ⇧ + P&lt;br&gt;
Escribe "settings" &lt;br&gt;
Haz click en "preferences: open settings(JSON)"&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Añade la siguiente línea (puedes ayudarte con la imagen también)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"editor.bracketPairColorization.enabled": true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JZ3HN4XH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3u9f442znv7c1lpn9pb2.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JZ3HN4XH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3u9f442znv7c1lpn9pb2.PNG" alt="how to" width="540" height="155"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;¡TADAAAAA! ¡Así de fácil! :)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://community.vscodetips.com/"&gt;VSC Tips ¡Aquí!&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Deploy Node + Express + Mongo Atlas con fetch de React en Heroku (MERN App)</title>
      <dc:creator>Veritechie</dc:creator>
      <pubDate>Wed, 17 Nov 2021 17:12:24 +0000</pubDate>
      <link>https://dev.to/veritechie/deploy-node-express-mongo-atlas-con-fetch-de-react-en-heroku-mern-app-3ien</link>
      <guid>https://dev.to/veritechie/deploy-node-express-mongo-atlas-con-fetch-de-react-en-heroku-mern-app-3ien</guid>
      <description>&lt;p&gt;Si has llegado aquí es porque tienes un proyecto que reúne las siguientes características:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Proyecto de &lt;strong&gt;React.JS&lt;/strong&gt; con fetch apuntado a un proyecto de backend y deployeado con Github Pages. (Te dejo aquí el enlace al post que hice para &lt;a href="https://dev.to/veritechie/deploy-tu-proyecto-de-reactjs-en-github-pages-1afp"&gt;deployear en gh-pages&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Proyecto de backend con &lt;strong&gt;Express + Node&lt;/strong&gt;, utilizando &lt;strong&gt;MongoDB Atlas&lt;/strong&gt; como base de datos.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ambos proyectos (Front y Back) funcionan en local y se alojan en Github&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;En resumen, lo que tendremos al final será nuestro proyecto de react alojado en gh-pages y nuestro proyecto de back de node y express alojado en &lt;a href="https://heroku.com" rel="noopener noreferrer"&gt;Heroku&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Deploy Backend en Heroku
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Configurar deploy automático en Heroku
&lt;/h4&gt;

&lt;p&gt;Me gustó este método porque automáticamente cada vez que hacemos un cambio en nuestro repositorio de github, este será modificado directamente en Heroku.&lt;/p&gt;

&lt;p&gt;Para eso vamos a crear una nueva app &lt;em&gt;Create new app&lt;/em&gt; en heroku, accedemos a la pestaña de &lt;em&gt;deploy&lt;/em&gt; y como &lt;em&gt;Deployment method&lt;/em&gt; usamos GitHub.&lt;/p&gt;

&lt;p&gt;Buscamos el repositorio al que queremos conectarnos. &lt;em&gt;Search&lt;/em&gt;. Si existe el repositorio, lo encontrará con éxito.&lt;/p&gt;

&lt;p&gt;Un poco más abajo, en &lt;em&gt;Automatic deploys&lt;/em&gt; hacemos click en el botón &lt;em&gt;Enable Automatic Deploys&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Esto quedaría mas o menos así 👇🏽&lt;br&gt;
&lt;a href="https://media.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%2Fwkqzp6o3bkhnkbjygooc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fwkqzp6o3bkhnkbjygooc.png" alt="resultado"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  2. Configurar URI de Mongo en Heroku
&lt;/h4&gt;

&lt;p&gt;Resume pasos previos para usar Mongo Atlas&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configurar cluster gratuito&lt;/li&gt;
&lt;li&gt;bbdd mongoimport de local a una bbdd de atlas&lt;/li&gt;
&lt;li&gt;Configurar usuario y contraseña de acceso a bbdd&lt;/li&gt;
&lt;li&gt;Activar cluster (Network access)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Te dejo un recurso para hacer esto &lt;a href="https://www.youtube.com/watch?v=EjQfQBf0oCw" rel="noopener noreferrer"&gt;aquí&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En la pestaña Database, le damos al botón Connect&lt;br&gt;
&lt;a href="https://media.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%2F7l2vgc1ai2mhuu4mximl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F7l2vgc1ai2mhuu4mximl.png" alt="Connect tour app"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copiamos la url&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mongodb+srv://&amp;lt;username&amp;gt;:&amp;lt;password&amp;gt;@sandbox.tvib4.mongodb.net/nombreDeMiBBDD?retryWrites=true&amp;amp;w=majority
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Modifica el usuario y contraseña por los que has configurado. Pon el nombre de la bbdd que estás utilizando.&lt;/p&gt;

&lt;p&gt;Volvemos a Heroku &amp;gt; Settings &amp;gt; Config Vars &amp;gt; Reveal Config Vars y pegamos la url en VALUE como indica la imagen.&lt;br&gt;
&lt;a href="https://media.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%2Ftx9oxbe5pyhxtezjmkkv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Ftx9oxbe5pyhxtezjmkkv.png" alt="config vars"&gt;&lt;/a&gt;&lt;br&gt;
En KEY ponemos el nombre de la variable que hemos configurado anteriormente en nuestro proyecto:&lt;br&gt;
&lt;a href="https://media.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%2Fnvz5nxbkz576pqelgn86.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fnvz5nxbkz576pqelgn86.png" alt="uri mongo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  3. Cambios en tu backend para que funcione Heroku
&lt;/h4&gt;

&lt;p&gt;Nos vamos a nuestro proyecto y vamos a configurar un par de cosas necesarias para que podamos deployear en heroku.&lt;/p&gt;

&lt;p&gt;Dentro de Package.json&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"scripts": {
    "start": "node ./archivoDeArranqueDeNode.js"
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No more nodemon. Heroku va a interceptar este nuevo script que acabamos de configurar y se arrancará con &lt;em&gt;npm start&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dentro de tu &lt;em&gt;archivoDeArranqueDeNode.js&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const PORT = process.env.PORT || 3000;

const server = app.listen(PORT, () =&amp;gt; {
    console.log(`Server is running on port ${PORT}`)
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configuramos la variable de entorno PORT. Cuando despleguemos a producción queremos que escuche en el puerto que Heroku nos asigne en esta variable de entorno (process.env.PORT). Para hacerlo usamos el operador lógico or ||, lo que hace, es quedarse con el primer valor que no arroje &lt;em&gt;undefined&lt;/em&gt; de todos los valores que pongamos separados por este operador.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hagamos la magia, subamos estos cambios a Git y veremos en Heroku como se hace el deploy automático.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Si vamos a Heroku y accedemos a More &amp;gt; View Logs, veremos como nuestro PORT está escuchando en 37457.&lt;br&gt;
&lt;a href="https://media.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%2Fo2bjxww33c60wdutgx11.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fo2bjxww33c60wdutgx11.png" alt="view logs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y en overview:&lt;br&gt;
&lt;a href="https://media.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%2Fkm9spusge2ypvbmzbjns.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fkm9spusge2ypvbmzbjns.png" alt="overview"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Ejecución de promesas</title>
      <dc:creator>Veritechie</dc:creator>
      <pubDate>Fri, 12 Nov 2021 09:24:25 +0000</pubDate>
      <link>https://dev.to/veritechie/ejecucion-de-promesas-37c6</link>
      <guid>https://dev.to/veritechie/ejecucion-de-promesas-37c6</guid>
      <description>&lt;p&gt;¿Cuánto tiempo tarda en ejecutarse una secuencia de promesas?&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const promesa1 = new Promise(function(resolve) {
  setTimeout(function() {
    resolve(1)
  }, 1000)
});

const promesa2 = new Promise(function(resolve) {
  setTimeout(function() {
    resolve(2)
  }, 2000)
});

const promesa3 = new Promise(function(resolve) {
  setTimeout(function() {
    resolve(3)
  }, 3000)
});


console.time('promesas')
Promise.all([promesa1, promesa2, promesa3]).then(function(result) {
  console.log(result);
  console.timeEnd('promesas')
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Exactamente 3 segundos (aproximadamente) ¿Sabes por qué?&lt;/p&gt;

&lt;p&gt;Cuando empiezan a ejecutarse todas entran en la web API y el temporizador se ejecutará durante tanto tiempo como el segundo parámetro MÁXIMO que le hemos pasado a una de las promesas, es decir, 3000 en este caso.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Te recomiendo el siguiente enlace para hacer tus pruebas:&lt;br&gt;
&lt;a href="http://latentflip.com/loupe/?code=JC5vbignYnV0dG9uJywgJ2NsaWNrJywgZnVuY3Rpb24gb25DbGljaygpIHsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gdGltZXIoKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1lvdSBjbGlja2VkIHRoZSBidXR0b24hJyk7ICAgIAogICAgfSwgMjAwMCk7Cn0pOwoKY29uc29sZS5sb2coIkhpISIpOwoKc2V0VGltZW91dChmdW5jdGlvbiB0aW1lb3V0KCkgewogICAgY29uc29sZS5sb2coIkNsaWNrIHRoZSBidXR0b24hIik7Cn0sIDUwMDApOwoKY29uc29sZS5sb2coIldlbGNvbWUgdG8gbG91cGUuIik7!!!PGJ1dHRvbj5DbGljayBtZSE8L2J1dHRvbj4%3D"&gt;LatenFlip.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>Deploy tu proyecto de React.JS en Github-Pages</title>
      <dc:creator>Veritechie</dc:creator>
      <pubDate>Thu, 11 Nov 2021 09:51:42 +0000</pubDate>
      <link>https://dev.to/veritechie/deploy-tu-proyecto-de-reactjs-en-github-pages-1afp</link>
      <guid>https://dev.to/veritechie/deploy-tu-proyecto-de-reactjs-en-github-pages-1afp</guid>
      <description>&lt;p&gt;¡Ya está!, mi proyecto funciona en local y ya está subido y guardadito en un repositorio en github! ¡Quiero la magia de github pages!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Github-pages: Servicio que me ofrece Github para poder almacenar en la nube mi proyecto y visualizarlo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;Abrimos la terminal de nuestro ID favorito donde tengamos ubicado nuestro proyecto e instalamos el paquete de Gh-pages
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i -D gh-pages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Con -D lo instamamos en el package.json como devDependencies)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;En nuestro archivo package.json añadimos la siguiente linea, justo debajo de "name": "nombredetuproyecto", por ejemplo.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"homepage":"https://GITHUBUSER.github.io/REPONAME"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Introduce tu nombre de usuario y el nombre de tu repositorio de Github y agrégalo arriba.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;En el mismo archivo, dentro de "scripts": {, añade:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; "predeploy": "npm run build",
 "deploy": "gh-pages -d build"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;¡Volvemos a la terminal! Ahora ejecutamos:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Y por último...
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¿Cómo sé que he tenido éxito?, algo así te tiene que mostrar:&lt;br&gt;
&lt;a href="https://media.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%2F8qorprtcuip645r4fy8n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F8qorprtcuip645r4fy8n.png" alt="Deploy done"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Además si actualizas tu repositorio en github verás que fue creada la rama de gh-pages. La url de acceso debería de verse así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://GITHUBUSER.github.io/REPONAME/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si te fijas bien podrás ver actualizado en tu repo que github-pages está activo!&lt;br&gt;
&lt;a href="https://media.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%2F7lhmqy84klv91e5xyay0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F7lhmqy84klv91e5xyay0.png" alt="enviroments"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;¡Enjoy!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>JavaScript visualizado: Event Loop</title>
      <dc:creator>Veritechie</dc:creator>
      <pubDate>Wed, 10 Nov 2021 19:52:15 +0000</pubDate>
      <link>https://dev.to/veritechie/javascript-visualizado-event-loop-k7o</link>
      <guid>https://dev.to/veritechie/javascript-visualizado-event-loop-k7o</guid>
      <description>&lt;h3&gt;
  
  
  ¿Qué es Event Loop y por qué debería importarte?
&lt;/h3&gt;

&lt;p&gt;JavaScript es de un solo subproceso: solo se puede ejecutar una tarea a la vez. Ahora imagina que estás ejecutando una tarea que tarda en terminar 30 segundos… Esperamos 30 segundos antes de que suceda cualquier otra cosa, ¿no es de locos?.&lt;/p&gt;

&lt;p&gt;Por suerte el navegador nos brinda algunas funciones que el motor JS en si no nos da: Una Web API. Esto incluye la API DOM, setTimeout, solicitudes HTTP, etc. Esto puede ayudarte a crear un comportamiento asincrónico y sin bloqueos.&lt;/p&gt;

&lt;p&gt;Cuando invocamos una función se añade a algo llamado “callstack” (pila de llamadas). Es parte del motor JS, no forma parte del navegador.&lt;/p&gt;

&lt;p&gt;Es una pila, por lo que es el primero en entrar y el último en salir. (como un montón de tortitas, piénsalo así). Cuando una función devuelve un valor, sale de la pila.&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;las funciones se envían a la pila de llamadas cuando se invocan y desaparecen cuando devuelven un valor&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rPSwcmXh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2ABQ0QuqGwpcZCGVnbshr_ng.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rPSwcmXh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2ABQ0QuqGwpcZCGVnbshr_ng.gif" alt="callstack" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La función de respuesta devuelve una función setTimeOut. &lt;br&gt;
Este nos lo proporciona la &lt;strong&gt;web API&lt;/strong&gt;: nos permite retrasar las tareas sin bloquear el hilo principal.&lt;/p&gt;

&lt;p&gt;La función &lt;strong&gt;callback&lt;/strong&gt; que pasamos a la función setTimeOut,&lt;br&gt;
la función de flecha ()=&amp;gt; { return 'Hey' } se añade a la &lt;strong&gt;web API&lt;/strong&gt;.&lt;br&gt;
Mientras tanto, la función setTimeOut y la de respuesta se eliminan del *&lt;em&gt;callstack. *&lt;/em&gt;¡Ambas han devuelto sus valores!&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;setTimeOut es proporcionado por el navegador,
la &lt;strong&gt;web API&lt;/strong&gt; se encarga de &lt;strong&gt;callback&lt;/strong&gt; que le pasamos.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XT9QMMgn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2AU-jSWrn_vKdjdCpz0JaIhQ.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XT9QMMgn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2AU-jSWrn_vKdjdCpz0JaIhQ.gif" alt="callstack" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En &lt;strong&gt;web API&lt;/strong&gt;, un temporizador se ejecutará durante tanto tiempo como el segundo argumento que le pasemos (1000ms). El &lt;strong&gt;callback&lt;/strong&gt; no se añade inmediatamente a la pila de llamadas, sino que se pasa a algo llamado cola (queue).&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Cuando el timer ha terminado (1000 ms en este caso),
el &lt;strong&gt;callback&lt;/strong&gt; se pasa a la cola de &lt;strong&gt;callback&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pTKU7DdH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2AuxMxZ6y6lzLCVP4bTiYEow.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pTKU7DdH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2AuxMxZ6y6lzLCVP4bTiYEow.gif" alt="callstack" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esto puede ser una parte confusa: No significa que la función de callback se añade al &lt;strong&gt;callstack&lt;/strong&gt; (por lo tanto, devuelve un valor) después de 1000ms, simplemente se añade a la cola después de 1000ms. Pero es una cola, ¡la función tiene que esperar su turno!&lt;/p&gt;

&lt;p&gt;Ahora esta es la parte que estábamos esperando… Es hora de que event loop haga su única tarea: &lt;strong&gt;¡conectar la cola con el callstack!&lt;/strong&gt; Si el &lt;strong&gt;callstack&lt;/strong&gt; está &lt;strong&gt;&lt;em&gt;vacío&lt;/em&gt;&lt;/strong&gt;, si todas las funciones invocadas anteriormente han devuelto sus valores y se han eliminado del stack, el primer elemento en la cola se añade al &lt;strong&gt;callstack&lt;/strong&gt;. En este caso, no se invocó ninguna otra función, lo que significa que el &lt;strong&gt;callstack&lt;/strong&gt; estaba vacío cuando el tiempo de la función de callback era el primer elemento de la cola.&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;El event Loop mira la cola de callback y de callstack.
Si el callstack está &lt;strong&gt;&lt;em&gt;vacío&lt;/em&gt;&lt;/strong&gt;, pone el primer elemento en la cola&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mm4RENTq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2Aflj3SyshFtfLiuVzVw3ypQ.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mm4RENTq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2Aflj3SyshFtfLiuVzVw3ypQ.gif" alt="callstack" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;El callback es añadido al callstack es invocada.
Una vez el valor es retornado, se saca de la pila del stack.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---VD1bgBZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2AVdOD_VVf9WQoUFnYnI9KvQ.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---VD1bgBZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2AVdOD_VVf9WQoUFnYnI9KvQ.gif" alt="callstack" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Leer esto es divertido, pero solo te sentirás cómodo con esto si trabajas con ello una y otra vez. Intenta averiguar qué se registra en la consola si ejecutamos lo siguiente:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const foo = () =&amp;gt; console.log("First");
const bar = () =&amp;gt; setTimeout(() =&amp;gt; console.log("Second"), 500);
const baz = () =&amp;gt; console.log("Third");

bar();
foo();
baz();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Echemos un vistazo rápido a lo que sucede cuando ejecutamos este código en un navegador:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Invocamos bar. bar devuelve una función deSetTimeOut&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;El callback que pasamos a setTimeOut se agrega a la &lt;strong&gt;web API&lt;/strong&gt;, la función setTimeOut y la barra se eliminan del callstack.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;El timer se ejecuta, mientras tanto foo es invocada y imprime &lt;strong&gt;First&lt;/strong&gt;. foo devuelve (undefined), baz es invocada y el callback es añadido a la cola&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;baz imprime &lt;strong&gt;Third&lt;/strong&gt;. El event loop ve que el callstack está &lt;strong&gt;&lt;em&gt;vacío&lt;/em&gt;&lt;/strong&gt; después de que baz se retorne, después de lo cual el callback se agrega a la pila de llamadas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;El callback imprime &lt;strong&gt;Second&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Link a la versión original del artículo: ✨♻️ &lt;a href="https://dev.to/lydiahallie/javascript-visualized-event-loop-3dif"&gt;JavaScript Visualized: Event Loop.&lt;/a&gt; &lt;em&gt;Thank you &lt;a href="https://dev.toundefined"&gt;Lydia Hallie&lt;/a&gt;, for making me take off 🚀&lt;/em&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🔥 El infierno de var</title>
      <dc:creator>Veritechie</dc:creator>
      <pubDate>Tue, 09 Nov 2021 15:32:53 +0000</pubDate>
      <link>https://dev.to/veritechie/el-infierno-de-var-522m</link>
      <guid>https://dev.to/veritechie/el-infierno-de-var-522m</guid>
      <description>&lt;p&gt;¿Que crees que imprimirá por pantalla este fragmento de código?&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for (**var** i = 1; i &amp;lt;= 5; i++) {
    setTimeout(function() {
        console.log("Pues...",i);
    }, 1000);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;SPOILER&lt;/em&gt;….&lt;/p&gt;

&lt;p&gt;…………&lt;/p&gt;

&lt;p&gt;…………&lt;/p&gt;

&lt;p&gt;…………&lt;/p&gt;

&lt;p&gt;…………&lt;/p&gt;

&lt;p&gt;…………&lt;/p&gt;

&lt;p&gt;…………&lt;/p&gt;

&lt;p&gt;…………&lt;/p&gt;

&lt;p&gt;Si tu respuesta fue Pues...6 ¡estás en lo cierto!, además te aparecerá justo una línea más arriba un numerito que identifica el número de setTimeOut lanzado. Este es aleatorio y a priori no sirve para nada, ¡solo FYI!&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Sabes por qué?
&lt;/h3&gt;

&lt;p&gt;Cuando declaramos una función con*&lt;em&gt;var&lt;/em&gt;&lt;em&gt;, el ámbito es su *contexto de ejecución&lt;/em&gt; en curso*,* que puede ser la función que la contiene o un ámbito global. Entonces podemos esperarnos resultados inesperados. Es por eso que es mejor que intentes evitar declarar variables con la palabra var. ¡pasa de eso!.&lt;/p&gt;

&lt;p&gt;Sin embargo… ¿que pasa si lanzamos este mismo fragmento de código?&lt;br&gt;
Nótese el cambio de &lt;strong&gt;&lt;em&gt;var&lt;/em&gt;&lt;/strong&gt; por &lt;strong&gt;&lt;em&gt;let&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for (**let** i = 1; i &amp;lt;= 5; i++) {
    setTimeout(function() {
        console.log("Pues...",i);
    }, 1000);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Sí amiguitos, ahora nos ejecuta el bucle tal y como deseamos. Gracias a la magia del scope, es una &lt;strong&gt;variable local&lt;/strong&gt; que solamente está definida dentro de la función.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;RECAP&lt;/em&gt;&lt;/strong&gt;: ¡No al var, si al let! (o const!)&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>Just JavaScript</title>
      <dc:creator>Veritechie</dc:creator>
      <pubDate>Sun, 07 Nov 2021 18:13:45 +0000</pubDate>
      <link>https://dev.to/veritechie/just-javascript-3pmp</link>
      <guid>https://dev.to/veritechie/just-javascript-3pmp</guid>
      <description>&lt;p&gt;&lt;strong&gt;Antecedentes:&lt;/strong&gt; Todo el mundo sabe que programar no es una tarea sencilla. Nunca sabes por donde empezar, a veces no entiendes nada y empiezas a dar vueltas; estudias (a tu manera) el código de otros compañeros, miras como loco stackoverflow… pero llega un momento que sientes que algo no va bien. Te falta algo. En mi caso lo llamaría conocimiento básico, entendimiento del propio lenguaje sobre todo antes de dar el salto a otros frameworks de JS (react, vue, angular…). Porque una cosa es estudiar la base de todo lenguaje de programación. Pero otra cosa es estudiar el por qué.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;a href="https://justjavascript.com/"&gt;Just Javascript&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt; es el modelo mental de cómo funciona JavaScript.&lt;br&gt;
En definitiva: &lt;strong&gt;mejorar nuestra comprensión&lt;/strong&gt; acerca de este lenguaje.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9yTNP-ED--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2A9QDAB_2T9YDkAIes6uElPA.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9yTNP-ED--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2A9QDAB_2T9YDkAIes6uElPA.gif" alt="JustJavascript Example" width="800" height="674"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.toundefined"&gt;Dan Abramov&lt;/a&gt; y &lt;a href="https://dev.toundefined"&gt;Maggie Appleton&lt;/a&gt; están detrás de estas mágicas explicaciones.&lt;/p&gt;

&lt;h3&gt;
  
  
  De que se trata
&lt;/h3&gt;

&lt;p&gt;Se divide en pequeñas lecciones (en total 9) que se envían por correo y en ella, aparte de los **modelos mentales fundamentales **que rodean a Javascript, se completa con una serie de ejercicios que te harán comprender mucho mejor lo que se explica.&lt;/p&gt;

&lt;h3&gt;
  
  
  A tu ritmo
&lt;/h3&gt;

&lt;p&gt;Para que te hagas una idea, a mi me ha llevado 8 días en hacerlo.&lt;br&gt;
1 hora por cada lección + ejercicios.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Lo recomiendo&lt;/strong&gt; encarecidamente si como yo, estás empezando, tienes todavía dudas sobre el principio de Javascript y quieres saber cosas tan curiosas como&lt;br&gt;
por qué &lt;strong&gt;0.1 + 0.2 === 0.3 es false&lt;/strong&gt;. &lt;strong&gt;Merece muchísimo la pena.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Puedes suscribirte aquí: &lt;strong&gt;&lt;a href="https://justjavascript.com/"&gt;Just Javascript&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;¿Y a ti, se te ocurre algún curso que merezca la pena para aprender el interior de Javascript?&lt;/p&gt;

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