<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Mitchell Contreras - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Mitchell Contreras - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 13 Jun 2026 14:16:30 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/author/mitarcon/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Tutorial async/await de JavaScript: Aprende callbacks, promesas y async/await en JS haciendo helados ??? ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original escrito por Joy Shaheb [https://www.freecodecamp.org/news/author/joy/]. Artículo original JavaScript Async/Await Tutorial – Learn Callbacks, Promises, and Async/Await in JS by Making Ice Cream ??? [https://www.freecodecamp.org/news/javascript-async-await-tutorial-learn-callbacks-promises-async-await-by-making-icecream/] Traducido y adaptado por Mitchell Contreras [/espanol/news/author/mitarcon/] Hoy vamos a construir una tienda de helados y aprenderemos asincronismo con JavaSc ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/tutorial-async-await-de-javascript-aprende-callbacks-promesas-y-async-await-en-js-haciendo-helados/</link>
                <guid isPermaLink="false">610897cebd9dff09271bf0d8</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Mitchell Contreras ]]>
                </dc:creator>
                <pubDate>Tue, 05 Oct 2021 12:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/10/FCC-Thumbnail--3-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong><strong><strong><strong>Artículo original escrito por </strong></strong></strong></strong><a href="https://www.freecodecamp.org/news/author/joy/">Joy Shaheb</a>.<br><strong><strong><strong><strong>Artículo original </strong></strong></strong></strong><a href="https://www.freecodecamp.org/news/javascript-async-await-tutorial-learn-callbacks-promises-async-await-by-making-icecream/">JavaScript Async/Await Tutorial – Learn Callbacks, Promises, and Async/Await in JS by Making Ice Cream ???</a><br><strong><strong><strong><strong>Traducido y adaptado por </strong></strong></strong></strong><a href="https://www.freecodecamp.org/espanol/news/author/mitarcon/">Mitchell Contreras</a></p><!--kg-card-begin: markdown--><p>Hoy vamos a construir una <strong>tienda de helados</strong> y aprenderemos asincronismo con JavaScript al mismo tiempo. A lo largo del camino aprenderemos:</p>
<ul>
<li>Callbacks</li>
<li>Promesas</li>
<li>Async/Await</li>
</ul>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/08/b1j935dg72g9u8zvh2oi.png" class="kg-image" alt="b1j935dg72g9u8zvh2oi" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/08/b1j935dg72g9u8zvh2oi.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/08/b1j935dg72g9u8zvh2oi.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/08/b1j935dg72g9u8zvh2oi.png 1107w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><!--kg-card-begin: markdown--><h1 id="aqupodremosverquecubriremosenesteartculo">Aquí podremos ver que cubriremos en este artículo:</h1>
<ul>
<li>¿Qué es asíncrono en JavaScript?</li>
<li>Síncrono vs asíncrono</li>
<li>Como trabajan los callbacks en JavaScript</li>
<li>Como Trabajan las promesas en JavaScript</li>
<li>Como trabaja Async/Await en JavaScript</li>
</ul>
<p>Entonces, vamos con esto.</p>
<h2 id="siprefierespuedesveresttutorialenyoutube">Si prefieres puedes ver esté tutorial en YouTube</h2>
<!--kg-card-end: markdown--><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.17977528089888%;" class="fluid-width-video-wrapper">
            <iframe width="356" height="200" src="https://www.youtube.com/embed/n5ZtTO1ArWg?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><!--kg-card-begin: markdown--><h2 id="quesasncronoenjavascript">¿Qué es asíncrono en JavaScript?</h2>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/08/3.png" class="kg-image" alt="3" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/08/3.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/08/3.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/08/3.png 1498w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p></p><!--kg-card-begin: markdown--><p>Si quieres construir proyectos eficientemente, entonces esté concepto es para ti.<br>
La teoría de asincronismo en JavaScript nos ayuda a dividir un proyecto complejo en tareas más pequeñas.<br>
Podemos usar cualquiera de estas tres técnicas- <strong>callback, promesas o async/await</strong> para ejecutar estas pequeñas tareas de la manera de obtener los mejores resultados.<br>
Vamos a empezar ?️</p>
<h2 id="sncronovsasncrono">Síncrono vs asíncrono</h2>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/08/4.png" class="kg-image" alt="4" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/08/4.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/08/4.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/08/4.png 1253w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><!--kg-card-begin: markdown--><h2 id="quesunsstemasncrono">¿Qué es un sístema síncrono?</h2>
<p>En un sístema síncrono una tarea es terminada después de otra. Pensemos que tienes 10 tareas por completar, Debemos completar una tarea a la vez.</p>
<p>Observa el GIF ? - Una cosa está ocurriendo a la vez.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/08/5.gif" class="kg-image" alt="5" width="600" height="400" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Veríamos que mientras la primera imagen no está cargada completamente, la segunda imagen no está cargando.<br>
Bueno, JavaScript por defecto es síncrono (posee un solo hilo de ejecución). Pensemos que eso es - un hilo significa que tienes una sola mano para hacer las cosas.</p>
<h2 id="quesunsistemaasncrono">¿Qué es un sistema asíncrono?</h2>
<p>En este sistema, las tareas son completadas independientemente.<br>
Aquí, imagina que 10 tareas, tú tienes 10 manos. Entonces, cada mano puede hacer una tarea independientemente de las otras manos.</p>
<p>Echa un vistazo al siguiente GIF ? - puedes ver que cada imagen carga al mismo tiempo.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/08/6.gif" class="kg-image" alt="6" width="600" height="400" loading="lazy"></figure><!--kg-card-begin: markdown--><p>otra vez, todas las imágenes son cargadas a su propio ritmo. Ninguna de ellas estás esperando por alguna otra.</p>
<h2 id="pararesumirsncronovsasncronojs">Para resumir síncrono vs asíncrono JS:</h2>
<p>Cuando tres imágenes están en un maratón, en un:</p>
<ul>
<li><strong>Sistema síncrono</strong>: tres imágenes están en el mismo carril, ninguno puede adelantar al otro. La carrera es terminada uno a la vez, Si la imagen número dos se detiene, las siguientes imágenes se detienen.</li>
</ul>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/08/7.png" class="kg-image" alt="7" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/08/7.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/08/7.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/08/7.png 1544w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><!--kg-card-begin: markdown--><ul>
<li><strong>Sistema asíncrono</strong>: Las tres imágenes están en diferentes carriles. Ellas finalizarían la carrera en su propio carril. Ninguna se detiene por otra.</li>
</ul>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/08/8.png" class="kg-image" alt="8" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/08/8.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/08/8.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/08/8.png 1544w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><!--kg-card-begin: markdown--><h2 id="ejemplosdecdigosncronoyasncrono">Ejemplos de código síncrono y asíncrono</h2>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/08/9.png" class="kg-image" alt="9" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/08/9.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/08/9.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/08/9.png 1156w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Antes de empezar este proyecto, vamos a ver algunos ejemplos para resolver algunas dudas.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/08/10.png" class="kg-image" alt="10" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/08/10.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/08/10.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/08/10.png 1054w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Vamos a probar un sistema asíncrono, escribe este código en JavaScript:</p>
<pre><code>console.log(" Yo ");

console.log(" como ");

console.log(" Helado ");
</code></pre>
<p>Este es el resultado en la consola: ?</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/08/11.png" class="kg-image" alt="11" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/08/11.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2021/08/11.png 919w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/08/12.png" class="kg-image" alt="12" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/08/12.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/08/12.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/08/12.png 1054w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Vamos a tomarnos dos segundos para comernos el helado. Ahora, vamos a probar un sistema asíncrono. Escribe el siguiente código en JavaScript.<br>
<strong>Observa:</strong> No te preocupes, discutiremos <code>setTimeout()</code> luego en este artículo.</p>
<pre><code>console.log("Yo");

// Veremos esto en 2 segundos

setTimeout(()=&gt;{
  console.log("como");
},2000)

console.log("Helado")
</code></pre>
<p>Este es el resultado en la consola: ?</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/08/13.png" class="kg-image" alt="13" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/08/13.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2021/08/13.png 924w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Ahora sabes la diferencia entre operaciones síncronas y asíncronas, vamos a construir nuestra tienda de helados.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/08/14.png" class="kg-image" alt="14" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/08/14.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/08/14.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/08/14.png 1253w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Para este proyecto puedes abrir <a href="https://codepen.io/">codepen.io</a> y empezar a programar, o puedes hacerlo en VS code y editar tu archivo de elección.</p>
<p>Abre la sección de JavaScript y también abre la consola de desarrollador. Escribiremos nuestro código y vemos los resultados en la consola.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/08/15.png" class="kg-image" alt="15" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/08/15.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/08/15.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/08/15.png 1253w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Cuando pasamos una función a otra función como un argumento, esto lo llamamos callback.<br>
Aquí podemos ver un ejemplo de una función callback:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/08/16.png" class="kg-image" alt="16" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/08/16.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/08/16.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/08/16.png 1054w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><!--kg-card-begin: markdown--><p>No te preocupes, vamos a ver algunos ejemplos de funciones callback en un minuto.</p>
<h2 id="porquusamosfuncionescallback">¿Por qué usamos funciones callback?</h2>
<p>Cuando hacemos una tarea compleja, dividimos esa tarea en pasos más pequeños. Para ayudarnos a establecer una relación entre estos pasos según el tiempo (opcional) y el orden, utilizamos devoluciones de llamada.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/08/17.png" class="kg-image" alt="17" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/08/17.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/08/17.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/08/17.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2021/08/17.png 2338w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Estos son los pequeños pasos que debes tomar para hacer helado. También ten en cuenta que en este ejemplo, el orden de los pasos y el tiempo son cruciales. No puedes cortar la fruta y servir helado.</p><p>Al mismo tiempo, si un paso anterior no se completa, no podemos pasar al siguiente paso.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2v1rn50smjul9arkneza.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>Para explicarlo con más detalle, comencemos nuestro negocio de heladerías.</p><h2 id="pero-espera-"><strong>Pero espera...</strong></h2><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cq8exwor5aiciu2j6jwu.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>La tienda tendrá dos partes:</p><ul><li>El almacén tendrá todos los ingredientes [Nuestro Backend]</li><li>Vamos a producir helado en tu cocina [el frontend]</li></ul><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i69bws707m5rvsj34i9o.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><h2 id="almacenemos-nuestros-datos">Almacenemos nuestros datos</h2><p>Ahora, vamos a almacenar nuestros ingredientes dentro de un objeto. ¡Empecemos!</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ihezrht8dgg9xn8lm2k9.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>Puedes almacenar los ingredientes dentro de objetos como este:</p><pre><code class="language-javascript">let stocks = {
    Fruits : ["strawberry", "grapes", "banana", "apple"]
 }
</code></pre><p>Nuestros otros ingredientes están aquí: ?</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6dcwr770l0ubupv0r2gj.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>Puedes almacenar estos otros ingredientes en objetos JavaScript como este: ?</p><pre><code class="language-javascript">let stocks = {
    Fruits : ["strawberry", "grapes", "banana", "apple"],
    liquid : ["water", "ice"],
    holder : ["cone", "cup", "stick"],
    toppings : ["chocolate", "peanuts"],
 };
</code></pre><p>Todo el negocio depende de lo que un cliente ordene. Una vez que tenemos un pedido, comenzamos la producción y luego servimos helado. Por lo tanto, vamos a crear dos funciones -&gt;</p><ul><li><code>order</code> (orden)</li><li><code>production</code> (producción)</li></ul><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3bnzniiyamo0b9l7e806.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>Así es como funciona todo: ?</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r8h8ra9wor8cs3dgddpb.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"><figcaption>Obtén el pedido del cliente, busca los ingredientes, comienza la producción y luego sirve.</figcaption></figure><p>Hagamos nuestras funciones. Usaremos funciones de flecha aquí:</p><pre><code class="language-javascript">let order = () =&gt;{};

let production = () =&gt;{};
</code></pre><p>Ahora, vamos a establecer una relación entre estas dos funciones usando una función callback, como esta: ?</p><pre><code class="language-javascript">let order = (call_production) =&gt;{

  call_production();
};

let production = () =&gt;{};
</code></pre><h3 id="vamos-a-hacer-una-peque-a-prueba"><strong>Vamos a hacer una pequeña prueba</strong></h3><p>Usaremos la función <code>console.log()</code> para realizar pruebas para aclarar cualquier duda que podamos tener sobre cómo establecimos la relación entre las dos funciones.</p><pre><code class="language-javascript">let order = (call_production) =&gt;{

console.log("Order placed. Please call production")

// function ? is being called 
  call_production();
};

let production = () =&gt;{

console.log("Production has started")

};
</code></pre><p>Para ejecutar la prueba, llamaremos a la función <code><strong><strong>order</strong></strong></code>. Y agregaremos la segunda función llamada <code>production</code> como su argumento.</p><pre><code class="language-javascript">// name ? of our second function
order(production);
</code></pre><p>Aquí está el resultado en nuestra consola ?</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u41ugdxxed1q8coz5hol.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><h2 id="t-mate-un-descanso"><strong>Tómate un descanso</strong></h2><p>Hasta ahora todo bien: ¡tómate un descanso!</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tnr74waq6noc0djln3qx.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><h2 id="despeja-la-consola-console-log"><strong>Despeja la consola <code>console.log</code></strong></h2><p>Mantén este código y elimina todo [no elimines nuestra variable de acciones]. En nuestra primera función, pasa otro argumento para que podamos recibir la orden [Nombre de la fruta]:</p><pre><code class="language-javascript">// Function 1

let order = (fruit_name, call_production) =&gt;{

  call_production();
};

// Function 2

let production = () =&gt;{};


// Trigger ?

order("", production);
</code></pre><p>Estos son nuestros pasos, y el tiempo que tardará cada paso en ejecutarse.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rphpp2lqjnk7f0tv5g3d.png" class="kg-image" alt="Tabla contiene los pasos para hacer helados" width="600" height="400" loading="lazy"><figcaption><strong style="box-sizing: inherit; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; margin: 0px; padding: 0px; vertical-align: baseline; color: var(--gray85);">Chart contains steps to make ice cream</strong></figcaption></figure><p>En este gráfico, puedes ver que el paso 1 es realizar el pedido, que tarda 2 segundos. Luego, el paso 2 es cortar la fruta (2 segundos), el paso 3 es agregar agua y hielo (1 segundo), el paso 4 es encender la máquina (1 segundo), el paso 5 es seleccionar el recipiente (2 segundos), el paso 6 es seleccionar los ingredientes (3 segundos) y el paso 7, el paso final, es servir el helado que toma 2 segundos.</p><p>Para establecer el tiempo, la función <code>setTimeout()</code> es excelente, ya que también utiliza una función callback tomando una función como argumento.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qwrg1taugyhvjnkx8xpp.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"><figcaption><strong style="box-sizing: inherit; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; margin: 0px; padding: 0px; vertical-align: baseline; color: var(--gray85);">Syntax of a setTimeout() function</strong></figcaption></figure><p>Ahora, vamos a seleccionar nuestra fruta y utilizar esta función:</p><pre><code class="language-javascript">// 1st Function

let order = (fruit_name, call_production) =&gt;{

  setTimeout(function(){

    console.log(`${stocks.Fruits[fruit_name]} was selected`)

// Order placed. Call production to start
   call_production();
  },2000)
};

// 2nd Function

let production = () =&gt;{
  // blank for now
};

// Trigger ?
order(0, production);
</code></pre><p>Y aquí está el resultado en la consola: ?</p><p><strong>Ten en cuenta</strong> que el resultado se muestra después de 2 segundos.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/edwji5vauypoezj3bxdk.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>Si te estás preguntando cómo recogimos la fresa de nuestra variable de stock, aquí está el código con el formato.?</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ia38z3x6b96xpq3aid91.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>No borres nada. Ahora comenzaremos a escribir nuestra función de producción con el siguiente código.? Usaremos funciones de flecha:</p><pre><code class="language-javascript">let production = () =&gt;{

  setTimeout(()=&gt;{
    console.log("production has started")
  },0000)

};
</code></pre><p>Y aquí está el resultado?</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5yskzvg7rezo2sg4lklq.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>Anidaremos otra función <code>setTimeout</code> en nuestra función <code>setTimeout</code> existente para picar la fruta. Así: ?</p><pre><code class="language-javascript">let production = () =&gt;{
  
  setTimeout(()=&gt;{
    console.log("production has started")


    setTimeout(()=&gt;{
      console.log("The fruit has been chopped")
    },2000)


  },0000)
};
</code></pre><p>Y aquí está el resultado?</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4659l1mua0rv40rwyem7.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>Si lo recuerdas, aquí están nuestros pasos:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rphpp2lqjnk7f0tv5g3d.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"><figcaption><strong style="box-sizing: inherit; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; margin: 0px; padding: 0px; vertical-align: baseline; color: var(--gray85);">Chart contains steps to make ice cream</strong></figcaption></figure><p>Completemos nuestra producción de helados anidando una función dentro de otra función: Esto también se conoce como función callback, ¿recuerdas?</p><pre><code class="language-javascript">let production = () =&gt;{

  setTimeout(()=&gt;{
    console.log("production has started")
    setTimeout(()=&gt;{
      console.log("The fruit has been chopped")
      setTimeout(()=&gt;{
        console.log(`${stocks.liquid[0]} and ${stocks.liquid[1]} Added`)
        setTimeout(()=&gt;{
          console.log("start the machine")
          setTimeout(()=&gt;{
            console.log(`Ice cream placed on ${stocks.holder[1]}`)
            setTimeout(()=&gt;{
              console.log(`${stocks.toppings[0]} as toppings`)
              setTimeout(()=&gt;{
                console.log("serve Ice cream")
              },2000)
            },3000)
          },2000)
        },1000)
      },1000)
    },2000)
  },0000)

};
</code></pre><p>Y aquí está el resultado en la consola ?</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5mq9bg6fqrc8apj7nu7b.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>¿Te sientes confundido?</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/man5l5pwavp9prio1wc0.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>Esto se llama infierno de función callback. Se ve algo como esto (¿recuerdas ese código justo arriba?): ?</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d5rk7f8d920jzn22smjh.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"><figcaption><strong style="box-sizing: inherit; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; margin: 0px; padding: 0px; vertical-align: baseline; color: var(--gray85);">Illustration of Callback hell</strong></figcaption></figure><p>¿Cuál es la solución a esto?</p><h1 id="c-mo-usar-promesas-para-escapar-del-infierno-de-funci-n-callback">Cómo usar promesas para escapar del infierno de función callback</h1><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x3neys1hxsrifgg5qm6x.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>Las promesas se inventaron para resolver el problema del infierno de devolución de llamada y para manejar mejor nuestras tareas.</p><h2 id="t-mate-un-descanso-1">Tómate un descanso</h2><p>¡Pero primero, tómate un descanso!</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bwfvel7kvm422gqvj0os.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>Así es como se ve una promesa:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7qo1zheuin2825osozvc.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"><figcaption><strong style="box-sizing: inherit; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; margin: 0px; padding: 0px; vertical-align: baseline; color: var(--gray85);">illustration of a promise format</strong></figcaption></figure><p>Diseccionemos las promesas juntos.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gozy5r1nfubzeq5t5t25.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ezi9ogz0ergprgkmu68a.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"><figcaption><strong style="box-sizing: inherit; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; margin: 0px; padding: 0px; vertical-align: baseline; color: var(--gray85);">An illustration of the life of a promise</strong></figcaption></figure><p>Como muestran los gráficos anteriores, una promesa tiene tres estados:</p><ul><li><strong>Pendiente<strong>:</strong> </strong>Esta es la etapa inicial. Aquí no pasa nada. Piensa en ello de esta manera, tu cliente se está tomando su tiempo para darte un pedido. Pero aún no han pedido nada.</li><li><strong>Resuelto<strong>:</strong></strong> Esto significa que su cliente ha recibido su comida y está feliz.</li><li><strong>Rechazado<strong>:</strong></strong> Esto significa que su cliente no recibió su pedido y abandonó el restaurante.</li></ul><p>Adoptemos promesas para nuestro estudio de caso de producción de helados.</p><h2 id="pero-espera--1"><strong>Pero espera...</strong></h2><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/634b6oyglkyoccsvr8l7.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>Necesitamos entender cuatro cosas más primero -&gt;</p><ul><li>Relación entre el tiempo y el trabajo</li><li>Encadenamiento de promesas</li><li>Manejo de errores</li><li>El controlador <code>.finally</code></li></ul><p>Comencemos nuestra heladería y entendamos cada uno de estos conceptos uno por uno dando pequeños pasos.</p><h2 id="relaci-n-entre-el-tiempo-y-el-trabajo">Relación entre el tiempo y el trabajo</h2><p>Si lo recuerdas, estos son nuestros pasos y el tiempo que cada uno tarda en hacer helado</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rphpp2lqjnk7f0tv5g3d.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"><figcaption><strong style="box-sizing: inherit; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; margin: 0px; padding: 0px; vertical-align: baseline; color: var(--gray85);">Chart contains steps to make ice cream</strong></figcaption></figure><p>Para que esto suceda, vamos a crear una variable en JavaScript: ?</p><pre><code class="language-javascript">let is_shop_open = true;
</code></pre><p>Ahora cree una función llamada <code>order</code> y pasa dos argumentos llamados <code>time, work</code>:</p><pre><code class="language-javascript">let order = ( time, work ) =&gt;{

  }
</code></pre><p>Ahora, vamos a hacerle una promesa a nuestro cliente, "Te serviremos helado" Así -&gt;</p><pre><code class="language-javascript">let order = ( time, work ) =&gt;{

  return new Promise( ( resolve, reject )=&gt;{ } )

  }
</code></pre><p>Nuestra promesa tiene 2 partes:</p><ul><li>Resuelto [ helado entregado ]</li><li>Rechazado [ el cliente no recibió helado ]</li></ul><pre><code class="language-javascript">let order = ( time, work ) =&gt; {

  return new Promise( ( resolve, reject )=&gt;{

    if( is_shop_open ){

      resolve( )

    }

    else{

      reject( console.log("Our shop is closed") )

    }

  })
}
</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3wik2xel68yue93yapm6.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>Agreguemos los factores de tiempo y trabajo dentro de nuestra promesa usando una función <code>setTimeout()</code> dentro de nuestra sentencia <code>if</code>. Sígueme ?</p><p><strong><strong>Not</strong>a<strong>:</strong></strong> En la vida real, también puede evitar el factor tiempo. Esto depende completamente de la naturaleza de su trabajo.</p><pre><code class="language-javascript">let order = ( time, work ) =&gt; {

  return new Promise( ( resolve, reject )=&gt;{

    if( is_shop_open ){

      setTimeout(()=&gt;{

       // work is ? getting done here
        resolve( work() )

// Setting ? time here for 1 work
       }, time)

    }

    else{
      reject( console.log("Our shop is closed") )
    }

  })
}
</code></pre><p>Ahora, vamos a usar nuestra función recién creada para comenzar la producción de helados.</p><pre><code class="language-javascript">// Set ? time here
order( 2000, ()=&gt;console.log(`${stocks.Fruits[0]} was selected`))
//    pass a ☝️ function here to start working
</code></pre><p>Resultado ? después de 2 segundos se ve así:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/erzjup8wt505j502e73n.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>¡Buen trabajo!</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8taajvjy6pfq35hu90nq.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><h2 id="encadenamiento-de-promesas">Encadenamiento de promesas</h2><p>En este método, definimos lo que necesitamos hacer cuando se completa la primera tarea utilizando el manejador <code>.then</code>. Se ve algo como esto ?</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l27ytifkoedl22kc97lh.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"><figcaption><strong style="box-sizing: inherit; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; margin: 0px; padding: 0px; vertical-align: baseline; color: var(--gray85);">Illustration of promise chaining using .then handler</strong></figcaption></figure><p>El manejador <code>.then</code> deveuelve una promesa cuando se resuelve nuestra promesa original.</p><h4 id="aqu-hay-un-ejemplo-">Aquí hay un ejemplo<strong>:</strong></h4><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1qpeewo19qbhzj47goos.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>Déjame hacerlo más simple: es similar a dar instrucciones a alguien. Le dices a alguien que " Primero haga esto, luego haga aquello, luego esta otra cosa, luego.., entonces.., entonces..."y así sucesivamente.</p><ul><li>La primera tarea es nuestra promesa original.</li><li>El resto de las tareas devuelven nuestra promesa una vez que se complete un pequeño trabajo.</li></ul><p>Vamos a implementar esto en nuestro proyecto. En la parte inferior de su código escriba las siguientes líneas. ?</p><p><strong>Nota: </strong>no te olvides de escribir la palabra <code>return</code> dentro de tu manejador <code>.then</code>. De lo contrario, no funcionará correctamente. Si tienes curiosidad, intenta eliminar la devolución una vez que terminemos los pasos: </p><pre><code class="language-javascript">order(2000,()=&gt;console.log(`${stocks.Fruits[0]} was selected`))

.then(()=&gt;{
  return order(0000,()=&gt;console.log('production has started'))
})
</code></pre><p>Y aquí está el resultado: ?</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qhhjaakbi6zshxhi6afy.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>Usando el mismo sistema, terminemos nuestro proyecto:?</p><pre><code class="language-javascript">// step 1
order(2000,()=&gt;console.log(`${stocks.Fruits[0]} was selected`))

// step 2
.then(()=&gt;{
  return order(0000,()=&gt;console.log('production has started'))
})

// step 3
.then(()=&gt;{
  return order(2000, ()=&gt;console.log("Fruit has been chopped"))
})

// step 4
.then(()=&gt;{
  return order(1000, ()=&gt;console.log(`${stocks.liquid[0]} and ${stocks.liquid[1]} added`))
})

// step 5
.then(()=&gt;{
  return order(1000, ()=&gt;console.log("start the machine"))
})

// step 6
.then(()=&gt;{
  return order(2000, ()=&gt;console.log(`ice cream placed on ${stocks.holder[1]}`))
})

// step 7
.then(()=&gt;{
  return order(3000, ()=&gt;console.log(`${stocks.toppings[0]} as toppings`))
})

// Step 8
.then(()=&gt;{
  return order(2000, ()=&gt;console.log("Serve Ice Cream"))
})
</code></pre><p>Aquí está el resultado: ?</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y0d0f4ys83ctnevkbgxs.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><h2 id="manejo-de-errores"><strong>Manejo de errores</strong></h2><p>Necesitamos una manera de manejar los errores cuando algo sale mal. Pero primero, necesitamos entender el ciclo de promesas:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jlm7zwonbxszeaccyohv.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z2ajcu52rxzwq64g81vp.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"><figcaption><strong style="box-sizing: inherit; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; margin: 0px; padding: 0px; vertical-align: baseline; color: var(--gray85);">An illustration of the life of a promise</strong></figcaption></figure><p>Para atrapar nuestros errores, cambiemos nuestra variable a falso <code>false</code>.</p><pre><code class="language-javascript">let is_shop_open = false;
</code></pre><p>Lo que significa que nuestra tienda está cerrada. Ya no vendemos helados a nuestros clientes.</p><p>Para manejar esto, usamos el manejador <code>.catch</code>. igual que <code>.then</code>, también devuelve una promesa, pero solo cuando nuestra promesa original es rechazada.</p><p>Un pequeño recordatorio aquí:</p><ul><li><code>.then</code> funciona cuando se resuelve una promesa</li><li><code>.catch</code> funciona cuando se rechaza una promesa</li></ul><p>Ir hasta el fondo y escribir el siguiente código:?</p><p>Solo recuerda que no debe haber nada entre tu anterior manejador <code>.then</code> y el manejador <code>.catch</code>.</p><pre><code class="language-javascript">.catch(()=&gt;{
  console.log("Customer left")
})
</code></pre><p>Aquí está el resultado:?</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lot6engklu29y05q8xyr.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>Un par de cosas a tener en cuenta sobre este código:</p><ul><li>El 1.er mensaje viene de la parte <code>reject()</code> de nuestra promesa</li><li>El segundo mensaje viene de manejador <code>.catch</code></li></ul><h2 id="c-mo-usar-el-manejador-finally-"><strong>Cómo usar el manejador </strong><code><strong>.finally()</strong></code><strong> </strong></h2><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gdq3i0agj4volq46ycue.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>Hay algo llamado el manejador <code>finally</code> el cual funciona sin importar si nuestra promesa fue resulta o rechazada.</p><p><strong>Por ejemplo<strong>:</strong></strong> Ya sea que atendamos a cero clientes o 100 clientes, nuestra tienda cerrará al final del día.</p><p>Si tienes curiosidad por probar esto, ven al fondo y escribe este código: ?</p><pre><code class="language-javascript">.finally(()=&gt;{
  console.log("end of day")
})
</code></pre><p>El resultado:?</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t2j3jf2uofip1d6y2rtt.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>Todos, por favor den la bienvenida a Async / Await~</p><h1 id="-c-mo-funciona-async-await-en-javascript">¿Cómo funciona<strong> Async / Await en JavaScript?</strong></h1><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ra7483f90b69pjl2cbae.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>Se supone que esta es la mejor manera de escribir promesas y nos ayuda a mantener nuestro código simple y limpio.</p><p>Todo lo que tienes que hacer es escribir la palabra <code>async</code> antes de cualquier función regular y se convierte en una promesa.</p><h2 id="pero-primero-tomate-un-descaso"><strong>Pero primero, tomate un descaso</strong></h2><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4vujyfxz7dg41jhjtcrx.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>Echemos un vistazo?</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/17f08ygj1odk28hgl9eq.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><h2 id="promesas-vs-async-await-en-javascript"><strong>Promesas vs Async/Await en JavaScript</strong></h2><p>Antes de async/await, para hacer una promesa escribimos esto:</p><pre><code class="language-javascript">function order(){
   return new Promise( (resolve, reject) =&gt;{

    // Write code here
   } )
}
</code></pre><p>Ahora usando async/await, escribimos uno como este:</p><pre><code class="language-javascript">//? the magical keyword
 async function order() {
    // Write code here
 }
</code></pre><h2 id="pero-espera--2"><strong>Pero espera....</strong></h2><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t1pjzw6zl0h21tyyh9u3.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>Necesitas entender -&gt;</p><ul><li>Como usar las palabras clave <code>try</code> y <code>catch</code></li><li>Como usar la palabra clave <code>await</code>.</li></ul><h2 id="c-mo-usar-las-palabras-clave-try-and-catch">Cómo usar las palabras clave Try and Catch</h2><p>Usamos la palabra clave <code>try</code> para ejecutar nuestro código mientras usamos <code>catch</code> para detectar nuestros errores. Es el mismo concepto que vimos cuando con promesas.</p><p>Hagamos una comparación. Veremos una pequeña demostración del formato, luego comenzaremos a programar.</p><h3 id="promesas-en-js-resolver-resolve-o-rechazar-reject"><strong>Promesas en JS -&gt; resolver <code>resolve</code> o rechazar <code>reject</code></strong></h3><p>We used resolve and reject in promises like this:</p><pre><code class="language-javascript">function kitchen(){

  return new Promise ((resolve, reject)=&gt;{
    if(true){
       resolve("promise is fulfilled")
    }

    else{
        reject("error caught here")
    }
  })
}

kitchen()  // run the code
.then()    // next step
.then()    // next step
.catch()   // error caught here
.finally() // end of the promise [optional]
</code></pre><h3 id="async-await-en-js-try-catch"><strong>Async / Await en JS -&gt; try, catch</strong></h3><p>Cuando usamos async/await, usamos este formato:</p><pre><code class="language-javascript">//? Magical keyword
async function kitchen(){

   try{
// Let's create a fake problem      
      await abc;
   }

   catch(error){
      console.log("abc does not exist", error)
   }

   finally{
      console.log("Runs code anyways")
   }
}

kitchen()  // run the code
</code></pre><p>No te asustes, hablaremos de la palabra clave <code>await</code> a continuación.</p><p>Now hopefully you understand the difference between promises and Async / Await.</p><h2 id="c-mo-usar-la-palabra-clave-await-de-javascript">Cómo usar la palabra clave <code>await</code> de JavaScript</h2><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fry577xha7313ead96xy.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>La palabra clave <code>await</code> hace que JavaScript espere hasta que una promesa se establezca y devuelva su resultado.</p><h3 id="c-mo-usar-la-palabra-clave-await-en-javascript">Cómo usar la palabra clave <code>await</code> en JavaScript</h3><p>Volvamos a nuestra heladería. No sabemos qué relleno prefiere un cliente, chocolate o cacahuetes. Así que tenemos que detener nuestra máquina e ir y preguntar a nuestro cliente lo que les gustaría en su helado.</p><p>Observe aquí que solo nuestra cocina está detenida, pero nuestro personal fuera de la cocina seguirá haciendo cosas como:</p><ul><li>lavar los platos</li><li>limpiar las mesas</li><li>tomando órdenes, y así sucesivamente</li></ul><h2 id="un-ejemplo-de-c-digo-de-palabra-clave-await">Un ejemplo de código de palabra clave <code>await</code></h2><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8r5w5aapofalnq882wat.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>Vamos a crear una pequeña promesa para preguntar qué relleno usar. El proceso dura tres segundos.</p><pre><code class="language-javascript">function toppings_choice (){
  return new Promise((resolve,reject)=&gt;{
    setTimeout(()=&gt;{

      resolve( console.log("which topping would you love?") )

    },3000)
  })
}
</code></pre><p>Ahora, vamos a crear nuestra función de cocina con la palabra clave <code>async</code> primero.</p><pre><code class="language-javascript">async function kitchen(){

  console.log("A")
  console.log("B")
  console.log("C")
  
  await toppings_choice()
  
  console.log("D")
  console.log("E")

}

// Trigger the function

kitchen();
</code></pre><p>Agreguemos otras tareas debajo de la función llamada <code>kitchen()</code>.</p><pre><code class="language-javascript">console.log("doing the dishes")
console.log("cleaning the tables")
console.log("taking orders")
</code></pre><p>Y aquí está el resultado:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y0dr669gewtrrd5fd86p.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>Literalmente, estamos saliendo de nuestra cocina para preguntarle a nuestro cliente: "¿cuál es su opción de cobertura?" Mientras tanto, otras cosas todavía se hacen.</p><p>Una vez que tengamos su elección, entramos en la cocina y terminamos el trabajo.</p><h3 id="nota-peque-a">Nota pequeña</h3><p>Al usar Async / Await, también puede usar el <code>.then</code>, <code>.catch</code>, y <code>.finally</code>, los manejadores también son una parte central de las promesas.</p><h3 id="abramos-nuestra-helader-a-de-nuevo">Abramos nuestra heladería de nuevo</h3><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vzw8gp721oecwo2b3l6s.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>Vamos a crear dos funciones -&gt;</p><ul><li><code>kitchen</code>: para hacer helado</li><li><code>time</code>: para asignar la cantidad de tiempo que tomará cada pequeña tarea.</li></ul><p>¡Empecemos! Primero, cree la función de tiempo:</p><pre><code class="language-javascript">let is_shop_open = true;

function time(ms) {

   return new Promise( (resolve, reject) =&gt; {

      if(is_shop_open){
         setTimeout(resolve,ms);
      }

      else{
         reject(console.log("Shop is closed"))
      }
    });
}

</code></pre><p>Ahora, vamos a crear nuestra cocina:</p><pre><code class="language-javascript">async function kitchen(){
   try{

     // instruction here
   }

   catch(error){
    // error management here
   }
}

// Trigger
kitchen();
</code></pre><p>Vamos a dar pequeñas instrucciones y probar si nuestra función de cocina está funcionando o no:</p><pre><code class="language-javascript">async function kitchen(){
   try{

// time taken to perform this 1 task
     await time(2000)
     console.log(`${stocks.Fruits[0]} was selected`)
   }

   catch(error){
     console.log("Customer left", error)
   }

   finally{
      console.log("Day ended, shop closed")
    }
}

// Trigger
kitchen();
</code></pre><p>El resultado se ve así cuando la tienda está abierta:?</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lptup827qau72e83deuv.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>El resultado se ve así cuando la tienda está cerrada: ?</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r8pjz1qlw58ap8pq7crz.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>Hasta ahora todo bien.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cnkgk63x51wth2byxzfe.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p>Completemos nuestro proyecto.</p><p>Aquí está la lista de nuestras tareas de nuevo: ?</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7wthn0jr5vw7vb02e4qg.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"><figcaption><strong style="box-sizing: inherit; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; margin: 0px; padding: 0px; vertical-align: baseline; color: var(--gray85);">Chart contains steps to make ice cream</strong></figcaption></figure><p>Primero, abre nuestra tienda</p><pre><code class="language-javascript">let is_shop_open = true;
</code></pre><p>Ahora escribe los pasos dentro de nuestra función <code>kitchen()</code>: ?</p><pre><code class="language-javascript">async function kitchen(){
    try{
	await time(2000)
	console.log(`${stocks.Fruits[0]} was selected`)

	await time(0000)
	console.log("production has started")

	await time(2000)
	console.log("fruit has been chopped")

	await time(1000)
	console.log(`${stocks.liquid[0]} and ${stocks.liquid[1]} added`)

	await time(1000)
	console.log("start the machine")

	await time(2000)
	console.log(`ice cream placed on ${stocks.holder[1]}`)

	await time(3000)
	console.log(`${stocks.toppings[0]} as toppings`)

	await time(2000)
	console.log("Serve Ice Cream")
    }

    catch(error){
	 console.log("customer left")
    }
}
</code></pre><p>Y aquí está el resultado: ?</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qs9yccq9209u7m9lquju.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><h1 id="conclusi-n"><strong>Conclusión</strong></h1><p>¡Felicitaciones por leer hasta el final! En este artículo has aprendido:</p><ul><li>La diferencia entre sistemas síncronos y asíncronos</li><li>Mecanismos de JavaScript asíncrono usando 3 técnicas (funciones callbacks, promesas, y Async / Await)</li></ul><p>Aquí está tu medalla por leer hasta el final. ❤️</p><h3 id="las-sugerencias-y-cr-ticas-son-muy-apreciadas-">Las sugerencias y críticas son muy apreciadas <strong>❤️</strong></h3><figure class="kg-card kg-image-card"><img src="https://dev-to-uploads.s3.amazonaws.com/i/usxsz1lstuwry3jlly4d.png" class="kg-image" alt="Alt Text" width="600" height="400" loading="lazy"></figure><p><strong><strong>YouTube<a href="https://youtube.com/c/joyshaheb"> / Joy Shaheb</a></strong></strong></p><p><strong><strong>LinkedIn<a href="https://www.linkedin.com/in/joyshaheb/"> / JoyShaheb</a></strong></strong></p><p><strong><strong>Twitter<a href="https://twitter.com/JoyShaheb"> / JoyShaheb</a></strong></strong></p><p><strong><strong>Instagram<a href="https://www.instagram.com/joyshaheb/"> / JoyShaheb</a></strong></strong></p><h1 id="cr-ditos"><strong>Créditos</strong></h1><ul><li><a href="https://www.freepik.com/user/collections/promises-article/2046500">Collection of all the images used</a></li><li><a href="https://www.flaticon.com/packs/unicorn-4">Unicorns</a>, <a href="https://www.flaticon.com/packs/kitty-avatars-3">kitty avatar</a></li><li><a href="https://www.pexels.com/photo/brown-tabby-cat-with-slice-of-loaf-bread-on-head-4587955/">tabby cat</a>, <a href="https://www.pexels.com/photo/young-female-astrologist-predicting-future-with-shining-ball-6658693/">Astrologist Woman</a>, <a href="https://www.pexels.com/photo/woman-in-white-dress-holding-white-flower-bouquet-3981511/">girl-holding-flower</a></li><li><a href="https://www.vecteezy.com/vector-art/180695-people-mind-emotion-character-cartoon-vector-illustration">Character emotions</a></li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Guía de Git para contribuir en un proyecto de código abierto ]]>
                </title>
                <description>
                    <![CDATA[ Una hoja de tips para tus contribuciones a un proyecto de códgio abierto. Si estás leyendo este artículo, ya debes conocer que abundan los beneficios de ser un contribuidor de proyectos de código abierto (Puedes saltarte este artículo y navegar hasta el final si estás aquí por la hoja de ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/una-guia-simple-de-git-y-una-hoja-de-trucos-para-colaboradores-de-codigo-abierto/</link>
                <guid isPermaLink="false">6093f823eaa005076665feef</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Mitchell Contreras ]]>
                </dc:creator>
                <pubDate>Mon, 05 Jul 2021 06:25:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/06/5f9ca17a740569d1a4ca4ed1.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Una hoja de tips para tus contribuciones a un proyecto de códgio abierto.</p>
<p>Si estás leyendo este artículo, ya debes conocer que abundan los beneficios de ser un contribuidor de proyectos de código abierto (Puedes saltarte este artículo y navegar hasta el final si estás aquí por la hoja de trucos).</p>
<p>El problema común al que se enfrenta un aspirante a contribuidor de proyecto de código abierto es como realizar el primer paso desde el <code>fork</code> hasta el <code>pull request</code>. Luego de leer este artículo, estarás equipado con todo lo que necesitas para realizar el primer <code>pull request</code> a un proyecto de código abierto.</p>
<p>Aparte de hacerse fácil este proceso para ti, el flujo de trabajo definido en git también hará que tu contribución se vea profesional. Esto será en el caso que quieras agregar tu contribución a tu portafolio.</p>
<h1 id="prerequisitos">Pre-requisitos</h1>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/05/2.png" class="kg-image" alt="2" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/05/2.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2021/05/2.png 1000w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>Photo by <a href="https://unsplash.com/@randyfath?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Randy Fath</a> / <a href="https://unsplash.com/?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Unsplash</a></figcaption></figure><!--kg-card-begin: markdown--><p>Este artículo asume que ya conoces los pasos para contribuir a un proyecto de código abierto. Si no los conoces, quizás te gustaría leer <a href="https://rubygarage.org/blog/how-contribute-to-open-source-projects">este artículo escrito por Maryna</a>. También asumimos que tienes instalado Git en tu computadora, Si no lo tienes, quizas quieras revisar <a href="https://docs.github.com/en/github/getting-started-with-github/set-up-git">instalación de Git en este artículo</a> y hacerlo antes.</p>
<h1 id="paso1forkdelproyecto">Paso 1: Fork del proyecto</h1>
<p>Esto es tan simple como hacer click en un botón de GitHub. Navega al repositorio del proyecto que desees contribuir, luego haz click en el botón <code>fork</code> en la parte superior izquierda como se puede observar en la siguiente imagen.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/05/3.png" class="kg-image" alt="3" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/05/3.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/05/3.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/05/3.png 1040w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Luego de usar el botón <code>fork</code> tendrás el repositorio en tu cuenta de GitHub.</p>
<h1 id="paso2clonarelproyectoentumquinalocal">Paso 2: Clonar el proyecto en tu máquina local</h1>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>Esta es la parte más simple de Git. Navega hasta el repositorio <code>forked</code> (El repositorio ahora se encuentra en tu lista de proyectos en GitHub). Luego del paso 1 y 2 como puedes ver en la imagen siguiente debes copiar la ruta url clonar el repositorio. Esta url debe verse: <code>https:github.com/suretrust.com/freeCodeCamp.git</code></p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/05/4.png" class="kg-image" alt="4" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/05/4.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/05/4.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/05/4.png 1040w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Luego debes clonar el proyecto con el comando <code>git clone &lt;la url copiada&gt;</code> en la linea de comandos como en el siguiente ejemplo:</p>
<p><code>git clone https://github.com/suretrust/freeCodeCamp.git</code></p>
<h1 id="paso3creaupstream">Paso 3: Crea upstream</h1>
<p>Upstream es necesario para mantener el seguimiento desde tu repositorio al repositorio del proyecto original. Esto es muy útil si deseas contribuir a un repositorio popular.</p>
<p>Algunos repositorios aceptan los <code>pull request</code> cada hora o menos, así que debes asegurarte que tu <code>rama</code> tiene los ultimos cambios del repositorio original.</p>
<p><strong>Debes tener en cuenta que upstream apunta al repositorio freeCodeCamp y no a tu repositorio.</strong> Siguiendo los pasos 1 y 2 debes copiar la url de upstream.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/05/5.png" class="kg-image" alt="5" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/05/5.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/05/5.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/05/5.png 1040w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Para crear un link al repositorio original, copia y pega el siguiente comando en tu terminal:</p>
<p><code>git remote add upstream &lt;upstream address&gt;</code></p>
<p>Puedes usar <code>git pull upstream master</code> para confirmar que no ha habido ningún cambio hasta este momento (desde que realizamos el fork del repositorio hasta ahora)-</p>
<h1 id="step4crealaramadndevasatrabajar">Step 4: Crea la rama dónde vas a trabajar</h1>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/05/6.png" class="kg-image" alt="6" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/05/6.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2021/05/6.png 1000w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>Photo by <a href="https://unsplash.com/@_zachreiner_?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Zach Reiner</a> / <a href="https://unsplash.com/?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Unsplash</a></figcaption></figure><!--kg-card-begin: markdown--><p>Es bueno crear una nueva rama cada vez que quieras contribuir, esto nos permite identificar que la rama es para la contribución que se está a punto de hacer, podría ser tan pequeño como corregir un error tipográfico o tan largo como la implementación de una nueva funcionalidad. De cualquier manera, es buena práctica crear una rama.</p>
<p>Otra parte importante de la creación de ramas es el nombrado, es agradable usar un nombre que un extraño que no sabe nada del repositorio pueda entender fácilmente. Si quieres añadir una funcionalidad de inicio de sesión, por ejemplo, debes crear una rama llamado <code>add-login-feature</code> o <code>login-feature</code>.</p>
<p>Para crear una rama debes escribir el siguiente comando en tu terminal:</p>
<p><code>git checkout -b &lt;el nombre de tu rama&gt;</code></p>
<p>Este comando creará una rama y apuntará a ella, si el nombre de la rama es <code>login-feature</code> entonces puedes usar el siguiente comando:</p>
<p><code>git checkout -b login-feature</code></p>
<p><strong>Añade tu contribución y después muévete al paso 5.</strong></p>
<h1 id="paso5gitaddyhacercommitdetucontribucin">Paso 5: Git add y hacer commit de tu contribución</h1>
<p>Esto también es bastante simple. Puedes hacer<code>stage</code> y <code>commit</code> de tus cambios escribiendo lo siguiente en la terminal:</p>
<pre><code>// Para hacer stage de los cambios
git add .

//Para hacer commit de los cambios
git commit -m 'Mensaje del commit'
</code></pre>
<p>Ahora ya has realizado tu commit, ¿Cúal es el siguiente paso?</p>
<h1 id="paso6hacerpulldesdeupstreamanuestraramalocal">Paso 6: Hacer Pull desde upstream a nuestra rama local</h1>
<p>Como lo vimos en el paso 4, este paso es mezclar cualquier diferencia en upstream en nuestra local para prevenir conflictos.</p>
<p><code>git pull upstream &lt;nombre-de-rama&gt;</code></p>
<p>Esto mezcla los cambios de upstream en nuestra rama actual.</p>
<h1 id="paso7pushdelaramaenlaqueestamostrabajando">Paso 7: Push de la rama en la que estamos trabajando</h1>
<p>Ahora, casi estás ahí.<br>
Para hacer push de los cambios en los que has estado trabajando debes ejecutar:</p>
<p><code>git push origin &lt;nombre-de-rama&gt;</code></p>
<h1 id="paso8crearunpullrequest">Paso 8: Crear un pull request</h1>
<p>Este es el paso final para cualquier contribución a un proyecto abierto, estaras diciendo "He realizado algunos cambios, ¿Le importaría agregarlos al proyecto?".</p>
<p>Al abrir una solicitud de pull request, esperaras que el propietario del proyecto o los miembros les guste lo que ven y los mezclen. De lo contrario, podrían realizar cambios o solicitar que tu los realices antes de hacer la mezcla con la rama estable del proyecto.</p>
<p>Para abrir un pull request, navega hasta el repositorio principal como puedes ver en la siguiente imagen. Podrás ver la última rama que subiste 'login-feature', entonces debes hacer click en <code>'compare and pull request'</code>.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/05/7.png" class="kg-image" alt="7" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/05/7.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2021/05/7.png 887w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Explica claramente los cambios que has realizado y luego crea el <code>pull request</code> como puedes verlo en la imágen:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/05/8.png" class="kg-image" alt="8" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/05/8.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2021/05/8.png 994w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Esto es todo. Ahora puedes ir y contribuir a un proyecto ¡como todo un profesional!</p>
<h1 id="hojadecomandodegitparacontribuiraunproyecto">Hoja de comando de Git para contribuir a un proyecto</h1>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/05/9.png" class="kg-image" alt="9" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/05/9.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/05/9.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/05/9.png 1040w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>¡Hasta luego y feliz contribución!</p><!--kg-card-begin: markdown--><p>Traducido del artículo de <a href="https://www.freecodecamp.org/news/author/suretrust/">Saheed Oladele</a> - <a href="https://www.freecodecamp.org/news/a-simple-git-guide-and-cheat-sheet-for-open-source-contributors/">A simple Git guide and cheat sheet for open source contributors</a></p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cada propiedad de fondo CSS ilustrada y explicadas con ejemplos de código? ]]>
                </title>
                <description>
                    <![CDATA[ Hoy vamos a aprender sobre cada una de las propiedades de fondo CSS con cada uno de sus posibles valores. Aprenderemos haciendo. ¡Vamos!? Tabla de contenidos  * Todas las propiedades  * background-image  * background-size  * background-repeat  * background-position  * background-origin  * background-clip  ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/todas-las-propiedades-background-de-css-explicadas-con-codigo-de-ejemplo/</link>
                <guid isPermaLink="false">607d79680aad9709126b405d</guid>
                
                    <category>
                        <![CDATA[ CSS ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Mitchell Contreras ]]>
                </dc:creator>
                <pubDate>Thu, 01 Jul 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/06/FreeCodeCamp--1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Hoy vamos a aprender sobre cada una de las propiedades de fondo CSS con cada uno de sus posibles valores. Aprenderemos haciendo. ¡Vamos!?</p>
<h1 id="tabladecontenidos">Tabla de contenidos</h1>
<ul>
<li>Todas las propiedades</li>
<li>background-image</li>
<li>background-size</li>
<li>background-repeat</li>
<li>background-position</li>
<li>background-origin</li>
<li>background-clip</li>
<li>background-attachment</li>
<li>background-color</li>
<li>Atajos y combinaciones</li>
<li>Conclusión</li>
</ul>
<p>También puedes ver este tutorial en YouTube:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.17977528089888%;" class="fluid-width-video-wrapper">
            <iframe width="356" height="200" src="https://www.youtube.com/embed/hwJKjsZUPjY?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><!--kg-card-begin: markdown--><h2 id="todaslaspropiedades">Todas las propiedades</h2>
<p>Esta es la lista de todas las propiedades que vamos a revisar. El texto rojo al final es la taquigrafía.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-2.png" class="kg-image" alt="imagen-2" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-2.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-2.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-2.png 1535w" sizes="(min-width: 720px) 720px" width="1535" height="1061" loading="lazy"></figure><!--kg-card-begin: markdown--><h1 id="qusonlaspropiedadesdefondocss">¿Qué son las propiedades de  fondo CSS?</h1>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-3.png" class="kg-image" alt="imagen-3" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-3.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-3.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/04/imagen-3.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-3.png 1694w" sizes="(min-width: 720px) 720px" width="1694" height="693" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Las propiedades de fondo CSS nos dejan controlar el tamaño y las propiedades de las imágenes, lo que nos permite <strong>hacer imágenes responsive</strong> para pequeñas y grandes pantallas. Esto, a su vez, nos ayuda a crear sitios web responsive.<br>
Por ejemplo,</p>
<ul>
<li>La propiedad <strong>background-size</strong> nos permite asignar un nuevo valor de ancho y alto para nuestras imágenes de acuerdo al tamaño de la pantalla.</li>
<li><strong>background-position</strong> nos permite decir al navegador donde poner la imagen en la pantalla.</li>
</ul>
<p>Y hay mucho más.</p>
<h2 id="cmoconfigurarelproyecto">¿Cómo configurar el proyecto?</h2>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-4.png" class="kg-image" alt="imagen-4" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-4.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-4.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/04/imagen-4.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-4.png 1694w" sizes="(min-width: 720px) 720px" width="1694" height="693" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Antes de programar, necesitas saber un poco sobre HTML, CSS y cómo usar VScode.<br>
Para probar las propiedades y sus valores, sigue los siguientes pasos ?</p>
<ol>
<li>Crea una nueva carpeta llamada 'BACKGROUND-PROJECT'. Abre la carpeta en VScode.</li>
<li>Crea los archivos <code>index.html</code> y <code>style.css</code>.</li>
<li>Instala 'live server' en VScode.</li>
<li>Inicia live server.</li>
</ol>
<h2 id="html">HTML</h2>
<p>Crea un <code>div</code> con el nombre de la clase 'container' dentro del <code>body tag</code> en el archivo HTML.</p>
<pre><code class="language-html">&lt;div class="container"&gt;&lt;/div&gt;
</code></pre>
<h2 id="css">CSS</h2>
<p>En CSS, tú debes incluir el tamaño para el 'container', de lo contrario nosotros no seremos capaces de ver la imagen. En nuestro caso, estableceremos 100vh, igual a:</p>
<pre><code>.container{
  height : 100vh;
}
</code></pre>
<h2 id="descargarlasimagenesdelproyecto">Descargar las imagenes del proyecto</h2>
<p>Las imágenes están en mi <a href="https://github.com/JoyShaheb/Project-image-repo/tree/main/Background-property-images">GitHub repository</a>. Te explico cómo descargarlas:</p>
<ol>
<li>Copia el link anterior ☝️</li>
<li>Ve a <a href="https://minhaskamal.github.io/DownGit/#/home">downgit</a> y pega el link que ya copiaste.</li>
<li>Sigue los pasos del siguiente video ?</li>
</ol>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-5.gif" class="kg-image" alt="imagen-5" width="984" height="538" loading="lazy"></figure><!--kg-card-begin: markdown--><p>y... ¡estamos listos!</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-6.png" class="kg-image" alt="imagen-6" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-6.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-6.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/04/imagen-6.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-6.png 1694w" sizes="(min-width: 720px) 720px" width="1694" height="693" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Vamos a programar ?</p>
<h2 id="lapropiedadbackgroundimage">La propiedad background-image</h2>
<p>Usando esta propiedad, podemos añadir imágenes <strong>a lo largo de nuestra hoja de estilos</strong>.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-7.png" class="kg-image" alt="imagen-7" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-7.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-7.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-7.png 1220w" sizes="(min-width: 720px) 720px" width="1220" height="518" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Escribimos la sintaxis después de escribir el selector, igual a:?</p>
<pre><code>.container{
// El path/URL de la imagen va dentro de las comillas simples ? 
   background-image  :  url(' ');
}
</code></pre>
<p>Podemos usar bakbroung-image de <strong>dos maneras</strong>:</p>
<ul>
<li>Con el path del directorio local.</li>
<li>Especificando la URl de la imagen.</li>
</ul>
<h3 id="comusarbackgroundimageatravsdeldirectorio">¿Comó usar background-image a través del directorio</h3>
<p>Aquí tenemos la sintaxis para background-image cuando usamos el directorio ?.</p>
<pre><code>.container{
// Coloca la ruta dentro de las comillas simples ? 
   background-image  :  url(' ');
}
</code></pre>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-8.png" class="kg-image" alt="imagen-8" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-8.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-8.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-8.png 1440w" sizes="(min-width: 720px) 720px" width="1440" height="529" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Hay tres casos donde necesitamos especificar la ruta de la imagen en nuestro CSS:</p>
<ol>
<li>Cuando la <code>imagen</code> y  <code>style.css</code> están en la misma carpeta.</li>
<li>Cuando la  <code>imagen</code> está en la siguiente carpeta.</li>
<li>Cuando la <code>imagen</code> está en la carpeta anterior.</li>
</ol>
<p>Cuando la <code>imagen</code> y <code>style.css</code> están en la <strong>misma carpeta</strong>, se va ver de la siguiente manera. ?</p>
<p>Observa que <code>kitty.png</code> y <code>style.css</code>están en la misma carpeta padre llamada <strong>BACKGROUND-PROJECT</strong>:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-9.png" class="kg-image" alt="imagen-9" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-9.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-9.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-9.png 1342w" sizes="(min-width: 720px) 720px" width="1342" height="815" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Para localizar la ruta de <code>kitty.png</code>, escribe el siguiente código en <code>style.css</code>:</p>
<pre><code>.container{
   background-image : url("kitty.png");
   
   height: 100vh;
// establecer el tamaño y no permitir repetición de la imagen
   background-repeat : no-repeat;
   background-size : contain;
 }
</code></pre>
<p>Cuando la imagen está en la carpeta siguiente y <code>style.css</code> en la carpeta anterior. Observa como la imagen debajo <code>kitty.png'</code> está en la carpeta Assets mientras que <code>style.css</code> está en la carpeta anterior.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-10.png" class="kg-image" alt="imagen-10" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-10.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-10.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-10.png 1342w" sizes="(min-width: 720px) 720px" width="1342" height="815" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Para continuar y encontrar el archivo <code>kitty.png</code>, debemos escribir un punto y un slash igual a (./) luego de la comilla en <code>style.css</code>. Entonces escribimos el nombre de la carpeta y luego slash (/) para finalmente colocar el nombre de la imagen, igual a: ?</p>
<pre><code class="language-CSS"> .container{
   background-image : url("./Assets/kitty.png");

   height: 100vh;
// establecer el tamaño y no permitir repetición de la imagen
   background-repeat : no-repeat;
   background-size : contain;
 }
</code></pre>
<p>Si la imagen está en la <strong>carpeta anterior</strong>, entonces necesitamos volver. Observa en la imagen abajo ? que <code>style.css</code> está en la carpeta <strong>src</strong> y <code>kitty.png</code> esta <strong>fuera de la carpeta src</strong>.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-11.png" class="kg-image" alt="imagen-11" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-11.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-11.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-11.png 1342w" sizes="(min-width: 720px) 720px" width="1342" height="815" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Para volver a la carpeta anterior y encontrar el archivo <code>kitty.png</code>, necesitamos escribir dos puntos seguidos y un slash (../) luego de las comillas en el archivo <code>style.css</code>. Entonces escribimos el nombre de la imagen, igual a: ?</p>
<pre><code> .container{
   background-image : url("../kitty.png");

   height: 100vh;
// establecer el tamaño y no permitir repetición de la imagen
   background-repeat : no-repeat;
   background-size : contain;
 }
</code></pre>
<h3 id="cmousarbackgroundimageconlinkdirecto">¿Cómo usar background-image con link directo?</h3>
<p>Esto es bastante sencillo. Escribimos la propiedad y colocamos en link dentro <code>link()</code>.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-12.png" class="kg-image" alt="imagen-12" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-12.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-12.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-12.png 1337w" sizes="(min-width: 720px) 720px" width="1337" height="529" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Para trabajar con una imagen como link directo, necesitamos escribir el siguiente código.</p>
<pre><code class="language-CSS"> .container{
    background-image : url("https://dev-to-uploads.s3.amazonaws.com/uploads/articles/szxp3jqyjyksrep1ep82.png");

  height: 100vh;
// establecer el tamaño y no permitir repetición de la imagen
   background-repeat : no-repeat;
   background-size : contain;
 }
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="tomemosundescanzo">Tomemos un descanzo</h3>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-13.png" class="kg-image" alt="imagen-13" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-13.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-13.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-13.png 1440w" sizes="(min-width: 720px) 720px" width="1440" height="901" loading="lazy"></figure><!--kg-card-begin: markdown--><h2 id="lapropiedadbackgroundsize">La propiedad background-size</h2>
<p>Podemos ajustar el tamaño de una imagen usando la propiedad <code>background-size</code>.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-14.png" class="kg-image" alt="imagen-14" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-14.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-14.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-14.png 1309w" sizes="(min-width: 720px) 720px" width="1309" height="529" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Podemos escribir la sintaxis luego de escribir el nombre del selector, igual a ?</p>
<pre><code>.container{
// Podremos escribir ? aquí
  background-size  : cover;
}
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>Podemos usar background-size de 3 maneras:</p>
<ul>
<li>Usar los valores cover/contain</li>
<li>Establecer el alto y ancho de la imagen</li>
<li>usar auto</li>
</ul>
<p>Vamos a empezar revisando los valores <strong>cover &amp; contain</strong> con tamaño de [718px X 614px].</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-15.png" class="kg-image" alt="imagen-15" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-15.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-15.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/04/imagen-15.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/size/w2400/2021/04/imagen-15.png 2400w" sizes="(min-width: 720px) 720px" width="2649" height="1161" loading="lazy"></figure><!--kg-card-begin: markdown--><h3 id="valorcover">Valor cover</h3>
<p>Para este trabajo debemos incluir una imagen, establecer altura y detener la repetición de la imagen. Podemos hacer esto en CSS: ?</p>
<pre><code>.container{
  background-image : url('cute-bear.png');
  background-repeat: no-repeat;
  background-size : cover;

// Debe incluir la altura
  height : 100vh;
}
</code></pre>
<p>Cuando usamos esta propiedad, estirará la imagen a toda la pantalla incluso cuando cambiamos el tamaño de la ventana. Mira el ejemplo a continuación ?</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-16.gif" class="kg-image" alt="imagen-16" width="480" height="310" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Este valor conservará el tamaño de la imagen [Responsive Image] incluso cuando cambiamos el tamaño de la ventana. Mira el video a continuación para ver como funciona ?</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-17.gif" class="kg-image" alt="imagen-17" width="480" height="310" loading="lazy"></figure><!--kg-card-begin: markdown--><h3 id="tamaodeanchoyalto">Tamaño de ancho y alto</h3>
<p>Podemos establecer el ancho y la altura de la imagen usando la propiedad background-size.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-18.png" class="kg-image" alt="imagen-18" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-18.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-18.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/04/imagen-18.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-18.png 2064w" sizes="(min-width: 720px) 720px" width="2064" height="1289" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Aquí esta la sintaxis en CSS: ?</p>
<pre><code>.container{
// Aquí, podemos ver ancho?  &amp;  ? alto
  background-size : 200px   200px;
}
</code></pre>
<p>No olvidemos insertar la imagen, establecer el alto de la imagen y detener la repetición de la imagen. El código se vería así:</p>
<pre><code>.container{
  background-image : url('cute-bear.png');
  background-repeat: no-repeat;

// Aquí, podemos ver ancho?  &amp;  ? alto
  background-size : 200px  200px;

// Debe incluir la altura
  height : 100vh;
}
}
</code></pre>
<h3 id="tamaoautomtico">tamaño automático</h3>
<p>Cuando usamos este valor, la imagen estaría en su tamaño original. No cambiaria cuando hacemos cambiamos el tamaño de la ventana. Esto se vería así:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-19.gif" class="kg-image" alt="imagen-19" width="480" height="266" loading="lazy"></figure><!--kg-card-begin: markdown--><h2 id="lapropiedadbackgroundrepeat">La propiedad background-repeat</h2>
<p>Esta propiedad nos permite repetir la imagen múltiples veces.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/iamgen-20.png" class="kg-image" alt="iamgen-20" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/iamgen-20.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/iamgen-20.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/04/iamgen-20.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/size/w2400/2021/04/iamgen-20.png 2400w" sizes="(min-width: 720px) 720px" width="2802" height="938" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Escribimos la sintaxis luego del selector, igual a ?</p>
<pre><code>.container{
// Podemos cambiar el valor ? aquí
  background-repeat : repeat;
}
</code></pre>
<p>Esta propiedad tiene seis valores posibles:</p>
<ul>
<li>repeat</li>
<li>repeat-x</li>
<li>repeat-y</li>
<li>no repeat</li>
<li>space</li>
<li>round</li>
</ul>
<p>Aquí podemos ver el resultado de cada uno de los posibles valores. Observemos que el tamaño de la imagen ejemplo es de [200px X 200px].</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-21.png" class="kg-image" alt="imagen-21" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-21.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-21.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/04/imagen-21.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-21.png 1866w" sizes="(min-width: 720px) 720px" width="1866" height="1385" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-22.gif" class="kg-image" alt="imagen-22" width="480" height="318" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-23.gif" class="kg-image" alt="imagen-23" width="480" height="318" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Ahora, vamosa investigar que ocurre con cada valor. Pero, antes de esto, observemos que necesitamos insertar una imagen usando la propiedad `background-image.</p>
<pre><code>.container{
   background-image : url('kitty.png');
   background-size : 200px 200px;
   background-repeat :  ; //Aquí colocaremos las opciones

   height : 100vh;
}
</code></pre>
<h3 id="elvalorrepeat">El valor repeat</h3>
<p>Usando este valor, podemos repetir la misma imagen múltiples veces a <strong>lo largo de los ejes X y Y</strong> tanto como el tamaño de la pantalla lo permita. En el ejemplo siguiente el tamaño de la imagen es de 200px x 200px.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-24.png" class="kg-image" alt="imagen-24" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-24.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-24.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-24.png 1199w" sizes="(min-width: 720px) 720px" width="1199" height="788" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Para duplicar este resultado, escribimos -&gt;</p>
<pre><code>.container{
   background-image : url('kitty.png');
   background-size : 200px 200px;
   background-repeat : repeat;

   height : 100vh;
}
</code></pre>
<h3 id="elvalorrepeatx">El valor repeat-x</h3>
<p>Este valor nos permite repetir la misma imagen múltiples veces a lo largo del <strong>eje x</strong> tanto como el tamaño de la pantalla lo permita. En el ejemplo siguiente el tamaño de la imagen es de 200px x 200px.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-25.png" class="kg-image" alt="imagen-25" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-25.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-25.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-25.png 1199w" sizes="(min-width: 720px) 720px" width="1199" height="788" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Para que esto ocurra, escribimos -&gt;</p>
<pre><code>.container{
   background-image : url('kitty.png');
   background-size : 200px 200px;
   background-repeat : repeat-x;

   height : 100vh;
}
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="elvalorrepeaty">El valor repeat-y</h3>
<p>Este valor funciona de la misma manera que "repeat-x" pero a lo largo del <strong>eje y</strong> tanto como el tamaño de la pantalla lo permita. En el ejemplo siguiente el tamaño de la imagen es de 200px x 200px.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-26.png" class="kg-image" alt="imagen-26" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-26.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-26.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-26.png 1199w" sizes="(min-width: 720px) 720px" width="1199" height="788" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Para esta salida, escribimos -&gt;</p>
<pre><code>.container{
   background-image : url('kitty.png');
   background-size : 200px 200px;
   background-repeat : repeat-y ;

   height : 100vh;
}
</code></pre>
<h3 id="elvalornorepeat">El valor no-repeat</h3>
<p>Podemos tener el tamaño original de nuestra imagen sin repeticiones usando este valor. En el ejemplo siguiente el tamaño de la imagen es de 200px x 200px.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-27.png" class="kg-image" alt="imagen-27" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-27.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-27.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-27.png 1199w" sizes="(min-width: 720px) 720px" width="1199" height="788" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Para este resultado, escribimos -&gt;</p>
<pre><code>.container{
   background-image : url('kitty.png');
   background-size : 200px 200px;
   background-repeat : no-repeat ; 

   height : 100vh;
}
</code></pre>
<h3 id="elvalorspace">El valor space</h3>
<p>Trabaja con los ejes X y Y. Podemos ver la principal diferencia en los espacios cuando cambiamos el tamaño de la ventana. Observa que obtenemos espacio en blanco cuando cambiamos el tamaño de la pantalla:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-28.gif" class="kg-image" alt="imagen-28" width="480" height="318" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Para experimentar con este valor debemos escribir -&gt;</p>
<pre><code>.container{
   background-image : url('kitty.png');
   background-size : 200px 200px;
   background-repeat : space ;

   height : 100vh;
}
</code></pre>
<h3 id="elvalorround">El valor round</h3>
<p>Esto funciona tanto para el eje x como el eje y. Observa que la imagen es expandida cuando nosotros cambiamos el tamaño de la pantalla.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-29.gif" class="kg-image" alt="imagen-29" width="480" height="318" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Solo debemos escribir -&gt;</p>
<pre><code>.container{
   background-image : url('kitty.png');
   background-size : 200px 200px;
   background-repeat : round ; 

   height : 100vh;
}
</code></pre>
<h2 id="lapropiedadbackgroundposition">La propiedad background-position</h2>
<p>Esta propiedad es usada para cambiar la posición de la imagen en la pantalla.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-30.png" class="kg-image" alt="imagen-30" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-30.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-30.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/04/imagen-30.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/size/w2400/2021/04/imagen-30.png 2400w" sizes="(min-width: 720px) 720px" width="2000" height="553" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Aquí tenemos la sintaxis:  ?</p>
<pre><code>.container{
// Esta es       eje x?  &amp;  ? eje y
background-position : 300px  200px;
}
</code></pre>
<p>No podemos olvidar insertar la imagen, establecer la altura y evitar la repetición de la imagen. Podemos establecer el tamaño de la imagen a 300px x 200px usando la propiedad <code>background-size</code>:</p>
<pre><code>.container{
  background-image: url("kitty-idea.png");
  background-size: 200px 200px;
  background-repeat: no-repeat;

// Este es       eje x?  &amp;  ? eje y
  background-position : 300px 200px;
  height: 100vh;
}
</code></pre>
<p>Como resultado:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-31.png" class="kg-image" alt="imagen-31" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-31.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-31.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/04/imagen-31.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-31.png 2090w" sizes="(min-width: 720px) 720px" width="2090" height="1323" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Podemos usar una combinación de estos valores:</p>
<ul>
<li>top</li>
<li>left</li>
<li>right</li>
<li>bottom</li>
<li>percentage values</li>
</ul>
<p>Por ejemplo, vamos a establecer nuestra imagen abajo a la derecha. Aquí está el código para esto:</p>
<pre><code>.container{
  background-image: url("kitty-idea.png");
  background-size: 200px 200px;
  background-repeat: no-repeat;

// Este es           eje x?  &amp;  ? eje y
  background-position : bottom right;
  height: 100vh;
}
</code></pre>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-32.png" class="kg-image" alt="imagen-32" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-32.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-32.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/04/imagen-32.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-32.png 2090w" sizes="(min-width: 720px) 720px" width="2090" height="1323" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Calculando el espacio permitido de la pantalla, el valor porcentaje determina la posición de la imagen. Aquí lo vemos en código:</p>
<pre><code>.container{
  background-image: url("kitty-idea.png");
  background-size: 200px 200px;
  background-repeat: no-repeat;

// Este es           eje x?  &amp;  ? eje y
  background-position : 25% 15%;
  height: 100vh;
}
</code></pre>
<p>Y esté es el resultado:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-33.png" class="kg-image" alt="imagen-33" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-33.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-33.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/04/imagen-33.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-33.png 2090w" sizes="(min-width: 720px) 720px" width="2090" height="1323" loading="lazy"></figure><!--kg-card-begin: markdown--><h2 id="lapropiedadbackgroundorigin">La propiedad background-origin</h2>
<p>Esta propiedad nos permite establecer el origen de nuestra imagen a través del CSS box model.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-34.png" class="kg-image" alt="imagen-34" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-34.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-34.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/04/imagen-34.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/size/w2400/2021/04/imagen-34.png 2400w" sizes="(min-width: 720px) 720px" width="2504" height="775" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Escribimos la sintaxis luego de escribir el selector, igual a  ?</p>
<pre><code>container{
// Escribiremos el valor ? aquí
  background-origin: border-box;
}
</code></pre>
<p>Tiene cuatro posibles valores:</p>
<ul>
<li>border-box</li>
<li>padding-box</li>
<li>content-box</li>
<li>inherit</li>
</ul>
<p>En el standard <strong>CSS box model</strong>, la parte exterior es <strong>border</strong>. entonces luego tenemos el <strong>padding</strong> y finalmente tenemos el <strong>content</strong> en el centro.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-35.png" class="kg-image" alt="imagen-35" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-35.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-35.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/04/imagen-35.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/size/w2400/2021/04/imagen-35.png 2400w" sizes="(min-width: 720px) 720px" width="3455" height="1853" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Aquí tenemos el resultado de cada una de las propiedades:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-36.png" class="kg-image" alt="imagen-36" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-36.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-36.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/04/imagen-36.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/size/w2400/2021/04/imagen-36.png 2400w" sizes="(min-width: 720px) 720px" width="2000" height="928" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Para recrear estos resultados:</p>
<ul>
<li>Primero necesitamos una imagen; necesitamos detener la repetición de la imagen, y establecer el alto y el ancho <strong>al tamaño del contenedor de la imagen.</strong></li>
<li>Una vez hecho, insertariamos 40px de padding, de lo contrario no podremos ver la diferencia entre padding-box y content-box.</li>
<li>Entonces, insertamos un borde rojo de 25px. Establecemos la propiedad border-style a dashed para obtener el borde de línea discontinua en la pantalla.</li>
<li>Establecemos la propiedad background-size a 400px &amp; 400px.</li>
</ul>
<p>Aquí podemos ver esto en código:</p>
<pre><code>.container{
  background-image: url('cute-girl.png');
  background-repeat: no-repeat;
  background-size: 400px 400px;


// Escribiremos el valor ? aquí para ver diferencia
  background-origin: border-box;
  padding: 40px;
  border: 25px solid red;
  border-style: dashed;

// ancho y alto del contenedor ?
  width : 400px;
  height : 400px;
}
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="tomamosundescanso">Tomamos un descanso</h3>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-37.png" class="kg-image" alt="imagen-37" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-37.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-37.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/04/imagen-37.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-37.png 1681w" sizes="(min-width: 720px) 720px" width="1681" height="667" loading="lazy"></figure><!--kg-card-begin: markdown--><h2 id="lapropiedadbackgroundclip">La propiedad background-clip</h2>
<p>Esta propiedad es igual a <code>background-origin</code>. Pero la principal diferencia es que <code>background-clip</code> <strong>CORTA</strong> la imagen para que quepa dentro del cuadro, mientras <code>background-origin</code> <strong>EMPUJA</strong> el contenido dentro del cuadro para que quepa.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-38.png" class="kg-image" alt="imagen-38" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-38.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-38.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-38.png 1121w" sizes="(min-width: 720px) 720px" width="1121" height="389" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Podemos escribir la sintaxis luego de escribir el selector, igual a ?</p>
<pre><code>.container{
// Podremos escribir los valores ? aquí
  background-clip  : border-box;
}
</code></pre>
<p>Tiene cuatro valores posibles:</p>
<ul>
<li>border-box</li>
<li>padding-box</li>
<li>content-box</li>
<li>inherit</li>
</ul>
<p>Aquí tenemos el resultado de cada una de las propiedades</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-39.png" class="kg-image" alt="imagen-39" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-39.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-39.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/04/imagen-39.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/size/w2400/2021/04/imagen-39.png 2400w" sizes="(min-width: 720px) 720px" width="2000" height="928" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Para recrear estos resultados debemos:</p>
<ul>
<li>Primero necesitamos una imagen, necesitamos detener la repetición, y necesitamos establecer el alto y el ancho <strong>ambos como el contenedor de la imagen</strong>.</li>
<li>Una vez hecho, podremos insertar 40px de padding, de lo contrario no podremos observar la diferencia entre padding-box y content-box.</li>
<li>Entonces, insertamos un borde rojo de 25px. Establecemos la propiedad border-style a dashed para obtener el borde de linea discontinua en la pantalla.</li>
<li>Establecemos la propiedad background-size a 400px &amp; 400px.</li>
</ul>
<p>El código se vería así:</p>
<pre><code>.container{
  background-image: url('cute-girl.png');
  background-repeat: no-repeat;
  background-size: 400px 400px;

// Cambiamos los valores aquí ?  para ver las diferencias 
  background-clip: border-box;
  padding: 40px;
  border: 25px solid red;
  border-style: dashed;

// Alto y ancho para el contenedor ?
  width : 400px;
  height : 400px;
}
</code></pre>
<h2 id="lapropiedadbackgroundattachment">La propiedad background-attachment</h2>
<p>Esta propiedad nos permite manejar el comportamiento de nuestro contenido e imagen <strong>cuando hacemos scroll</strong>.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-40.png" class="kg-image" alt="imagen-40" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-40.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-40.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-40.png 1225w" sizes="(min-width: 720px) 720px" width="1225" height="455" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Nosotros escribimos la sintaxis luego del selector, igual a ?</p>
<pre><code>.container{
// Podremos escribir los valores ? aquí
background-attachment: scroll;
}
</code></pre>
<p>Hay tres valores posibles:</p>
<ul>
<li>scroll</li>
<li>fixed</li>
<li>local</li>
</ul>
<p>Cuando usamos <strong>scroll</strong> la imagen se fija y podemos desplazarnos libremente por nuestro contenido. El valor fijo nos da un efecto de paralaje en el desplazamiento del mouse y produce múltiples imágenes siempre que nuestro contenido no termine.</p>
<p>Podemos ver los resultados en vivo aquí ?</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-embed-card kg-card-hascaption"><iframe id="cp_embed_GRjJjro" src="https://codepen.io/ematte/embed/preview/GRjJjro?default-tabs=html%2Cresult&amp;height=300&amp;host=https%3A%2F%2Fcodepen.io&amp;slug-hash=GRjJjro" title="Background Attachment Example" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" style="width: 100%; overflow: hidden;" loading="lazy"></iframe><figcaption>Referencia https://dev.to/hadrysmateusz/learn-all-8-background-css-properties-in-5-minutes-2lk4</figcaption></figure><!--kg-card-begin: markdown--><h2 id="lapropiedadbackgroundcolor">La propiedad background-color</h2>
<p>Podemos usar esta propiedad para establecer el background con color.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-42.png" class="kg-image" alt="imagen-42" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-42.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-42.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-42.png 1039w" sizes="(min-width: 720px) 720px" width="1039" height="423" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Debemos escribir la sintaxis luego de escribir el selector, igual a ?</p>
<pre><code>.container{
// Podemos escribir el valor ?  aquí
   background-color :  red;
}
</code></pre>
<p>Existen muchas opciones pero las más populares son:</p>
<ul>
<li>Color sólido usando nombre o el valor hexadecimal</li>
<li>Usando la función <code>RGB()</code></li>
<li>Usando la función `linear-gradient()``</li>
</ul>
<h3 id="cmoobteneruncolorslidodefondoutilizandoelnombreoelvalorhexadecimal">¿Cómo obtener un color sólido de fondo utilizando el nombre o el valor hexadecimal?</h3>
<p>Podemos usar el nombre del color para establecer el color de fondo haciendo:</p>
<pre><code>.container{
   background-color : red;

   height : 100vh;
}
</code></pre>
<p>O, podemos usar el color hexadecimal de la siguiente manera:</p>
<pre><code>.container{
   background-color : #ff0000; //color rojo

   height : 100vh;
}
</code></pre>
<p>Puedes revisar estos recursos para más colores.</p>
<p><a href="https://coolors.co/">coolors.co</a><br>
<a href="https://flatuicolors.com/">flatuicolors.com</a></p>
<h3 id="cmousarlafuncinrgbparaestablecerelcolordefondo">¿Cómo usar la función RGB() para establecer el color de fondo?</h3>
<p>Podemos usar la función <code>RGB()</code> para establecer el color de fondo haciendo:</p>
<pre><code>.container{
// Nombre del color "American River"
   background-color : rgb(99, 110, 114);

   height : 100vh;
}
</code></pre>
<p>También podemos usar <code>RGBA()</code> para establecer el color y la opacidad</p>
<pre><code>.container{
.container{
// El 0.5 al final representa        50% ? opacity 
   background-color :  rgba(99, 110, 114, 0.5);

   height : 100vh;
}
}
</code></pre>
<p>Este es un experimento con el color 'Eton blue' con varios niveles de opacidad.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-43.png" class="kg-image" alt="imagen-43" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-43.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-43.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-43.png 1080w" sizes="(min-width: 720px) 720px" width="1080" height="1211" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-44.png" class="kg-image" alt="imagen-44" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-44.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-44.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-44.png 1324w" sizes="(min-width: 720px) 720px" width="1324" height="549" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Puedes visitar <a href="https://uigradients.com/#Summer">la página</a> para más códigos usando CSS.</p>
<p>Vamos a recrear el siguiente color de fondo:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-45.png" class="kg-image" alt="imagen-45" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-45.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-45.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-45.png 1366w" sizes="(min-width: 720px) 720px" width="1366" height="569" loading="lazy"></figure><!--kg-card-begin: markdown--><p>'#22c1c3'representa el color a la izquierda y '#fdbb2d' representa el color a la derecha. '90deg' nos dice como se inclinaran estos dos colores para generar el degradado.</p>
<p>El código se ve así:</p>
<pre><code>.container{
 
   background: linear-gradient(90deg, #22c1c3, #fdbb2d);  

   height : 100vh;
}

</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="resumendelaspropiedades">Resumen de las propiedades</h2>
<p>Este es el resumen de las propiedades de background:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-46.png" class="kg-image" alt="imagen-46" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-46.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/imagen-46.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/04/imagen-46.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-46.png 2004w" sizes="(min-width: 720px) 720px" width="2004" height="1098" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Para este experimento, vamos a colocar <code>kitty.png</code> en nuestro navegador usando un color de fondo azul con 200px en el eje X y 200px en el eje Y. El código referencia sería:</p>
<pre><code>.container{
 
   background-color : skyblue;
   background-image : url('kitty.png);
   background-repeat: no-repeat;
   background-attachment: fixed;
   background-position: 200px 200px;

   height : 100vh;
}
</code></pre>
<p>Y este sería el código usando una sola sentencia:</p>
<pre><code>.container{
 
   background: skyblue url('kitty.png) no-repeat fixed 200px 200px;

   height : 100vh;
}
</code></pre>
<p>Usarlo en una sola sentencia nos ahorra tiempo. Si quieres saltar uno de los valores, puedes hacerlo siempre que se mantenga el orden de las propiedades.</p>
<h1 id="conclusin">Conclusión</h1>
<p>Aquí tienes una medalla por leerlo todo hasta el final ❤️<br>
Las quejas y las sugerencias son muy bien apreciadas ❤️</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-47.png" class="kg-image" alt="imagen-47" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/imagen-47.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/imagen-47.png 1000w" sizes="(min-width: 720px) 720px" width="1000" height="245" loading="lazy"></figure><!--kg-card-begin: markdown--><h2 id="creditos">Creditos</h2>
<ul>
<li><a href="https://www.pexels.com/photo/woman-lying-on-plants-2125610/">Cute Girl I have a crush on ?</a></li>
<li><a href="https://www.flaticon.com/packs/kitty-avatars-3">kitty Avatar</a></li>
<li><a href="https://www.freepik.com/free-vector/cute-bear-is-happy-cartoon-illustration_12341167.htm#position=4">Cute panda</a></li>
<li><a href="https://www.freepik.com/free-vector/set-happy-cute-cats-cartoon-illustration_12566295.htm#position=11">Cute cat with duck</a></li>
<li><a href="https://www.freepik.com/free-vector/young-girl-different-gestures-cartoon-illustration_12566309.htm#page=1&amp;position=22">Cute girl illustration</a></li>
<li><a href="https://www.freepik.com/free-vector/set-cute-rabbit-with-duck-feel-happy-sad-cartoon-illustration_12573654.htm#position=7">Rabbit with duck</a></li>
<li><a href="https://css-tricks.com/almanac/properties/b/background/">CSS-Tricks</a></li>
</ul>
<p>YouTube / <a href="https://www.youtube.com/channel/UCHG7IJuST_BXJkne-0u0Xtw">Joy Shaheb</a><br>
Twitter / <a href="https://twitter.com/JoyShaheb">JoyShaheb</a><br>
Instagram / <a href="https://www.instagram.com/joyshaheb/">JoyShaheb</a></p>
<p>Traducido del artículo de <a href="https://www.freecodecamp.org/news/author/joy/">Joy Shaheb</a> - <a href="https://www.freecodecamp.org/news/learn-css-background-properties/">Every CSS Background Property Illustrated and Explained with Code Examples ?️</a></p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ HTML vs Body: ¿Cómo configurar el ancho y el alto para el tamaño de la página completa? ]]>
                </title>
                <description>
                    <![CDATA[ CSS es difícil pero también es permisivo, esto nos permite introducir estilo al azar en nuestro CSS. La página todavía carga y no hay "accidentes". Cuando se trata del ancho y el alto de la página ¿Sabes qué configurar del elemento html? ¿Y del elemento body? ¿Simplemente colocas los estilos ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/html-vs-body-como-configurar-el-ancho-y-el-alto-para-el-tamano-de-la-pagina-completa/</link>
                <guid isPermaLink="false">605f2af9b121f60935dc7f88</guid>
                
                    <category>
                        <![CDATA[ Programación ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Mitchell Contreras ]]>
                </dc:creator>
                <pubDate>Fri, 18 Jun 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/06/measure.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>CSS es difícil pero también es permisivo, esto nos permite introducir estilo al azar en nuestro CSS. La página todavía carga y no hay "accidentes".</p>
<p>Cuando se trata del ancho y el alto de la página ¿Sabes qué configurar del elemento <code>html</code>? ¿Y del elemento <code>body</code>? ¿Simplemente colocas los estilos en ambos elementos y esperas lo mejor? Si lo haces, no estás solo.</p>
<p>Las respuestas a esas preguntas no son intuitivas, Soy culpable de aplicar estilos a ambos elementos en el pasado sin considerar exactamente cuál propiedad debe ser aplicada a qué elemento ?‍. No es raro ver las propiedades CSS aplicadas tanto al elemento <code>html</code> como al elemento <code>body</code> de la siguiente manera:</p>
<pre><code>html, body {
     min-height: 100%;
}
</code></pre>
<h2 id="acasoimporta">¿Acaso importa?</h2>
<p>Si, si importa.</p>
<p>La definición de estilos anterior crea un problema:</p>
<p>Establece la altura mínima al 100% en ambos elementos, y esto no permite que el <code>body</code>llene la página como se esperaría. Cuando verificamos los estilos en las <em>herramientas del desarrollador</em>, el <code>body</code> tiene una altura cero. Mientras tanto, el elemento <code>html</code> tiene una altura igual a la parte visible de la página del navegador.</p>
<p>Miremos la siguiente captura de pantalla de <em>herramientas del desarrollador de Chrome</em>:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/empty_body.png" class="kg-image" alt="empty_body" width="596" height="280" loading="lazy"></figure><!--kg-card-begin: markdown--><p>El <code>body</code> tiene por defecto un margen de 8px indicado por la barra en la parte superior, pero la altura tiene de valor 0.</p>
<h2 id="porquestoocurre">¿Por qué esto ocurre?</h2>
<p>El uso de un porcentaje como tamaño necesita usar como referencia el elemento padre en el que basar el porcentaje. El elemento <code>html</code> hace referencia a la ventana gráfica que tiene un valor de altura igual a la altura de la ventana gráfica visible. Sin embargo, nosotros solo establecemos el <code>min-value</code> del elemento <code>html</code>... NO un valor a la propiedad <code>height</code>. Por lo tanto, el elemento <code>body</code>no tiene un elemento padre al que hacer referencia cuando establece la propiedad igual al 100%.</p>
<h2 id="elproblemapuedeestaroculto">El problema puede estar oculto</h2>
<p>Si comenzamos con suficiente contenido para el cuerpo de la página web, es posible que no notemos el problema. Y para hacerlo más difícil de observar, si establecemos <code>background-color</code> en ambos elementos o incluso en uno solo de ellos, la ventana gráfica estará llena de ese color. Esto da la impresión que el elemento <code>body</code> es tan grande como la ventana gráfica. Pero no, todavía está en cero.</p>
<p>La imagen anterior fue tomada de una página con el siguiente CSS:</p>
<pre><code>html, body {
    min-height: 100%;
}
body { background-color: dodgerblue; }
</code></pre>
<h2 id="herenciainversa">¿Herencia inversa?</h2>
<p>En un giro extraño, el elemento <code>html</code>asume el <code>background-color</code>del elemento <code>body</code>si no se establece un <code>background-color</code> separado para el elemento <code>html</code>.</p>
<h2 id="entoncesculeslaconfiguracindealturaidealparaunapginafullresponsive">Entonces, ¿cuál es la configuración de altura ideal para una página full responsive?</h2>
<p>Por años, la respuesta fue la siguiente:</p>
<pre><code>html {
    height: 100%;
}
body {
    min-height: 100%;
}
</code></pre>
<p>Esto permite al elemento <code>html</code> hacer referencia a la ventana gráfica y tenga un valor de altura igual al 100%. Con el elemento <code>html</code> recibiendo un valor de altura, el  <code>min-height</code> asignado al elemento <code>body</code> le da una altura inicial que coincide con el elemento <code>html</code>. Esto también permite que el <code>body</code>crezca más alto si el contenido supera el tamaño de lo visible de la página.</p>
<p>El único inconveniente es que el elemento <code>html</code> no crezca más allá de la altura de la ventana gráfica visible. Sin embargo, se ha permitido que el elemento <code>body</code>supere el elemento <code>html</code>.</p>
<h2 id="lasolucinactualestsimplificada">La solución actual está simplificada</h2>
<pre><code>body { min-height: 100vh; }
</code></pre>
<p>En este ejemplo usamos como unidad <strong>vh</strong>(altura de la ventana gráfica) para permitir que el <code>body</code> establezca una altura mínima basada en la altura completa de la ventana gráfica.</p>
<p>Al igual que la discusión anterior de <code>background-color</code>, si nosotros no seteamos el valor de la altura máxima del elemento <code>html</code>, asumirá el mismo valor de la altura del elemento <code>body</code>.</p>
<p>Por lo tanto, esta solución evita el desbordamiento del elemento <code>html</code>presente en la solución anterior y ambos elementos crecen con su contenido.</p>
<p>El uso de la unidad <strong>vh</strong> causó algunos problemas con el navegador móvil en el pasado, pero parece que Chrome y Safary son consistentes con las unidades de visualización ahora.</p>
<h2 id="tamaodepginapuedecausarunscrollhorizontal">Tamaño de página puede causar un scroll horizontal</h2>
<p>Espera... ¿qué? ¿No debería decir "Ancho de página?<br>
¡No!</p>
<p>En otra extraña serie de eventos, la altura de tu página puede activar el scroll horizontal en tu navegador. Cuando el contenido de tu página web es más alto que la altura de la ventana gráfica, se activa la barra del scroll vertical a la derecha. Esto puede causar que tu página tenga instantáneamente una barra de scroll horizontal.</p>
<h2 id="cmopodemossolucionarestproblema">¿Cómo podemos solucionar esté problema?</h2>
<p>Podemos dormir mejor sabiendo que comenzamos con una configuración del ancho de la página. Este problema surge cuando cualquier elemento, no solo los elementos <code>html</code> o <code>body</code>- se establecen con 100vw (ancho de la ventana gráfica).</p>
<p>Las unidades de la ventana gráfica no tienen en cuenta los 10 píxeles aproximados que ocupa la barra de desplazamiento vertical. Por lo tanto, cuando se activa la barra de desplazamiento vertical, también se obtiene una barra de desplazamiento horizontal.</p>
<h2 id="cmoconfiguramoslapginaparaeltamaocompleto">¿Cómo configuramos la página para el tamaño completo?</h2>
<p>Si no establecemos un ancho en los elementos <code>html</code>y <code>body</code>, el tamaño predeterminado de la pantalla será el tamaño completo de la pantalla. Si establecemos un valor de ancho que no sea automático, consideremos restablecer primero el CSS. Recordemos, por defecto el elemento <code>body</code>tiene 8 píxeles de margen en todos los lados.</p>
<p>Reestablecer el CSS elimina esto. De lo contrario, establecer el ancho al 100% antes de eliminar los márgenes hará que el elemento del <code>body</code> desborde. Aquí está el restablecimiento de CSS que uso:</p>
<pre><code>* { 
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}
</code></pre>
<h2 id="cmoestablecemoselanchodenuestrapreferencia">¿Cómo establecemos el ancho de nuestra preferencia?</h2>
<p>Si bien puede que no siempre sea necesario establecer un ancho, generalmente lo hago. Puede ser simplemente un hábito.</p>
<p>Si establecemos el ancho al 100% en el elemento <code>body</code>, tendrá un ancho de página completo. Esto es equivalente a no establecer un valor de ancho y permitir el valor predeterminado.</p>
<p>Si deseamos utilizar el elemento del <code>body</code> como un contenedor más pequeño y dejar que el elemento HTML llene la página, podemos establecer un valor de ancho máximo en el <code>body</code>.</p>
<p>Aquí un ejemplo:</p>
<pre><code>html { background-color: #000; } 
body {
    min-height: 100vh;
    max-width: 400px;
    background-color: papayawhip; 
    margin: 0 auto;
}
</code></pre>
<h2 id="conclusin">Conclusión</h2>
<p>Sin una altura proporcionada para el elemento <code>html</code>, establecer <code>height</code> y/o <code>min-height</code> del elemento <code>body</code> no da como resultado la altura (antes de agregar el contenido). Sin embargo, sin un ancho para el elemento <code>html</code>, establecer el ancho del elemento <code>body</code> en 100% da como resultado el ancho de la página completa. Esto puede parecer contra intuitivo y confuso.</p>
<p>Para una página responsive, establezca el <code>min-height</code> del elemento <code>body</code> en 100vh. Si estableces el ancho de página, elije el 100% sobre 100vw para evitar el scroll horizontal.</p>
<p>Les dejo un tutorial de mi canal de YouTube demostrando como configurar el ancho y el alto para una página web que crece con el contenido que contiene:</p>
<p><a href="https://www.youtube.com/watch?v=dpuKVjX6BJ8">HTML Page Width and Height Settings | CSS Full Screen Size</a></p>
<p>¿Tienes una manera diferente de establecer el ancho y el alto que te guste más?</p>
<p>¡Dejame saber tu método!</p>
<p>Traduccion del articulo - <a href="https://www.freecodecamp.org/news/html-page-width-height/">HTML vs Body: How to Set Width and Height for Full Page Size</a> por <a href="https://www.freecodecamp.org/news/author/dave/">Dave Gray</a></p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Flexbox vs Grid - Como construir los layouts HTML más comunes ]]>
                </title>
                <description>
                    <![CDATA[ Hay tantos recursos de CSS excelentes en internet. Pero ¿qué pasa si solo quieres un diseño simple y lo quieres ahora? En este artículo, describo los 5 layouts más comunes y cómo construirlos usando Flexbox y Grid. ¿Cómo funcionará esto? Hay un link debajo de cada uno de los layouts ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/flexbox-vs-grid-como-construir-los-layouts-mas-comunes/</link>
                <guid isPermaLink="false">60575c66540cd708b57382bb</guid>
                
                    <category>
                        <![CDATA[ Flexbox ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Mitchell Contreras ]]>
                </dc:creator>
                <pubDate>Thu, 17 Jun 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/06/halacious.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Hay tantos recursos de CSS excelentes en internet. Pero ¿qué pasa si solo quieres un diseño simple y lo quieres ahora? En este artículo, describo los 5 layouts más comunes y cómo construirlos usando Flexbox y Grid.</p>
<h2 id="cmofuncionaresto">¿Cómo funcionará esto?</h2>
<p>Hay un link debajo de cada uno de los layouts para ver el código HTML y CSS en CodePen. Puedes darte cuenta que uso SASS para la definición de estilos, si quieres hacerlo en tu local, debes instalar SASS usando:</p>
<pre><code>npm i sass -g
</code></pre>
<h2 id="plantilladeunatarjetabsica">Plantilla de una tarjeta básica</h2>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/card.png" class="kg-image" alt="card" width="558" height="360" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Utilicé la tarjeta anterior como base del diseño del layout. Está compuesto por tres elementos en dirección vertical, por lo que los bloques <code>div</code> funcionan bastante bien. Sin embargo, necesitaré hacer que el elemento central (el párrafo) se estire.</p>
<p><strong>Ganador: Flexbos</strong></p>
<p><a href="https://codepen.io/ondrabus/pen/rNeOEQJ">CodePen Flexbox</a> <a href="https://codepen.io/ondrabus/pen/mdPeZvd">CodePen Grid</a></p>
<p>Empecemos creando nuestros diferentes layouts.</p>
<h2 id="1tarjetaverticalmenteyhorizontalmentecentrados">#1 Tarjeta verticalmente y horizontalmente centrados</h2>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/card--1--1.png" class="kg-image" alt="card--1--1" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/03/card--1--1.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2021/03/card--1--1.png 974w" sizes="(min-width: 720px) 720px" width="974" height="488" loading="lazy"></figure><!--kg-card-begin: markdown--><p><strong>Con Flexbox</strong>, necesitamos un elemento centrado horizontalmente, y otro (el elemento hijo) que sea centrado verticalmente. El orden de los elementos es definido por <code>flex-direction</code>. La forma en que el elemento se posiciona en el espacio disponible se establece mediante <code>align-self</code> en el elemento o <code>align-items</code> en el elemento padre.</p>
<p><strong>Con Grid</strong>, necesitamos tres columnas y tres filas. Con esto podemos posicionar la tarjeta en la celda del medio. Centrar horizontalmente es sencillo. Definimos tres columnas y su tamaño usando <code>grid-template-columns: auto 33% auto</code> ya que la tarjeta debe ser tan ancha como 1/3 del área visible.</p>
<p>El problema es que nosotros no sabemos la dimensiones verticales, queremos que las filas superior e inferior ocupen el espacio restante que no es posible con la cuadrícula. La tarjeta está centrada, pero su altura depende de la altura de la ventana. Sin embargo, podemos solucionar esto con un elemento adicional alrededor de la tarjeta y centrarlo usando <code>margin</code>.</p>
<p><strong>Ganador: Flexbos</strong></p>
<p><a href="https://codepen.io/ondrabus/pen/vYGYobr">CodePen Flexbox</a> <a href="https://codepen.io/ondrabus/pen/yLOYdLO">CodePen Grid</a></p>
<h2 id="2dostarjetasverticalyhorizontalmentecentradas">#2 Dos tarjetas vertical y horizontalmente centradas</h2>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/two-cards.png" class="kg-image" alt="two-cards" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/03/two-cards.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2021/03/two-cards.png 976w" sizes="(min-width: 720px) 720px" width="976" height="489" loading="lazy"></figure><!--kg-card-begin: markdown--><p>A menudo necesitamos centrar más de un elemento. Estas dos tarjetas también deben mantener la misma altura si una u otra contiene un texto más largo.</p>
<p>Con <strong>Flexblox</strong>, necesitamos agrupar ambas tarjetas en otro elemento y usarlo para centrar ambas a la vez. No podemos usar <code>align-items</code> aquí ya que se aplica al eje Y en este caso. Necesitamos definir como el espacio restante en el eje X debe ser distribuido usando <code>justify-content: center</code>. Esto asegura que ambas tarjetas estén centrados horizontalmente.</p>
<p>Si omitimos el problema de la altura variable de <strong>Grid</strong>, podemos alcanzar el mismo resultado incluso sin ningún elemento agrupador adicional. En esta ocasión definimos un cuadrícula con cinco columnas con <code>rid-template-columns: auto 33% 50px 33% auto</code>. El resto permanece como el ejemplo anterior.</p>
<p><strong>Ganador: Flexbos</strong></p>
<p><a href="https://codepen.io/ondrabus/pen/mdPybJa">CodePen Flexbox</a> <a href="https://codepen.io/ondrabus/pen/RwaWXOp">CodePen Grid</a></p>
<h2 id="3multiplestarjetasconelmismotamao">#3 Multiples tarjetas con el mismo tamaño</h2>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/cards.png" class="kg-image" alt="cards" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/03/cards.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2021/03/cards.png 937w" sizes="(min-width: 720px) 720px" width="937" height="470" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Este es otro caso de uso típico para blogs, sitios de comercio electrónico (e-commerce), o en general, cualquier sitio que muestre algún tipo de listado. Queremos que las tarjetas tengan el mismo ancho y alto. La altura se debe inferir del elemento más grande en la lista.</p>
<p>Esto se puede hacer en <strong>Flebox</strong> usando <code>flex-wrap:wrap</code>. Los elementos pasan a la siguiente línea si su ancho excede el espacio restante de cada línea. Sin embargo, la misma altura sólo se conserva en el ámbito de una sola línea, a menos que se defina explícitamente.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/3-flexbox-1.png" class="kg-image" alt="3-flexbox-1" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/03/3-flexbox-1.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/03/3-flexbox-1.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/03/3-flexbox-1.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2021/03/3-flexbox-1.png 1948w" sizes="(min-width: 720px) 720px" width="1948" height="606" loading="lazy"></figure><!--kg-card-begin: markdown--><p><strong>Grid</strong> muestra su verdadero poder aquí. Este diseño se puede crear usando <code>grid-auto-rows: 1fr</code> que aplica la misma altura a todas las líneas.</p>
<p><strong>Ganador: Grid</strong></p>
<p><a href="https://codepen.io/ondrabus/pen/LYNpawv">CodePen Flexbox</a> <a href="https://codepen.io/ondrabus/pen/QWNjPLg">CodePen Grid</a></p>
<h2 id="3alternandoentretextoseimagenescentradoshorizontalmenteyverticalmente">#3 Alternando entre textos e imagenes centrados horizontalmente y verticalmente</h2>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/alternating-text.png" class="kg-image" alt="alternating-text" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/03/alternating-text.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2021/03/alternating-text.png 937w" sizes="(min-width: 720px) 720px" width="937" height="742" loading="lazy"></figure><!--kg-card-begin: markdown--><p>En este ejemplo, tenemos texto con botones CTA acompañados con imágenes del otro lado. Ambos componentes deben ser centrados verticalmente, ya que su tamaño puede variar.</p>
<p>Esto es pan comido para <strong>Flexbox</strong>. Cada fila es un elemento de un artículo dividido en dos contenedores, <code>.img</code>y <code>.content</code>. Son necesarios para una distribución uniforme (<code>flex-basis: 50%</code>). El centrado vertical del contenido interno es definido usando <code>align-items: center</code>. La alternancia se logra invirtiendo la dirección de Flexbox usando <code>flex-direction: row-reverse</code> en cada artículo impar.</p>
<p><strong>Grid</strong> maneja este caso bastante bien también. No necesitamos definir un gran grid, sino más bien uno por cada artículo. Define columnas igualmente anchas que están verticalmente centradas usando <code>align-items: center</code> y la alternancia se define a nivel de celda mediante valores conmutados <code>grid-column</code>.</p>
<p><strong>Ganador: Empate</strong></p>
<p><a href="https://codepen.io/ondrabus/pen/BaKoEyQ">CodePen Flexbox</a> <a href="https://codepen.io/ondrabus/pen/WNwrOOv">CodePen Grid</a></p>
<h2 id="5cabecerahorizontalconmen">#5 Cabecera horizontal con menú</h2>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/menu.png" class="kg-image" alt="menu" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/03/menu.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2021/03/menu.png 937w" sizes="(min-width: 720px) 720px" width="937" height="100" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Para lograr este diseño usando <strong>Flexbox</strong>, ambos lados de la cabecera necesitan ser representados como un solo elemento.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/5-flexbox-1.png" class="kg-image" alt="5-flexbox-1" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/03/5-flexbox-1.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2021/03/5-flexbox-1.png 798w" sizes="(min-width: 720px) 720px" width="798" height="106" loading="lazy"></figure><!--kg-card-begin: markdown--><p>El logo y el nombre de la compañía como un solo elemento <code>anchor</code> a la izquierda, y el menú es un elemento <code>nav</code> a la derecha. Flexbox los posiciona con <code>justify-content: space-between</code>.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/5-grid-1.png" class="kg-image" alt="5-grid-1" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/03/5-grid-1.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2021/03/5-grid-1.png 799w" sizes="(min-width: 720px) 720px" width="799" height="140" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Con <strong>Grid</strong>, necesitamos dos columnas - una para el logo y otra para el menú. El menú es otro grid que distribuye el tamaño de las columnas usando <code>grid-template-columns: repeat(4, minmax(0, 1fr))</code>. El problema aquí es que si queremos añadir otro elemento al menú, también necesitamos modificar el CSS.</p>
<p><strong>Ganador: Flexbox</strong></p>
<p><a href="https://codepen.io/ondrabus/pen/wvGMqXq">CodePen Flexbox</a> <a href="https://codepen.io/ondrabus/pen/oNxbeKx">CodePen Grid</a></p>
<h2 id="yelganadores">Y el ganador es ....</h2>
<p>El puntaje final es 5:2 a favor de Flexbox, pero esto no significa que esto lo convierta en el mejor. Hay situaciones donde se necesita usar uno u otro, algunas ocasiones usarlos juntos para alcanzar lo que se necesita.</p>
<p>Si necesitas flexibilidad y posiciones condicionadas trabajar con Flexbox. Si quieres crear listas o estructuras similares que requieran elementos de tamaños iguales o tener una forma de tabla trabajar con Grid.</p>
<p>Como programador front-end, no te saldrás con la tuya sin saber ambos.</p>
<p><a href="https://css-tricks.com/snippets/css/a-guide-to-flexbox/">Guía de Flexbox</a> <a href="https://css-tricks.com/snippets/css/complete-guide-grid/">Guía de Grid</a></p>
<p>Traducido del artículo de <a href="https://www.freecodecamp.org/news/author/ondrej/">Ondrej Polesny</a> - <a href="https://www.freecodecamp.org/news/flexbox-vs-grid-how-to-build-the-most-common-html-layouts/">Flexbox vs Grid - How to Build the Most Common HTML Layouts</a></p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Tutorial de MongoDB Atlas – ¿Cómo empezar? ]]>
                </title>
                <description>
                    <![CDATA[ Para los siguientes desafíos, utilizaremos MongoDB para almacenar los datos. Para simplificar la configuración, utilizaremos un servicio llamado MongoDB Atlas.Crear una cuenta de MongoDB Atlas MongoDB Atlas es una DaaS (Base de datos como servicio) de MongoDB, lo que significa que ellos configuran y alojan la base de datos por ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/tutorial-de-mongodb-atlas-como-empezar/</link>
                <guid isPermaLink="false">607442e34c4d4208dfdb6d2c</guid>
                
                    <category>
                        <![CDATA[ Mongo ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Mitchell Contreras ]]>
                </dc:creator>
                <pubDate>Wed, 16 Jun 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/06/cabinets.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/04/primera-imagen.jpeg" class="kg-image" alt="primera-imagen" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/04/primera-imagen.jpeg 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/04/primera-imagen.jpeg 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/04/primera-imagen.jpeg 1600w, https://www.freecodecamp.org/espanol/news/content/images/2021/04/primera-imagen.jpeg 2000w" sizes="(min-width: 720px) 720px" width="2000" height="1388" loading="lazy"><figcaption>Para los siguientes desafíos, utilizaremos MongoDB para almacenar los datos. Para simplificar la configuración, utilizaremos un servicio llamado MongoDB Atlas.</figcaption></figure><!--kg-card-begin: markdown--><h2 id="crearunacuentademongodbatlas">Crear una cuenta de MongoDB Atlas</h2>
<p>MongoDB Atlas es una DaaS (Base de datos como servicio) de MongoDB, lo que significa que ellos configuran y alojan la base de datos por nosotros. Entonces, nuestra única responsabilidad sería llenar la BD con lo que importa: los datos.</p>
<ul>
<li><a href="https://account.mongodb.com/account/register">Crea tu cuenta</a> en MongoDB Atlas.</li>
<li>Llena el formulario con tu información y haz clic en <strong>Sign up</strong></li>
</ul>
<h2 id="crearunnuevocluster">Crear un nuevo cluster</h2>
<ul>
<li>En la página siguiente, llena los campos nombre de la organización, nombre del proyecto, selecciona JavasScript como lenguaje de programación preferido y haz clic en el botón verde para <strong>continuar</strong>.</li>
<li>Clic en el botón <strong>Crear un Cluster</strong> debajo de clusters compartidos. Esta debe ser la única opción libre.</li>
<li>En la sección <strong>Proveedor de la nube y región</strong>, deja la opción por defecto (Normalmente es AWS).</li>
<li>La sección <strong>Nivel de Cluster</strong>, deja la opción por defecto, <code>M0 Sandbox (Shared RAM 512 MB Storage)</code>.</li>
<li>En la sección de <code>Nombre del Cluster</code>, puedes seleccionar el nombre del cluster, o dejar por defecto, <code>Cluster 0</code>.</li>
<li>CLic en el botón verde <code>Create Cluster</code> en la parte superior de la pantalla.</li>
<li>Debes poder ver el mensaje <code>Your cluster is being created. New clusters take 1-3 minutes to provision</code> <strong>Tu cluster ha sido creado. Los nuevos clusters toman entre 1-3 minutos para ser aprovisionados</strong>. Espera hasta que el cluster sea creado para ir al siguiente paso.</li>
</ul>
<h2 id="crearunnuevousuarioparalabasededatos">Crear un nuevo usuario para la base de datos</h2>
<ul>
<li>En la parte izquierda de la pantalla, clic en <strong>Acceso a la base de datos</strong>.</li>
<li>Clic en el botón verde <strong>Agregar un nuevo usuario a la base de datos</strong>.</li>
<li>En la modal, ingresar un nuevo usuario y contraseña.</li>
<li>En la sección <strong>Privilegios del usuario</strong>. deja las opciones por defecto, <strong>Leer y escribir en cualquier base de datos</strong>.</li>
<li>CLic en el botón <strong>Agregar usuario</strong> para crear tu nuevo usuario.</li>
</ul>
<h2 id="permitirconexindesdecualquierip">Permitir conexión desde cualquier IP</h2>
<ul>
<li>En la parte izquierda de la pantalla, clic en <strong>Acceso de red</strong>.</li>
<li>Clic en el botón verde <strong>Añadir dirección IP</strong>.</li>
<li>En la modal, click en el botón <strong>Permitir conexión desde cualquier lugar</strong>. Debes ver <code>0.0.0.0/0</code> en la lista de accesos.</li>
<li>Clic en el botón <strong>Confirmar</strong>.</li>
</ul>
<h2 id="connectarteatucluster">Connectarte a tu cluster</h2>
<ul>
<li>Clic en el botón verde <strong>Empezar</strong> en la parte inferior izquierda de tu pantalla y ahora deberías ver el paso final, <strong>Connectate a tu cluster</strong>, clic en él.</li>
<li>En la parte izquierda de la pantalla, clic en <strong>Clusters</strong>.</li>
<li>Clic en el botón <strong>Conectar</strong> a tu cluster.</li>
<li>En la modal, clic en <strong>Conecta tu aplicación</strong>.</li>
<li>Debes poder ver el URI, lo que debes usar para conectar tu base de datos y tiene la estructura: <code>mongodb+srv://&lt;username&gt;:&lt;password&gt;@&lt;cluster-name&gt;.mongodb.net/&lt;db-name&gt;?retryWrites=true&amp;w=majority</code>.</li>
<li>CLic en botón <strong>Copiar</strong> tu URI al portapapeles.</li>
</ul>
<p>Observa que los campos <code>&lt;username&gt;</code>, <code>&lt;cluster-name&gt;</code> y <code>&lt;db-name&gt;</code> de la URI ya están completados para ti. Todo lo que necesitas hacer es reemplazar el campo <code>&lt;password&gt;</code> con el creado en el paso anterior.</p>
<p>Esto es todo, ahora tienes el URI para añadir a tu aplicación y conectarte a tu base de datos. Mantén esta URI en un lugar seguro para que puedas usarlo luego.</p>
<p>Traducción del artículo <a href="https://www.freecodecamp.org/news/get-started-with-mongodb-atlas/">MongoDB Atlas Tutorial – How to Get Started</a></p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ La complejidad de los algoritmos simples y las estructuras de datos en JS ]]>
                </title>
                <description>
                    <![CDATA[ En el articulo anterior "Algoritmos simples y estructuras de datos en JS" [https://medium.com/free-code-camp/a-step-towards-computing-as-a-science-algorithms-data-structures-4c0e2d6ae79a] . Discutimos algoritmos simples(búsquedas lineales y binarias; selección e inserción ordenada). Aquí, continúo con el concepto de complejidad y su aplicación a algoritmos y estructuras de datos. Complejidad La complejidad es un factor involucrado en un proceso ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/la-complejidad-de-los-algoritmos-simples-y-las-estructuras-de-datos-en-js/</link>
                <guid isPermaLink="false">60077956a4e0700982a9f2a8</guid>
                
                    <category>
                        <![CDATA[ Algoritmos ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Mitchell Contreras ]]>
                </dc:creator>
                <pubDate>Fri, 14 May 2021 05:30:27 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/05/1_1bB3zrN0WrNC6ErArRF6cQ-1-.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>En el articulo anterior <a href="https://medium.com/free-code-camp/a-step-towards-computing-as-a-science-algorithms-data-structures-4c0e2d6ae79a">"Algoritmos simples y estructuras de datos en JS"</a>. Discutimos algoritmos simples(búsquedas lineales y binarias; selección e inserción ordenada). Aquí, continúo con el concepto de complejidad y su aplicación a algoritmos y estructuras de datos.</p>
<h2 id="complejidad">Complejidad</h2>
<p>La <strong>complejidad</strong> es un factor involucrado en un proceso complejo. Con respecto a los algoritmos y las estructuras de datos; esto puede ser por <strong>tiempo</strong> o <strong>espacio</strong> (espacio en disco) necesario para realizar una tarea específica (buscar, clasificar o acceder a los datos) en una estructura de datos determinada. La eficiencia del rendimiento de una tarea depende del número de operaciones requeridas para completarla.</p>
<p><strong>Sacar la basura</strong> puede requerir 3 pasos (atar, sacar y tirar en el basurero). <strong>Sacar la basura</strong> puede ser simple, pero si la vas a sacar después de una larga semana, es posible que no puedas completar la tarea debido a la <strong>falta de espacio</strong> en el basurero.</p>
<p><strong>Aspirar una habitación</strong> puede requerir muchos pasos repetitivos (encender la aspiradora, aspirar repetidamente los espacios de la habitación y apagarla). Mientras más grande sea la habitación, <strong>más tiempo llevará</strong> aspirar la habitación.</p>
<p><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/first-Image.png" alt="n" width="600" height="371" loading="lazy"></p>
<p>Entonces, existe una relación entre el número de operaciones realizadas y el número de elementos operados. Tener mucha basura (elementos) requiere sacarla muchas veces. Esto puede generar un problema de <strong>complejidad espacial (space complexity)</strong>. Tener una gran cantidad metros cuadrados (elementos) requiere aspirar muchas veces. Esto puede dar lugar a un problema de <strong>complejidad en tiempo (time complexity)</strong>.</p>
<p>Ya sea que esté <strong>sacando la basura</strong> o <strong>aspirando una habitación</strong>, podría decir que el <strong>orden de la operación (O)</strong> incrementa exactamente con el <strong>número de elementos (n)</strong>. Si tengo 1 bolsa de basura, tengo que sacar la basura una vez. Si tengo 2 bolsas de basura, tengo que hacer la misma tarea dos veces, asumiendo que físicamente no puedo levantar más de una bola a la vez. Entonces, the Big-O de estas tareas es O = n o O = function(n) o <strong>O(n)</strong>. Esto es una <strong>complejidad lineal (linear complexity)</strong> (una línea recta entre 1 operación: 1 elemento). Entonces, 30 operaciones equivalen a 30 elementos (línea amarilla del gráfico anterior).</p>
<p>Esto es similar a lo que sucede cuando se consideran algoritmos y estructuras de datos</p>
<h2 id="bsquedas">Búsquedas</h2>
<h3 id="bsquedalineal">Búsqueda lineal</h3>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/lineal-search-2.gif" class="kg-image" alt="lineal-search-2" width="596" height="188" loading="lazy"></figure><!--kg-card-begin: html--><p style="text-align:center;"><a href="https://blog.penjee.com/wp-content/uploads/2015/04/binary-and-linear-search-animations.gif">origen</a></p><!--kg-card-end: html--><!--kg-card-begin: markdown--><p>El <strong>mejor caso</strong> para buscar un elemento en una lista ordenada, es uno después del otro. Es una constante <strong>O(1)</strong>, asumiendo que es el primer elemento en tu lista. Por lo tanto, si el elemento que estás buscando siempre aparece primero en la lista, independientemente del tamaño de la lista, encontrarás el elemento inmediatamente. La complejidad de la búsqueda es constante con el tamaño de la lista. <strong>El peor caso</strong> de este tipo de busqueda es de complejidad lineal o <strong>O(n)</strong>. En otras palabras, para n elementos, tengo que buscar n veces antes de encontrar mi elemento, por eso es una búsqueda lineal.</p>
<h3 id="bsquedabinaria">Búsqueda binaria</h3>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/binary-search-1.gif" class="kg-image" alt="binary-search-1" width="596" height="182" loading="lazy"></figure><!--kg-card-begin: html--><p style="text-align:center;"><a href="https://blog.penjee.com/wp-content/uploads/2015/04/binary-and-linear-search-animations.gif">origen</a></p><!--kg-card-end: html--><!--kg-card-begin: markdown--><p>Para búsqueda binaria, el mejor caso es O(1), esto significa que el elemento que buscas se encuentra en el centro. El peor caso es log base 2 of n o:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/log2nexponent-1.png" class="kg-image" alt="log2nexponent-1" width="236" height="92" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Logaritmo o log es la manera de expresar un exponente a una base dada. Entonces, si hay 16 elementos (n = 16), esto tomará, en el peor caso, 4 pasos para encontrar el número 15 (exponente = 4).</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/binarysearchImage-1.png" class="kg-image" alt="binarysearchImage-1" width="462" height="278" loading="lazy"></figure><!--kg-card-begin: markdown--><p>o simplemente: O(log n)</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/log2144-2.png" class="kg-image" alt="log2144-2" width="159" height="57" loading="lazy"></figure><!--kg-card-begin: markdown--><h2 id="ordenamiento">Ordenamiento</h2>
<h3 id="ordenamientoburbujabubble">Ordenamiento Burbuja (Bubble)</h3>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/bubble-2.gif" class="kg-image" alt="bubble-2" width="277" height="257" loading="lazy"></figure><!--kg-card-begin: html--><p style="text-align:center;"><a href="https://upload.wikimedia.org/wikipedia/commons/5/54/Sorting_bubblesort_anim.gif">origen</a></p><!--kg-card-end: html--><!--kg-card-begin: markdown--><p>En el ordenamiento burbuja, cada elemento es comparado con el resto de la colección para determinar el máximo valor. Por esta razón, el <strong>peor caso</strong> es de complejidad <strong>O(n²)</strong>. Pensemos en un bucle dentro de otro bucle.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/example-binary-search-2.png" class="kg-image" alt="example-binary-search-2" width="340" height="326" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Entonces, por cada elemento necesitas compararlo con el resto de la colección, un total de 16 comparaciones para 4 elementos (4² = 16). En <strong>el mejor de los casos</strong> la colección ya esta ordenada, excepto por un solo elemento. Esto equivale a una sola ronda de comparaciones. Es decir, se requiren cuatro comparaciones, que es una complejidad de <strong>O(n)</strong>.</p>
<h2 id="seleccin">Selección</h2>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/selection-2.gif" class="kg-image" alt="selection-2" width="270" height="119" loading="lazy"></figure><!--kg-card-begin: html--><p style="text-align:center;"><a href="https://codepumpkin.com/selection-sort-algorithms/">origen</a></p><!--kg-card-end: html--><!--kg-card-begin: markdown--><p>A diferencia del <strong>ordenamiento burbuja</strong>, en lugar de intercambiar el valor más alto, intercambia el valor más bajo. El <strong>ordenamiento por selección</strong> selecciona el valor más bajo para intercambiarlo con las primeras posiciones. Pero, como requiere comparar cada elemento con el resto de la colección también tiene una complejidad <strong>O(n²)</strong>.</p>
<h2 id="insercin">Inserción</h2>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/insertion-2.gif" class="kg-image" alt="insertion-2" width="946" height="514" loading="lazy"></figure><!--kg-card-begin: html--><p style="text-align:center;"><a href="https://gfycat.com/densebaggyibis">origen</a></p><!--kg-card-end: html--><!--kg-card-begin: markdown--><p>A diferencia de los <strong>ordenamientos burbuja y selección</strong>, el ordenamiento por inserción inserta los elementos en su posición correcta. Pero, igual que el ordenamiento anterior requiere comparar cada elemento con el resto de la colección, por lo tanto, tiene una complejidad de orden <strong>O(n²)</strong>. Al igual que el <strong>ordenamiento burbuja</strong>, si solo queda un elemento por ordenar, solo se requiere una ronda de comparaciones para insertar el elemento en su posición correcta. Es decir, en su <strong>mejor caso</strong> tiene una complejidad <strong>O(n)</strong>.</p>
<h2 id="estructurasdedatos">Estructuras de datos</h2>
<h3 id="arreglos">Arreglos</h3>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/array-2.png" class="kg-image" alt="array-2" width="550" height="133" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Debido a que se necesita un solo paso para acceder a los elementos de un arreglo usando su índice, o agregar/eliminar un elemento al final del arreglo, la complejidad para <strong>acceder, añadir o eliminar</strong> un valor de un arreglo es <strong>O(1)</strong>. Considerando, <strong>buscar linealmente</strong> a través de un arreglo usando su índice, como lo vimos antes, tiene una complejidad de <strong>O(n)</strong>.</p>
<p>Además, debido a que un <strong>cambio de un valor hacia o desde el inicio de una matriz</strong> (<em>shift o unshift</em>) requiere <strong>volver a generar los índices</strong>(es decir, eliminar un elemento en el índice 0 requiere volver a etiquetar el elemento del índice 1 como índice 0, y así sucesivamente). Tiene una complejidad <strong>O(n)</strong> ya que la generación de los índices se realiza desde el inicio hasta el final del arreglo.</p>
<h3 id="clavevalor">clave — Valor</h3>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/key-value-2.jpeg" class="kg-image" alt="key-value-2" width="480" height="257" loading="lazy"></figure><!--kg-card-begin: markdown--><p><strong>Acceder, insertar o remover</strong> un valor usando la clave es instantáneo, por lo que se entiende complejidad <strong>O(1)</strong>. Buscando en un "depósito" un elemento específico usando todas las claves disponibles es en esencia una <strong>busqueda lineal</strong>, y tiene una complejidad <strong>O(n)</strong>.</p>
<h2 id="conclusin">Conclusión</h2>
<p><strong>Complejidad</strong> es más que un tema para discutir en algoritmos y estructuras de datos. Si se usa con prudencia, puede ser útil para medir la eficiencia del trabajo que se realiza y el código que se crea para resolver problemas.</p>
<h2 id="referencia">Referencia</h2>
<p><a href="https://www.udemy.com/js-algorithms-and-data-structures-masterclass/">https://www.udemy.com/js-algorithms-and-data-structures-masterclass/</a></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>Traducido del artículo de <a href="http://">Yung L. Leung</a> - <a href="https://www.freecodecamp.org/news/the-complexity-of-simple-algorithms-and-data-structures-in-javascript-11e25b29de1e/">The complexity of simple algorithms and data structures in JS</a></p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ ¿Cómo evitar que Git siempre solicite las credenciales de usuario? ]]>
                </title>
                <description>
                    <![CDATA[  ¿Alguna vez te has encontrado con Git solicitando username y contraseña cada vez que intenta interactuar con github incluso después de configurarlo? Bueno, este es un problema muy común entre los usuarios que clonan un repositorio usando HTTPS. En este artículo mostraré cómo solucionarlo. Se puede clonar un repositorio ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-evitar-que-git-siempre-solicite-las-credenciales-de-usuario/</link>
                <guid isPermaLink="false">5fe643c58c7cd154bb97e301</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Mitchell Contreras ]]>
                </dc:creator>
                <pubDate>Sat, 16 Jan 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/article-banner--10--3.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p></p><!--kg-card-begin: markdown--><p>¿Alguna vez te has encontrado con Git solicitando username y contraseña cada vez que intenta interactuar con github incluso después de configurarlo? Bueno, este es un problema muy común entre los usuarios que clonan un repositorio usando HTTPS. En este artículo mostraré cómo solucionarlo.</p>
<p>Se puede clonar un repositorio usando URL con <code>https://</code> desde todos los repositorios tanto públicos como privados. Estas URL funcionan en todas partes, incluso si se está detrás de un firewall o un proxy.</p>
<p><img src="https://www.freecodecamp.org/espanol/news/content/images/2020/12/clone.png" alt="clone" width="446" height="232" loading="lazy"></p>
<p>Cuando se interactúa con un repositorio remoto usando una url HTTPS en la línea de comandos, tu debes validar tu username y contraseña, ¿Estoy en lo correcto?</p>
<p>El uso de url con HTTPS tiene algunas ventajas: es más fácil de configurar que SSH :D, y usualmente funciona a través de servidores de seguridad y proxies estrictos. Sin embargo, también te solicita que ingrese tus credenciales de Github cada vez que realiza un <code>pull</code> o un <code>push</code> :(.</p>
<h1 id="tupuedessolucionarestoconfigurandogitparaqueguardesuinformacin">Tu puedes solucionar esto configurando git para que guarde su información</h1>
<p>Se realiza así:</p>
<ul>
<li>Actualiza la URL de <code>origin remote</code> usando SSH en lugar de HTTPS;</li>
</ul>
<pre><code class="language-shell">git remote set-url origin git@github.com:username/repo.git
</code></pre>
<p>o</p>
<ul>
<li>Haciendo que git almacena el username y la contraseña, luego de esto no volverá a solicitar la información.</li>
</ul>
<pre><code class="language-shell">git config --global credential.helper store
</code></pre>
<ul>
<li>Guardar username y contraseña en la sesión (<strong>cache it</strong>)</li>
</ul>
<pre><code class="language-shell">git config --global credential.helper cache
</code></pre>
<ul>
<li>Puedes guardar por un tiempo específico</li>
</ul>
<pre><code class="language-shell">git config --global credential.helper 'cache --timeout=600'
</code></pre>
<p>Listo, has solucionado esto, Git no volverá a solicitar las credenciales nuevamente.</p>
<p>Traducido del artículo de <a href="https://www.freecodecamp.org/news/author/bolajiayodeji/"><strong>Bolaji Ayodeji</strong></a> - <a href="https://www.freecodecamp.org/news/how-to-fix-git-always-asking-for-user-credentials/"><strong>How to fix Git always asking for user credentials</strong></a></p>
<!--kg-card-end: markdown--><p></p><p></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Git pull force - Como sobre escribir los cambios locales con git ]]>
                </title>
                <description>
                    <![CDATA[ Cuando aprendes a programar, tarde o temprano también aprenderás sobre los sistemas de control de versiones. Hay muchas herramientas en el mercado, pero una de ellas es el estándar de facto utilizado por casi toda la industria. Es tan popular que hay empresas que utilizan su nombre en su marca, ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/git-pull-force-como-sobre-escribir-los-cambios-locales-con-git/</link>
                <guid isPermaLink="false">5fde2f588c7cd154bb97ac0d</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Mitchell Contreras ]]>
                </dc:creator>
                <pubDate>Fri, 15 Jan 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/photo-1520891309540-863309442d8a-1.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Cuando aprendes a programar, tarde o temprano también aprenderás sobre los sistemas de control de versiones. Hay muchas herramientas en el mercado, pero una de ellas es el estándar de facto utilizado por casi toda la industria. Es tan popular que hay empresas que utilizan su nombre en su marca, estamos hablando de Git por supuesto.</p>
<p>Si bien Git es una herramienta poderosa, su poder está bien escondido. Hay algunos conceptos esenciales que se deben comprender para llegar a ser realmente competente con Git. La buena noticia es que una vez que las aprendas, casi nunca tendrás problemas de los que no puedas escapar.</p>
<h1 id="elflujonormaldetrabajo">El flujo normal de trabajo</h1>
<p>En un flujo normal de trabajo con Git, usarás un repositorio local (<strong>local repository</strong>), y un repositorio remoto (<strong>remote repository</strong>), y una o más ramas  de trabajo (<strong>branch</strong>). Los repositorios almacenan toda la información sobre el proyecto, incluyendo su historial completo de cambios y sus <strong>branches</strong>. Un <strong>branch</strong> es básicamente una colección de cambios que van desde un proyecto vacío hasta el estado actual.</p>
<p>Después de clonar un repositorio, trabajarás en su copia local e introducir nuevos cambios. Mientras no envíes los cambios locales a repositorio remoto, todo el trabajo estará disponible solo en la máquina local.</p>
<h1 id="cambioslocales">Cambios locales</h1>
<p>Todo está bien cuando tú y el resto de tu equipo están trabajando en archivos totalmente diferentes. Pase lo que pase, no entrarán en conflicto sus cambios. Sin embargo, hay ocasiones en las que tú y tus compañeros introducen cambios simultáneamente en el mismo archivo. Ahí es donde suelen empezar los problemas.</p>
<p>¿Alguna vez has ejecutado <code>git pull</code> solo para ver el temido <code>error: Your local changes to the following files would be overwritten by merge:</code>? Tarde o temprano, todos nos topamos con este problema.</p>
<p>Lo que es más confuso aquí es que nosotros no deseamos fusionar nada, solo es traer los cambios del repositorio remoto. En realidad, el comando <code>git pull</code> es un poco más complicado de lo que se piensa.</p>
<h1 id="cmotrabajaexactamentegitpull">¿Cómo trabaja exactamente git pull?</h1>
<p><code>git pull</code> no es una operación simple. Consiste en traer datos del repositorio remoto y luego mezclar los cambios con el repositorio local. Estas dos operaciones pueden ser realizadas manualmente si lo deseas con:</p>
<pre><code class="language-javascript">git fetch
git merge origin/$CURRENT_BRANCH
</code></pre>
<p>La sentencia <code>origin/$CURRENT_BRANCH</code> significa que:</p>
<ul>
<li>Git mezclará los cambios del repositorio remoto llamado <code>origin</code>(<br>
el que clonaste)</li>
<li>Serán añadidos a <code>$CURRENT_BRANCH</code></li>
<li>No serán visibles si no estás parado en el <strong>branch</strong></li>
</ul>
<p>Dado que Git solo realiza funciones cuando no hay cambios no confirmados (<strong>uncommitted</strong>), cada vez que ejecuta <code>git pull</code> con cambios <strong>uncommitted</strong> podría meterse en problemas. Afortunadamente, ¡hay formas de salir de este problema de una sola pieza!</p>
<p><img src="https://www.freecodecamp.org/espanol/news/content/images/2020/12/photo-1499938971550-7ad287075e0d.jpeg" alt="photo-1499938971550-7ad287075e0d" width="2000" height="1500" loading="lazy"></p>
<h1 id="diferentesacercamientos">Diferentes acercamientos</h1>
<p>Cuando tienes cambios locales <strong>uncommitted</strong> y aun así deseas obtener una nueva versión desde el repositorio remoto, el caso de uso generalmente cae en uno de los siguientes escenarios.</p>
<ul>
<li>No importan los cambios locales y desea sobrescribirlos,</li>
<li>Te importan los cambios y te gustaría mantenerlos después de traer los cambios remotos,</li>
<li>Deseas descargar los cambios remotos pero aún no aplicarlos.</li>
</ul>
<p>Cada uno de estos enfoques requiere una solución diferente.</p>
<h1 id="noquieresmantenerloscambioslocales">No quieres mantener los cambios locales</h1>
<p>En este caso, deseas eliminar todos los cambios locales <strong>uncommitted</strong>. Quizás modificaste un archivo para probar, pero ya no necesitas la modificación. Lo único que importa es estar al día con los cambios.</p>
<p>Esto significa que agrega un paso más entre buscar los cambios remotos y mezclarlos en local. Este paso restablecerá el <strong>branch</strong> a su último estado <strong>committed</strong>, lo que permitirá que <code>git merge</code> funcione.</p>
<pre><code class="language-javascript">git fetch
git reset --hard HEAD
git merge origin/$CURRENT_BRANCH
</code></pre>
<p>Si no quieres escribir el nombre del <strong>branch</strong> todo el tiempo puedes correr este comando. Git tiene un atajo que apunta al <strong>upstream branch</strong>  <code>@{u}</code>. <strong>upstream branch</strong> es el <strong>branch</strong> en repositorio remoto al que se le hace <code>git pull</code> o <code>git push</code>.</p>
<p>Así es como se vería el comando anterior usando el atajo.</p>
<pre><code class="language-javascript">git fetch
git reset --hard HEAD
git merge '@{u}'
</code></pre>
<p>Estamos citando el atajo en el ejemplo para evitar que el shell lo interprete.</p>
<h1 id="teimportanloscambioslocales">Te importan los cambios locales</h1>
<p>Cuando tus cambios <strong>uncommitted</strong> son importantes, hay dos opciones. Tú puedes hacer un <strong>commit</strong> y luego realizar <code>git pull</code>, o puedes guardarlos temporalmente con <code>git stash</code>.</p>
<p><strong>git stash</strong> significa guardar los cambios por un momento para traerlos nuevamente más tarde. Para ser más preciso, <code>git stash</code> crea un <strong>commit</strong> que no es visible en el <strong>branch</strong> actual, pero que son accesibles para Git.</p>
<p>Para recuperar los cambios guardados en el último <strong>stash</strong>, se debe usar el comando <code>git stash pop</code>. Después de aplicar con éxito los cambios este comando también elimina el <strong>stash commit</strong>, ya que no es necesario mantenerlo.</p>
<p>El flujo de trabajo podría verse así:</p>
<pre><code class="language-javascript">git fetch
git stash
git merge '@{u}'
git stash pop
</code></pre>
<p>Por defecto, los cambios en <strong>stash</strong> se convertiran en <strong>staged</strong>. Si deseas eliminarlos usa el comando <code>git restore --staged</code> (si usas una versión mayor de Git 2.25.0)</p>
<h1 id="soloquierescambiarloscambiosremotos">Solo quieres cambiar los cambios remotos</h1>
<p>El último escenario es un poco diferente a los anteriores. Digamos que estás en medio de una refactorización muy complicada, donde perder los cambios ni guardarlos es una opción. Sin embargo, aún deseas tener los cambios remotos disponibles para ejecutar <code>git diff</code> contra ellos.</p>
<p>Como probablemente hayas descubierto, ¡descargar los cambios remotos no requiere <code>git pull</code> en absoluto! <code>git fetch</code> es suficiente. Una cosa a tener en cuenta es que, de forma predeterminada, <code>git fetch</code> solo traerá cambios del <strong>branch</strong> actual. Para obtener los cambios de todos los <strong>branches</strong>  debes usar <code>git fetch --all</code>. Y si desea limpiar algunas de las ramas que ya no existen en el repositorio remoto, <code>git fetch --prune</code> hará la limpieza</p>
<p><img src="https://www.freecodecamp.org/espanol/news/content/images/2020/12/photo-1563207153-f403bf289096.jpeg" alt="Photo by Lenin Estrada / Unsplash" width="2000" height="1333" loading="lazy"></p>
<h1 id="algodeautomatizacin">Algo de automatización</h1>
<p>¿Has oído hablar del archivo Git Config? Es un archivo donde Git guarda todas las configuraciones creadas por el usuario. Se encuentra en el directorio de inicio: ya sea <code>~/.gitconfig</code> o <code>~/.config/git/config</code>, podemos agregar algunos alias personalizados que se entenderán como comandos de Git.</p>
<p>Por ejemplo, para tener un alias equivalente a <code>git diff --cached</code> (que muestra la diferencia entre la rama actual y los archivos en etapas), agregaremos lo siguiente:</p>
<pre><code class="language-javascript">[alias]
  dc = diff --cached
</code></pre>
<p>Después de esto puede ejecutar <code>git dc</code> siempre que desee revisar los cambios. De esta manera, podemos configurar algunos alias relacionados con los casos de uso anteriores.</p>
<pre><code class="language-javascript">[alias]
  pull_force = !"git fetch --all; git reset --hard HEAD; git merge @{u}"
  pf = pull_force
  pull_stash = !"git fetch --all; git stash; git merge @{u}; git stash pop"
</code></pre>
<p>De esta manera, <code>git pull_force</code> puede sobre escribir los cambios locales, mientras <code>git pull_stash</code> permite mantenerlos.</p>
<h1 id="elotrogitpullforce">El otro Git Pull Force</h1>
<p>Es posible que las mentes curiosas ya hayan descubierto que existe el comando <code>git pull --force</code>. Sin embargo, esta bestia es muy diferente a lo que se presenta en este artículo.</p>
<p>Puede sonar como algo que nos ayudaría a sobrescribir los cambios locales. En cambio, nos permite buscar los cambios de un <strong>branch</strong> remoto a un <strong>branch</strong> local diferente. <code>git pull --force</code> solo modifica el comportamiento. Por lo tanto, es equivalente a <code>git fetch --force</code>.</p>
<p>Al igual que <code>git push</code>, <code>git fetch</code> nos permite especificar en qué <strong>branch</strong> local y remoto deseamos operar. <code>git fetch origin/feature-1:my-feature</code> significa que los cambios en el <strong>branch</strong>  <code>feature-1</code>en el repositorio remoto serán visibles en el <strong>branch</strong> local <code>my-feature</code>. Cuando un <strong>commit</strong> modifica el histórico existente, no es permitido por git sin el uso explícito del parámetro <code>--force</code>.</p>
<p><code>git push --force</code> permite sobrescribir los <strong>branches</strong> remotos, <code>git fetch --force</code> (or <code>git pull --force</code>) permite sobreescribir los <strong>branches</strong> locales. Siempre se usa con los <strong>branches</strong> origen y destino mencionados como parámetros. Una alternativa para sobreescribir cambios locales usando <code>git pull --force</code> podría ser <code>git pull force "@{u}:HEAD</code>.</p>
<h1 id="conclusin">Conclusión</h1>
<p>El mundo de git es gigantesco. Esté artículo cubrió solo una de las facetas del mantenimiento del repositorio: incorporar cambios remotos en un <strong>branch</strong> local. Incluso este escenario cotidiano requería que analicemos un poco más en profundidad los mecanismos internos de esta herramienta de control de versiones.</p>
<p>Aprender casos de uso reales te ayuda a comprender mejor cómo funciona Git internamente. Esto, a su vez, te hará sentir empoderado cada vez que te metas en problemas. Todos hacemos eso de vez en cuando.</p>
<p>Traducido del artículo de <a href="https://www.freecodecamp.org/news/author/doomhammer/"><strong>Piotr Gaczkowski</strong></a> - <a href="https://www.freecodecamp.org/news/git-pull-force-how-to-overwrite-local-changes-with-git/"><strong>Git Pull Force – How to Overwrite Local Changes With Git</strong></a></p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo utilizar funciones anónimas para Namespacing en tu aplicación con JavaSctipt ]]>
                </title>
                <description>
                    <![CDATA[ Veamos qué son los Namespace cuando se trata de crear aplicaciones y algunos de los beneficios de usar un Namespacing privado. ¿Qué es un Namespace? En pocas palabras, un Namespace es una sección de código que tiene su propio espacio. Cuando comienzas a escribir aplicaciones con JS, generalmente escribes el ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-utilizar-funciones-anonimas-para-namespacing/</link>
                <guid isPermaLink="false">5fdd3c638c7cd154bb97a391</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Mitchell Contreras ]]>
                </dc:creator>
                <pubDate>Sun, 27 Dec 2020 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/04/photo-1459347268516-3ed71100e718.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><em>Veamos qué son los Namespace cuando se trata de crear aplicaciones y algunos de los beneficios de usar un Namespacing privado.</em></p>
<h1 id="quesunnamespace">¿Qué es un Namespace?</h1>
<p>En pocas palabras, un Namespace es una sección de código que tiene su propio espacio. Cuando comienzas a escribir aplicaciones con JS, generalmente escribes el códgio y lo ejecutas. Esto coloca todo el código en lo que conocemos como <strong>global namespace</strong>, que contiene todo el código en el que estas trabajando.</p>
<p>Sin embargo, si mantienes todo tu código en el <strong>global namespace</strong>, puedes tener conflictos, por ejemplo en el nombre de las variables. Se presenta principalmente en aplicaciones grandes .</p>
<p>Veamos un ejemplo de porque usar <strong>global namespace</strong> para desarrollor aplicaciones es una mala idea.</p>
<p>Digamos que tenemos un juego que realiza un seguimiento de los puntos que tiene el jugador:</p>
<pre><code class="language-javascript">var puntos = 0;
</code></pre>
<p>Muchos juegos registran puntos para agregar una ventaja al juego. Simplemente escribiendo esta linea de código, hemos creado una variable llamada <em>puntos</em> que puede llevar el total de puntos ganados por un usuario.</p>
<p>Y eso está muy bien, pero digamos que tenemos un usuario avanzado jugando. Este usuario sabe cómo mirar el código fuente de nuestra página web, por lo que esta persona echa un vistazo al código y se da cuenta que la variable <em>puntos</em> esta seteada en el <strong>global namespace</strong>. ¡Una sonrisa malvada se dibuja en sus rostros mientras contemplan los puntos que pueden lograr! Deciden que no quieren esperar para vencer a algunos malos, o aplastar algunos hongos, o lo que sea necesario para obtener un montón de puntos. ¡Quieren sus puntos ahora! Bueno, ¿Comó suena un billón de billones de puntos? Entonces, abren la consola en el navegador y simplemente escribe:</p>
<pre><code class="language-javascript">puntos = 34750925489459203859095480917458059034;
</code></pre>
<p>Una vez el usuario presiona <em>Enter</em>, la variable de puntos se actualiza en el juego. Ahora, el usuario tiene una cantidad de puntos enorme, y probablemente poco realistico en el juego, y puede presumir ante sus amigos que nadie puede superar su increíble puntiación.</p>
<p>¿Cómo evitamos que esto ocurra? Aquí es donde entran en juego <strong>private namespaces</strong></p>
<h1 id="privatenamespaces">Private Namespaces</h1>
<p><strong>Private namespaces</strong> permiten a los desarrolladores poner su código en secciones(or <strong>namespaces</strong>). Estas secciones operan de forma independiente entre sí, pero aún pueden leer y escribir desde el <strong>global namespace</strong>.</p>
<p>Para visualizar esto en términos más simples usemos un escenario de la vida real, digamos que estás trabajando en un edificio de oficinas. Tienes tu propia oficina y puedes ver que el resto tambien tienen la suya. Cada oficina está cerrada con llave y solo el dueño de la ofician tiene la llave. Supongamos que tiene algún tipo de super cerradura que hace que su oficina sea impenetrable para cualquier otra persona en el edificio.<br>
Consideremos el edificio como el <strong>global namespace</strong>. y cada oficina como un <strong>private namespaces</strong>. No tienes acceso a la oficina de nadie más ni ellos tienen acceso a la tuya. Pero, cada uno tiene acceso al resto del edificio, ya sea para tomar café, tomar un refrigerio, etc. Cada uno puede tomar algo del <strong>global namespace</strong>(crear/modificar algo allí), pero no puenen <em>crear/modificar/tomar</em> nada de las oficinas de los demás; solo pueden <em>crear/modificar/tomar</em> de su <strong>private namespaces</strong>/oficina privada.</p>
<h1 id="conseguirunprivatenamespace">Conseguir un private namespace</h1>
<p>Entonces, ¿cómo logramos conseguir este <strong>private namespace</strong> en JavaScript? Usando una función anónima auto-ejecutable.</p>
<p>Revisemos el ejemplo anterior pero separando en un <strong>private namespace</strong>:</p>
<pre><code class="language-javascript">//La forma más común en que verás una función anónima de ejecución automática
(function () {
    var puntos = 0;
})();

//Esta es solo una de las muchas formas más alternativas de usar una función anónima de ejecución automática
/*
!function () {
    var puntos = 0;
}();
*/
</code></pre>
<p>Ahora, cuando el usuario llegue a la página, no podrá abrir la consola en su navegador y cambiar el valor de la variable <em>puntos</em> como desee. ¡Increíble!</p>
<h1 id="namespaceylainteraccincondocument">Namespace y la interacción con document</h1>
<p>El código anterior fue solo uno de los usos de <em>anonymous self-executing function</em> para darle al código su propio <strong>private namespace</strong>. Tengamos en cuenta que los <strong>namespaces</strong> solo afectan al código JS (varables/<em>arreglos</em>/objectos/etc), no al código que pertenece al <em>document</em> en sí.</p>
<p>Cualquier código dentro de un <strong>namespace</strong> todavía tiene el mismo acceso al docmuento HTML y CSS, coomo lo haría normalmente en el <strong>global namespace</strong>. Veamos los siguientes dos ejemplos de código. Ambos realizan la misma funcionalidad y ninguno es más beneficioso ni más eficiente que el otro.</p>
<pre><code class="language-javascript">&lt;script type="text/javascript"&gt;
    (function () {
        document.querySelector('body').style.background = 'azul';
    })();
&lt;/script&gt;
</code></pre>
<p>Es igual a</p>
<pre><code class="language-javascript">&lt;script type="text/javascript"&gt;
    document.querySelector('body').style.background = 'azul';
&lt;/script&gt;
</code></pre>
<p>Tenga en cuenta que esta es solo una forma de utilizar espacios de nombres en aplicaciones JavaScript. Adapta tu código a la situación que se este presentando.</p>
<p>Traducido del artículo <a href="https://www.freecodecamp.org/news/how-to-use-anonymous-functions-for-private-namespacing-in-your-javascript-apps/">How to Use Anonymous Functions for Private Namespacing in Your JavaScript Apps</a></p>
<!--kg-card-end: markdown--><p></p><p> </p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Lista de números primos - Una gráfica con todos los números primos hasta el 20,000 ]]>
                </title>
                <description>
                    <![CDATA[ Aquí hay una lista de los 2,667 números primos entre 0 y 20,000. Construí esta lista para mi propio uso como programador y quiero compartirla contigo. Antes de revisar la lista me gustaría mostrarte cómo generarlos utilizando un lenguaje de programación. Como crear una lista de números primos utilizando Criba ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/lista-de-numeros-primos-una-grafica-con-todos-los/</link>
                <guid isPermaLink="false">5fd5245f8c7cd154bb9747b3</guid>
                
                    <category>
                        <![CDATA[ Matemáticas ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Mitchell Contreras ]]>
                </dc:creator>
                <pubDate>Tue, 15 Dec 2020 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/04/photo-1524168948265-8f79ad8d4e33.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Aquí hay una lista de los 2,667 números primos entre 0 y 20,000.</p><p>Construí esta lista para mi propio uso como programador y quiero compartirla contigo.</p><p>Antes de revisar la lista me gustaría mostrarte cómo generarlos utilizando un lenguaje de programación.</p><h2 id="como-crear-una-lista-de-n-meros-primos-utilizando-criba-de-erat-stenes">Como crear una lista de números primos utilizando Criba de Eratóstenes</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2020/12/Sieve_of_Eratosthenes_animation.gif" class="kg-image" alt="Sieve_of_Eratosthenes_animation" width="445" height="369" loading="lazy"><figcaption>Como funciona Criba de Erastóstenes paso por paso. Imagen de Wikipedia</figcaption></figure><p>Aquí el código en Javascript genera una lista arbitraria de números primos.</p><!--kg-card-begin: markdown--><pre><code class="language-javascript">function getPrimes(max) {
    var sieve = [];
    var i;
    var j;
    var primes = [];
    for (i = 2; i &lt;= max; ++i) {
        if (!sieve[i]) {
            primes.push(i);
            for (j = i &lt;&lt; 1; j &lt;= max; j += i) {
                sieve[j] = true;
            }
        }
    }
    return primes;
}
getPrimes(1000);
</code></pre>
<!--kg-card-end: markdown--><h2 id="lista-completa-de-n-meros-primos-entre-0-y-20000">Lista Completa de números primos entre 0 y 20000</h2><p><br>Aquí tenemos la lista completa de números primos. Pueden observar que he omitido intencionalmente las comas, por lo que los programadores no tendrán que eliminarlas antes de copiarlas y pegarlas en su código.</p><!--kg-card-begin: markdown--><pre><code class="language-javascript">2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
101
103
107
109
113
127
131
137
139
149
151
157
163
167
173
179
181
191
193
197
199
211
223
227
229
233
239
241
251
257
263
269
271
277
281
283
293
307
311
313
317
331
337
347
349
353
359
367
373
379
383
389
397
401
409
419
421
431
433
439
443
449
457
461
463
467
479
487
491
499
503
509
521
523
541
547
557
563
569
571
577
587
593
599
601
607
613
617
619
631
641
643
647
653
659
661
673
677
683
691
701
709
719
727
733
739
743
751
757
761
769
773
787
797
809
811
821
823
827
829
839
853
857
859
863
877
881
883
887
907
911
919
929
937
941
947
953
967
971
977
983
991
997
1009
1013
1019
1021
1031
1033
1039
1049
1051
1061
1063
1069
1087
1091
1093
1097
1103
1109
1117
1123
1129
1151
1153
1163
1171
1181
1187
1193
1201
1213
1217
1223
1229
1231
1237
1249
1259
1277
1279
1283
1289
1291
1297
1301
1303
1307
1319
1321
1327
1361
1367
1373
1381
1399
1409
1423
1427
1429
1433
1439
1447
1451
1453
1459
1471
1481
1483
1487
1489
1493
1499
1511
1523
1531
1543
1549
1553
1559
1567
1571
1579
1583
1597
1601
1607
1609
1613
1619
1621
1627
1637
1657
1663
1667
1669
1693
1697
1699
1709
1721
1723
1733
1741
1747
1753
1759
1777
1783
1787
1789
1801
1811
1823
1831
1847
1861
1867
1871
1873
1877
1879
1889
1901
1907
1913
1931
1933
1949
1951
1973
1979
1987
1993
1997
1999
2003
2011
2017
2027
2029
2039
2053
2063
2069
2081
2083
2087
2089
2099
2111
2113
2129
2131
2137
2141
2143
2153
2161
2179
2203
2207
2213
2221
2237
2239
2243
2251
2267
2269
2273
2281
2287
2293
2297
2309
2311
2333
2339
2341
2347
2351
2357
2371
2377
2381
2383
2389
2393
2399
2411
2417
2423
2437
2441
2447
2459
2467
2473
2477
2503
2521
2531
2539
2543
2549
2551
2557
2579
2591
2593
2609
2617
2621
2633
2647
2657
2659
2663
2671
2677
2683
2687
2689
2693
2699
2707
2711
2713
2719
2729
2731
2741
2749
2753
2767
2777
2789
2791
2797
2801
2803
2819
2833
2837
2843
2851
2857
2861
2879
2887
2897
2903
2909
2917
2927
2939
2953
2957
2963
2969
2971
2999
3001
3011
3019
3023
3037
3041
3049
3061
3067
3079
3083
3089
3109
3119
3121
3137
3163
3167
3169
3181
3187
3191
3203
3209
3217
3221
3229
3251
3253
3257
3259
3271
3299
3301
3307
3313
3319
3323
3329
3331
3343
3347
3359
3361
3371
3373
3389
3391
3407
3413
3433
3449
3457
3461
3463
3467
3469
3491
3499
3511
3517
3527
3529
3533
3539
3541
3547
3557
3559
3571
3581
3583
3593
3607
3613
3617
3623
3631
3637
3643
3659
3671
3673
3677
3691
3697
3701
3709
3719
3727
3733
3739
3761
3767
3769
3779
3793
3797
3803
3821
3823
3833
3847
3851
3853
3863
3877
3881
3889
3907
3911
3917
3919
3923
3929
3931
3943
3947
3967
3989
4001
4003
4007
4013
4019
4021
4027
4049
4051
4057
4073
4079
4091
4093
4099
4111
4127
4129
4133
4139
4153
4157
4159
4177
4201
4211
4217
4219
4229
4231
4241
4243
4253
4259
4261
4271
4273
4283
4289
4297
4327
4337
4339
4349
4357
4363
4373
4391
4397
4409

1223
1229
1231
1237
1249
1259
1277
1279
1283
1289
1291
1297
1301
1303
1307
1319
1321
1327
1361
1367
1373
1381
1399
1409
1423
1427
1429
1433
1439
1447
1451
1453
1459
1471
1481
1483
1487
1489
1493
1499
1511
1523
1531
1543
1549
1553
1559
1567
1571
1579
1583
1597
1601
1607
1609
1613
1619
1621
1627
1637
1657
1663
1667
1669
1693
1697
1699
1709
1721
1723
1733
1741
1747
1753
1759
1777
1783
1787
1789
1801
1811
1823
1831
1847
1861
1867
1871
1873
1877
1879
1889
1901
1907
1913
1931
1933
1949
1951
1973
1979
1987
1993
1997
1999
2003
2011
2017
2027
2029
2039
2053
2063
2069
2081
2083
2087
2089
2099
2111
2113
2129
2131
2137
2141
2143
2153
2161
2179
2203
2207
2213
2221
2237
2239
2243
2251
2267
2269
2273
2281
2287
2293
2297
2309
2311
2333
2339
2341
2347
2351
2357
2371
2377
2381
2383
2389
2393
2399
2411
2417
2423
2437
2441
2447
2459
2467
2473
2477
2503
2521
2531
2539
2543
2549
2551
2557
2579
2591
2593
2609
2617
2621
2633
2647
2657
2659
2663
2671
2677
2683
2687
2689
2693
2699
2707
2711
2713
2719
2729
2731
2741
2749
2753
2767
2777
2789
2791
2797
2801
2803
2819
2833
2837
2843
2851
2857
2861
2879
2887
2897
2903
2909
2917
2927
2939
2953
2957
2963
2969
2971
2999
3001
3011
3019
3023
3037
3041
3049
3061
3067
3079
3083
3089
3109
3119
3121
3137
3163
3167
3169
3181
3187
3191
3203
3209
3217
3221
3229
3251
3253
3257
3259
3271
3299
3301
3307
3313
3319
3323
3329
3331
3343
3347
3359
3361
3371
3373
3389
3391
3407
3413
3433
3449
3457
3461
3463
3467
3469
3491
3499
3511
3517
3527
3529
3533
3539
3541
3547
3557
3559
3571
3581
3583
3593
3607
3613
3617
3623
3631
3637
3643
3659
3671
3673
3677
3691
3697
3701
3709
3719
3727
3733
3739
3761
3767
3769
3779
3793
3797
3803
3821
3823
3833
3847
3851
3853
3863
3877
3881
3889
3907
3911
3917
3919
3923
3929
3931
3943
3947
3967
3989
4001
4003
4007
4013
4019
4021
4027
4049
4051
4057
4073
4079
4091
4093
4099
4111
4127
4129
4133
4139
4153
4157
4159
4177
4201
4211
4217
4219
4229
4231
4241
4243
4253
4259
4261
4271
4273
4283
4289
4297
4327
4337
4339
4349
4357
4363
4373
4391
4397
4409
4421
4423
4441
4447
4451
4457
4463
4481
4483
4493
4507
4513
4517
4519
4523
4547
4549
4561
4567
4583
4591
4597
4603
4621
4637
4639
4643
4649
4651
4657
4663
4673
4679
4691
4703
4721
4723
4729
4733
4751
4759
4783
4787
4789
4793
4799
4801
4813
4817
4831
4861
4871
4877
4889
4903
4909
4919
4931
4933
4937
4943
4951
4957
4967
4969
4973
4987
4993
4999
5003
5009
5011
5021
5023
5039
5051
5059
5077
5081
5087
5099
5101
5107
5113
5119
5147
5153
5167
5171
5179
5189
5197
5209
5227
5231
5233
5237
5261
5273
5279
5281
5297
5303
5309
5323
5333
5347
5351
5381
5387
5393
5399
5407
5413
5417
5419
5431
5437
5441
5443
5449
5471
5477
5479
5483
5501
5503
5507
5519
5521
5527
5531
5557
5563
5569
5573
5581
5591
5623
5639
5641
5647
5651
5653
5657
5659
5669
5683
5689
5693
5701
5711
5717
5737
5741
5743
5749
5779
5783
5791
5801
5807
5813
5821
5827
5839
5843
5849
5851
5857
5861
5867
5869
5879
5881
5897
5903
5923
5927
5939
5953
5981
5987
6007
6011
6029
6037
6043
6047
6053
6067
6073
6079
6089
6091
6101
6113
6121
6131
6131
6133
6143
6151
6163
6173
6197
6199
6203
6211
6217
6221
6229
6247
6257
6263
6269
6271
6277
6287
6299
6301
6311
6317
6323
6329
6337
6343
6353
6359
6361
6367
6373
6379
6389
6397
6421
6427
6449
6451
6469
6473
6481
6491
6521
6529
6547
6551
6553
6563
6569
6571
6577
6581
6599
6607
6619
6637
6653
6659
6661
6673
6679
6689
6691
6701
6703
6709
6719
6733
6737
6761
6763
6779
6781
6791
6793
6803
6823
6827
6829
6833
6841
6857
6863
6869
6871
6883
6899
6907
6911
6917
6947
6949
6959
6961
6967
6971
6977
6983
6991
6997
7001
7013
7019
7027
7039
7043
7057
7069
7079
7103
7109
7121
7127
7129
7151
7159
7177
7187
7193
7207
7211
7213
7219
7229
7237
7243
7247
7253
7283
7297
7307
7309
7321
7331
7333
7349
7351
7369
7393
7411
7417
7433
7451
7457
7459
7477
7481
7487
7489
7499
7507
7517
7523
7529
7537
7541
7547
7549
7559
7561
7573
7577
7583
7589
7591
7603
7607
7621
7639
7643
7649
7669
7673
7681
7687
7691
7699
7703
7717
7723
7727
7741
7753
7757
7759
7789
7793
7817
7823
7829
7841
7853
7867
7873
7877
7879
7883
7901
7907
7919
7927
7933
7937
7949
7951
7963
7993
8009
8011
8017
8039
8053
8059
8069
8081
8087
8089
8093
8101
8111
8117
8123
8147
8161
8167
8171
8179
8191
8209
8219
8221
8231
8233
8237
8243
8263
8269
8273
8287
8291
8293
8297
8311
8317
8329
8353
8363
8369
8377
8387
8389
8419
8423
8429
8431
8443
8447
8461
8467
8501
8513
8521
8527
8537
8539
8543
8563
8573
8581
8597
8599
8609
8623
8627
8629
8641
8647
8663
8669
8677
8681
8689
8693
8699
8707
8713
8719
8731
8737
8741
8747
8753
8761
8779
8783
8803
8807
8819
8821
8831
8837
8839
8849
8861
8863
8867
8887
8893
8923
8929
8933
8941
8951
8963
8969
8971
8999
9001
9007
9011
9013
9029
9041
9043
9049
9059
9067
9091
9103
9109
9127
9133
9137
9151
9157
9161
9173
9181
9187
9199
9203
9209
9221
9227
9239
9241
9257
9277
9281
9283
9293
9311
9319
9323
9337
9341
9343
9349
9371
9377
9391
9397
9403
9413
9419
9421
9431
9433
9437
9439
9461
9463
9467
9473
9479
9491
9497
9511
9521
9533
9539
9547
9551
9587
9601
9613
9619
9623
9629
9631
9643
9649
9661
9677
9679
9689
9697
9719
9721
9733
9739
9743
9749
9767
9769
9781
9787
9791
9803
9811
9817
9829
9833
9839
9851
9857
9859
9871
9883
9887
9901
9907
9923
9929
9931
9941
9949
9967
9973
10007
10009
10037
10039
10061
10067
10069
10079
10091
10093
10099
10103
10111
10133
10139
10141
10151
10159
10163
10169
10177
10181
10193
10211
10223
10243
10247
10253
10259
10267
10271
10273
10289
10301
10303
10313
10321
10331
10333
10337
10343
10357
10369
10391
10399
10427
10429
10433
10453
10457
10459
10463
10477
10487
10499
10501
10513
10529
10531
10559
10567
10589
10597
10601
10607
10613
10627
10631
10639
10651
10657
10663
10667
10687
10691
10709
10711
10723
10729
10733
10739
10753
10771
10781
10789
10799
10831
10837
10847
10853
10859
10861
10867
10883
10889
10891
10903
10909
10937
10939
10949
10957
10973
10979
10987
10993
11003
11027
11047
11057
11059
11069
11071
11083
11087
11093
11113
11117
11119
11131
11149
11159
11161
11171
11173
11177
11197
11213
11239
11243
11251
11257
11261
11273
11279
11287
11299
11311
11317
11321
11329
11351
11353
11369
11383
11393
11399
11411
11423
11437
11443
11447
11467
11471
11483
11489
11491
11497
11503
11519
11527
11549
11551
11579
11587
11593
11597
11617
11621
11621
11633
11657
11677
11681
11689
11699
11701
11717
11719
11731
11743
11777
11779
11783
11789
11801
11807
11813
11821
11827
11831
11833
11839
11863
11867
11887
11897
11903
11909
11923
11927
11933
11939
11941
11953
11959
11969
11971
11981
11987
12007
12011
12037
12041
12043
12049
12071
12073
12097
12101
12107
12109
12113
12119
12143
12149
12157
12161
12163
12197
12203
12211
12227
12239
12241
12251
12253
12263
12269
12277
12281
12289
12301
12323
12329
12343
12347
12373
12377
12379
12391
12401
12409
12413
12421
12433
12437
12451
12457
12473
12479
12487
12491
12497
12503
12511
12517
12527
12539
12541
12547
12553
12569
12577
12583
12589
12601
12611
12613
12619
12637
12641
12647
12653
12659
12671
12689
12697
12703
12713
12721
12739
12743
12757
12763
12781
12791
12799
12809
12821
12823
12829
12841
12853
12889
12893
12899
12907
12911
12917
12919
12923
12941
12953
12959
12967
12973
12979
12983
13001
13003
13007
13009
13033
13037
13043
13049
13063
13093
13099
13103
13109
13121
13127
13147
13151
13159
13163
13171
13177
13183
13187
13217
13219
13229
13241
13249
13259
13267
13291
13297
13309
13313
13327
13331
13337
13339
13367
13381
13397
13399
13411
13417
13421
13441
13451
13457
13463
13469
13477
13487
13499
13513
13523
13537
13553
13567
13577
13591
13597
13613
13619
13627
13633
13649
13669
13679
13681
13687
13691
13693
13697
13709
13711
13721
13723
13729
13751
13757
13759
13763
13781
13789
13799
13807
13829
13831
13841
13859
13873
13877
13879
13883
13901
13903
13907
13913
13921
13931
13933
13963
13967
13997
13999
14009
14011
14029
14033
14051
14057
14071
14081
14083
14087
14107
14143
14149
14153
14159
14173
14177
14197
14207
14221
14243
14249
14251
14281
14293
14303
14321
14323
14327
14341
14347
14369
14387
14389
14401
14407
14411
14419
14423
14431
14437
14447
14449
14461
14479
14489
14503
14519
14533
14537
14543
14549
14551
14557
14561
14563
14591
14593
14621
14627
14629
14633
14639
14653
14657
14669
14683
14699
14713
14717
14723
14731
14737
14741
14747
14753
14759
14767
14771
14779
14783
14797
14813
14821
14827
14831
14843
14851
14867
14869
14879
14887
14891
14897
14923
14929
14939
14947
14951
14957
14969
14983
15013
15017
15031
15053
15061
15073
15077
15083
15091
15101
15107
15121
15131
15137
15139
15149
15161
15173
15187
15193
15199
15217
15227
15233
15241
15259
15263
15269
15271
15277
15287
15289
15299
15307
15313
15319
15329
15331
15349
15359
15361
15373
15377
15383
15391
15401
15413
15427
15439
15443
15451
15461
15467
15473
15493
15497
15511
15527
15541
15551
15559
15569
15581
15583
15601
15607
15619
15629
15641
15643
15647
15649
15661
15667
15671
15679
15683
15727
15731
15733
15737
15739
15749
15761
15767
15773
15787
15791
15797
15803
15809
15817
15823
15859
15877
15881
15887
15889
15901
15907
15913
15919
15923
15937
15959
15971
15973
15991
16001
16007
16033
16057
16061
16063
16067
16069
16073
16087
16091
16097
16103
16111
16127
16139
16141
16183
16187
16189
16193
16217
16223
16229
16231
16249
16253
16267
16273
16301
16319
16333
16339
16349
16361
16363
16369
16381
16411
16417
16421
16427
16433
16447
16451
16453
16477
16481
16487
16493
16519
16529
16547
16553
16561
16567
16573
16603
16607
16619
16631
16633
16649
16651
16657
16661
16673
16691
16693
16699
16703
16729
16741
16747
16759
16763
16787
16811
16823
16829
16831
16843
16871
16879
16883
16889
16901
16903
16921
16927
16931
16937
16943
16963
16979
16981
16987
16993
17011
17021
17027
17029
17033
17041
17047
17053
17077
17093
17099
17107
17117
17123
17137
17159
17167
17183
17189
17191
17203
17207
17209
17231
17239
17257
17291
17293
17299
17317
17321
17327
17333
17341
17351
17359
17377
17377
17383
17387
17389
17393
17401
17417
17419
17431
17443
17449
17467
17471
17477
17483
17489
17491
17497
17509
17519
17539
17551
17569
17573
17579
17581
17597
17599
17609
17623
17627
17657
17659
17669
17681
17683
17707
17713
17729
17737
17747
17749
17761
17783
17789
17791
17807
17827
17837
17839
17851
17863
17881
17891
17903
17909
17911
17921
17923
17929
17939
17957
17959
17971
17977
17981
17987
17989
18013
18041
18043
18047
18049
18059
18061
18077
18089
18097
18119
18121
18127
18131
18133
18143
18149
18169
18181
18191
18199
18211
18217
18223
18229
18233
18251
18253
18257
18269
18287
18289
18301
18307
18311
18313
18329
18341
18353
18367
18371
18379
18397
18401
18413
18427
18433
18439
18443
18451
18457
18461
18481
18493
18503
18517
18521
18523
18539
18541
18553
18583
18587
18593
18617
18637
18661
18671
18679
18691
18701
18713
18719
18731
18743
18749
18757
18773
18787
18793
18797
18803
18839
18859
18869
18899
18911
18913
18917
18919
18947
18959
18973
18979
19001
19009
19013
19031
19037
19051
19069
19073
19079
19081
19087
19121
19139
19141
19157
19163
19181
19183
19207
19211
19213
19219
19231
19237
19249
19259
19267
19273
19289
19301
19309
19319
19333
19373
19379
19381
19387
19391
19403
19417
19421
19423
19427
19429
19433
19441
19447
19457
19463
19469
19471
19477
19483
19489
19501
19507
19531
19541
19543
19553
19559
19571
19577
19583
19597
19603
19609
19661
19681
19687
19697
19699
19709
19717
19727
19739
19751
19753
19759
19763
19777
19793
19801
19813
19819
19841
19843
19853
19861
19867
19889
19891
19913
19919
19927
19937
19949
19961
19963
19973
19979
19991
19993
19997</code></pre>
<!--kg-card-end: markdown--><p>Traducido del artículo - <strong><a href="https://www.freecodecamp.org/news/prime-numbers-list-chart-of-primes/">Prime Numbers List – A Chart of All Primes Up to 20,000</a> </strong>de <a href="https://www.freecodecamp.org/news/author/quincylarson/"><strong>Quincy Larson</strong></a></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
