<?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[ Stephanie Frias - 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[ Stephanie Frias - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sun, 24 May 2026 19:37:27 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/author/stephanie/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Significado del algoritmo divide y vencerás: Explicado con ejemplos ]]>
                </title>
                <description>
                    <![CDATA[ ¿Qué son los algoritmos "divide y vencerás"? (Y no, no es divide y concurrir) Divide y vencerás es un paradigma algorítmico (a veces llamado por error Divide y Concurrir - una adaptación en broma), similar a los paradigmas de programación Dinámica y Algoritmos ávidos o glotones. Un algoritmo Divide y ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/significado-del-algoritmo-divide-y-venceras/</link>
                <guid isPermaLink="false">5ffc3ff88c7cd154bb98639c</guid>
                
                    <category>
                        <![CDATA[ Algoritmos ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Stephanie Frias ]]>
                </dc:creator>
                <pubDate>Sun, 04 Apr 2021 04:56:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/03/photo-1460194436988-671f763436b7-1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <h2 id="-qu-son-los-algoritmos-divide-y-vencer-s-y-no-no-es-divide-y-concurrir-"><strong>¿Qué son los algoritmos "divide y vencerás"? (Y no, no es divide y concurrir)</strong></h2><p>Divide y vencerás es un paradigma algorítmico (a veces llamado por error Divide y Concurrir - una adaptación en broma), similar a los paradigmas de programación Dinámica y Algoritmos ávidos o glotones. Un algoritmo <em>Divide y Vencerás</em> típico resuelve un problema siguiendo estos 3 pasos.</p><ol><li><strong>Dividir:</strong> Descomponer el problema en sub-problemas del mismo tipo. Este paso involucra descomponer el problema original en pequeños sub-problemas. Cada sub-problema debe representar una parte del problema original. Por lo general, este paso emplea un enfoque recursivo para dividir el problema hasta que no es posible crear un sub-problema más.</li><li><strong>Vencer:</strong> &nbsp;Resolver los sub-problemas recursivamente. Este paso recibe un gran conjunto de sub-problemas a ser resueltos. Generalmente a este nivel, los problemas se resuelven por sí solos.</li><li><strong>Combinar: </strong>Combinar las respuestas apropiadamente. Cuando los sub-problemas son resueltos, esta fase los combina recursivamente hasta que estos formulan la solución al problema original. Este enfoque algorítmico trabaja recursivamente y los pasos de conquista y fusión trabajan tan a la par que parece un sólo paso.</li></ol><p>Usualmente este método nos permite hacer una reducción bastante significativa en la complejidad tiempo del algoritmo a emplear.</p><p>Por ejemplo, el método de la burbuja conlleva una complejidad de &nbsp;<code>O(n^2)</code>, mientras que el quicksort (una aplicación de Dividir y Vencer) reduce la complejidad a <code>O(nlog(n))</code>. La búsqueda linear tiene una complejidad de <code>O(n)</code>, mientras que la búsqueda binaria(otra aplicación de dividir y vencer) reduce la complejidad a &nbsp;<code>O(log(n))</code>.</p><p>A continuación algunos de los algoritmos estándar de la variedad dividir y vencer</p><p><strong>Búsqueda Binaria,</strong> es un algoritmo de búsqueda. En cada paso, el algoritmo compara el parámetro de entrada (x) con el valor del elemento en la mitad del arreglo. Si los valores coinciden, retorna el índice del elemento medio. De lo contrario, si x es mejor al elemento medio, el algoritmo recurre a la mitad izquierda del elemento medio, de lo contrario retorna la mitad a la derecha del elemento medio. </p><p><strong><strong>Quicksort</strong>, </strong> es un algoritmo de ordenamiento. El algoritmo elige un elemento pivote, reordena los elementos del arreglo de forma que todos los elementos de menor valor al del elemento pivote se mueven hacia su izquierda y los elementos de mayor valor hacia su derecha. Finalmente, el algoritmo ordena los sub-arreglos recursivamente hacia la izquierda y derecha del elemento pivote.</p><p><strong><strong>Merge Sort</strong>, </strong>es también un algoritmo de ordenamiento. Este algoritmo divide el arreglo en dos partes, ordenada cada una de ellas recursivamente, y finalmente une las dos partes ya ordenadas. El tiempo de complejidad de este algoritmo es de &nbsp;<code>O(nLogn)</code>, en el mejor caso, caso medio y en el peor de los casos. La complejidad de tiempo puede ser entendida fácilmente recurriendo a la ecuación: <code>T(n) = 2T(n/2) + n</code>.</p><p><strong>Par de puntos más cercanos, </strong>El problema es encontrar el par de puntos más cercano a otra par dado en el plano XY. Este problema puede ser resuelto en un tiempo <code>O(n^2)</code> calculando la distancia de cada par de puntos y comparando las distancias hasta encontrar la menor. El algoritmo de tipo Dividir y Vencer resuelve este problema en un tiempo &nbsp;<code>O(nLogn)</code>.</p><p><strong>Algoritmo de <strong>Strassen</strong> </strong>es un algoritmo eficiente para multiplicar dos matrices. Un método simple para multiplicar dos matrices requiere 3 bucles anidados lo que nos da una complejidad de &nbsp;<code>O(n^3)</code>. &nbsp;El algoritmo de Strassen multiplica dos matrices en un tiempo de &nbsp;<code>O(n^2.8974)</code>.</p><p><strong>El Algoritmo</strong> <strong><strong>Cooley–Tukey</strong> de Transformación Rápida de Fourier <strong>(FFT) </strong></strong>es el algoritmo más común de FFT (Transformación Rápida de Fourier en inglés). Es un algoritmo de tipo Dividir y Vencer que opera en un tiempo de <strong> </strong><code>O(nlogn)</code>.</p><p><strong>El algortimo de Karatsuba, </strong>este fue el primer algoritmo de multiplicación más rápido asintóticamente que el algoritmo cuadrático clásico de multiplicación. Este algoritmo consigue reducir la multiplicación de dos números de n dígitos a como máximo de &nbsp;n^1.585( que es la aproximación del logaritmo de 3 en base 2) multiplicaciones de un dígito. Por lo tanto es más rápido que el algoritmo clásico que requiere el producto de n^2 de números de un dígito. </p><h3 id="dividir-y-vencer-d-v-vs-programaci-n-din-mica-dp-"><strong>Dividir y vencer (D &amp; V) vs programación dinámica (DP)</strong></h3><p>Ambos paradigmas (D &amp; V y PD) dividen un problema cualquiera en sub problema y resuelve cada uno de ellos. ¿Cómo elegir uno de ellos para un problema? Dividir y Vencer debe ser empleado cuando los sub problemas no son evaluados muchas veces. De lo contrario programación dinámica o memoización debería emplearse en su lugar.</p><p>Por ejemplo, la Búsqueda Binaria es un algoritmo Dividir y Vencer, nunca evaluaremos los sub problema más de una vez. Por otro lado, el cálculo del Número Fibonacci se debe preferir la aplicación de Programación Dinámica.</p><p>Traducción del Artículo - <strong><a href="https://www.freecodecamp.org/news/divide-and-conquer-algorithms/">Divide and Conquer Algorithm Meaning: Explained with Examples</a></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Una primera mirada a GitHub Actions con Heroku ]]>
                </title>
                <description>
                    <![CDATA[ En octubre, GitHub anunció que su última gran característica, GitHub Actions, iba a ser beta pública. En ese momento no tenía muy en claro de qué consistía,  pero después de leer la publicación en su publicación de blog me pareció bastante simple. GitHub Actions es la respuesta a las principales ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/github-actions-una-primera-mirada-con-heroku/</link>
                <guid isPermaLink="false">5fdaa0758c7cd154bb978249</guid>
                
                    <category>
                        <![CDATA[ GitHub ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Stephanie Frias ]]>
                </dc:creator>
                <pubDate>Sun, 10 Jan 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/01/1_GsbQnrSIRn8-MkyfFGXJHw-1-.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>En octubre, GitHub anunció que su última gran característica, GitHub Actions, iba a ser beta pública. En ese momento no tenía muy en claro de qué consistía, &nbsp;pero después de leer la publicación en su publicación de blog me pareció bastante simple. GitHub Actions es la respuesta a las principales características de su competidor: La función Auto DevOps de Gitlab.</p><p>Hace poco creé mi propia cuenta personal en Gitlab solo por el hecho que GitLab me ofrecía una forma muy fácil de automatizar mi proceso de compilación y despliegue de una aplicación simple de una página en React usando tan solo un archivo &nbsp;<code>.gitlab-ci.yml</code></p><p>Sin embargo, cuando obtuve acceso al beta de GitHub Actions tenía que darle un intento. Así que decidí construir algo similar.</p><h4 id="-mu-strame-el-c-digo-">¡Muéstrame el código!</h4><p>Si ya tienes una idea de qué acciones son y solo quieres ver el código relacionado, siéntete libre de explorar el repositorio para este artículo en el siguiente enlace: <a href="https://github.com/pedsm/tryGithubAction">https://github.com/pedsm/tryGithubAction</a></p><h4 id="un-breve-descargo"><strong>Un breve descargo</strong></h4><p>Toda mi experiencia con GitHub Action hasta el momento está basada en su versión beta, así tenlo en consideración. Pueda que muchas de las cosas de las que hablo aquí no sean liberadas en versión final, además ignoraré los errores y comportamientos raros que he ido encontrando.</p><h3 id="-qu-es"><strong>¿Qué es?</strong></h3><p>GitHub Actions te permite automatizar tareas a ser completadas cuando algo sucede en tus repositorios (como pushes, issues, versión y demás). Esto significa que puedes configurar tu repositorio de manera tal que pueda ser automáticamente probado y desplegado cada vez hay un nuevo commit, que es exactamente lo que yo hice.</p><p>Como ya mencioné, la única razón por la que decidí crear una cuenta en GitLab fue la posibilidad de tener un flujo de trabajo en el cual todo nuevo código agregado al Master sea desplegado directamente al sitio web, entonces decidí recrear esto exactamente.</p><h3 id="la-configuraci-n"><strong>La Configuración</strong></h3><p>Una vez que tienes acceso a GitHub Action, verás una nueva pestaña con el nombre de <code>Actions</code> en tus repositorios. En ella podrás crear tu primer flujo de trabajo. Un flujo de trabajo es un archivo de flujo de trabajo que vive dentro del .github que ya se usa para otras cosas, como plantillas de relaciones públicas y otras configuraciones de GitHub específicas del repositorio.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*zUZtwIE2WjvlpS4DqcLxBw.png" class="kg-image" alt="la" width="800" height="83" loading="lazy"><figcaption>La nueva pestaña de "Actions"</figcaption></figure><p>GitHub Actions viene con un editor gráfico completamente equipado para tus flujos de trabajo. Esto es un soplo de aire fresco si pensaste que ibas a tener que aprender un nuevo esquema YAML or algún lenguaje específico a la tecnología como en el caso de <code>Jenkinsfile</code>. Por otro lado, si no quieres usar ninguna de estas alucinantes herramientas gráficas siempre puedes editar el archivo .workflow a tu gusto.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*gk2BNOWyKfD-50-1CrgTHw.png" class="kg-image" alt="1*gk2BNOWyKfD-50-1CrgTHw" width="800" height="569" loading="lazy"><figcaption>El visualizador gráfico del .workflow</figcaption></figure><p>Los archivos de Workflow usan el lenguaje de configuración HashiCorp(conocido también como HCL). Si conoces de Terraform, este lenguaje se te hará familiar.</p><h3 id="las-diferencias"><strong>Las diferencias</strong></h3><p>Si has implementado algún tipo de prueba automatizada, todo esto se te hará muy familiar. Quizá aparte de tener acceso a un editor gráfico. De todas maneras, encontraremos menos similitudes a medida que avancemos.</p><p>GitHub Actions, como el nombre lo sugiere, es una serie de <code>actions</code> que son ejecuciones de comandos individuales, lo cual es bastante inusual. Si le prestas atención al archivo <em>de flujo de trabajo, </em>habrás notado que la definición de las acciones tiene un parámetro <code>uses</code>. Si usas una acción <code>npm</code> podrías crear una solo tarea NPM como <code>npm install</code> y luego otra acción para hacer la prueba <code>npm test</code>. Esto es inusual, ya que algunas tareas lógicas como "instalar dependencias" podrían requerir más de un comando y usualmente están agrupadas en "Etapas" en otras soluciones de integración continua.</p><p>Al usar el editor gráfico y agregas una nueva acción, lo primero que se te muestra es una lista de acciones disponibles. Luego aparece un formulario simple en el cual solo debes ingresar texto en los campos <em>label</em>, <em>args</em> y <em>run</em>.</p><p>El campo <em>label, </em> como podrías inferir, es solo un nombre amigable para lo que hace tu acción, como por ejemplo "<em>Testing". </em>La acción luego realizas un <em><em>‘runs args’</em> &nbsp;</em>en la terminal considerando que <em>runs </em>no está siendo sobreescrito. Esto significa que para ejecutar <code>npm install</code> en una acción que use npm, tendrías que dejar el campo <em>runs </em>con el texto por defecto (vacío) y en el campo <em>args</em> escribir <code>install</code></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*N6uwl7UCYhFb-xmcU5RBUg.png" class="kg-image" alt="1*N6uwl7UCYhFb-xmcU5RBUg" width="388" height="536" loading="lazy"><figcaption>La pantalla de configuración de una acción en el editor gráfico</figcaption></figure><p>A este momento me provoca un poco de decepción, porque al parecer GitHub quiere restringir la funcionalidad de esta característica a solo las cosas que la plataforma determine. Npm está disponible por el momento, pero si usas pip para tu proyecto en Python entonces tendrás que implementar una acción propia o buscar una alternativa de código abierto. Ya es posible crear tus propias acciones personalizadas, pero dado que aún está en su versión beta es poco probable que encuentres gran variedad. Mirando el lado positivo, si tenían las dos cosas que necesitaba, NMP y Heroku.</p><h3 id="el-proyecto"><strong>El Proyecto</strong></h3><p>La idea del proyecto es bastante simple: Quería construir una aplicación en Vue(ya que es lo que estoy aprendiendo actualmente) y tener un despliegue automático a un servicio de alojamiento.</p><p>Después quería crearlo de manera que el contenido del sitio web refleje un archivo <code>json</code> con una serie de nombres de usuario de GitHub. De esta manera cualquier podría crear un PR con su nombre de usuario de GitHub y yo podría darle clic a un botón y tener todo desplegado mágicamente. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*J55Yixev7q9A4LPcY_jyDg.png" class="kg-image" alt="1*J55Yixev7q9A4LPcY_jyDg" width="800" height="674" loading="lazy"><figcaption>You can check it out here <a href="https://try-github-action.herokuapp.com/" rel="noopener" target="_blank" title="" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">https://try-github-action.herokuapp.com/</a></figcaption></figure><p>Omitiré todo el contenido en Vue.js e iré directamente a los Actions. Luego de construir esta simple aplicación, sólo tenía que hacer las siguientes acciones:</p><ol><li>Instalar las dependencias</li><li>Ejecutar los linters (muy importante para prevenir cualquier mala estructura en el archivo json)</li><li>Construir el código listo para ir a producción</li><li>Desplegar en algún sitio web. (Decidí usar Heroku ya que parece ser el menos complicado en términos de servidores y que hay acciones disponible para esta plataforma).</li></ol><p>Con los 3 primeros pasos tuve la experiencia más intuitiva automatizando cualquier cosa. Me recordó mucho a la plataforma IFTT. Solo tienes que darle clic a la acción NPM y luego escoger que quieres que NPM haga. Sé que mencioné que me sentí un poco restringido al solo tener una par de acciones, pero la realidad es que en ningún momento tuve que preocuparme sobre la distribución de Linux que estaba usando, si NPM estaba empaquetado con la instalación Node.js, y lo más importante cero preocupación si es que la sintaxis HCL estaba correcta. Un par de clic en la interfaz gráfica y listo. El proceso completo tomó 4 acciones y menos de 5 minutos.</p><p>Luego pasé a la fase de despliegue. Sabía que esta iba a ser un poco más complicada, porque a pesar de saber cómo funciona Heroku, nunca antes lo había utilizado. Sin embargo, en el repositorio actions/heroku &nbsp;encontré instrucciones claras que me ayudaron a hacer exactamente lo que quería hacer. Al final, fue un tema de más clics y listo.</p><h3 id="secretos"><strong>Secretos</strong></h3><p>Creo que esté el momento perfecto para hablar sobre mi funcionalidad favorita de GitHub Actions, los secretos. Como podrás suponer, Heroku requiere una API Key para poder permitirle a alguien desplegar la aplicación. De lo contrario, cualquiera leyendo este artículo podría reemplazar mi aplicación con lo que le plazca. Usualmente, esto es algo molesto al encargarse de un proyecto de código abierto, ya que no puedes almacenarlo dentro del mismo repositorio. AWS tiene incluso un servicio dedicado a esta clase de problema. A pesar de ellos, GitHub ha implementado una elegante solución a este problema.</p><p>Los secretos son valores que puedes almacenar al mismo nivel del repositorio y que será automáticamente encriptados y luego enviados como variables de entorno a las acciones que definas que tengan acceso a estos valores.</p><p>Si le has pegado una mirada al repositorio de la acción de Heroku, te habrás dado cuenta de que <code>HEROKU_API_KEY</code> está listado como un secreto requerido. El proceso para hacer esto en el editor es tan simple como darle clic a <em><em>*new secret*</em>, </em>y luego darle un nombre y valor. A partir de ellos, puedes marcar el checkbox para cualquier acción que quieras que tenga acceso a esta información.</p><p>Ya que estos secretos se convierten en variable de entorno, no te quedas limitado a las acciones. Por ejemplo, tu framework de pruebas podría recibir las credenciales para un base de datos ya existente para guardar los resultados de tus pruebas, entonces podrías enviar estos secretos mediante una acción <code>npm test</code>.</p><h4 id="env"><strong>Env</strong></h4><p><em>Env</em> es otra opción dentro del editor gráfico que básicamente hace lo mismo que <em>Secrets, </em>pero omite todos los malabares de encriptar tu información. No es un gran problema, ya que la información no sensible podría ser almacenada en un archivo <code>.env</code> dentro del mismo repositorio. </p><h3 id="mis-reflexiones-sobre-github-actions"><strong>Mis reflexiones sobre GitHub Actions</strong></h3><p>GitHub Actions no está haciendo nada novedoso. Hay docenas si no cientos de soluciones disponibles ya sea comerciales o gratuitas que hacen lo mismo que hace Actions. Incluso GitHub tiene toda una categoría de marketplace para la automatización de tareas para tu repositorio.</p><p>Sin embargo, personalmente nunca he tenido tan buena experiencia de usuarios configurando una canalización de CI/CD. GitHub actions no está reinventando la rueda, solo la está haciendo más económica.</p><p>Como desarrolladores, siempre tenemos que encontrar el balance entre simplicidad de uso y cuántas funcionalidades queremos agregarle a algo. El eternos dilema entre usar la terminal de Git o su interfaz gráfica. Por otra parte, GitHub está súper consciente de lo que el mercado tiene disponible y que ellos no están tratando de ser competidores de los grandes. No, no te vas a deshacer de Jenkins, Circle o cualquier otra solución que tu organización esté ya usando. Pero si tienes un pequeño proyecto propio, definitivamente vale la pena darle una chance con GitHub Actions.</p><p><strong>Contribuye</strong></p><p>Todo el código para éste artículo es abierto y disponible en <a href="https://github.com/pedsm/tryGithubActions" rel="noopener">https://github.com/pedsm/tryGithubActions</a>. Si deseas registrar algún issue y agregar tu usuario de GitHub al proyecto, siéntete libre de crear un PR.</p><p>Traducido del artículo de <strong>Pedro Mendonça</strong> - <strong><a href="https://www.freecodecamp.org/news/a-first-look-at-github-actions-with-heroku-a6b4239d556/">A first look at GitHub Actions with Heroku</a> </strong>de <strong>Pedro Mendonça</strong></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
