<?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" version="2.0"><channel><title><![CDATA[richardpalacios.dev]]></title><description><![CDATA[My digital garden, resume, personal blog, and portfolio by Richard Palacios García]]></description><link>https://blog.richardpalacios.dev</link><generator>RSS for Node</generator><lastBuildDate>Thu, 15 Oct 2026 08:15:20 GMT</lastBuildDate><atom:link href="https://blog.richardpalacios.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Códigos de Estado HTTP]]></title><description><![CDATA[El buen diseño de una `REST API` depende mucho de conocer los principales códigos de estado `HTTP`, y el saber como/cuando usarlos; revela nuestra experiencia como desarrollador.

Este post fue publicado originalmente en mi sitio personal

Para ayuda...]]></description><link>https://blog.richardpalacios.dev/codigos-de-estado-http</link><guid isPermaLink="true">https://blog.richardpalacios.dev/codigos-de-estado-http</guid><category><![CDATA[http]]></category><category><![CDATA[HTTP Status]]></category><category><![CDATA[#HTTP-status-code-best-practices]]></category><category><![CDATA[REST API]]></category><category><![CDATA[REST]]></category><dc:creator><![CDATA[Richard Palacios G.]]></dc:creator><pubDate>Tue, 01 Nov 2022 20:56:59 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1677704032883/ca0f0f8e-abdf-4812-b5ad-aad7b34fcb36.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>El buen diseño de una `REST API` depende mucho de conocer los principales códigos de estado `HTTP`, y el saber como/cuando usarlos; revela nuestra experiencia como desarrollador.</p>
<blockquote>
<p>Este post fue publicado originalmente en mi <a target="_blank" href="https://www.richardpalacios.dev/posts/2022/11/resumen-c%C3%B3digos-de-estado-http/"><code>sitio personal</code></a></p>
</blockquote>
<p>Para ayudar a dominar los códigos de estado al crear API's; dejo este resumen de los códigos HTTP mas usados o mas comunes:</p>
<ol>
<li><p>1XX -&gt; Información</p>
</li>
<li><p>2XX -&gt; Petición correcta</p>
</li>
<li><p>3XX -&gt; Redirection</p>
</li>
<li><p>4XX -&gt; Error de cliente</p>
</li>
<li><p>5XX -&gt; Error de servidor.</p>
</li>
</ol>
<p>Hay un tweet de <a target="_blank" href="https://twitter.com/stevelosh/status/372740571749572610">@stevelosh</a>, que define de manera graciosa el objetivo de cada rango o familia de codigos <strong><em>HTTP</em></strong>*.*</p>
<p><strong>English</strong></p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>HTTP Status Code</td><td>HTTP Description</td></tr>
</thead>
<tbody>
<tr>
<td>100</td><td>hold on</td></tr>
<tr>
<td>200</td><td>here you go</td></tr>
<tr>
<td>300</td><td>go away</td></tr>
<tr>
<td>400</td><td>you messed up (client)</td></tr>
<tr>
<td>500</td><td>I messed up (server)</td></tr>
</tbody>
</table>
</div><p><strong>Spanish</strong></p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Código de Estado HTTP</td><td>Descripción del Código</td></tr>
</thead>
<tbody>
<tr>
<td>100</td><td>espera</td></tr>
<tr>
<td>200</td><td>aquí tienes</td></tr>
<tr>
<td>300</td><td>vete/andate</td></tr>
<tr>
<td>400</td><td>tu hiciste algo mal (cliente)</td></tr>
<tr>
<td>500</td><td>yo hice algo mal (servidor)</td></tr>
</tbody>
</table>
</div><h2 id="heading-algunos-de-los-codigos-http-mas-usados">Algunos de los códigos <code>HTTP</code> más usados</h2>
<h3 id="heading-rango-100">Rango <em>100</em></h3>
<ul>
<li><em>100</em> : Es un código muy raro en http, y se puede encontrar al usar websocket. Los websockets usan el código 100 para intercambiar cierta información de protocolo que sirve para establecer la conexión.</li>
</ul>
<h3 id="heading-rango-200">Rango <em>200</em></h3>
<ul>
<li><p><em>200</em> : OK</p>
</li>
<li><p><em>201</em> : <em>CREATED</em>, <em>devuelve una cabecera</em> <code>location</code><em>, que es una URL de donde se puede consultar el nuevo recurso, creado.</em></p>
</li>
<li><p><em>202</em> : <em>ACCEPTED</em>, encolado en caso de usar colas servicios o workers, también devuelve una cabecera <code>location</code> que es una URL de donde se puede consultar el recurso.</p>
</li>
<li><p><em>204</em> : <em>NO CONTENT, es como si el servidor te dijera, "te entendí pero no voy a decir nada"</em>.</p>
</li>
</ul>
<h3 id="heading-rango-300">Rango <em>300</em></h3>
<ul>
<li><p><em>301</em> : MOVED PERMANENTLY, es usado para redirección a largo plazo, el navegador guarda en cache la redirección. Ejm: Cuando la pagina cambio de nombre.</p>
</li>
<li><p><em>302</em> : ENCONTRADO Y REDIRECCIÓN TEMPORAL, redirecciona a otro lugar. Ejm: Redirección en proceso de login.</p>
</li>
<li><p><em>303</em> : SEE OTHER</p>
</li>
<li><p><em>304</em> : NOT MODIFIED, se usa cuando el servidor web implementa algún tipo de cache.</p>
</li>
<li><p><em>307</em> : TEMPORARY REDIRECT</p>
</li>
<li><p><em>308</em> : PERMANENT REDIRECT</p>
</li>
</ul>
<blockquote>
<p><strong><em>Importante,</em></strong> <em>tener en cuenta 👇</em></p>
<p>Los códigos <strong>307</strong> y <strong>308</strong> funcionan como los códigos de respuesta <strong>302</strong> y <strong>301</strong> respectivamente (<mark>Redireccion temporal y permanente)</mark>.</p>
<p>Pero debemos recordar que en una <code>request</code> que use los métodos <em>POST</em>| <em>PUT</em>| <em>DELETE</em> y retorne los códigos <strong>301</strong> o <strong>302;</strong> los métodos (POST|PUT|DELETE) se convertiran en una peticion con método <strong>GET</strong></p>
<ul>
<li><p><em>301</em> y <em>302</em>, cambia el método de la peticion por GET.</p>
</li>
<li><p><em>307</em> y <em>308</em>, mantienen el método de la peticion(POST, PUT, DELETE).</p>
</li>
</ul>
</blockquote>
<h3 id="heading-rango-400">Rango <em>400</em></h3>
<p>Se usan cuando el error ha sido provocado por algo que realizo el cliente,</p>
<ul>
<li><p>Ejemplo:</p>
<ul>
<li><p>Se envió una <em>petición/request</em> mal.</p>
</li>
<li><p>No se envió un parámetro obligatorio o requerido.</p>
</li>
<li><p>Hace una <em>peticion/request</em> a un URL que no existe.</p>
</li>
</ul>
</li>
<li><p><em>400</em> : BAD REQUEST.</p>
</li>
<li><p><em>401 y 403</em> : UNAUTHORIZED AND FORBIDDEN ERRORS.</p>
</li>
<li><p><em>404</em> : NOT FOUND.</p>
</li>
<li><p><em>410</em> : GONE, `ya no existe` o `se ha ido`, **Nuevo**</p>
<ul>
<li>Ejm: Cuando se publica un tweet polémico y decides borrarlo; y cuando alguien con el URL quiere volver a ver el tweet, podría devolver 410, porque ha sido eliminado y ya no existe.</li>
</ul>
</li>
<li><p><em>422</em> : UNPROCESSABLE ENTITY, en caso de que los parámetros pasados sean inválidos.</p>
<ul>
<li>Ejm: no se envía parámetro correcto o que es obligatorio en la petición.</li>
</ul>
</li>
<li><p><em>451</em> : UNAVAILABLE FOR LEGAL REASONS.</p>
</li>
</ul>
<h3 id="heading-rango-500">Rango <em>500</em></h3>
<p>En este rango, existen muchos códigos de estados, pero el mas importante es el <strong>500</strong>. Se usa cuando hubo un <em>error interno</em> en el <em>servidor</em>.</p>
<ul>
<li><p>Ejm:</p>
<ul>
<li><p>Una excepción en el código fuente.</p>
</li>
<li><p>Un error en la base de datos.</p>
</li>
<li><p>Una conexión dañada a algun servidor o peticion, puede darse el caso que nuestro servidor este consultando por detrás a otro servicio y este no este respondiendo a tiempo o con <code>timetout</code>, etc.</p>
</li>
</ul>
</li>
<li><p><em>500</em> : INTERNAL SERVER ERROR.</p>
</li>
<li><p><em>502</em> : BAD GATEWAY.</p>
</li>
<li><p><em>503</em> : SERVICE UNAVAILABLE.</p>
</li>
<li><p><em>504</em> : GATEWAY TIMEOUT, el servidor esta tardando mucho en responder.</p>
</li>
</ul>
<h2 id="heading-conclusiones-y-recomendaciones">Conclusiones y Recomendaciones</h2>
<p>Debemos tener en cuenta que como desarrolladores, a pesar de conocer el error y el códito de estado HTTP exacto que podríamos usar para retornar en el <code>response</code>, aun siendo buena práctica lo anterior, debemos tomar en cuenta <strong>desde el punto de vista de la Seguridad</strong>, que código debemos usar.</p>
<p>Sería mejor responder un código más genérico y no ser tan específico con el código de estado HTTP que retornemos. Ejm: <em>500</em> o <em>404</em>.</p>
<p>El motivo de esto es para proteger la seguridad de nuestra aplicación o servidor de posible <em>hackers</em> o <em>personas mal intencionadas</em>, y evitar que indaguen en los códigos de respuesta HTTP ya que si detallamos especificando el código HTTP les facilitamos encontrar debilidades que pueda tener nuestro sistema y que no hayamos detectado aún.</p>
<h3 id="heading-recursos">Recursos</h3>
<p>Aqui hay algunos recursos donde podemos ver mas a detalle los códigos de estado HTTP:</p>
<ul>
<li><p><a target="_blank" href="https://httpstatuses.org/">HTTP Statuses</a></p>
</li>
<li><p><a target="_blank" href="https://http.cat/">HTTP Cats</a></p>
</li>
<li><p><a target="_blank" href="https://http.dog/">HTTP Dogs</a></p>
</li>
<li><p><a target="_blank" href="https://www.restapitutorial.com/httpstatuscodes.html">HTTP Status Codes</a></p>
</li>
</ul>
<h3 id="heading-referencias">Referencias</h3>
<ul>
<li><p>Obtenido de investigaciones en internet.</p>
</li>
<li><p>Libro Express in Action.</p>
</li>
<li><p>Tweet de <a target="_blank" href="https://twitter.com/stevelosh/status/372740571749572610">@stevelosh</a></p>
</li>
<li><p>Explicación en el canal de <a target="_blank" href="http://makigas.es">makigas.es</a>.</p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Idempotencia en verbos http]]></title><description><![CDATA[Este post es una breve descripción sobre la famosa idempotencia y su importancia en el los verbos http.

Según wikipedia el significado de idempotencia es la propiedad de realizar una acción determinada varias veces, y aún así, conseguir el mismo res...]]></description><link>https://blog.richardpalacios.dev/idempotencia-en-verbos-http</link><guid isPermaLink="true">https://blog.richardpalacios.dev/idempotencia-en-verbos-http</guid><category><![CDATA[http]]></category><category><![CDATA[REST API]]></category><category><![CDATA[idempotencia]]></category><category><![CDATA[buenas practicas]]></category><dc:creator><![CDATA[Richard Palacios G.]]></dc:creator><pubDate>Mon, 17 Oct 2022 22:39:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1677792267267/bed32b2e-1e1c-4893-9416-62cb83897dfb.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Este post es una breve descripción sobre la famosa idempotencia y su importancia en el los verbos http.</strong></p>
<blockquote>
<p>Según wikipedia el significado de <strong>idempotencia</strong> es la propiedad de realizar una acción determinada varias veces, y aún así, conseguir el mismo resultado que se obtendría si se realizara una sola vez.</p>
</blockquote>
<p>En el caso de <strong>HTTP</strong>, específicamente en los verbos HTTP, la <strong>idempotencia</strong> nos dice que:</p>
<p>La ejecución repetida de una <em>petición,</em> con los mismos parámetros, sobre un mismo recurso; <mark>tendrá el mismo efecto en el estado de nuestro recurso</mark>, si se ejecuta 1 o N veces. Es decir siempre tendremos el mismo resultado sin importar el numéro de ejecuciones.</p>
<h2 id="heading-verbos-http-idempotentes-vs-no-idempotentes">Verbos HTTP Idempotentes Vs No Idempotentes</h2>
<p>Debemos tener en cuenta, que tambien existen verbos HTTP <strong>idempotentes</strong> y <strong>no idempotentes</strong>.</p>
<p>En la siguiente tabla vemos los verbos que son y no son idempotentes:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Verbo HTTP</td><td>Es idempotente</td></tr>
</thead>
<tbody>
<tr>
<td>GET</td><td>SI</td></tr>
<tr>
<td>POST</td><td><mark>NO</mark></td></tr>
<tr>
<td>PUT</td><td>SI</td></tr>
<tr>
<td>PATCH</td><td><mark>NO</mark></td></tr>
<tr>
<td>DELETE</td><td>SI</td></tr>
</tbody>
</table>
</div><h2 id="heading-verbos-no-idempotentes">Verbos no idempotentes</h2>
<p>Debemos tener en cuenta, que existen verbos HTTP <strong>no idempotentes</strong>. Pero es <strong>buena práctica</strong>, respetar el principio de <em>idempotencia</em> para evitar efectos secundarios o no deseados al ejecutar nuestros recursos http.</p>
<p>La ejecución repetida, usando un <em>verbo no idempotente,</em> con los mismos datos sobre un recurso <strong>no tendrá el mismo efecto</strong>.</p>
<h3 id="heading-ejemplo-verbo-no-idempotente"><strong>Ejemplo verbo No idempotente</strong></h3>
<p>Tenemos un <strong>API</strong> la cual, tiene un <em>endpoint</em> que tiene como recurso una entidad <em>USUARIO parte de</em> una base de datos de un blog.</p>
<p>Si hacemos uso de una petición <code>POST</code> http para crear un artículo, como <code>POST</code> es un verbo <strong>no idempotente</strong>.</p>
<p>Si ejecutamos la siguiente petición <code>POST /api/v1/usuario</code> la primera vez, con los siguientes datos, obtendremos como resultado la creacion del recuso usuario <code>Jhon Doe</code>.</p>
<pre><code class="lang-json">POST /api/v1/usuario
{
    <span class="hljs-attr">"nombre"</span> : <span class="hljs-string">"Jhon Doe"</span>,
    <span class="hljs-attr">"email"</span>: <span class="hljs-string">"jdoe@doe.com"</span>
}
</code></pre>
<p>¿Que pasa si ejecutamos una segunda vez esta petición <code>POST /api/v1/usuario</code> con la misma información en el cuerpo de la <em>petición?</em> -- dependiendo de la lógica dentro de nuestra API podemos tener los siguientes resultados :</p>
<ol>
<li><p>Si no estamos validando que el email se repita, el resultado en cada ejecución, será crear cada vez un <em>nuevo</em> recurso <em>_usuario_ en la base de datos.</em></p>
</li>
<li><p>Si validamos el <code>email</code> obtendremos un error porque ya existe un usuario con el mismo email en la base de datos.</p>
</li>
</ol>
<h3 id="heading-ejemplo-verbo-idempotente">Ejemplo verbo Idempotente</h3>
<p>En este caso vamos a usar el verbo http <code>PUT</code>; realizaremos una peticion de creación/actualización sobre un recurso <code>USUARIO</code> especifico de la base de datos con datos usados en el cuerpo del ejemplo anterior.</p>
<p>Si ejecutamos la siguiente petición <code>PUT /api/v1/usuario/1</code> creara un nuevo <code>USUARIO</code> en caso de no existir, o lo modificara en caso de haya cambiado algo en el existente.</p>
<pre><code class="lang-json">PUT /api/v1/usuario/<span class="hljs-number">1</span>
{
  <span class="hljs-attr">"nombre"</span> : <span class="hljs-string">"Jhon Doe"</span>,
  <span class="hljs-attr">"email"</span>: <span class="hljs-string">"jdoe@doe.com"</span>
}
</code></pre>
<p>Si ejecutamos esta petición por primera vez, creara el nuevo recurso <code>usuario/1</code> en caso de no existir.</p>
<p>Pero si repetimos y ejecutamos la misma petición N veces, con el verbo idempotente <code>PUT</code>, incluso enviando los mismo parámetros al mismo recurso <code>/1</code>, este se actualizara y se mantendrá igual, es decir tendremos el mismo estado o resultado.</p>
<p>Pero que pasa si ejecutamos la petición cambiando algo de información, por ejemplo el recurso <code>/2</code>, el efecto que tendrá sera crear un nuevo recurso.</p>
<pre><code class="lang-json">PUT /api/v1/usuario/<span class="hljs-number">2</span>
{
  <span class="hljs-attr">"nombre"</span> : <span class="hljs-string">"Jhon Doe "</span>,
  <span class="hljs-attr">"email"</span>: <span class="hljs-string">"jdoe@doe.com"</span>
}
</code></pre>
<h2 id="heading-conclusiones">Conclusiones</h2>
<p>Es importante tener en cuenta que este comportamiento de <strong>idempotencia</strong> no solo se produce simplemente por usar uno de los verbos idempotentes, sino que es necesario implementar y respetar este principio al momento de diseñar la lógica de nuestra API.</p>
]]></content:encoded></item><item><title><![CDATA[Productividad y buenos commits 
 : commitizen y git|linux alias]]></title><description><![CDATA[En este post, explicaré mi flujo de trabajo al usar Git desde la terminal, y lo necesario a configurar en tu espacio de trabajo para mejorar tu productividad a la hora de usarlo en tu día a día.

Este post fue publicado originalmente en mi sitio pers...]]></description><link>https://blog.richardpalacios.dev/commitizen-alias-git-workflow</link><guid isPermaLink="true">https://blog.richardpalacios.dev/commitizen-alias-git-workflow</guid><category><![CDATA[Git]]></category><category><![CDATA[Linux]]></category><category><![CDATA[terminal]]></category><category><![CDATA[conventional commits]]></category><category><![CDATA[commitizen]]></category><dc:creator><![CDATA[Richard Palacios G.]]></dc:creator><pubDate>Fri, 29 Jan 2021 08:34:10 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1677697381226/ace01b21-3f86-4161-b7e9-ad4f0f1b31de.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>En este post, explicaré mi flujo de trabajo al usar <em>Git</em> desde la <em>terminal</em>, y lo necesario a configurar en tu espacio de trabajo para mejorar tu productividad a la hora de usarlo en tu día a día.</strong></p>
<blockquote>
<p>Este post fue publicado originalmente en mi <a target="_blank" href="https://www.richardpalacios.dev/posts/2021/01/commitizen-y-alias-mejora-tus-commits-y-productividad-con-git-en-la-terminal/">sitio personal</a></p>
</blockquote>
<p>Para mejorar cada vez tu productividad cuando usas <em>git</em> desde la terminal, considero hay 2 cosas importantes que te pueden ayudar a conseguirlo:</p>
<ol>
<li><p>Trabaja en buenos <em>alias</em> (<em>git</em> y <em>linux</em>) y mejoralos contantemente.</p>
</li>
<li><p>Usar herramientas como <em>commitizen</em> para asegurar una <a target="_blank" href="https://www.conventionalcommits.org/en/v1.0.0/">convención</a> al momento de escribir <em>commits</em>.</p>
</li>
</ol>
<blockquote>
<p>Te ha pasado, que estás en la zona/concentrado, terminas de corregir un error, o de crear una nueva funcionalidad, y te llega ese pequeño momento de frustración en el que no sabes exactamente qué escribir en tu mensaje de <em>commit</em>? (🤦‍♂️ o tal vez solo soy yo!!)</p>
</blockquote>
<p>Es molesto sobre todo, cuando te equivocas y tienes que hacer un <em>--amend</em> al darte cuenta de que no lo describiste bien y tener que repensarlo, buscar el último comando, escribir nuevamente el mensaje, etc., aún más si ya hiciste push!!.</p>
<p>Si esto te ha pasado, creo que esto te va a interesar.</p>
<h2 id="heading-1-por-que-tanta-conmocion-por-un-mensaje-de-commit">1. ¿Por qué tanta conmoción por un mensaje de commit?</h2>
<p>No solo es un mensaje de <em>commit</em>, es la historia y evolución de nuestro desarrollo. Sí, <strong>Git</strong> es una herramienta esencial en nuestro flujo de trabajo como programadores. Pero igual de importante, es escribir correctamente nuestros mensajes de commit, mejor cuando seguimos una convención como <a target="_blank" href="https://www.conventionalcommits.org/en/v1.0.0/">conventional commits</a>.</p>
<p>Lo que queremos lograr con esto, es mantener un historial limpio y fácil de leer de los cambios(<em>logs</em>) de nuestro código, y convertirlo en una narrativa que solo al leerla, podamos descubrir y entender el proceso y evolución de nuestro software.</p>
<blockquote>
<p>The git log is a narrative of how development is progressing. Keep it clean.<br /><em>Juan J. Merelo</em></p>
</blockquote>
<h2 id="heading-2-por-que-commitizen-y-no-simplemente-un-cliente-grafico-de-git">2. ¿Por qué commitizen y no simplemente un cliente gráfico de Git?</h2>
<p>Es cierto y válido, actualmente existen herramientas gráficas que facilitan el trabajo, al versionar tu código con <em>git</em>, y sobre todo al visualizar el historial de cambios que has realizado; pero aún no conozco alguno, que integre <em>linters</em> de <em>commits</em> como conventional commits. (<em>Si conoces alguno que sea open source por favor házmelo saber!!</em>)</p>
<p>Aparte de esto, la ventaja que obtendremos al usar <em>commitizen</em> y <em>alias</em> a través del terminal, en mi opinión, no tiene nada que envidiarle a una app gráfica, ! Bueno la <em>UI</em> de <em>logs</em> tal vez!; pero como dicen por ahí, “para gustos, colores!". Además, encontré una forma de arreglar esto con un <em>alias</em>, el que veremos más adelante.</p>
<p>Basta decir que por el gusto de usar la terminal, además de que, está buenísimo entender bien las bases de git y saber que comandos estás usando realmente; así no tener dificultades con alguna herramienta que te puedas encontrar en el futuro.</p>
<h2 id="heading-3-requisitos">3. Requisitos</h2>
<p>Por lo general, me gusta trabajar sobre linux, por eso para seguir este post y empezar tu configuración es necesario lo siguiente:</p>
<ul>
<li><p>Tener una máquina con <em>linux</em> o <a target="_blank" href="https://docs.microsoft.com/en-us/windows/wsl/about">WSL</a> instalado, si estás en <em>windows 10</em>.</p>
</li>
<li><p>Tener instalado <a target="_blank" href="https://git-scm.com/downloads">Git</a></p>
</li>
<li><p>Tener instalado <em>npm</em> y <a target="_blank" href="https://nodejs.org/en/">Node.js</a></p>
</li>
</ul>
<p><em>Ten en cuenta que sería bueno que ya conozcas las bases de git para entender o darle sentido a esta lectura, pero aun así, intentaré hacerlo fácil de seguir.</em></p>
<h2 id="heading-4-mi-configuracion-de-espacio-de-trabajo-para-git">4. Mi configuración de espacio de trabajo para Git</h2>
<p>Como ya te debes imaginar, mi configuración al rededor de Git son alias de linux, git aliases y commitizen.</p>
<ul>
<li><p><strong>Linux Alias</strong> → se usan para encapsular la ejecución de un conjunto de comandos, en un solo comando abreviado en la terminal, dicho de otra formas, son abreviaciones de nuestros comandos que se configuran en tu sistema linux, en este caso 'git', Ejm:</p>
<pre><code class="lang-bash">  <span class="hljs-comment"># Comando largo</span>
  git commit -m <span class="hljs-string">'mensaje commit'</span>

  <span class="hljs-comment">#Comando abreviado</span>
  gc <span class="hljs-string">'mensaje commit'</span>
</code></pre>
</li>
<li><p><strong>Git aliases</strong> → esta es una característica de Git parecida a la de linux alias, ayuda a simplificar en abreviaciones mas cortas la ejecución de los comandos de git.Ejm:</p>
<pre><code class="lang-shell">  $ git config --global alias.co checkout
  $ git config --global alias.br branch
  $ git config --global alias.ci commit
  $ git config --global alias.st status
</code></pre>
</li>
<li><p><strong>Commitizen</strong> → <a target="_blank" href="https://github.com/commitizen/cz-cli">Commitizen</a> nos permite escribir mensajes de commits de forma guiada y rapida a travez de CLI o yo podria decirle TUI.</p>
<p>  Commitizen es un <em>cli</em> "command line interface tool" que nos ayuda a escribir mesajes de commits mas amigables siguiendo un estandar de convenciones y buenas practicas, con la ayuda de linters y herramientas que puedes configurar.</p>
</li>
</ul>
<p>Puedes encontrar mi configuración de <em>linux alias</em> y <em>git aliases</em> aquí:</p>
<p><a target="_blank" href="https://github.com/rpalaciosg/dotfiles"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1677697383145/3a34c75f-aa9d-49f4-9b6e-f06c87da0702.svg" alt="My dotfiles" /></a></p>
<h2 id="heading-5-linux-alias-para-acortar-comandos">5. Linux 'alias' para acortar comandos</h2>
<p>Por lo general al usar la terminal, escribes un comando o combinación de comandos, por ejemplo <code>git</code> o <code>ls</code>. Aveces es un poco molesto cuando tienes que repetir muchas veces el mismo comando (y eso que este es uno de los cortos), entonces es aquí donde puedes usar un alias.</p>
<p>En este caso configuro un alias <code>g</code> para el comando git .</p>
<ul>
<li>En sistemas unix donde solemos usar zsh o bash, etc; configuramos un alias de esta forma → alias g=''.</li>
</ul>
<p>Ahora abrimos nuestro archivo de configuracion del shell que uses ya <code>~/.bashrc</code> de bash o <code>~/.zshrc</code> de zshell (es el que uso) y agregamos esta linea alias g=git al final del archivo o en la sección #alias si esta ya existe .</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td></td></tr>
</thead>
<tbody>
<tr>
<td><em>Mi archivo</em> <a target="_blank" href="https://github.com/rpalaciosg/dotfiles/blob/master/.zshrc"><em>~/.zshrc</em></a></td></tr>
</tbody>
</table>
</div><p>Ahora si nos dirigimos a nuestra terminal, en el directorio de uno de nuestros repositorios de git, podemos usar git, reemplazando el comando <code>git</code> por <code>g</code>, Ejm:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td></td></tr>
</thead>
<tbody>
<tr>
<td>Imagen del terminal ejecutando comando <code>git status</code></td></tr>
</tbody>
</table>
</div><p>En la imagen anterior vemos que no tenemos diferencia en el resultado al escribir el comando <code>git status</code> o <code>g status</code> debido a que a la configuración del alias harán lo mismo <em>"mostrar el estado del repositorio"</em>.</p>
<p><strong>Bien logramos acortar el comando git, pero como acortamos las opciones o argumentos que van el comando git?</strong></p>
<p>Esto lo podemos hacer creando un alias con el comando y los argumentos que necesitemos, un ejemplo <code>alias gst=git status</code>, asi al escribir <code>gst</code> en nuestra terminal obtendremos la salida del comando git status. <strong>Pruebalo!!</strong></p>
<p>En el caso de que uses <a target="_blank" href="https://www.zsh.org/">Zsh</a>, existen alias ya pre-configurados para tu comodidad. Esto lo consigues instalado un framework para zsh llamado <a target="_blank" href="https://ohmyz.sh/">Oh-My-Zsh</a>, y activando su plugin de <a target="_blank" href="https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/git">Git Ohmyzsh</a> existente en el framework.</p>
<p>En la siguiente imagen puedes ver los alias pre-configurados en el plugin <em>git</em> de <em>oh-my-zsh</em>.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td></td></tr>
</thead>
<tbody>
<tr>
<td><a target="_blank" href="https://jasonm23.github.io/oh-my-git-aliases.html">Oh-My-Zsh Git Aliases</a></td></tr>
</tbody>
</table>
</div><p>Aunque estos alias son muy útiles, siempre toma un tiempo aprenderlos, incluso no llegas a usarlos todos. Por eso te recomiendo que estos alias los tengas de referencia para crear los tuyos y asi irles aprendiendo durante la marcha según los necesites, como yo lo hice.</p>
<h2 id="heading-6-configurando-git-aliases">6. Configurando git aliases</h2>
<p>Algo que percibí, es que al usar <code>linux alias</code> para comandos git, me limitaban a poder usarlos solo en ambientes linux, y debido a que aveces suelo usar git en windows;<br />Basándome en los alias que tiene el plugin Git de oh-my-zsh, decidí configurar esos alias dentro de mi configuración de git como aliases. Ademas con el objetivo de aprenderlos, me obligue a crear solo los que necesitaba y usara de forma repetida, ya luego iría agregando nuevos según los necesite.</p>
<p>Para crear un alias en git, puedes usar un comando como este:</p>
<pre><code class="lang-shell">git config --global alias.[alias_comando] [comando_git]
</code></pre>
<p><code>alias.[alias_comando] [comando_git]</code> le dice a git que agregue esta abreviación para un comando especifico en la sección [alias] del archivo de configuración de git <code>.gitconfig</code>.</p>
<p>Esto lo hará ya sea de forma <em>local</em> o <em>global</em>, en este caso el argumento <code>—global</code> nos dice que queremos que sea global, es decir que este disponible para todos los repositorios en nuestro sistema. Pero si lo quitamos este sera configurado localmente en un solo repositorio.</p>
<p>Por ejemplo crearemos el git aliases del comando <em>status</em>, escribiendo lo siguiente en nuestro terminal:</p>
<pre><code class="lang-shell">#global
git config --global alias.st status

#local
git config alias.st status
</code></pre>
<p>Estas lineas nos dice que la abreviación al comando <code>status</code> ahora sera <code>st</code></p>
<p>El archivo <code>.gitconfig</code> lo podemos encontrar en las siguientes ubicaciones:</p>
<ul>
<li><p>Si la instalación que se realizo fue para uso global de todos los usuarios, estará:</p>
<ul>
<li><p>Windows: 'C:\Users&lt;username&gt;.gitconfig</p>
</li>
<li><p>Linux/Ubuntu: ~home&lt;username&gt;.gitconfig</p>
</li>
</ul>
</li>
<li><p>Si lo queremos hacer solo para un repositorio o de forma local, cada repositorio git tiene una carpeta <code>.git</code> que suele estar oculta, al ingresar a esta carpeta puedes encontrar el archivo de configuración <code>.gitconfig</code>.</p>
</li>
</ul>
<p>Si deseamos configurar varios <em>alias</em> a la vez, abrimos el fichero <code>.gitconfig</code> ya sea <em>global</em> o <em>local</em> y bajo la sección [alias] empezamos a crear o editar nuestros alias para comandos de git.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td></td></tr>
</thead>
<tbody>
<tr>
<td>Mi archivo <a target="_blank" href="https://github.com/rpalaciosg/dotfiles/blob/master/.gitconfig">~/.gitconfig</a></td></tr>
</tbody>
</table>
</div><p>De esta forma puedes crear los alias que mas te gusten. Lo mas recomendable es que crees los que uses mas a menudo y según tus necesidades, ya queda al alcance de tu imaginación.</p>
<h3 id="heading-listar-tus-git-aliases-configurados">Listar tus git aliases configurados</h3>
<p>Puedes tener un <em>alias</em>, que te muestre un listado de todos tus <em>alias</em> configurados, para crearlo escribe la siguiente línea en tu <em>terminal</em>:</p>
<pre><code class="lang-shell">git config --global alias.alias "! git config --get-regexp ^alias\. | sed -e s/^alias\.// -e s/\ /\ =\ /"
</code></pre>
<p>Luego para probarlo, escribe <code>git alias</code> en tu <em>terminal</em> y veras como se listan todos los <em>git aliases</em> que configuraste:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td></td></tr>
</thead>
<tbody>
<tr>
<td>Creando un <em>alias</em> para listar <code>git aliases</code></td></tr>
</tbody>
</table>
</div><h2 id="heading-7-usando-nuestros-alias">7. Usando nuestros "alias"</h2>
<p>Para probar los nuevos <em>alias</em> configurados, crearemos un nuevo repositorio. Entonces, dentro de un nuevo directorio con el nombre que prefieras, abrimos un terminal y ejecutamos el comando <code>g init</code> o <code>git init</code> para inicializar el repositorio. <em>como puedes ver usamos el linux alias</em> <code>g</code></p>
<div class="hn-table">
<table>
<thead>
<tr>
<td></td></tr>
</thead>
<tbody>
<tr>
<td>Usando <em>alias</em> <code>g</code> para el comando <code>git</code></td></tr>
</tbody>
</table>
</div><p>Ahora podemos crear archivos dentro del repositorio, y para añadirlos al <em>staging area</em> con un <code>git add &lt;archivo&gt;</code> o en nuestro caso el comando abreviado <code>g add README.md</code>.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td></td></tr>
</thead>
<tbody>
<tr>
<td>Usando <em>alias</em> <code>g add</code></td></tr>
</tbody>
</table>
</div><p>Si hacemos un <code>g st</code> o <code>git status</code>, nos damos cuenta que los archivos están listos para ser <em>"commiteados/versionados"</em> o registrados en el <em>log</em> del repositorio. <em>como puedes ver ahora usamos la combinación de linux alias y git aliases</em></p>
<div class="hn-table">
<table>
<thead>
<tr>
<td></td></tr>
</thead>
<tbody>
<tr>
<td>Usando alias <code>g status</code></td></tr>
</tbody>
</table>
</div><h2 id="heading-8-usando-commitizen-para-escribir-buenos-mensajes-de-commit">8. Usando commitizen para escribir buenos mensajes de commit</h2>
<p>Para hacer commit de tus cambios, escribes <code>git commit</code>, o si usamos nuestros alias configurados escribiríamos <code>g commit</code> o <code>g c</code>, al hacerlo se abrirá un editor donde describirás tu mensaje <em>commit</em>.</p>
<p>Pero, esto podría ser un poco molesto, si existe una herramienta llamada <a target="_blank" href="https://github.com/commitizen/cz-cli">commitizen</a>, que mejora la experiencia al escribir <em>commits</em> y de paso le añade convenciones de buenas prácticas.</p>
<p>Al usar <a target="_blank" href="https://github.com/commitizen/cz-cli">commitizen</a> a través de su <em>CLI</em>, en lugar de escribir el comando <code>git commit</code> podemos usar el comando <code>cz</code> y solo escribiendo en nuestro terminal <code>git cz</code>, <code>g cz</code> o simplemente <code>cz</code>, <em>commitizen</em> reconocerá este comando y lanzara una pequeña <em>app cli</em>, que de manera interactiva, nos guiará para completar y escribir nuestro mensaje de commit. Podemos ver un ejemplo en la imagen siguiente.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td></td></tr>
</thead>
<tbody>
<tr>
<td>Usando <a target="_blank" href="https://github.com/commitizen/cz-cli">commitizen</a> a traves del comando <code>cz</code></td></tr>
</tbody>
</table>
</div><h3 id="heading-haciendo-nuestro-repositorio-commitizen-friendly">Haciendo nuestro repositorio commitizen friendly</h3>
<p>Antes de poder usar las ventajas de <a target="_blank" href="https://github.com/commitizen/cz-cli">commitizen</a>, debemos configurar nuestro repositorio y hacerlo Commitizen friendly como lo llaman los creadores. Esto lo hacemos escribiendo lo siguiente en nuestro terminal:</p>
<ol>
<li><p>Instalamos el paquete npm esc<code>npm install -g commitizen</code> ,</p>
</li>
<li><p>Inicializamos un proyecto npm escribiendo <code>npm init</code></p>
</li>
<li><p>Configuramos nuestro repositorio para usar <code>cz-conventional-changelog</code> adapter, escribiendo:</p>
</li>
</ol>
<pre><code class="lang-shell">commitizen init cz-conventional-changelog --save-dev --save-exact
</code></pre>
<p><em>Esto agregara en el archivo package.json a commitizen como una dependencia de desarrollo.</em></p>
<h3 id="heading-escribiendo-un-commit-con-commitizen">Escribiendo un commit con Commitizen</h3>
<p>Ahora estamos listos para hacer un commit usando commitizen.</p>
<p>Hacemos algún cambio en nuestro repositorio, agregamos dicho cambio con <code>git add</code> y luego escribimos <code>g cz</code> todo desde nuestra terminal.</p>
<ol>
<li>Aparecerá un cli interactivo, que primero nos pedirá elegir el tipo de cambio que estamos realizando ya sea una nueva característica, cambio en documentación, corrección de errores, etc; tal como lo dicta la convención de <a target="_blank" href="https://www.conventionalcommits.org/en/v1.0.0/">conventional-commits</a> en este caso al estar inicializando el repositorio osea es el primer commit, escogemos <code>feat</code> de feature.</li>
</ol>
<div class="hn-table">
<table>
<thead>
<tr>
<td></td></tr>
</thead>
<tbody>
<tr>
<td>Usando <code>g cz</code></td></tr>
</tbody>
</table>
</div><ol>
<li>Especificamos el scope del cambio, aqui escribiremos <code>*</code> u <code>all</code> ya que es la inicializacion de todo el repositorio.</li>
</ol>
<div class="hn-table">
<table>
<thead>
<tr>
<td></td></tr>
</thead>
<tbody>
<tr>
<td>Escogiendo <code>scope</code> del cambio en commitizen`</td></tr>
</tbody>
</table>
</div><ol>
<li>Seguido a esto nos pide ingresar un mensaje corto para el commit, donde escribiremos <em>commit inicial</em>. Seguidamente nos pide agregar una descripción mas detallada para el commit, en este caso la podemos dejar en blanco.</li>
</ol>
<div class="hn-table">
<table>
<thead>
<tr>
<td></td></tr>
</thead>
<tbody>
<tr>
<td>Describiendo el <code>commit</code> con <code>commitizen</code></td></tr>
</tbody>
</table>
</div><ol>
<li>Luego nos pregunta si hay breaking changes o cambios importantes, en este caso escribimos <code>No</code> o <code>N</code>. También nos pregunta si este cambio afecta algún issue o problema abierto donde podemos describirlo, en este caso escribimos <code>No</code>.</li>
</ol>
<div class="hn-table">
<table>
<thead>
<tr>
<td></td></tr>
</thead>
<tbody>
<tr>
<td>Especificando <em>breaking changes</em> e <em>issues</em> como parte del commit</td></tr>
</tbody>
</table>
</div><p>Al final se creara el commit con un mensaje que usa un formato con convenciones y buenas practicas <code>feat(*): commit inicial</code> , y esto con ayuda de <code>commitizen</code>.</p>
<h3 id="heading-formateando-mi-git-log-en-una-sola-linea-git-aliases">Formateando mi git log en una sola linea (git aliases)</h3>
<p>Si queremos ver como quedo nuestro mensaje commit, podemos escribir <code>git log</code> o <code>g l</code> si tenemos configurado un alias, para poder ver el historial de cambios de nuestro repositorio.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td></td></tr>
</thead>
<tbody>
<tr>
<td>Resultado de <code>git log</code> con formato`</td></tr>
</tbody>
</table>
</div><p>Te puede parecer curioso que el resultado de haber hecho <code>git log</code> en tu equipo no es igual al de la imagen anterior; para que tu git log este formateado en una sola linea y con colores, puedes crear y usar el alias para git pegando en tu terminal el comando a continuación.</p>
<pre><code class="lang-shell">git config --global alias.l "log --pretty=format:'%Cgreen%h %Creset%cd %Cblue[%cn] %Creset%s%C(yellow)%d%C(reset)' --graph --date=relative --decorate --all"
</code></pre>
<p>Entonces para usarlo debes escribir <code>g l</code> y tendrás un resultado parecido.</p>
<p>En internet encuentras mucha información, sobre modelos y colores del formato en el que se muestra tu git log, su forma de personalizar es muy flexible y con muchas alternativas según tu Sistema Operativo.</p>
<h3 id="heading-formateando-y-detallando-mi-git-log-git-aliases">Formateando y detallando mi git log (git aliases)</h3>
<p>Tengo configurado un alias diferente también para el comando git log, pero que muestra mas a detalle los archivos ue fueron modificados en cada commit, para eso escribe el siguiente comando en tu terminal:</p>
<pre><code class="lang-shell">git config --global alias.ll "log --graph --name-status --pretty=format:'%C(red)%h %C(reset)(%cd) %C(green)%an %Creset%s %C(yellow)%d%Creset' --date=relative"
</code></pre>
<p>Entonces si ejecuto <code>g ll</code> o <code>git ll</code>, obtengo lo siguiente (este es el log de otro repositorio para fines demostrativos):</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td></td></tr>
</thead>
<tbody>
<tr>
<td>Resultado del alias <code>g ll</code> o <code>git ll</code></td></tr>
</tbody>
</table>
</div><h2 id="heading-9-conclusion">9. Conclusion</h2>
<p>Puedes estar pensando, que tal vez no vale la pena instalar y depender de una librería solo para escribir un commit. Pero como en todo, eso depende:</p>
<ul>
<li><p>de tus necesidades</p>
</li>
<li><p>de si quieras escribir buenos commits siguiendo una convención.</p>
</li>
<li><p>ya conoces de memoria la convención Conventional-commits y no necesitas una herramienta</p>
</li>
<li><p>usas tu propia convención con emojis en tus mensajes de commits</p>
</li>
<li><p>etc..</p>
</li>
</ul>
<p>Pueden ser muchos puntos de vista, y puede ser que no estes de acuerdo con el mio.</p>
<p>Todo lo compartido en esta lectura, bien o mal, es simplemente mi experiencia, mi gusto y la forma en que a mi me ha funcionado.</p>
<p>Ten por seguro que existen muchas mas formas de hacerlo, e incluso puede que sean mejores; al final el objetivo de todo este proceso, es poner en evidencia la <code>importancia de tener una buena narrativa de tu historial de cambios en tu repositorio</code>, y esto lo logras escribiendo buenos mensajes de commit desde el principio.</p>
<p>Mi recomendación, es que empieces a usar commitizen en repositorios en los que trabajes de forma individual y siempre al iniciar el repositorio. Si lo vas a usar en un repositorio de equipo, es mejor que el equipo se ponga de acuerdo y dejen claro que se usara una convención y linter de commits, esto les dará muchas ventajas a futuro y menos desacuerdos.</p>
<p>Bueno, eso es todo, <strong>Muchas gracias por llegar hasta el final!! ✌</strong>, espero haya sido de tu interés, y de ayuda.</p>
<p>Te invito a que pruebes <a target="_blank" href="https://github.com/commitizen/cz-cli">commitizen</a> y que configures tus propios alias, ademas de que juegues con el formato de resultado de algunos comandos.</p>
<p>Eres libre de revisar <a target="_blank" href="https://github.com/rpalaciosg/dotfiles">mis Dotfiles</a> y darme tu opinion, tengo algunas cosas nuevas que descubrí y que estoy probando.</p>
<p><strong>Si tienes alguna duda o feedback sobre este contenido no dudes en hacérmelo saber.</strong></p>
<ul>
<li><p><a target="_blank" href="apalaciosg91@gmail.com">📧 apalaciosg91@gmail.com</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/rpalaciosg">👨🏽‍💻GitHub: rpalaciosg</a></p>
</li>
<li><p><a target="_blank" href="https://twitter.com/rpalaciosg_">🐦Twitter: rpalaciosg_</a></p>
</li>
<li><p><a target="_blank" href="https://www.linkedin.com/in/richardpalaciosgarcia/">💼LinkedIn: richardpalaciosgarcia</a></p>
</li>
</ul>
<h2 id="heading-10-recursos">10. Recursos</h2>
<ul>
<li><p><a target="_blank" href="https://git.wiki.kernel.org/index.php/Aliases#Use_graphviz_for_display">https://git.wiki.kernel.org/index.php/Aliases#Use_graphviz_for_display</a></p>
</li>
<li><p><a target="_blank" href="https://jasonm23.github.io/oh-my-git-aliases.html">https://jasonm23.github.io/oh-my-git-aliases.html</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/craftzdog/dotfiles-public">https://github.com/craftzdog/dotfiles-public</a></p>
</li>
<li><p><a target="_blank" href="https://unsplash.com/photos/91AQt9p4Mo8">https://unsplash.com/photos/91AQt9p4Mo8</a></p>
</li>
<li><p><a target="_blank" href="https://www.conventionalcommits.org/en/v1.0.0/">https://www.conventionalcommits.org/en/v1.0.0/</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/commitizen-tools/commitizen">https://github.com/commitizen-tools/commitizen</a></p>
</li>
<li><p>Imágenes almacenadas en <a target="_blank" href="imgur.com">imgur</a> a traves de <a target="_blank" href="https://hackmd.io/">https://hackmd.io/</a></p>
</li>
</ul>
]]></content:encoded></item></channel></rss>