<?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[ Aitor Zaldua - 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[ Aitor Zaldua - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 16 May 2026 19:16:30 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/author/aitor/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Como implementar una aplicación basada en React Router en Netlify ]]>
                </title>
                <description>
                    <![CDATA[ En este artículo, vamos a aprender las formas más populares de desplegar una aplicación React en Netlify. Además, conoceremos los cambios de configuración que tendrás que realizar para desplegar una app React basada en Routing. Lo que más me gusta de Netlify es que proporciona un montón de características útiles ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-implementar-una-aplicacion-basada-en-react-router-en-netlify/</link>
                <guid isPermaLink="false">60cadd72f197b1090f9ff69a</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Aitor Zaldua ]]>
                </dc:creator>
                <pubDate>Wed, 14 Jul 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/06/routing.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>En este artículo, vamos a aprender las formas más populares de desplegar una aplicación React en Netlify. Además, conoceremos los cambios de configuración que tendrás que realizar para desplegar una app React basada en Routing.</p><p>Lo que más me gusta de Netlify es que proporciona un montón de características útiles de forma gratuita, tales como:</p><ul><li>Una forma de desplegar un website estático en segundos.</li><li>Despliegue continuo, lo que significa que cuando conectas tu repositorio de Github/Gitlab/Bitbucket, se activa automáticamente el despliegue cuando se envían nuevos commits al repositorio.</li><li>La garantía de que el website nunca se caerá, incluso durante las nuevas implantaciones.</li><li>Le permite volver fácilmente a cualquier versión anterior de su sitio web con un solo clic.</li><li>Posibilidad de previsualizar rápidamente cualquiera de las versiones de la aplicación previamente desplegadas.</li><li>Cambio de dominio o subdominio al instante.</li></ul><p>Y mucho más</p><p>Así que vamos a ver cómo desplegar una aplicación React en Netlify.</p><blockquote>¿Te gustaría aprender Redux desde el principio y construir una aplicación para pedir comida desde cero? Puedes consultar el curso <a href="https://master-redux.yogeshchavan.dev/">Mastering Redux</a>.</blockquote><h2 id="arrastrar-y-soltar-la-carpeta-build-en-netlify">Arrastrar y soltar la carpeta build en Netlify</h2><p>La forma más rápida y sencilla de desplegar una aplicación React es, simplemente, arrastrar y soltar la carpeta <code>build</code> en Netlify.</p><p>Para crear dicha carpeta, simplemente hay que ejecutar el comando <code>npm run build</code> o <code>yarn build</code> desde la línea de comandos, dentro la carpeta del proyecto.</p><p>Una vez creada la carpeta build, sólo hay que soltar la carpeta en el área correspondiente, bajo el menú <code>sites</code>, como se muestra a continuación:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/04/drag_drop.gif" class="kg-image" alt="drag_drop" width="600" height="400" loading="lazy"></figure><p></p><h2 id="c-mo-desplegar-una-aplicaci-n-en-netlify-desde-un-repositorio-de-github">Cómo desplegar una aplicación en Netlify desde un repositorio de GitHub</h2><p>Esta es, sin duda, mi forma favorita de desplegar aplicaciones en Netlify.</p><p>La ventaja de utilizar este método es que cada vez que subas cualquier cambio al repositorio de GitHub, se desplegará automáticamente en Netlify. También se pueden ver todas las versiones desplegadas y retroceder fácilmente a cualquier versión de código que funcione previamente con un solo clic.</p><p>Si ya tienes un repositorio subido a GitHub, entonces solo tienes que conectarlo.</p><p>Para comenzar, tras iniciar sesión en la cuenta de Netlify, en el panel de control, se hace clic en el botón Nuevo sitio desde Git.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/04/netlify_home.png" class="kg-image" alt="netlify_home" width="600" height="400" loading="lazy"></figure><p>Nuevo clic en el botón <code>GitHub</code> para conectar el repositorio GitHub.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/04/git_provider.png" class="kg-image" alt="git_provider" width="600" height="400" loading="lazy"></figure><p>Se abrirá una nueva pestaña. Asegúrate de que la ventana emergente está activada en tu navegador.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/04/select_repository.png" class="kg-image" alt="select_repository" width="600" height="400" loading="lazy"></figure><p>Busca el repositorio de GitHub, en la caja de búsqueda <code>Search repos</code>. Si el repositorio no se muestra, haz clic en el botón <code>Configure the Netlify app on GitHub</code> en la parte inferior de la página.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/04/configure_netlify.png" class="kg-image" alt="configure_netlify" width="600" height="400" loading="lazy"></figure><p>Una vez que hayas hecho clic, desplázate hacia abajo en la página y haz clic en el desplegable <code>Select repositories</code>, busca el repositorio y haz clic en el botón Guardar.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/04/select_repo.png" class="kg-image" alt="select_repo" width="600" height="400" loading="lazy"></figure><p>Serás redirigido a la página anterior, que muestra todos los repositorios disponibles.</p><p>Busca el repositorio que quieres desplegar. En el ejemplo, está seleccionado el repositorio <a href="https://github.com/myogeshchavan97/react-book-management-app">react-book-management-app</a> que se puede ver cómo se crea en el <a href="https://www.freecodecamp.org/news/react-crud-app-how-to-create-a-book-management-app-from-scratch/">artículo enlazado.</a></p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/04/find_repository-1.png" class="kg-image" alt="find_repository-1" width="600" height="400" loading="lazy"></figure><p>Una vez &nbsp;hayas seleccionado el repositorio, podrás ver la siguiente pantalla:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/04/deploy_repository.png" class="kg-image" alt="deploy_repository" width="600" height="400" loading="lazy"></figure><p>Para esta aplicación, no necesitamos cambiar nada.</p><p>Las opciones <code>Build command</code> y <code>Publish directory</code> se rellenarán automáticamente. Asegúrate de introducir estos campos si tienes un comando diferente en <code>package.json</code> para construir tu aplicación o esos campos no se rellenan automáticamente.</p><p>Ahora, haz clic en el botón <code>Deploy site</code>. Una vez que hayas hecho clic, verás el mensaje de <code>Site deploy in progress</code>.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/04/deploying.png" class="kg-image" alt="deploying" width="600" height="400" loading="lazy"></figure><p>Tendrás que esperar un poco mientras se despliega. Una vez completado el despliegue, verás la siguiente pantalla:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/04/deployed.png" class="kg-image" alt="deployed" width="600" height="400" loading="lazy"></figure><p>Abre el enlace en la nueva pestaña y verás tu aplicación desplegada en vivo.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/04/deployed_app.gif" class="kg-image" alt="deployed_app" width="600" height="400" loading="lazy"></figure><p>¡Impresionante! Ahora, si haces algún cambio en el código fuente y subes ese cambio a GitHub, Netlify lo detectará y volverá a desplegar tu aplicación con tus últimos cambios.</p><p>Si compruebas la aplicación, verás que la aplicación funciona bien con la navegación y eres capaz de añadir/editar/borrar un libro.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/04/working_app.gif" class="kg-image" alt="working_app" width="600" height="400" loading="lazy"></figure><p><strong>Pero hay un problema</strong>. Si accedes directamente a la ruta <code>/add</code> o actualizas dicha ruta, obtendrás un error de página no encontrada como se muestra a continuación:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/04/page_not_found.gif" class="kg-image" alt="page_not_found" width="600" height="400" loading="lazy"></figure><p>Obtendrás el mismo error si intentas actualizar la ruta de la página de edición (edit page).</p><p>Esto se debe a que, cuando accedemos a cualquier ruta en nuestra máquina local, React Router se encarga del enrutamiento. Pero cuando desplegamos la aplicación en cualquier servidor, al acceder directamente a la ruta, se enviará la petición al propio servidor (Netlify en nuestro caso).</p><p>Pero como no hay un manejador de ruta <code>/add</code> en el lado del servidor, se verá un error de página no encontrada. Pero Netlify proporciona una manera de arreglar esto.</p><p>Crea un nuevo archivo con el nombre <code>_redirects</code> dentro de la carpeta <code>public</code> de nuestro proyecto y añade el siguiente contenido:</p><pre><code class="language-js">/* /index.html 200
</code></pre><p>Aquí, le estamos diciendo a Netlify que redirija todas las rutas al archivo <code>index.html</code>.</p><p>El archivo <code>index.html</code> contiene todo el código de nuestra aplicación React. Se genera dentro de la carpeta de compilación cuando Netlify &nbsp;ejecuta el comando de compilación <code>yarn build</code> mientras se despliega la aplicación.</p><p>Y como el enrutamiento es manejado por nuestra aplicación React, que está contenida en el archivo <code>index.html</code>, nuestra aplicación funcionará sin un problema de página no encontrada.</p><p>Ahora, sube los cambios al repositorio de GitHub para que Netlify despliegue la aplicación de nuevo con estos cambios.</p><p>Y una vez desplegada, si compruebas ahora la aplicación desplegada, podrás ver que la aplicación funciona bien y no obtenemos un error de página no encontrada.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/04/no_page_not_found.gif" class="kg-image" alt="no_page_not_found" width="600" height="400" loading="lazy"></figure><p>Ya está. Ya hemos terminado de desplegar nuestra aplicación en Netlify.</p><h2 id="c-mo-cambiar-de-forma-sencilla-el-dominio-en-netlify"><strong>Cómo cambiar, de forma sencilla, el dominio en Netlify</strong></h2><p>Si compruebas el nombre del sitio desplegado, verás que no es fácil de recordar, especialmente si tiene muchas aplicaciones desplegadas. Pero Netlify proporciona una manera de cambiar eso fácilmente.</p><p>Haz clic en el botón <code>Site settings</code> que aparece en la sección de resumen del sitio.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/04/site_settings.png" class="kg-image" alt="site_settings" width="600" height="400" loading="lazy"></figure><p>A continuación, haz clic en el botón <code>Change site name</code> e introduce un nuevo nombre. Guarda con el botón <code>Save</code> y ahora se podrá acceder a la aplicación con el nombre modificado.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/04/changed_site_name.gif" class="kg-image" alt="changed_site_name" width="600" height="400" loading="lazy"></figure><blockquote>Por lo general, me gusta dar el mismo nombre que el nombre del repositorio para que sea fácil encontrar una aplicación en particular si tenemos muchas aplicaciones desplegadas en Netlify.</blockquote><p>Si quieres saber cómo desplegar una aplicación React + Node.js en producción, consulta <a href="https://dev.to/myogeshchavan97/how-to-deploy-react-node-js-application-to-heroku-4jb4">este artículo</a>.</p><h3 id="-gracias-por-leer-este-art-culo-"><strong>¡Gracias por leer este artículo!</strong></h3><p>Puedes encontrar el código &nbsp;completo de GitHub junto con este cambio de redirección en <a href="https://github.com/myogeshchavan97/netlify-react-book-management-app">este repositorio</a>.</p><p><strong>Puede ver la demostración en vivo de la aplicación desplegada <a href="https://react-book-management-app.netlify.app/">aquí</a>.</strong></p><p>¿Quieres aprender todas las características de ES6+ en detalle, incluyendo let y const, promesas, varios métodos de promesa, desestructuración de arreglos y objetos, arrow functions, async/await, importación y exportación y mucho más desde cero?</p><p>Echa un vistazo al libro <a href="https://modernjavascript.yogeshchavan.dev/">Mastering Modern JavaScript</a>. Este libro cubre todos los prerrequisitos para aprender React y te ayuda a mejorar en JavaScript y React.</p><blockquote>Puedes consultar una preview gratuita <a href="https://www.freecodecamp.org/news/learn-modern-javascript">aquí</a></blockquote><p>Además, puedes consultar el <strong><a href="https://yogeshchavan1.podia.com/react-router-introduction">curso gratuito de Introducción a React Router</a></strong> para aprender React Router desde cero.</p><p>Por último, ¿Quieres estar al día con el contenido regular sobre JavaScript, React, Node.js? Sigue el <a href="https://www.linkedin.com/in/yogesh-chavan97/">LinkedIn </a>de Yogesh Chavan.</p><p> Traducido del artículo de <a href="https://www.freecodecamp.org/news/author/yogesh/">Yogesh Chavan</a> - <a href="https://www.freecodecamp.org/news/how-to-deploy-react-router-based-app-to-netlify/">How to Deploy a React Router-Based Application to Netlify</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo solucionar problemas de Leetcode con Python en una sola línea ]]>
                </title>
                <description>
                    <![CDATA[ Python es uno de los lenguajes de programación más potentes. Nos ofrece una serie de características y funcionalidades únicas que hace que sea sencillo escribir código con él. En este artículo, vamos a solucionar problemas de arreglos de Leetcode en una sola línea, usando una de las características más interesantes ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-solucionar-problemas-de-leetcode-con-python-con-una-sola-linea/</link>
                <guid isPermaLink="false">6085a1b00aad9709126b4e5d</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Aitor Zaldua ]]>
                </dc:creator>
                <pubDate>Wed, 30 Jun 2021 05:54:04 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/04/photo-1610018556010-6a11691bc905.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Python es uno de los lenguajes de programación más potentes. Nos ofrece una serie de características y funcionalidades únicas que hace que sea sencillo escribir código con él.</p><p>En este artículo, vamos a solucionar problemas de arreglos de Leetcode en una sola línea, usando una de las características más interesantes de Python: <strong>Comprensión de listas.</strong></p><h2 id="-qu-es-comprensi-n-de-listas"><strong>¿Qué es Comprensión de listas?</strong></h2><p></p><p>Antes de comenzar con los problemas vamos a estar seguros de que entendemos de qué trata la comprensión de listas:</p><blockquote> La comprensión de listas es una construcción sintáctica disponible en algunos lenguajes de programación para crear una lista basada en otras listas existentes.<br>- Wikipedia -</blockquote><p>Veamos cómo funciona la comprensión de listas con un ejemplo.</p><p>Consideremos un arreglo de números. Nuestra tarea es la de añadir 1 a los números en los índices impares y añadir 2 a los números en los índices pares</p><p>Ahora veremos cómo resolver el problema de arriba usando tanto un for-loop como la comprensión de listas.</p><h3 id="c-mo-resolver-el-problema-con-un-bucle-for"><strong>Cómo resolver el problema con un bucle for</strong></h3><pre><code class="language-python">def addOneAndTwo(nums, n):
    for i in range(n):
        if i % 2 == 1:
            nums[i] += 1 
        else:
            nums[i] += 2 
    return nums
</code></pre><h3 id="c-mo-resolverlo-con-comprensi-n-de-lista"><strong>Cómo resolverlo con comprensión de lista</strong></h3><pre><code class="language-python">def addOneAndTwo(nums, n):
    return [nums[i] + 1 if i % 2 == 1 else nums[i] + 2 for i in range(n)]
</code></pre><p>Puedes ver cómo la solución usando comprensión de listas, simplifica esta de 6 líneas a una sola. Este es el poder de comprensión de listas.</p><h2 id="c-mo-resolver-problemas-de-leetcode-con-comprensi-n-de-lista-"><strong>Cómo resolver problemas de Leetcode con comprensión de lista.</strong></h2><p></p><p>Ahora, vamos a solucionar los siguientes problemas de Leetcode en una sola línea usando comprensión de lista</p><h3 id="1-mezclar-el-arreglo-"><strong>1. <a href="https://leetcode.com/problems/shuffle-the-array">Mezclar el arreglo.</a></strong></h3><p>Este es el enunciado del problema de Leetcode:</p><p>Dado el arreglo <code>nums</code> que consiste en <code>2n</code> elementos en forma</p><p><code>[x<sub>1</sub>,x<sub>2</sub>,...,x<sub>n</sub>,y<sub>1</sub>,y<sub>2</sub>,...,y<sub>n</sub>]</code>. Devolver el arreglo en la forma <code>[x<sub>1</sub>,y<sub>1</sub>,x<sub>2</sub>,y<sub>2</sub>,...,x<sub>n</sub>,y<sub>n</sub>]</code>.</p><h4 id="ejemplo-"><strong>Ejemplo:</strong></h4><p>Input: nums = [2,5,1,3,4,7], n = 3<br>Output: [2,3,5,4,1,7]</p><p>Explicación: Como x1=2, x2=5, x3=1, y1=3, y2=4, y3=7, entonces, la respuesta es [2,3,5,4,1,7].</p><h4 id="soluci-n-"><strong>Solución:</strong></h4><pre><code class="language-python">def shuffle(self, nums, n):
    return reduce(lambda a, b: a + b, [[nums[i], nums[j]] for i, j in zip(range(0, n), range(n, 2 * n))])
</code></pre><h3 id="2-n-mero-de-buenas-parejas"><strong>2. <a href="https://leetcode.com/problems/number-of-good-pairs/">Número de buenas parejas</a></strong></h3><p>Dado un arreglo de números enteros <code>nums</code>. Un par <code>(i,j)</code> es llamado <em>bueno </em>si <code>nums[i]</code> == <code>nums[j]</code> y <code>i</code> &lt; <code>j</code>. Devolver el número de buenas parejas</p><h4 id="ejemplo--1"><strong>Ejemplo:</strong></h4><p>Input: nums = [1,2,3,1,1,3]<br>Output: 4</p><p>Explicación: Hay 4 buenas parejas (0,3), (0,4), (3,4), (2,5) de índice 0.</p><h4 id="soluci-n--1"><strong>Solución:</strong></h4><pre><code class="language-python">def numIdenticalPairs(self, nums):
    return sum([int(i != j and nums[i] == nums[j]) for i in range(0, len(nums)) for j in range(i + 1, len(nums))])
</code></pre><h3 id="3-ni-os-con-el-mayor-n-mero-de-caramelos-"><strong>3. <a href="https://leetcode.com/problems/kids-with-the-greatest-number-of-candies/">Niños con el mayor número de caramelos.</a></strong></h3><p>Dado el arreglo <code>candies</code> &nbsp;y el entero <code>extraCandies</code>, donde <code>candies[i]</code> representa el número de caramelos que tiene el i-ésimo niño.</p><p>Por cada niño, chequea si hay alguna forma de distribuir <code>extraCandies</code> entre los niños de forma que puedan tener el mayor número de caramelos entre ellos. Date cuenta de que múltiples niños pueden tener el mayor número de caramelos.</p><h4 id="ejemplo--2"><strong>Ejemplo:</strong></h4><p>Input: candies = [2,3,5,1,3], extraCandies = 3<br>Output: [true,true,true,false,true]</p><p>Explicación: El niño 1 tiene 2 caramelos y, si él recibe todos los caramelos extra (3), él tendrá 5 caramelos, el número mayor de caramelos entre los niños.</p><p>El niño 2 tiene 3 caramelos y, si él recibe al menos 2 caramelos extra, entonces, ellos tendrán el número mayor de caramelos entre los niños.</p><p>El niño 3 tiene 5 caramelos, que ya es el número mayor de caramelos entre los niños.</p><p>El niño 4 tiene 1 caramelo, e incluso recibiendo todos los caramelos extra, tan solo tendrá 4 caramelos.</p><p>El niño 5 tiene 3 caramelos, si él recibe al menos 2 caramelos extra entonces ellos tendrán el mayor número de caramelos entre los niños.</p><h4 id="soluci-n--2"><strong>Solución:</strong></h4><pre><code class="language-python">def kidsWithCandies(self, candies, extraCandies):
    return [candy + extraCandies &gt;= max(candies) for candy in candies]
</code></pre><h3 id="4-descompresi-n-de-la-lista-codificada-de-longitud-de-ejecuci-n"><strong>4. </strong><a href="https://leetcode.com/problems/decompress-run-length-encoded-list/">Descompresión de la lista codificada de longitud de ejecución</a></h3><p>Estamos dando una lista de enteros denominada <code>nums</code> representando una lista comprimida con la codificación de longitud de ejecución.</p><p>Considerando cada par de elementos adyacente <code>[freq, val] = [nums[2*i], nums[2*i+1]]</code> (con<code>i &gt;= 0</code>). Por cada par, existen elementos <code>freq</code> con el valor <code>val</code> concatenado en una sublista. Concatena todas las sublistas de izquierda a derecha para generar la lista descomprimida. </p><p>Retorna la lista descomprimida.</p><h4 id="ejemplo--3"><strong>Ejemplo:</strong></h4><p>Input: nums = [1,2,3,4]<br>Output: [2,4,4,4]</p><p>Explicación: El primer par [1,2] significa que tenemos freq = 1 t val = 2, luego generamos el arreglo [2].</p><p>El segundo par [3,4] significa que tenemos freq = 3 y val = 4, luego generamos [4,4,4]. Al final la concatenación [2] + [4] es [2,4,4,4].</p><h4 id="soluci-n--3"><strong>Solución:</strong></h4><pre><code class="language-python">def decompressRLElist(self, nums):
    return reduce(lambda a, b: a + b, [[nums[i + 1]] * nums[i] for i in range(0, len(nums), 2)])
</code></pre><h3 id="5-la-riqueza-del-cliente-m-s-rico-"><strong>5. <a href="https://leetcode.com/problems/richest-customer-wealth/">La riqueza del cliente más rico.</a></strong></h3><p>Dado una cuadrícula de <code>m x n</code> cuentas, &nbsp;<code>accounts</code> , formada por números enteros donde <code>accounts[i][j]</code> es la cantidad de dinero que el i-ésimo, cliente tiene en el i-ésimo banco. Retornar la riqueza que tiene el cliente más rico.</p><p>La riqueza de un cliente es la cantidad de dinero que tiene como suma de todas sus cuentas bancarias. El cliente más rico es aquel que tiene la mayor riqueza</p><h4 id="ejemplo--4"><strong>Ejemplo:</strong></h4><p>Input: accounts = [[1,2,3],[3,2,1]]<br>Output: 6</p><p>Explicación: El primer cliente tiene un valor de riqueza &nbsp;= 1 + 2 + 3 = 6, el segundo cliente tiene riqueza = 3 + 2 + 1 = 6. Ambos clientes son considerados los más ricos, con un valor 6, luego se retorna 6.</p><h4 id="soluci-n--4"><strong>Solución:</strong></h4><pre><code class="language-python">def maximumWealth(self, accounts):
    return max([sum(row) for row in accounts])
</code></pre><h2 id="conclusi-n-"><strong>Conclusión.</strong></h2><p>Espero que las soluciones anteriores sean útiles. Puedes combinar <strong><a href="https://data-flair.training/blogs/python-list-comprehension/">compresión de listas</a></strong> con otras funciones como <a href="https://www.freecodecamp.org/news/15-useful-javascript-examples-of-map-reduce-and-filter-74cbbb5e0a1f/"><strong>map</strong>, <strong>filter</strong> y <strong>reduce</strong></a><strong> </strong>para hacer que las soluciones sean más simples y efectivas.</p><p>Traducido del artículo de <a href="https://www.freecodecamp.org/news/author/ganeshkumarm1/">Ganesh Kumar Marimuthu</a> - <a href="https://www.freecodecamp.org/news/solve-leetcode-problems-using-python-list-comprehension/">How to Solve Leetcode Problems With Python One-Liners</a></p><h2 id="gracias-"><strong>Gracias ?</strong></h2><p><a href="https://www.linkedin.com/in/ganeshkumarm1" rel="noopener nofollow">Linkedin</a> | <a href="https://github.com/ganeshkumarm1" rel="noopener nofollow">Github</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Qué es la Zona Muerta Temporal (Temporal Dead Zone, TDZ) en JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ Lo sé, Zona Muerta Temporal suena como a una frase de Ciencia Ficción, pero es muy útil para entender qué significan términos y conceptos con los que trabajas (o quieres aprender) día a día. Agárrate, porque esto se complica. ¿Eres consciente que en JavaScript podemos añadir { } para sumar ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/que-es-la-zona-muerta-temporal-temporal-dead-zone-tdz/</link>
                <guid isPermaLink="false">6045fb52c2765408ef8dd9a3</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Aitor Zaldua ]]>
                </dc:creator>
                <pubDate>Tue, 01 Jun 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/03/What-is-the-Temporal-dead-zone_.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Lo sé, Zona Muerta Temporal suena como a una frase de Ciencia Ficción, pero es muy útil para entender qué significan términos y conceptos con los que trabajas (o quieres aprender) día a día.</p><p>Agárrate, porque esto se complica.</p><p>¿Eres consciente que en JavaScript podemos añadir <code>{ }</code> para sumar un nivel al scope donde queramos?</p><p>Por ejemplo, siempre podemos hacer lo siguiente:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">{ { { { { { var madness = true } } } } } }</code></pre><figcaption>¡Esperemos que nunca veas algo similar en producción!</figcaption></figure><p>He incluido este detalle para estar seguro de que los siguientes ejemplos tengan sentido (No he querido asumir que todo el mundo lo sabe de antemano).</p><p>Antes de ES6 no había otra forma de declarar variables que usar <code>var</code> pero ES6 nos trajo las opciones de <code>let</code> y <code>const</code>.</p><p>Las declaraciones <code>let</code> y <code>const</code> son ambas block-scoped, que significa que solo son accesibles dentro de las llaves <code>{</code> <code>}</code> que les rodean. La declaración <code>var</code>, por otro lado, no tiene esa restricción.</p><p>Aquí hay un ejemplo:</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">let babyAge = 1;
let isBirthday = true;

if (isBirthday) {
	let babyAge = 2; 
}

console.log(babyAge); // Hmmmm. Esto imprime un 1</code></pre><figcaption>2 variables únicas, con diferentes valores.</figcaption></figure><p>Lo anterior ha ocurrido porque la redeclaración de <code>babyAge</code> a 2 se encuentra solo disponible dentro del bloque <code>if</code> . Más allá, se usa el primer valor de <code>babyAge</code> . ¿Puedes ver que son 2 variables diferentes?</p><p>En contraste, la declaración <code>var</code> no está limitada al scope:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">var babyAge = 1;
var isBirthday = true;

if (isBirthday) {
	var babyAge = 2; 
}

console.log(babyAge); // Ah! Esto imprime 2</code></pre><figcaption>One variable with it's value re-declared.&nbsp;</figcaption></figure><p>La última diferencia destacada entre <code>let</code> / <code>const</code> y <code>var</code> &nbsp;es que, si tu accedes a <code>var</code> &nbsp;antes de que sea declarada, su valor es indefinido, pero si haces lo mismo para <code>let</code> &nbsp;y <code>const</code>, te saldrá un <code>ReferenceError</code>.</p><pre><code class="language-javascript">console.log(varNumber); // undefined
console.log(letNumber); // No se registra, lanza un "ReferenceError letNumber is not defined"

var varNumber = 1;
let letNumber = 1;</code></pre><p>Lanzan el error debido a lo que se conoce como Zona Muerta Temporal.</p><h2 id="la-zona-muerta-temporal-explicada-"><strong>La Zona Muerta Temporal, explicada.</strong></h2><p>Esto es lo que es la TDZ: El término describe el estado donde las variables son inaccesibles. Se encuentran en el scope, pero no han sido declaradas todavía.</p><p>Las variables <code>let</code> y <code>const</code> existen en la TDZ desde el inicio de su ámbito de aplicación, su scope, hasta que son declaradas.</p><p>También se puede decir que las variables existen en la TDZ desde que se vinculan (cuando la variable se vincula al ámbito o scope en el que está) hasta que se declara (cuando se reserva un nombre en memoria para esa variable).</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">{
 	// ¡Esta es la Zona muerta temporal para la variable age!
	// ¡Esta es la Zona muerta temporal para la variable age!
	// ¡Esta es la Zona muerta temporal para la variable age!
 	// ¡Esta es la Zona muerta temporal para la variable age!
	let age = 25; // Cuando llegamos aquí, se acabó TDZ.
	console.log(age);
}</code></pre><figcaption>La zona muerta temporal capturada y catalogada.</figcaption></figure><p>Puedes ver arriba que, si se quiere acceder a la variable age, antes de su declaración, nos arrojará un <code>ReferenceError</code>. Por la TDZ.</p><p>Pero <code>var</code> no hace eso, <code>var</code> es inicializada como <code>undefined</code> a diferencia de las otras declaraciones, <code>let</code> y <code>const</code>.</p><h2 id="-cu-l-es-la-diferencia-entre-declarar-e-inicializar"><strong>¿Cuál es la diferencia entre declarar e inicializar?</strong></h2><p>Aquí hay un ejemplo de declaración e inicialización de una variable</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">function scopeExample() {

    let age; // 1
    age = 20; // 2
    let hands = 2; // 3
}</code></pre><figcaption>Declaración vs inicialización.</figcaption></figure><p>Declarar una variable significa que se reserva el nombre en memoria en el scope actual. En el ejemplo, el etiquetado como 1 en los comentarios.</p><p>Inicializar una variable es establecer el valor de la variable. En este caso, etiquetado como 2 en los comentarios.</p><p>O siempre se puede hacer ambas tareas en una sola línea. Es la etiquetada como 3 en comentarios.</p><p>Repitámoslo otra vez: Las variables <code>let</code> y <code>const</code> existen en la TDZ desde el inicio de su scope hasta que son declaradas.</p><p>Entonces, a partir del fragmento de código anterior, ¿dónde se sitúa la TDZ para <code>age</code>? Además, ¿La variable <code>hands</code> tiene TDZ? si es así, ¿Dónde está el inicio y final de la TDZ de <code>hands</code> ? Intenta resolverlo antes de continuar.</p><p>Vamos a comprueba tus respuestas:</p><p>Tanto <code>hands</code> como <code>age</code> están dentro de la TDZ.</p><p>La TDZ para <code>hands</code> finaliza cuando es declarada, la misma línea en que se le pone valor 2.</p><p>La TDZ para <code>age</code> finaliza cuando es declarada y el nombre reservado en memoria (En el paso 2).</p><h2 id="-por-qu-se-crea-la-tdz-cuando-se-crea"><strong>¿Por qué se crea la TDZ cuando se crea?</strong></h2><p>Volvamos a nuestro primer ejemplo:</p><pre><code>{
    // ¡Esta es la Zona Muerta Temporal para la variable age!
    // ¡Esta es la Zona Muerta Temporal para la variable age!
    // ¡Esta es la Zona Muerta Temporal para la variable age!
    // ¡Esta es la Zona Muerta Temporal para la variable age!
    let age = 25; // Cuando llegamos aquí, se acabó la TDZ
    console.log(age);
}</code></pre><p>Si añadimos un <code>console.log</code> dentro de la TDZ veremos el siguiente error:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2020/10/image-5.png" class="kg-image" alt="image-5" width="600" height="400" loading="lazy"></figure><p>¿Por qué existe la TDZ entre en inicio del scope y la declaración de la variable? ¿Cuál es la razón específica para ello?</p><p><strong>Es por el hoisting (elevación)</strong></p><p>El motor de JS que está analizando y ejecutando tu código tiene 2 pasos que realizar:</p><ol><li>Analizar el código en el Arbol de Sintaxis Abstracto/código de bytes ejecutable, y</li><li>Ejecución en tiempo real.</li></ol><p>En el paso uno es cuando sucede el hoisting, realizado por el motor de JS. Esencialmente, consiste en elevar todas las variables al comienzo del scope. Un ejemplo será como sigue:</p><pre><code class="language-js">console.log(hoistedVariable); // undefined
var hoistedVariable = 1;</code></pre><p>Para ser claro, estas variables no se mueven físicamente en el código, pero el resultado funcionalmente es idéntico a lo siguiente:</p><pre><code class="language-js">var hoistedVariable;

console.log(hoistedVariable); // undefined
counter = 1;</code></pre><p>La única diferencia con <code>const</code> y <code>let</code> es que, cuando son elevadas, sus valores no toman el valor por defecto <code>undefined</code>.</p><p>Para probar que <code>const</code> y <code>let</code> también se elevan, veamos el ejemplo:</p><pre><code class="language-js">{
    // ¡Las 2 variables siguientes van a ser elevadas al inicio del scope!
	console.log(typeof variableQueNoExiste); // Imprime undefined
	console.log(typeof name); // Devuelve error, no puede acceder a 'name' antes de inicializarla

	let name = "Kealan";
}</code></pre><p>El fragmento anterior es la prueba de que <code>let</code> es claramente elevada por encima de donde fue declarada, ya que el motor nos avisa de este hecho. Se sabe que <code>name</code> existe (Es declarada), pero no podemos acceder a ella antes de su inicialización.</p><p>Si te ayuda a recordarlo, pienso en ello como lo siguiente:</p><p>Cuando las variables son elevadas, <code>var</code> obtiene el valor de inicialización <code>undefined</code> por defecto en el proceso de hoisting o elevación. Por su parte <code>let</code> y <code>const</code> también son elevadas, pero no son puestas con el valor <code>undefined</code> en el proceso.</p><p>Y este es el único motivo por el que tenemos TDZ. Por eso ocurre con <code>let</code> y <code>const</code> pero no con <code>var</code>.</p><h2 id="m-s-ejemplos-de-tdz"><strong>Más </strong>ejemplos <strong>de TDZ</strong></h2><p>La TDZ también fue creada para los parámetros por defecto de las funciones. Luego, algo como lo siguiente:</p><pre><code class="language-js">function createTDZ(a=b, b) {
}

createTDZ(undefined, 1); </code></pre><p>Nos lanza un <code>ReferenceError</code> porque la evaluación de la variable <code>a</code> intenta el acceso a la variable <code>b</code> antes que haya sido analizada por el motor de JS. Los argumentos de la función se encuentran todos dentro de la TDZ hasta que son analizados.</p><p>Incluso algo tan sencillo como <code>let tdzTest = tdzTest</code>; deberá lanzar un error debido a la TDZ. En este caso, <code>var</code> creará justo <code>tdzTest</code> &nbsp;y la pondra a <code>undefined</code>.</p><p>Un último ejemplo, bastante avanzado, de Erik Arvindson (el cual está involucrado en la evolución y mantenimiento de las especificaciones de ECMAScript):</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">let a = f(); // 1
const b = 2;
function f() { return b; } // 2, b está en la TDZ
</code></pre><figcaption>Un último ejemplo.</figcaption></figure><p>Puedes seguir los números comentados.</p><p>En la primera línea llamamos a la función <code>f</code>, la cual trata de acceder a la variable <code>b</code> , la cual lanzará un <code>ReferenceError</code> ya que <code>b</code> se encuentra en la TDZ.</p><h2 id="-por-qu-tenemos-tdz"><strong>¿Por qué tenemos TDZ?</strong></h2><p>El Dr. Alex Rauschmayer tiene un excelente post explicando por qué existe la TDZ y la principal razón que esgrime es la siguiente:</p><p>Nos ayuda a atrapar errores.</p><p>Intentar acceder a una variable antes de declararla es el camino equivocado, y no debería ser posible.</p><p>También da una semántica más esperada y racional para <code>const</code> ya que const es elevada (hoisted), porque ¿qué pasa si un programador intenta usarlo antes de que sea declarada en tiempo de ejecución? ¿Qué variable debería contener en el momento en el que se eleva? Fue el mejor enfoque decidido por el equipo de especificaciones de ECMAScript.</p><h2 id="c-mo-evitar-los-problemas-que-provoca-la-tdz"><strong>Cómo evitar los problemas que provoca la TDZ</strong></h2><p>Es relativamente sencillo, siempre asegúrate de definir tus <code>let</code>s y <code>const</code>s en la parte superior del scope.</p><p>Traducido del artículo de <a href="https://www.freecodecamp.org/news/author/kealan/">Kealan Parr</a> - <a href="https://www.freecodecamp.org/news/what-is-the-temporal-dead-zone/">What is the Temporal Dead Zone (TDZ) in JavaScript?</a></p><p></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Instalación y configuración de un servidor de FTP en Linux Redhat/CentOS ]]>
                </title>
                <description>
                    <![CDATA[ FTP son las siglas de File Transfer Protocol (Protocolo de Transferencia de Archivos). Fue escrito por Abhay Bhushan y publicado como RFC 114 el 16 de abril de 1971. Es compatible con todos los sistemas operativos y navegadores. Se basa en una arquitectura cliente-servidor. Cómo instalar y configurar un servidor ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/instalacion-y-configuracion-de-un-servidor-de-ftp-en-linux-redhat-centos/</link>
                <guid isPermaLink="false">60113e0ba4e0700982aa10d8</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Aitor Zaldua ]]>
                </dc:creator>
                <pubDate>Tue, 23 Mar 2021 06:12:56 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/01/photo-1571786256017-aee7a0c009b6.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>FTP son las siglas de File Transfer Protocol (Protocolo de Transferencia de Archivos). Fue escrito por Abhay Bhushan y publicado como RFC 114 el 16 de abril de 1971. Es compatible con todos los sistemas operativos y navegadores. Se basa en una arquitectura cliente-servidor.</p><h2 id="c-mo-instalar-y-configurar-un-servidor-ftp-en-linux-redhat-centos"><strong>Cómo instalar y configurar un servidor FTP en Linux Redhat/CentOS</strong></h2><p>Paso 1: Usaremos localhost (127.0.0.1) en nuestro equipo para configurar el servidor ftp.</p><p>Paso 2: Instalar el paquete vsftpd (muy seguro FTP daemon).</p><p><code>yum install -y vsftpd</code></p><p>Paso 3: Inicia el servidor FTP cuando el sistema esté encendido.</p><p><code>systemctl enable vsftpd.service</code></p><p>Paso 4: Comprobar el estado del servidor de FTP.</p><p><code>systemctl status vsftpd.service</code></p><p>Paso 5: Configura el paquete vsftpd. Editaremos <code>/etc/vsftpd/vsftpd.conf</code></p><pre><code class="language-text">// Cambia la línea que contiene anonymous_enable=NO a
anonymous_enable=YES

</code></pre><p>Esto le permitirá a cualquiera acceder al servidor FTP con autenticación.</p><pre><code>// Cambie lo siguiente a YES
local_enable=YES
write_enable=YES&lt;br&gt;</code></pre><p>Paso 6: Inicia el servidor FTP.<br><code>systemctl start vsftpd.service</code></p><p>Paso 7: Instala el cliente de FTP.<br><code>yum install -y lftpd</code></p><p>Paso 8: Conecta el FTP al localhost.<br><code>lftp localhost</code></p><p>Traducido del artículo - <strong><a href="https://www.freecodecamp.org/news/install-and-configure-ftp-server-in-redhat-centos-linux/">Install and configure an FTP server in Redhat/Centos Linux</a></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 5 comandos de Git que deberías conocer, con ejemplos en código. ]]>
                </title>
                <description>
                    <![CDATA[ Llevo usando Git durante algunos años y todavía me encuentro buscando en Google cómo hacer algunas de sus tareas básicas. Este artículo es mi intento de aprender a hacer algunas de esas tareas escribiendo sobre ellas. Y aunque todavía a veces las olvide, al menos tendré una referencia donde poder ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/5-comandos-de-git-que-deberias-conocer-con-ejemplos-en-codigo/</link>
                <guid isPermaLink="false">5ffff907a4e0700982a9d688</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Aitor Zaldua ]]>
                </dc:creator>
                <pubDate>Mon, 15 Mar 2021 05:44:29 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/01/art01im01-2.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Llevo usando Git durante algunos años y todavía me encuentro buscando en Google cómo hacer algunas de sus tareas básicas. Este artículo es mi intento de aprender a hacer algunas de esas tareas escribiendo sobre ellas. Y aunque todavía a veces las olvide, al menos tendré una referencia donde poder encontrar fácilmente estos comandos, y, por supuesto, tú también la tendrás.</p><p>Pero antes de pasar a aprender cómo usar estos comandos, les contaré algo que me dijo una vez un colega mío y que se me ha quedado grabado desde entonces: Todo es posible con Git, nada se pierde en Git.</p><p>No sé si la primera parte de su declaración es totalmente cierta, pero la tengo en mente cada vez que intento hacer algo con Git. Sinceramente, creo que voy a encontrar un comando que me ayude a hacer lo que necesito con solo buscar en Google las palabras adecuadas. Si eres nuevo en Git, me gustaría que creyeras en ello también.</p><p>En este artículo, aprenderemos a hacer lo siguiente:</p><ol><li>Agregar repositorios remotos.</li><li>Cambiar repositorios remotos.</li><li>Borrar una rama local o remota.</li><li>Fusionar un archivo de una rama a otra.</li><li>Deshacer un commit localmente y uno remotamente.</li></ol><p>Aunque este artículo está dirigido a personas con, al menos, conocimientos básicos de Git, haré lo posible por explicar los términos lo mejor posible.</p><h2 id="1-agregar-repositorios-remotos"><strong>1. Agregar Repositorios Remotos</strong></h2><p>Los repositorios remotos son versiones de nuestros proyectos que se almacenan en Internet o en cualquier otro lugar. Añadir un repositorio remoto es una forma de decirle a Git dónde está almacenado nuestro código.</p><p>Esto se puede hacer usando la URL del repositorio. Esta podría ser la URL de nuestro repositorio, el fork de otro usuario, o incluso un servidor completamente diferente.</p><p>Cuando clonamos un repositorio, Git implícitamente añade ese repositorio como el origen remoto, denominándose en Git, <code>origin</code>. Para añadir un nuevo repositorio Git, se utiliza este comando:</p><pre><code class="language-text">git remote add &lt;nombre del repositorio&gt; &lt;url&gt;</code></pre><p>Donde &lt;nombre del repositorio&gt; es, precisamente, un nombre único que le hemos asignado, y <code>url</code> es la url del repositorio que queremos añadir.</p><p>Por ejemplo, si queremos añadir un repositorio denominado <code>upstream</code>, podemos escribir el siguiente comando:</p><pre><code class="language-text">git remote add upstream https://github.com/sarahchima/personal-website.git</code></pre><p>Recuerda que tu nombre de repositorio puede ser cualquiera, sólo tiene que ser único, diferente a los nombres de los repositorios remotos que ya tienes. También debe ser algo que puedas recordar fácilmente.</p><p>Para ver la lista de URL remotas que has añadido, podemos ejecutar el siguiente comando:</p><pre><code class="language-text">git remote -v</code></pre><p>Veremos una lista de los nombres y las URL remotas que hemos añadido.</p><p>¿Pero qué pasa si quieres cambiar estas URL remotas? Vamos a ver el siguiente comando de Git.</p><h2 id="2-cambiar-los-repositorios-remotos"><strong>2. Cambiar los Repositorios Remotos</strong></h2><p></p><p>Hay varias razones por las que podemos querer cambiar una URL remota. Por ejemplo, recientemente tuve que pasar de usar URLs de <code>https</code> a URLs de <code>ssh</code> para un proyecto en el que estuve trabajando.</p><p>Para ello, utilizaremos el siguiente comando:</p><pre><code class="language-text">git remote set-url &lt;nombre de repositorio remoto existente&gt; &lt;url&gt;</code></pre><p>Para que este comando funcione, el nombre de repositorio remoto tiene que existir previamente. Esto significa que no funcionará si no has añadido ese nombre remoto antes.</p><p>Por ejemplo, si queremos cambiar la URL remota de un repositorio denominado upstream, teclearemos:</p><pre><code class="language-text">git remote set-url upstream git@github.com:sarahchima/personal-website.git</code></pre><p>Recuerda que debes verificar que el cambio se ha realizado tecleando la sentencia:</p><p> <code>git remote -v</code></p><p>Ya tenemos suficiente acerca de repositorios remotos, vayamos con algo completamente diferente.</p><h2 id="3-borrar-una-rama-local-o-remota"><strong>3. Borrar una rama local o remota</strong></h2><p>Una rama de trabajo, es una versión del repositorio que es diferente del proyecto principal de trabajo. Si no estás familiarizado con las ramas en Git, a lo mejor te interesa leer sobre ellas en Git antes de continuar.</p><h3 id="c-mo-borrar-una-rama-local"><strong>Cómo borrar una rama local</strong></h3><p>Para borrar una rama local, lo primero es asegurarse de no estar en la mencionada rama. Si tienes que moverte a una rama diferente, usa el siguiente comando:</p><pre><code class="language-shell">git checkout &lt;nombre de la rama adonde mover&gt;</code></pre><p>Una vez estés en otra rama diferente, puedes proseguir a borrar la rama con el siguiente con el siguiente comando: </p><pre><code class="language-shell">git branch -d &lt;nombre de la rama&gt;</code></pre><p>Luego si queremos borrar una rama denominada <code>fix/homepage-changes</code>, haremos lo siguiente:</p><pre><code class="language-text">git branch -d fix/homepage-changes</code></pre><p>Podemos teclear el comando <code>git branch</code> en la terminal para confirmar que la rama ha sido borrada satisfactoriamente.</p><p>Pero, a veces, lo que queremos borrar es una rama que ya hemos subido a un repositorio remoto, ¿Cómo podemos hacerlo?</p><h3 id="c-mo-borrar-una-rama-remota"><strong>Cómo borrar una rama remota</strong></h3><p>Para borrar una rama remota, usaremos el siguiente comando:</p><pre><code class="language-text">git push &lt;nombre del repositorio remoto&gt; --delete &lt;nombre del branch&gt;</code></pre><p>Donde <code>&lt;nombre del repositorio remoto&gt;</code> es el nombre del repositorio donde se encuentra la rama a borrar.</p><p>Por ejemplo, si queremos borrar una rama denominada <code>fix/homepage-changes</code> del <code>origin</code>, teclearemos lo siguiente:</p><pre><code class="language-text">git push origin --delete fix/homepage-changes</code></pre><p>La rama remota quedará borrada.</p><h2 id="4-fusionar-un-archivo-de-una-rama-a-otra"><strong>4. Fusionar un archivo de una rama a otra</strong></h2><p>A veces, queremos fusionar el contenido de un archivo específico de una rama a otra, lo que se conoce como fusionar. Por ejemplo, podemos querer fusionar del contenido de un archivo denominado <code>index.html</code> de la rama <code>master</code> de un proyecto a una rama denominada <code>development</code> del mismo proyecto. ¿Cómo lo podemos hacer?</p><p>Primero, nos movemos a la rama hacia la que queremos llevar el archivo, para ello usamos la opción <code>checkout</code>. Por ejemplo, para moverse a la rama <code>development</code>:</p><pre><code class="language-text">git checkout development</code></pre><p>Ahora, fusionamos el archivo que traemos desde la rama master, usando el comando <code>checkout --patch</code>:</p><pre><code class="language-text">git checkout --patch master index.html</code></pre><p>En caso de querer sobrescribir completamente el archivo, se omite la etiqueta <code>--patch</code></p><pre><code class="language-text">git checkout master index.html</code></pre><p>También se omitirá <code>--patch</code> si el archivo <code>index.html</code> no existe en la rama destino <code>development</code>.</p><h2 id="5-deshacer-un-commit"><strong>5. Deshacer un commit</strong></h2><p>A veces, ya hemos realizado un commit, es decir, hemos confirmado los cambios, y nos damos cuenta de que es incorrecto por lo que queremos deshacerlo. Incluso hemos podido llevar los cambios a un repositorio remoto, pero queremos revertir la acción. ¿Cómo podemos deshacer o borrar ese commit? Comencemos deshaciendo un commit local.</p><h3 id="c-mo-deshacer-un-commit-local"><strong>Cómo deshacer un commit local</strong></h3><p>Una forma de deshacer un commit local es usando el comando <code>git reset</code>. Por ejemplo, si se quiere deshacer el último commit realizado podemos teclear:</p><pre><code class="language-text">git reset --soft HEAD~1</code></pre><p>La etiqueta <code>--soft</code> mantiene los cambios realizados en los ficheros, sólo se revierte el propio commit. Sin embargo, si lo que se quiere es que tampoco se mantengan dichos cambios en los ficheros, se usará el flag <code>--hard</code> en su lugar, por ejemplo:</p><pre><code class="language-text">git reset --hard HEAD~1</code></pre><p>Recuerda, usaremos el flag <code>--hard</code> solo cuando estemos seguros de que no necesitamos ninguno de los cambios.</p><p>Además, fíjate que <code>HEAD~1</code> apunta al último commit realizado. Si lo que queremos es deshacer un commit anterior, podemos usar <code>git reflog</code> para obtener un log de todos los commits anteriores. Después, usaremos el comando <code>git reset</code> con el hash del commit a borrar (el hash es el número que está al comienzo de cada línea en el historial del log). Por ejemplo, si el hash del commit es <code>9157b6910</code>, haremos los siguientes:</p><pre><code class="language-text">git reset --soft 9157b6910 </code></pre><h3 id="c-mo-deshacer-un-commit-remoto"><strong>Cómo deshacer un commit remoto</strong></h3><p>Hay veces en las que se quiere deshacer un commit que ya hemos subido a un repositorio remoto. En estos casos, podemos usar <code>git revert</code> para deshacerlo de forma local y, posteriormente, subir este cambio a la rama remota.</p><p>Primero, buscamos el hash del commit usando git reflog:</p><pre><code class="language-text">git reflog</code></pre><p>Luego, lo revertimos. Si asumimos que nuestro hash es 9157b6910, haríamos lo siguiente:</p><pre><code class="language-text">git revert 9157b6910 </code></pre><p>Finalmente, subimos el cambio a la rama remota.</p><h2 id="sumario"><strong>Sumario</strong></h2><p>En este artículo, hemos examinado los comandos para realizar las siguientes tareas en Git:</p><ol><li>Añadir repositorios remotos.</li><li>Cambiar repositorios remotos.</li><li>Borrar una rama.</li><li>Fusionar un archivo de una rama a otra.</li><li>Borrar un commit local y remoto.</li></ol><p>Tal vez algún día escriba más acerca de más tareas que se pueden realizar con Git.</p><p>Espero que hayas disfrutado del artículo, muchas gracias por leerlo. </p><p>Traducido del artículo de <a href="https://www.freecodecamp.org/news/author/sarah/">Sarah Chima Atuonwu</a> - <a href="https://www.freecodecamp.org/news/5-git-commands-you-should-know-with-code-examples/">5 Git Commands You Should Know, with Code Examples</a></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
