<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://www.santiagollapur.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://www.santiagollapur.com/" rel="alternate" type="text/html" /><updated>2025-07-05T17:12:01+00:00</updated><id>https://www.santiagollapur.com/feed.xml</id><title type="html">Santiago Llapur</title><subtitle>Este lugar es donde escribo ideas ideas y experiencias propias.</subtitle><author><name>Santiago Llapur</name><email>santillapur@gmail.com</email></author><entry><title type="html">Argentina en la era de la globalización</title><link href="https://www.santiagollapur.com/argentina-en-la-era-de-la-globalizacion" rel="alternate" type="text/html" title="Argentina en la era de la globalización" /><published>2025-07-05T13:00:00+00:00</published><updated>2025-07-05T13:00:00+00:00</updated><id>https://www.santiagollapur.com/argentina-en-la-era-de-la-globalizacion</id><content type="html" xml:base="https://www.santiagollapur.com/argentina-en-la-era-de-la-globalizacion"><![CDATA[<p>En un mundo cada vez más interconectado, Argentina se enfrenta a un nuevo desafío: competir con productos globales manteniendo viva su industria nacional. La apertura de las importaciones transformó las reglas del juego y exige una adaptación urgente.</p>

<h2 id="la-hipercompetencia-y-sus-efectos-sobre-la-industria-local">La hipercompetencia y sus efectos sobre la industria local</h2>

<p>Con la apertura de las importaciones, los industriales locales se están enfrentando a una etapa de <strong>hipercompetitividad</strong>, cosa que complica aún más las cosas para el productor nacional, el cual ya opera en un contexto de <strong>altas cargas impositivas</strong>, una <strong>infraestructura comercial muy costosa</strong> y una <strong>política laboral restrictiva y obsoleta</strong> que desalienta la contratación formal y limita la flexibilidad operativa.</p>

<p>Esta presión deja en evidencia la necesidad de <strong>adaptación, eficiencia y estrategia</strong>, especialmente para las empresas que ven reducida su participación en el mercado interno.</p>

<h2 id="casos-reales-lo-que-se-vive-en-el-día-a-día-industrial">Casos reales: lo que se vive en el día a día industrial</h2>

<p>Un gran ejemplo es un industrial con el que me reuní, dueño de una empresa con más de 100 empleados y máquinas de última tecnología de producción. Antes, una góndola de supermercado estaba completa con su mercadería. Hoy, con la suma de productos importados, apenas ocupa un 20 % de ese espacio.</p>

<p>Esta caída abrupta en las ventas vuelve <strong>imposible sostener la misma estructura</strong>, obligándolo a operar a pérdida. La situación no es aislada, sino representativa de lo que atraviesan muchas industrias nacionales frente a una competencia desigual.</p>

<p>Otro caso concreto: para un proyecto en el que estoy trabajando, me cotizaron unas <strong>aberturas de PVC</strong>. El precio en China es de <strong>USD 55 FOB</strong>, mientras que el mismo producto fabricado en Argentina cuesta <strong>USD 231</strong>. Esta diferencia de costos vuelve inviable cualquier intento de competir si no se aborda el problema de fondo.</p>

<h2 id="diferenciarse-o-desaparecer-el-nuevo-paradigma-industrial">Diferenciarse o desaparecer: el nuevo paradigma industrial</h2>

<p>La competencia global nos obliga a <strong>repensar el modelo productivo argentino</strong>. Ya no alcanza con producir: hay que <strong>reestructurar</strong>, <strong>optimizar procesos</strong> y, sobre todo, <strong>identificar el diferencial</strong> que te hace destacar frente a competidores internacionales.</p>

<p>Ese diferencial puede estar en el <strong>diseño</strong>, la <strong>calidad</strong>, la <strong>personalización</strong>, los <strong>tiempos de entrega</strong> o el <strong>servicio posventa</strong>. No se trata solo de fabricar más barato, sino de ofrecer <strong>más valor</strong>.</p>

<p>Un caso interesante es el de un fabricante de <strong>revestimientos alistonados</strong>. Su diferencial no está en el precio, sino en ofrecer un sistema completo: <strong>accesorios integrados</strong> que se adaptan perfectamente a esos paneles, permitiendo una mejor optimización del espacio y un resultado estético superior. Es ahí donde marca la diferencia y se vuelve competitivo.</p>

<p>En otro proyecto personal en un parque industrial, aplicamos estos principios para lograr, con el mismo costo de inversión inicial, una reducción del 95% en los costos fijos. Esto fue posible gracias al uso estratégico de tecnología, demostrando que la innovación y la eficiencia son claves para sostener la industria frente.</p>

<blockquote>
  <p>No podemos competir solo por precio. Tenemos que competir por <strong>propuesta de valor</strong>.</p>
</blockquote>

<h2 id="el-rol-del-estado-productividad-no-proteccionismo-vacío">El rol del Estado: productividad, no proteccionismo vacío</h2>

<p>Yo creo que el rol del gobierno sería <strong>promover productividad industrial</strong>, a través de medidas como el otorgamiento de <strong>créditos a tasa baja</strong>, <strong>reducción impositiva</strong> e <strong>inversión en infraestructura logística</strong>, no mediante una política internacional meramente restrictiva.</p>

<h2 id="una-visión-hacia-adelante">Una visión hacia adelante</h2>

<p>Esto no es algo nuevo. El argentino está dotado de versatilidad porque, si no se la rebusca, se muere. Y literalmente, no puede comer. Seamos creativos como siempre lo fuimos, apostemos por la industria nacional.</p>

<p><strong>No fundamos más empresas, fundemos más empresas.</strong></p>]]></content><author><name>Santiago Llapur</name><email>santillapur@gmail.com</email></author><summary type="html"><![CDATA[En un mundo cada vez más interconectado, Argentina se enfrenta a un nuevo desafío: competir con productos globales manteniendo viva su industria nacional. La apertura de las importaciones transformó las reglas del juego y exige una adaptación urgente.]]></summary></entry><entry><title type="html">El placer y la felicidad</title><link href="https://www.santiagollapur.com/el-placer-y-la-felicidad" rel="alternate" type="text/html" title="El placer y la felicidad" /><published>2023-09-03T13:00:00+00:00</published><updated>2023-09-03T13:00:00+00:00</updated><id>https://www.santiagollapur.com/el-placer-y-la-felicidad</id><content type="html" xml:base="https://www.santiagollapur.com/el-placer-y-la-felicidad"><![CDATA[<p>“La interpretación de dos de nuestras emociones mas importantes y positivas</p>

<p>Placer y Felicidad.</p>

<p>El placer es efímero, la felicidad es constante.</p>

<p>El placer es visceral, la felicidad es etérea.</p>

<p>El placer es tomar, la felicidad es dar.</p>

<p>El placer puede lograrse con substancias, la felicidad no puede lograrse con substancias.</p>

<p>El placer lo experimentamos solos, la felicidad la experimentamos en grupos sociales.</p>

<p>Los extremos del placer todos llevan a la adicción, ya sea de sustancias o comportamientos, y sin embargo no existe tal cosa como ser adicto a mucha felicidad.</p>

<p>Y finalmente, lo más importante.</p>

<p>El placer es dopamina.</p>

<p>Y la felicidad es serotonina.”</p>

<p>Robert Lustig, citado en Future Memories por Hernan Cattaneo (2021).</p>]]></content><author><name>Santiago Llapur</name><email>santillapur@gmail.com</email></author><summary type="html"><![CDATA[“La interpretación de dos de nuestras emociones mas importantes y positivas]]></summary></entry><entry><title type="html">El lado B del deseo</title><link href="https://www.santiagollapur.com/el-lado-b-del-deseo" rel="alternate" type="text/html" title="El lado B del deseo" /><published>2023-04-23T21:00:00+00:00</published><updated>2023-04-23T21:00:00+00:00</updated><id>https://www.santiagollapur.com/el-lado-b-del-deseo</id><content type="html" xml:base="https://www.santiagollapur.com/el-lado-b-del-deseo"><![CDATA[<p>El deseo es un estado emocional que todos experimentamos en alguna parte de nuestras vidas. Puede ser la fuerza motivadora que nos impulsa a buscar lo que queremos y perseguir nuestros objetivos. Sin embargo, también puede ser una fuente de sufrimiento y ansiedad.</p>

<p>Esto se explica por la necesidad de tener algo que no tenemos en este momento. Siempre que deseamos algo, estamos conscientes de que no lo tenemos, por lo que puede derivar una sensación de vacío que puede convertirse en frustración, y ansiedad.</p>

<p>La raíz del sufrimiento que surge del deseo es el apego. Frecuentemente, nos aferramos a nuestros deseos y los convertimos en necesidades. Nos decimos que no podemos ser felices sin eso que queremos. Esto nos lleva a creer que la felicidad depende de tener ciertas cosas o de que ciertas situaciones se desarrollen de determinada manera, lo que es una idea falsa y peligrosa.</p>

<p>Además, el deseo puede llevarnos a actuar de manera poco ética o inapropiada debido a que nos obsesionamos con lo que queremos y nos volvemos egoístas o insensibles a las necesidades de los demás.</p>

<p>Esto no significa que tengamos que reprimir nuestros deseos o negarlos por completo. Los deseos son parte de nuestra naturaleza humana y lo que nos motiva a tomar acción. Lo importante es reconocer que los deseos no son necesidades y que la felicidad no depende de su satisfacción.</p>

<p>En lugar de atarnos a nuestros deseos, podemos aprender a dejarlos ir y aceptar las cosas como son. Podemos cultivar la gratitud por lo que tenemos en lugar de mirar lo que nos falta. Podemos aprender a encontrar la alegría y la satisfacción en el momento presente, en vez de buscar constantemente algo que está fuera de nuestro alcance.</p>]]></content><author><name>Santiago Llapur</name><email>santillapur@gmail.com</email></author><summary type="html"><![CDATA[El deseo es un estado emocional que todos experimentamos en alguna parte de nuestras vidas. Puede ser la fuerza motivadora que nos impulsa a buscar lo que queremos y perseguir nuestros objetivos. Sin embargo, también puede ser una fuente de sufrimiento y ansiedad.]]></summary></entry><entry><title type="html">El lado B del deseo</title><link href="https://www.santiagollapur.com/el-lado-b-del-deseo" rel="alternate" type="text/html" title="El lado B del deseo" /><published>2023-04-23T21:00:00+00:00</published><updated>2023-04-23T21:00:00+00:00</updated><id>https://www.santiagollapur.com/el-lado-b-del-deseo</id><content type="html" xml:base="https://www.santiagollapur.com/el-lado-b-del-deseo"><![CDATA[<p>El deseo es un estado emocional que todos experimentamos en alguna parte de nuestras vidas. Puede ser la fuerza motivadora que nos impulsa a buscar lo que queremos y perseguir nuestros objetivos. Sin embargo, también puede ser una fuente de sufrimiento y ansiedad.</p>

<p>Esto se explica por la necesidad de tener algo que no tenemos en este momento. Siempre que deseamos algo, estamos conscientes de que no lo tenemos, por lo que puede derivar una sensación de vacío que puede convertirse en frustración, y ansiedad.</p>

<p>La raíz del sufrimiento que surge del deseo es el apego. Frecuentemente, nos aferramos a nuestros deseos y los convertimos en necesidades. Nos decimos que no podemos ser felices sin eso que queremos. Esto nos lleva a creer que la felicidad depende de tener ciertas cosas o de que ciertas situaciones se desarrollen de determinada manera, lo que es una idea falsa y peligrosa.</p>

<p>Además, el deseo puede llevarnos a actuar de manera poco ética o inapropiada debido a que nos obsesionamos con lo que queremos y nos volvemos egoístas o insensibles a las necesidades de los demás.</p>

<p>Esto no significa que tengamos que reprimir nuestros deseos o negarlos por completo. Los deseos son parte de nuestra naturaleza humana y lo que nos motiva a tomar acción. Lo importante es reconocer que los deseos no son necesidades y que la felicidad no depende de su satisfacción.</p>

<p>En lugar de atarnos a nuestros deseos, podemos aprender a dejarlos ir y aceptar las cosas como son. Podemos cultivar la gratitud por lo que tenemos en lugar de mirar lo que nos falta. Podemos aprender a encontrar la alegría y la satisfacción en el momento presente, en vez de buscar constantemente algo que está fuera de nuestro alcance.</p>]]></content><author><name>Santiago Llapur</name><email>santillapur@gmail.com</email></author><summary type="html"><![CDATA[El deseo es un estado emocional que todos experimentamos en alguna parte de nuestras vidas. Puede ser la fuerza motivadora que nos impulsa a buscar lo que queremos y perseguir nuestros objetivos. Sin embargo, también puede ser una fuente de sufrimiento y ansiedad.]]></summary></entry><entry><title type="html">Autenticación Passwordless con Rails</title><link href="https://www.santiagollapur.com/autenticacion-passwordless-con-rails" rel="alternate" type="text/html" title="Autenticación Passwordless con Rails" /><published>2021-04-27T12:00:00+00:00</published><updated>2021-04-27T12:00:00+00:00</updated><id>https://www.santiagollapur.com/passwordless-authentication-with-rails</id><content type="html" xml:base="https://www.santiagollapur.com/autenticacion-passwordless-con-rails"><![CDATA[<h1 id="qué-es-una-autenticación-passwordless">¿Qué es una autenticación passwordless?</h1>
<p>Una autenticación passwordless es una manera de verificar un usuario en nuestra app sin necesidad de que requieran un nombre de usuario y contraseña. En cambio, vamos a generar un token de seguridad para autenticar al usuario.</p>

<p>Estos son algunos de los beneficios que otorgan tener una autenticación passwordless:</p>
<ul>
  <li>una UX mejorada, los usuarios no tienen la necesidad de recordar sus contraseñas y generar una nueva en el caso de que se olviden la antigua.</li>
  <li>aumento en seguridad, se reduce la posibilidad de el reutilización de la misma contraseña en el caso de que surja un hackeo/leak en algunas de las plataformas en las que se haya registrado. También imposibilita la probabilidad de phishing.</li>
  <li>relativamente fácil de crear, se simplifica el proceso de login.</li>
</ul>

<h1 id="escenario-de-uso">Escenario de uso:</h1>
<p>Los casos de uso con esta funcionalidad son infinitos. En este ejemplo en particular lo voy a asemejar a un trabajo que tuve en un cliente, en donde hice uso de esta funcionalidad, pero con una versión simplificada porque sino el articulo se me va de las manos. No vamos a hacer uso de gemas como <code class="language-plaintext highlighter-rouge">devise</code> o <code class="language-plaintext highlighter-rouge">sorcery</code>, aunque se podría realizar de igual manera con ellas.</p>

<h1 id="setup">Setup:</h1>
<p>Vamos a crear la app: <code class="language-plaintext highlighter-rouge">rails new passwordless-auth-app -T --skip-turbokinks --database=postgresql</code></p>

<h2 id="1-instalación-de-gemas">1. Instalación de gemas:</h2>
<p><em>NOTA</em>: las gemas que utilizo no son necesarias para implementar esta funcionalidad.</p>
<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># ./Gemfile.rb</span>
<span class="c1"># formulario para ingreso del email</span>
<span class="n">gem</span> <span class="s1">'simple_form'</span><span class="p">,</span> <span class="s1">'~&gt; 5.1'</span>

<span class="n">group</span> <span class="ss">:development</span><span class="p">,</span> <span class="ss">:test</span> <span class="k">do</span>
  <span class="c1"># para chequear el envio de mails en entorno de desarrollo</span>
  <span class="n">gem</span> <span class="s1">'letter_opener'</span><span class="p">,</span> <span class="s1">'~&gt; 1.7'</span> 
<span class="k">end</span>
</code></pre></div></div>
<p><code class="language-plaintext highlighter-rouge">bundle install</code> debería instalar todas las gemas. Luego de esto vamos a setear la configuración para <code class="language-plaintext highlighter-rouge">letter_opener</code>.</p>
<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># ./config/environments/development.rb</span>
<span class="no">Rails</span><span class="p">.</span><span class="nf">application</span><span class="p">.</span><span class="nf">configure</span> <span class="k">do</span>
  <span class="n">config</span><span class="p">.</span><span class="nf">action_mailer</span><span class="p">.</span><span class="nf">default_url_options</span> <span class="o">=</span> <span class="p">{</span> <span class="ss">host: </span><span class="s2">"http://localhost:3000"</span> <span class="p">}</span>
  <span class="n">config</span><span class="p">.</span><span class="nf">action_mailer</span><span class="p">.</span><span class="nf">delivery_method</span> <span class="o">=</span> <span class="ss">:letter_opener</span>
  <span class="p">(</span><span class="o">...</span><span class="p">)</span>
<span class="k">end</span>
</code></pre></div></div>

<h2 id="2-creación-del-esqueleto-de-la-app">2. Creación del esqueleto de la app:</h2>

<h3 id="migraciones-de-modelos-y-controllers">Migraciones de modelos y controllers:</h3>
<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Modelos</span>
<span class="n">rails</span> <span class="n">g</span> <span class="n">model</span> <span class="no">User</span> <span class="n">email</span><span class="ss">:string</span> <span class="n">login_token</span><span class="ss">:string</span> <span class="n">login_token_expires_at</span><span class="ss">:datetime</span> <span class="o">&amp;&amp;</span>
<span class="n">rake</span> <span class="n">db</span><span class="ss">:create</span> <span class="o">&amp;&amp;</span> 
<span class="n">rake</span> <span class="n">db</span><span class="ss">:migrate</span>

<span class="c1"># Controllers</span>
<span class="n">rails</span> <span class="n">g</span> <span class="n">controller</span> <span class="n">sessions</span> <span class="n">index</span>
<span class="n">rails</span> <span class="n">g</span> <span class="n">controller</span> <span class="n">users</span> <span class="n">new</span> <span class="n">create</span>
</code></pre></div></div>

<h3 id="modificación-de-rutas">Modificación de rutas:</h3>
<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># ./config/routes.rb</span>
<span class="no">Rails</span><span class="p">.</span><span class="nf">application</span><span class="p">.</span><span class="nf">routes</span><span class="p">.</span><span class="nf">draw</span> <span class="k">do</span>
  <span class="n">resources</span> <span class="ss">:sessions</span><span class="p">,</span> <span class="ss">only: </span><span class="p">[</span><span class="ss">:index</span><span class="p">]</span> <span class="k">do</span>
    <span class="n">get</span> <span class="ss">:undefined_login_token</span><span class="p">,</span> <span class="ss">on: :collection</span>
  <span class="k">end</span>

  <span class="n">resources</span> <span class="ss">:users</span><span class="p">,</span> <span class="ss">only: </span><span class="p">[</span><span class="ss">:new</span><span class="p">,</span> <span class="ss">:create</span><span class="p">]</span> <span class="k">do</span>
    <span class="n">post</span> <span class="ss">:update_new_access_token</span><span class="p">,</span> <span class="ss">on: :collection</span>
    <span class="n">get</span> <span class="ss">:generate_new_access_token</span><span class="p">,</span> <span class="ss">on: :collection</span>
    <span class="n">get</span> <span class="ss">:email_sent</span><span class="p">,</span> <span class="ss">on: :member</span>
  <span class="k">end</span>

  <span class="n">root</span> <span class="ss">to: </span><span class="s1">'users#new'</span>
<span class="k">end</span>
</code></pre></div></div>

<h3 id="modelo-callbacks-y-metodos-de-instancia">Modelo, callbacks, y, metodos de instancia:</h3>
<p>Ahora viene la parte mas divertida, en donde nos vamos a ensuciar con un poco de lógica. Vamos a crear la función <code class="language-plaintext highlighter-rouge">generate_login_token!</code> en donde actualizamos el login_token con un valor alfanumérico al azar y la fecha de expiración de ese token. A su vez vamos a setear un <a href="https://guides.rubyonrails.org/active_record_callbacks.html" target="_blank">callback</a> para que esta función se ejecute cada vez que creamos un nuevo record.
Por otro lado en <code class="language-plaintext highlighter-rouge">login_token_url</code> ya dejamos seteado el path para que el usuario pueda acceder a nuestra app (recuerden cambiar esta función si van a subir su app a producción ya que va a romper porque <code class="language-plaintext highlighter-rouge">localhost:3000</code> va a ser una url inexistente).</p>
<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># ./models/user.rb</span>
<span class="k">class</span> <span class="nc">User</span> <span class="o">&lt;</span> <span class="no">ApplicationRecord</span>

  <span class="c1"># Callbacks</span>
  <span class="n">before_create</span> <span class="ss">:generate_login_token!</span>

  <span class="c1"># Instance Methods</span>
  <span class="k">def</span> <span class="nf">generate_login_token!</span>
    <span class="nb">self</span><span class="p">.</span><span class="nf">login_token</span> <span class="o">=</span> <span class="no">SecureRandom</span><span class="p">.</span><span class="nf">urlsafe_base64</span>
    <span class="nb">self</span><span class="p">.</span><span class="nf">login_token_expires_at</span> <span class="o">=</span> <span class="mi">10</span><span class="p">.</span><span class="nf">days</span><span class="p">.</span><span class="nf">from_now</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">login_token_valid?</span>
    <span class="n">login_token_expires_at</span> <span class="o">&gt;</span> <span class="no">Time</span><span class="p">.</span><span class="nf">now</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">login_token_url</span>
    <span class="c1"># NOTA: Cambiar la url cuando la app este en produccion, se puede hacer por medio de la gema dotenv o rails credentials.</span>
    <span class="s2">"http://localhost:3000/sessions?login_token=</span><span class="si">#{</span><span class="n">login_token</span><span class="si">}</span><span class="s2">"</span>
  <span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>

<h3 id="controller">Controller:</h3>
<p>El controller no tiene mucha logica, paso a explicar cual sería el objetivo de cada path:</p>

<ul>
  <li><em>new</em>: va a ser donde el user ingrese su email para que le envíen el <code class="language-plaintext highlighter-rouge">login_token</code>.</li>
  <li><em>create</em>: Es un create básico.</li>
  <li><em>generate_new_access_token</em>: En el caso de que el usuario se olvide/vence el <code class="language-plaintext highlighter-rouge">login_token</code>, puede entrar a esta vista donde se le pediría que introduzca el email de su usuario ya registrado.</li>
  <li><em>update_new_access_token</em>: Va a ser el path al que se va redireccionar desde la vista de <code class="language-plaintext highlighter-rouge">generate_new_access_token</code> para generar un nuevo <code class="language-plaintext highlighter-rouge">login_token</code> con el refresh de <code class="language-plaintext highlighter-rouge">login_token_expires_at</code>.</li>
</ul>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># ./app/controllers/users_controller.rb</span>
<span class="k">class</span> <span class="nc">UsersController</span> <span class="o">&lt;</span> <span class="no">ApplicationController</span>
  <span class="n">before_action</span> <span class="ss">:set_user</span><span class="p">,</span> <span class="ss">only: </span><span class="sx">%i[:email_sent]</span>
  <span class="k">def</span> <span class="nf">new</span>
    <span class="vi">@user</span> <span class="o">=</span> <span class="no">User</span><span class="p">.</span><span class="nf">new</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">create</span>
    <span class="vi">@user</span> <span class="o">=</span> <span class="no">User</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="n">user_params</span><span class="p">)</span>
    <span class="n">redirect_to</span> <span class="n">email_sent_user_path</span><span class="p">(</span><span class="vi">@user</span><span class="p">)</span> <span class="k">if</span> <span class="vi">@user</span><span class="p">.</span><span class="nf">save</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">email_sent</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">generate_new_access_token</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">update_new_access_token</span>
    <span class="vi">@user</span> <span class="o">=</span> <span class="no">User</span><span class="p">.</span><span class="nf">find_by</span><span class="p">(</span><span class="n">user_params</span><span class="p">)</span>
    <span class="k">if</span> <span class="vi">@user</span><span class="p">.</span><span class="nf">present?</span>
      <span class="vi">@user</span><span class="p">.</span><span class="nf">generate_login_token!</span>
      <span class="vi">@user</span><span class="p">.</span><span class="nf">save</span>
      <span class="n">redirect_to</span> <span class="n">generate_new_access_token_users_path</span><span class="p">,</span> <span class="ss">notice: </span><span class="s2">"Login token was successfully updated, check your email."</span>
    <span class="k">else</span>
      <span class="n">redirect_to</span> <span class="n">undefined_login_token_sessions_path</span>
    <span class="k">end</span>
  <span class="k">end</span>

  <span class="kp">private</span>

  <span class="k">def</span> <span class="nf">set_user</span>
    <span class="vi">@user</span> <span class="o">=</span> <span class="no">User</span><span class="p">.</span><span class="nf">find</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="ss">:user_id</span><span class="p">])</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">user_params</span>
    <span class="n">params</span><span class="p">.</span><span class="nf">require</span><span class="p">(</span><span class="ss">:user</span><span class="p">).</span><span class="nf">permit</span><span class="p">(</span><span class="ss">:email</span><span class="p">)</span>
  <span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>

<h3 id="vistas">Vistas:</h3>
<p>Las vistas las simplifique lo mas posible, con ver el contenido se entiende el objetivo que buscan en cuanto a la UX.</p>
<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># ./app/views/users/new.html.erb</span>
<span class="o">&lt;</span><span class="n">h1</span><span class="o">&gt;</span><span class="no">Bienvenido</span> <span class="n">a</span> <span class="n">passwordless</span><span class="o">-</span><span class="n">auth</span><span class="o">-</span><span class="n">app!</span><span class="o">&lt;</span><span class="sr">/h1&gt;
&lt;h2&gt;Introudce to email abajo en el formulario para registrarte.&lt;/</span><span class="n">h2</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="sx">%= simple_form_for(@user) do |f| %&gt;
  &lt;%=</span> <span class="n">f</span><span class="p">.</span><span class="nf">input</span> <span class="ss">:email</span> <span class="o">%&gt;</span>
  <span class="o">&lt;</span><span class="sx">%= f.button :submit %&gt;
&lt;% end %&gt;
</span></code></pre></div></div>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># ./app/views/sessions/email_sent.html.erb</span>
<span class="o">&lt;</span><span class="n">h1</span><span class="o">&gt;</span><span class="no">Gracias</span> <span class="n">por</span> <span class="n">registrarte!</span> <span class="no">Se</span> <span class="n">te</span> <span class="n">ha</span> <span class="n">enviado</span> <span class="n">un</span> <span class="n">email</span> <span class="n">a</span> <span class="o">&lt;</span><span class="sx">%= @user.email %&gt; con el accesso a la plataforma&lt;/h1&gt;
</span></code></pre></div></div>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># ./app/views/users/generate_new_access_token.html.erb</span>
<span class="o">&lt;</span><span class="n">h1</span><span class="o">&gt;</span><span class="no">Genera</span> <span class="n">un</span> <span class="n">nuevo</span> <span class="n">login</span> <span class="n">token</span> <span class="n">en</span> <span class="n">el</span> <span class="n">caso</span> <span class="n">de</span> <span class="n">que</span> <span class="n">se</span> <span class="n">te</span> <span class="n">haya</span> <span class="n">expirado</span> <span class="n">o</span> <span class="n">no</span> <span class="n">lo</span> <span class="n">recuerdes</span><span class="o">&lt;</span><span class="sr">/h1&gt;
&lt;%= simple_form_for(:user, url: update_new_access_token_users_path, method: :post) do |f| %&gt;
  &lt;%= f.input :email %&gt;
  &lt;%= f.button :submit %&gt;
&lt;% end %&gt;
</span></code></pre></div></div>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># ./app/views/sessions/undefined_login_token.html.erb</span>
<span class="o">&lt;</span><span class="n">h1</span><span class="o">&gt;</span><span class="no">No</span> <span class="n">has</span> <span class="n">podido</span> <span class="n">acceder</span> <span class="n">a</span> <span class="n">tu</span> <span class="n">cuenta?</span><span class="o">&lt;</span><span class="sr">/h1&gt;
&lt;h2&gt;Si se expiro tu login_token, genera uno nuevo &lt;%= link_to 'aqui', generate_new_access_token_users_path %&gt;&lt;/</span><span class="n">h2</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="n">h2</span><span class="o">&gt;</span><span class="no">No</span> <span class="n">tienes</span> <span class="n">cuenta?</span> <span class="o">&lt;</span><span class="sx">%= link_to 'Registrate', new_user_path %&gt; &lt;/h2&gt;
</span></code></pre></div></div>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># ./app/views/sessions/index.html.erb</span>
<span class="o">&lt;</span><span class="n">h1</span><span class="o">&gt;</span><span class="no">Bienvenido</span> <span class="o">&lt;</span><span class="sx">%= @user.email %&gt;&lt;/h1&gt;
&lt;p&gt;Aqui puedes administrar y modificar todos tus datos.&lt;/p&gt;
</span></code></pre></div></div>

<h2 id="3-agregado-de-notificaciones-para-enviar-los-emails">3. Agregado de notificaciones para enviar los emails:</h2>
<p>La frutillita del postre, configurar el proceso de ejecución del mail en el que se envíe el <code class="language-plaintext highlighter-rouge">login_token</code>.</p>

<p>###Iniciamos creando una el mailer:</p>
<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">rails</span> <span class="n">generate</span> <span class="n">mailer</span> <span class="no">LoginMailer</span>
</code></pre></div></div>
<p>Luego agregamos la función <code class="language-plaintext highlighter-rouge">send_email</code> dentro de la clase <code class="language-plaintext highlighter-rouge">LoginMailer</code>:</p>
<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># ./app/mailers/login_mailer.rb</span>
<span class="k">class</span> <span class="nc">LoginMailer</span> <span class="o">&lt;</span> <span class="no">ApplicationMailer</span>
  <span class="k">def</span> <span class="nf">send_email</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
    <span class="vi">@user</span> <span class="o">=</span> <span class="n">user</span>
    <span class="vi">@url</span>  <span class="o">=</span> <span class="n">url</span>

    <span class="n">mail</span> <span class="ss">to: </span><span class="vi">@user</span><span class="p">.</span><span class="nf">email</span><span class="p">,</span> <span class="ss">subject: </span><span class="s1">'Ingresar a paswordless-auth-app'</span>
  <span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>

<p>Y finalmente agregamos la vista de este mailer:</p>
<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># ./app/views/login_mailer/send_email.html.erb</span>
<span class="o">&lt;!</span><span class="no">DOCTYPE</span> <span class="n">html</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="n">html</span><span class="o">&gt;</span>
  <span class="o">&lt;</span><span class="n">head</span><span class="o">&gt;</span>
    <span class="o">&lt;</span><span class="n">meta</span> <span class="n">content</span><span class="o">=</span><span class="s1">'text/html; charset=UTF-8'</span> <span class="n">http</span><span class="o">-</span><span class="n">equiv</span><span class="o">=</span><span class="s1">'Content-Type'</span> <span class="o">/&gt;</span>
  <span class="o">&lt;</span><span class="sr">/head&gt;
  &lt;body&gt;
    &lt;h1&gt;Bienvenido &lt;%= @user.email %&gt;,&lt;/</span><span class="n">h1</span><span class="o">&gt;</span>
    <span class="o">&lt;</span><span class="n">a</span> <span class="n">href</span><span class="o">=</span><span class="s2">"&lt;%= @url %&gt;"</span><span class="o">&gt;</span><span class="no">Haz</span> <span class="n">click</span> <span class="n">para</span> <span class="n">acceder</span> <span class="n">a</span> <span class="n">la</span> <span class="n">app</span><span class="p">.</span><span class="nf">&lt;</span><span class="o">/</span><span class="n">a</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="sr">/html&gt;
</span></code></pre></div></div>

<h3 id="callback-para-la-ejecución-del-mail">Callback para la ejecución del mail:</h3>
<p>Para tener el proceso completo sería generar una ejecución automática de este mail una vez que se crea el usuario/renueva el <code class="language-plaintext highlighter-rouge">login_token</code>.</p>
<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># ./app/models/user.rb</span>
<span class="k">class</span> <span class="nc">User</span> <span class="o">&lt;</span> <span class="no">ApplicationRecord</span>
  <span class="c1"># Callback</span>
  <span class="n">after_save</span> <span class="ss">:send_new_login_token_notification</span><span class="p">,</span> <span class="ss">if: </span><span class="no">Proc</span><span class="p">.</span><span class="nf">new</span> <span class="p">{</span> <span class="n">saved_change_to_attribute?</span><span class="p">(</span><span class="ss">:login_token</span><span class="p">)</span> <span class="p">}</span>
  
  <span class="c1"># Instance Method</span>
  <span class="k">def</span> <span class="nf">send_new_login_token_notification</span>
    <span class="no">LoginMailer</span><span class="p">.</span><span class="nf">send_email</span><span class="p">(</span><span class="nb">self</span><span class="p">,</span> <span class="n">login_token_url</span><span class="p">).</span><span class="nf">deliver_now</span>
  <span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>

<h2 id="4-autenticación-de-la-sesión">4. Autenticación de la sesión:</h2>
<p>Por ultimo paso queda validar que el <code class="language-plaintext highlighter-rouge">login_token</code> sea el correcto dentro de <code class="language-plaintext highlighter-rouge">SessionsController</code>:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">SessionsController</span> <span class="o">&lt;</span> <span class="no">ApplicationController</span>
  <span class="k">def</span> <span class="nf">index</span>
    <span class="vi">@user</span> <span class="o">=</span> <span class="no">User</span><span class="p">.</span><span class="nf">find_by</span><span class="p">(</span><span class="ss">login_token: </span><span class="n">login_token_params</span><span class="p">)</span>

    <span class="k">unless</span> <span class="vi">@user</span><span class="p">.</span><span class="nf">present?</span> <span class="o">&amp;&amp;</span> <span class="vi">@user</span><span class="p">.</span><span class="nf">login_token_valid?</span>
      <span class="n">redirect_to</span> <span class="n">undefined_login_token_sessions_path</span>
    <span class="k">end</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">undefined_login_token</span>
  <span class="k">end</span>

  <span class="kp">private</span>

  <span class="k">def</span> <span class="nf">login_token_params</span>
    <span class="n">params</span><span class="p">.</span><span class="nf">require</span><span class="p">(</span><span class="ss">:login_token</span><span class="p">)</span>
  <span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>

<h2 id="5-et-voaià">5. Et Voaià!</h2>
<p><img src="https://res.cloudinary.com/dd28ghazj/image/upload/v1619574813/santiagollapur.com/autenticacion-passwordless-con-rails/passwordless-auth_ci3xqn.gif" />
Ya tenemos funcionando la autenticación de usuarios sin necesidad de tener una contraseña 🎉.</p>

<p>El objetivo de este post es dar una idea básica de una de las muchas formas en las que se puede crear este tipo de autenticaciones, hay mucho mas en términos de seguridad y autorización para trabajar.</p>

<p>Les comparto los 2 principales posts en los que me sirvieron para realizar este trabajo:</p>

<ul>
  <li>
    <p><a href="https://dev.to/matiascarpintini/magic-links-with-ruby-on-rails-and-devise-4e3o" target="_blank">Magic Links with Ruby On Rails and Devise</a></p>
  </li>
  <li>
    <p><a href="https://fullstackheroes.com/rails/sorcery-passwordless-authentication/" target="_blank">Implement a passwordless authentication with Sorcery</a></p>
  </li>
</ul>]]></content><author><name>Santiago Llapur</name><email>santillapur@gmail.com</email></author><summary type="html"><![CDATA[¿Qué es una autenticación passwordless? Una autenticación passwordless es una manera de verificar un usuario en nuestra app sin necesidad de que requieran un nombre de usuario y contraseña. En cambio, vamos a generar un token de seguridad para autenticar al usuario.]]></summary></entry><entry><title type="html">Comandos avanzados en GIT</title><link href="https://www.santiagollapur.com/comandos-avanzados-en-git" rel="alternate" type="text/html" title="Comandos avanzados en GIT" /><published>2021-01-27T12:00:00+00:00</published><updated>2021-01-27T12:00:00+00:00</updated><id>https://www.santiagollapur.com/advanced-git-commands</id><content type="html" xml:base="https://www.santiagollapur.com/comandos-avanzados-en-git"><![CDATA[<p>GIT es una herramienta imprescindible a la hora de trabajar como desarrollador. Este post va orientado a gente que ya tiene una noción básica de la herramienta, con el objetivo de optimizar su uso y conocer útiles comandos que nos pueden sacar de aprietes.</p>

<h1 id="git-stash-">git stash <a href="https://git-scm.com/docs/git-stash" target="_blank">📖</a></h1>
<p>Si solo pudiera elegir un comando de git, definitivamente sería <code class="language-plaintext highlighter-rouge">git stash</code>. Una vez que lo descubrí, mi workflow cambió por completo. La traducción de stash hace referencia a reserva, lo que te permite este comando es guardar todos los cambios que veníamos haciendo en staging sin necesidad de forzar un commit para poder dedicarnos a otra cosa.</p>

<p>Un escenario bastante usual en el que hacía uso de este comando es cuando estaba trabajando en una feature particular, pero surgía algún bug en producción y tenía que dejar lo que estaba haciendo para tirar un hotfix en la codebase. No iba a deshacer todo lo que venía haciendo, por lo que hacía un <code class="language-plaintext highlighter-rouge">git stash</code> (o <code class="language-plaintext highlighter-rouge">git stash -u</code> en el caso de que untracked files), abría una nueva branch para solucionar el bug, y luego retornaba a lo que estaba haciendo en la rama de la feature con un <code class="language-plaintext highlighter-rouge">git stash pop</code>. En el caso de que los cambios stasheados no sean útiles se pueden eliminar con <code class="language-plaintext highlighter-rouge">git stash drop</code>. Además podemos tener más de un stash guardado, por lo que podemos ver la cantidad de stashes con <code class="language-plaintext highlighter-rouge">git stash list</code>.</p>

<p><img src="https://res.cloudinary.com/dd28ghazj/image/upload/v1611013931/santiagollapur.com/advanced-git-commands/git-stash_mkh9bd.png" /></p>

<p>Para entender más en profundidad recomiendo leer el siguiente <a href="https://www.atlassian.com/es/git/tutorials/saving-changes/git-stash" target="_blank">blogpost</a>.</p>

<h1 id="git-uncommit-reset-">git uncommit (reset) <a href="https://git-scm.com/docs/git-reset" target="_blank">📖</a></h1>
<p>Cuantas veces nos pasó de hacer un commit localmente y nos olvidamos de modificar algo demasiado diminuto como para hacer otro nuevo commit. Con <code class="language-plaintext highlighter-rouge">git reset --soft HEAD^</code> van a poder revertir ese commit y pasarlo a staging para agregar los cambios imprevistos. Al mismo también le puse alias: <code class="language-plaintext highlighter-rouge">git config --global alias.uncommit 'reset --soft HEAD^'</code>.</p>

<p><img src="https://res.cloudinary.com/dd28ghazj/image/upload/v1611602695/santiagollapur.com/advanced-git-commands/git_uncommit_skzhvv.png" /></p>

<h1 id="git-unstage-reset-">git unstage (reset) <a href="https://git-scm.com/docs/git-reset" target="_blank">📖</a></h1>
<p>Similar al de uncommit pero en staging, nos puede pasar que hicimos <code class="language-plaintext highlighter-rouge">git add</code> con algún que otro archivo que no queremos commitear ahora, por lo que necesitamos sacarlo de staging con <code class="language-plaintext highlighter-rouge">git reset nombredelarchivo.txt</code>. Al igual que los otros ejemplos, lo uso con alias <code class="language-plaintext highlighter-rouge">git config --global alias.unstage 'reset'</code> ya que el reset me parece que queda poco claro.</p>

<p><img src="https://res.cloudinary.com/dd28ghazj/image/upload/v1611605200/santiagollapur.com/advanced-git-commands/git_unstage_e4qjeq.png" /></p>

<h1 id="git-checkout-">git checkout <a href="https://git-scm.com/docs/git-checkout" target="_blank">📖</a></h1>
<p>Probablemente ya conozcan este comando para moverse de branches, pero también tiene otro caso de uso que es para cuando hicimos cambios en un archivo, pero nos dimos cuenta que queremos deshacerlos, en vez de estar borrando linea por linea con un simple <code class="language-plaintext highlighter-rouge">git checkout nombredelarchivo.txt</code> se revierten los cambios. Hay que tener cuidado con este comando porque una vez que se ejecuta el checkout, no se pueden recuperar los cambios hechos.</p>

<p><img src="https://res.cloudinary.com/dd28ghazj/image/upload/v1611702041/santiagollapur.com/advanced-git-commands/git_checkout_r5md8x.png" /></p>

<h1 id="git-sla--gloga-">git sla / gloga <a href="https://git-scm.com/docs/git-log" target="_blank">📖</a></h1>
<p>Ambos comandos son inexistentes, son abreviaciones que cree a raíz de <code class="language-plaintext highlighter-rouge">git log --oneline --decorate --graph --all</code>, que vendría a ser una manera de ver todo el commit history de una forma más agradable, para entender cómo fueron mergeadas las ramas en el caso de que no seamos los únicos trabajando en un proyecto. Para crear el alias deberíamos escribir lo siguiente <code class="language-plaintext highlighter-rouge">git config --global alias.sla 'log --oneline --decorate --graph --all'</code>. sla hace referencia por “short log all”, pero cada uno puede modificar el alias a su gusto. Por otro lado, si queremos abreviar más todavía esta función, podríamos crear un alias (en mi caso uso Oh My Zsh para crear esto) como <code class="language-plaintext highlighter-rouge">alias gloga='git log --oneline --decorate --graph --all'</code>.</p>

<p><img src="https://res.cloudinary.com/dd28ghazj/image/upload/v1611591990/santiagollapur.com/advanced-git-commands/git_log_c3wsjg.png" /></p>

<h1 id="git-blame-">git blame <a href="https://git-scm.com/docs/git-blame" target="_blank">📖</a></h1>
<p><code class="language-plaintext highlighter-rouge">git blame nombredelarchivo.txt</code> sirve para ver que linea de un archivo fue modificada, la fecha en que se modificó, el autor de ese cambio, y el commit el cual se hizo. No suelo utilizar mucho este comando porque le agregué a mi editor de texto un plugin para ya verlo desde ahí sin tener la necesidad de escribir en la terminal (<a href="https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens#current-line-blame-">VScode</a>, <a href="https://packagecontrol.io/packages/Git%20blame">Sublime Text</a>).</p>

<p>Un escenario de uso se me dió cuando tenía que refactorizar unos métodos, en donde el código no estaba muy declarado o no llegaba a entender en qué contexto se escribió, por lo que me fijaba con el blame, y le consultaba a aquella persona que trabajó previamente en eso.</p>

<p><img src="https://res.cloudinary.com/dd28ghazj/image/upload/v1611596387/santiagollapur.com/advanced-git-commands/git_blame_ipwfrw.png" /></p>

<h1 id="algunos-extras">Algunos extras:</h1>
<ul>
  <li><code class="language-plaintext highlighter-rouge">git diff --cached</code>: Sirve para ver el diff de los archivos que estén en staging.</li>
  <li><code class="language-plaintext highlighter-rouge">git add . &amp;&amp; git commit --amend --no-edit</code>: Agrega cambios que te olvidaste de agregar al último commit.</li>
  <li><code class="language-plaintext highlighter-rouge">git show hash-del-commit</code>: muestra los cambios que hizo una persona en determinado commit</li>
  <li><code class="language-plaintext highlighter-rouge">git cherry-pick hash-del-commit</code>: Este comando nos ofrece la posibilidad de agregar un commit ya hecho de cualquier otra rama a la actual que estemos parados.</li>
  <li><code class="language-plaintext highlighter-rouge">git reflog</code>: muestra todas las operaciones locales que hiciste en determinado proyecto.</li>
  <li><code class="language-plaintext highlighter-rouge">git tag nombredeltag</code>: se le asocia un tag al próximo commit que hagas, esta bueno para cuando se hacen releases de nuevas versiones de app u otros sucesos importantes.</li>
  <li>HEAD: es la referencia al último commit del branch en el que estamos parados.</li>
</ul>

<p>Si este post te resultó interesante y queres investigar más del tema, recomiendo hacer el curso gratuito de <a href="https://thoughtbot.com/upcase/mastering-git" target="_blank">Mastering Git</a> de thoughtbot, y si te interesa profundizar en como funciona git, leer <a href="https://shafiul.github.io/gitbook/1_the_git_object_model.html">The Git Object Model</a></p>]]></content><author><name>Santiago Llapur</name><email>santillapur@gmail.com</email></author><summary type="html"><![CDATA[GIT es una herramienta imprescindible a la hora de trabajar como desarrollador. Este post va orientado a gente que ya tiene una noción básica de la herramienta, con el objetivo de optimizar su uso y conocer útiles comandos que nos pueden sacar de aprietes.]]></summary></entry><entry><title type="html">Hello World!</title><link href="https://www.santiagollapur.com/hello-world" rel="alternate" type="text/html" title="Hello World!" /><published>2020-11-21T12:00:00+00:00</published><updated>2020-11-21T12:00:00+00:00</updated><id>https://www.santiagollapur.com/hello-world</id><content type="html" xml:base="https://www.santiagollapur.com/hello-world"><![CDATA[<p>¡Hola Mundo! Luego de procrastinar este mundo lleno de distracciones, arranqué mi propio blog. En este lindo sitio de la matrix me voy a enfocar en crear contenido basado en experiencias y aprendizaje que tenga a lo largo de mi carrera personal/profesional, por lo que probablemente vaya a estar escribiendo sobre software, emprendimientos, y otras yerbas.</p>

<h2 id="algunos-de-los-tópicos-que-me-incentivaron-a-crear-este-blog">Algunos de los tópicos que me incentivaron a crear este blog:</h2>

<h3 id="falta-de-contenido-de-desarrollo-para-gente-de-habla-hispana">Falta de contenido de desarrollo para gente de habla hispana</h3>
<p>A pesar que el Español es el cuarto idioma con más hablantes nativos en el mundo, solo abarca el <a href="https://w3techs.com/technologies/overview/content_language">4% total de la información en la internet</a>, siendo el Inglés como predominante con el 60%. Probablemente muchas de las cosas las cuales este hablando carecen de su existencia en el Español.</p>
<h3 id="reforzar-aprendizajes">Reforzar aprendizajes</h3>
<p>Una gran hack para retener mejor la información que se genera al aprender cosas nuevas es intentando explicarlas de la forma más simple posible, que es lo que voy a estar intentando hacer en mis siguientes publicaciones.</p>
<h3 id="mejorar-la-calidad-de-escritura">Mejorar la calidad de escritura</h3>
<p>La comunicación es un soft-skill imprescindible, más que nada hoy en día donde todo es remoto, dar un mensaje preciso puede acortar las idas y vueltas entregando como resultado una mejora en términos de eficiencia.</p>
<h3 id="aportar-mi-granito-de-arena-en-el-mundo">Aportar mi granito de arena en el mundo</h3>
<p>El típico cliché, pero las tecnologías e información open source aportaron muchísimo a mi vida (y a la de todos), espero poder devolver ese agradecimiento de alguna forma a este mundo, y este blog puede ser una de esas muchas maneras. Así que con tal de que lo que escriba acá le afecte a una sola persona, ya me voy a sentir satisfecho.</p>
<h3 id="generar-una-marca-personal">Generar una marca personal</h3>
<p>Un blog personal puede ser un canal más para venderse a la hora de desarrollar un camino profesional. Creo que puede generar oportunidades interesantes a futuro. Además ahora puedo sobrar a mis amigos/familiares diciendo que tengo <em>mi propia pagina web.</em></p>

<p>Aprovecho para comentar el tech-stack con el que armé esta página. Como framework use <a href="https://jekyllrb.com">Jekyll</a> que permite crear contenido estático muy fácilmente, a este no le agregué mucho contenido extra, solo un poco de estilos para hacer un diseño minimalista. Luego, uso <a href="https://pages.github.com/">Github Pages</a> para hostear todo el contenido.</p>]]></content><author><name>Santiago Llapur</name><email>santillapur@gmail.com</email></author><summary type="html"><![CDATA[¡Hola Mundo! Luego de procrastinar este mundo lleno de distracciones, arranqué mi propio blog. En este lindo sitio de la matrix me voy a enfocar en crear contenido basado en experiencias y aprendizaje que tenga a lo largo de mi carrera personal/profesional, por lo que probablemente vaya a estar escribiendo sobre software, emprendimientos, y otras yerbas. Algunos de los tópicos que me incentivaron a crear este blog: Falta de contenido de desarrollo para gente de habla hispana A pesar que el Español es el cuarto idioma con más hablantes nativos en el mundo, solo abarca el 4% total de la información en la internet, siendo el Inglés como predominante con el 60%. Probablemente muchas de las cosas las cuales este hablando carecen de su existencia en el Español. Reforzar aprendizajes Una gran hack para retener mejor la información que se genera al aprender cosas nuevas es intentando explicarlas de la forma más simple posible, que es lo que voy a estar intentando hacer en mis siguientes publicaciones. Mejorar la calidad de escritura La comunicación es un soft-skill imprescindible, más que nada hoy en día donde todo es remoto, dar un mensaje preciso puede acortar las idas y vueltas entregando como resultado una mejora en términos de eficiencia. Aportar mi granito de arena en el mundo El típico cliché, pero las tecnologías e información open source aportaron muchísimo a mi vida (y a la de todos), espero poder devolver ese agradecimiento de alguna forma a este mundo, y este blog puede ser una de esas muchas maneras. Así que con tal de que lo que escriba acá le afecte a una sola persona, ya me voy a sentir satisfecho. Generar una marca personal Un blog personal puede ser un canal más para venderse a la hora de desarrollar un camino profesional. Creo que puede generar oportunidades interesantes a futuro. Además ahora puedo sobrar a mis amigos/familiares diciendo que tengo mi propia pagina web.]]></summary></entry></feed>