<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Picando Código</title>
	<atom:link href="https://picandocodigo.net/feed/" rel="self" type="application/rss+xml" />
	<link>https://picandocodigo.net</link>
	<description>Blog sobre programación, tecnología, software libre, videojuegos, cómics y más</description>
	<lastBuildDate>Tue, 02 Jun 2026 08:41:34 +0000</lastBuildDate>
	<language>es-AR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://picandocodigo.net/wp-content/uploads/2013/07/cropped-avatar-150-32x32.png</url>
	<title>Picando Código</title>
	<link>https://picandocodigo.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>¿Cómo juegan Mega Man X en el Super Nintendo?</title>
		<link>https://picandocodigo.net/2026/como-juegan-mega-man-x-en-el-super-nintendo/</link>
					<comments>https://picandocodigo.net/2026/como-juegan-mega-man-x-en-el-super-nintendo/#respond</comments>
		
		<dc:creator><![CDATA[Fernando]]></dc:creator>
		<pubDate>Tue, 02 Jun 2026 09:00:49 +0000</pubDate>
				<category><![CDATA[Videojuegos]]></category>
		<category><![CDATA[Mega Man]]></category>
		<category><![CDATA[Mega Man X]]></category>
		<category><![CDATA[Super Nintendo]]></category>
		<guid isPermaLink="false">https://picandocodigo.net/?p=18754</guid>

					<description><![CDATA[<p>El fin de semana pasado me puse a jugar a Mega Man X en Super Nintendo. Es uno de mis juegos preferidos, de los mejores de todos los tiempos. ¿Ustedes también juegan con los dedos en el control así? El pulgar lo uso para tener siempre cargando el mega buster en el Y, y saltar con el B. Pero la mayoría de las veces necesito saltar con el A para hacer la deslizada rápida (dash) hacia adelante. También se puede hacer el dash apretando dos veces el d-pad en la dirección en la que queremos ir. Pero es mucho más [&#8230;]</p>
El post <a href="https://picandocodigo.net/2026/como-juegan-mega-man-x-en-el-super-nintendo/">¿Cómo juegan Mega Man X en el Super Nintendo?</a> fue publicado originalmente en <a href="https://picandocodigo.net">Picando Código</a>.]]></description>
										<content:encoded><![CDATA[<p>El fin de semana pasado me puse a jugar a <strong>Mega Man X</strong> en Super Nintendo. Es uno de mis juegos preferidos, de los mejores de todos los tiempos. ¿Ustedes también juegan con los dedos en el control así?</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-18757" src="https://picandocodigo.net/wp-content/uploads/2026/06/control-snes-megaman-x.gif" alt="Cómo uso el control de Super Famicom para jugar Mega Man X" width="600" height="343"></p>
<p>El pulgar lo uso para tener siempre cargando el mega buster en el Y, y saltar con el B. Pero la mayoría de las veces necesito saltar con el A para hacer la deslizada rápida (dash) hacia adelante. También se puede hacer el dash apretando dos veces el d-pad en la dirección en la que queremos ir. Pero es mucho más práctico usar un botón.</p>
<p>Por cierto, siempre empiezo en la pantalla de <strong>Chill Penguin</strong>. Es donde encontramos la cápsula que nos da la armadura para las piernas, lo que nos permite usar este poder. Para mí siempre fue la primera pantalla de Mega Man X después de la introducción. Es una mecánica esencial el resto del juego.</p>
<p>Mi manera de jugar no es la más cómoda, así que se me ocurrió escribir al respecto en el blog. Creo que hace poco charlamos de este tema con mi primo en una sesión de Nintendo Online <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f914.png" alt="🤔" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Seguramente los controles fueron diseñados pensando en que al momento de saltar, uno usaría el pulgar sobre el A y B para poder moverse mejor. Pero yo necesito estar cargando el mega buster todo el tiempo. Más allá de que tengo prácticamente memorizado dónde van a aparecer enemigos en todas las pantallas de tanto que lo he jugado, necesito estar cargando mi mega buster, por las dudas.</p>
<p>¿Ustedes también? ¿O son normales y usan el pulgar sobre el A y B? ¿O son más normales todavía y no juegan juegos de hace más de 30 años? Estoy seguro que hay algún hack o una forma más práctica de hacerlo, pero yo todavía no la he encontrado.</p>
<p>En versiones modernas como <strong>Mega Man X Legacy Collection</strong>, podemos remapear el A al L o R, lo que lo hace infinitamente más cómodo. Pero en el Super Nintendo original, no queda otra que sufrir el A. Aparte si me acostumbro a usar un botón distinto en otra plataforma, cuando vuelva al Super Nintendo voy a sufrir porque tengo que volver al A.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-18759" src="https://picandocodigo.net/wp-content/uploads/2026/06/megaman-x-legacy-collection-botones.jpg" alt="Mega Man X - Legacy Collection - menú de opciones" width="1000" height="281" srcset="https://picandocodigo.net/wp-content/uploads/2026/06/megaman-x-legacy-collection-botones.jpg 1000w, https://picandocodigo.net/wp-content/uploads/2026/06/megaman-x-legacy-collection-botones-300x84.jpg 300w, https://picandocodigo.net/wp-content/uploads/2026/06/megaman-x-legacy-collection-botones-768x216.jpg 768w, https://picandocodigo.net/wp-content/uploads/2026/06/megaman-x-legacy-collection-botones-600x169.jpg 600w, https://picandocodigo.net/wp-content/uploads/2026/06/megaman-x-legacy-collection-botones-900x253.jpg 900w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></p>
<p>Por cierto, usando el control <em>8 BitDo Pro 2</em>, me di cuenta que no puedo jugar a <strong>Mega Man X</strong> en <em>Mega Man X Legacy Collection</em>. Este control está diseñado de forma más ergonómica, y tiene como una elevación en la parte de atrás del control para un mejor agarre. El problema es que el dedo índice y el mayor quedan más separados y tendría que hacer un estiramiento doloroso para alcanzar el A. Así que el dedo mayor pasa al botón R, y todo el peso de la parte derecha del control cae sobre el meñique y el anular (<a href="https://picandocodigo.net/?attachment_id=18763" rel="attachment wp-att-18763">imagen</a>).</p>
<p>No es lo ideal, así que para esos casos tengo que usar el control de Super Nintendo o mi <a href="https://picandocodigo.net/2021/reparando-control-8bitdo-sn30-pro/">viejo y querido 8BitDo SN30 Pro</a> que ya está pidiendo cambio pobre.</p>
<p>Ese fin de semana jugué hasta vencer a todos los Mavericks, juntar todos los corazones y tanques y conseguir el hadouken. Tengo el password guardado para volver e intentar vencer a Sigma una vez más y terminar el juego. Mega Man X es uno de los mejores juegos 2D que existen, y me encantaría recordar la primera vez que lo jugué. Esta vez cuando termine, voy a ver si vuelvo a Mega Man X2 en Legacy Collection e intento terminarlo. Tanto X2 como X3 he llegado lejos, pero nunca los terminé, tareas pendientes...</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-18761" src="https://picandocodigo.net/wp-content/uploads/2026/06/mega-man-x-dash.jpg" alt="Mega Man X - Dash" width="800" height="329" srcset="https://picandocodigo.net/wp-content/uploads/2026/06/mega-man-x-dash.jpg 800w, https://picandocodigo.net/wp-content/uploads/2026/06/mega-man-x-dash-300x123.jpg 300w, https://picandocodigo.net/wp-content/uploads/2026/06/mega-man-x-dash-768x316.jpg 768w, https://picandocodigo.net/wp-content/uploads/2026/06/mega-man-x-dash-600x247.jpg 600w" sizes="auto, (max-width: 800px) 100vw, 800px" /></p>El post <a href="https://picandocodigo.net/2026/como-juegan-mega-man-x-en-el-super-nintendo/">¿Cómo juegan Mega Man X en el Super Nintendo?</a> fue publicado originalmente en <a href="https://picandocodigo.net">Picando Código</a>.]]></content:encoded>
					
					<wfw:commentRss>https://picandocodigo.net/2026/como-juegan-mega-man-x-en-el-super-nintendo/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Reseña: Dracamar - Nintendo Switch</title>
		<link>https://picandocodigo.net/2026/resena-dracamar-nintendo-switch/</link>
					<comments>https://picandocodigo.net/2026/resena-dracamar-nintendo-switch/#respond</comments>
		
		<dc:creator><![CDATA[Fernando]]></dc:creator>
		<pubDate>Wed, 20 May 2026 08:00:40 +0000</pubDate>
				<category><![CDATA[Videojuegos]]></category>
		<category><![CDATA[Dracamar]]></category>
		<category><![CDATA[Nintendo Switch]]></category>
		<guid isPermaLink="false">https://picandocodigo.net/?p=18717</guid>

					<description><![CDATA[<p>Dracamar es un juego de plataformas 3D inspirado en clásicos del género. Es una aventura para un jugador en el que controlamos a un grupo de jóvenes en una aventura para salvar su archipiélago con ambientación basada en la cultura Mediterránea. El juego fue desarrollado por Petoons Studio, un estudio independiente de videojuegos fundado en Barcelona en 2017. Aspiran a crear juegos y juguetes mágicos para niños y familias de todo el mundo. El equipo es una mezcla de artistas, desarrolladores de videojuegos y educadores. Tienen amplia experiencia en el desarrollo de juegos infantiles y familiares para PC y consolas [&#8230;]</p>
El post <a href="https://picandocodigo.net/2026/resena-dracamar-nintendo-switch/">Reseña: Dracamar - Nintendo Switch</a> fue publicado originalmente en <a href="https://picandocodigo.net">Picando Código</a>.]]></description>
										<content:encoded><![CDATA[<p><strong>Dracamar</strong> es un juego de plataformas 3D inspirado en clásicos del género. Es una aventura para un jugador en el que controlamos a un grupo de jóvenes en una aventura para salvar su archipiélago con ambientación basada en la cultura Mediterránea.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-18726" src="https://picandocodigo.net/wp-content/uploads/2026/05/bienvenidos-a-dracamar.jpg" alt="Bienvenidos a Dracamar" width="1000" height="563" srcset="https://picandocodigo.net/wp-content/uploads/2026/05/bienvenidos-a-dracamar.jpg 1000w, https://picandocodigo.net/wp-content/uploads/2026/05/bienvenidos-a-dracamar-300x169.jpg 300w, https://picandocodigo.net/wp-content/uploads/2026/05/bienvenidos-a-dracamar-768x432.jpg 768w, https://picandocodigo.net/wp-content/uploads/2026/05/bienvenidos-a-dracamar-600x338.jpg 600w, https://picandocodigo.net/wp-content/uploads/2026/05/bienvenidos-a-dracamar-900x507.jpg 900w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></p>
<p>El juego fue desarrollado por <a href="https://www.petoons.com/es/about-us/" target="_blank" rel="noopener">Petoons Studio</a>, un estudio independiente de videojuegos fundado en Barcelona en 2017. Aspiran a crear juegos y juguetes mágicos para niños y familias de todo el mundo. El equipo es una mezcla de artistas, desarrolladores de videojuegos y educadores. Tienen amplia experiencia en el desarrollo de juegos infantiles y familiares para PC y consolas de algunas de las marcas más populares del mundo: Peppa Pig, PJ Masks, Bratz y Monster High, entre otras.</p>
<p>Es un clásico juego de plataformas 3D. A primera impresión me hizo acordar a los títulos de Bob Esponja que jugué anteriormente en Switch, <a href="https://picandocodigo.net/wp-content/uploads/2026/05/sponge-bob-squarepants-switch.jpg" target="_blank" rel="noopener"><em><strong>SpongeBob Squarepants: Battle for Bikini Bottom Rehydrated</strong></em> y <strong><em>Spongebob Squarepants: The Cosmic Shake</em></strong></a>. Además de los gráficos coloridos, la música tranquila y el estilo del juego, toma la misma decisión de saltar con el botón A en vez del B como nos tienen acostumbrados otros juegos. También puede que tome inspiración de series como <strong>Banjo Kazooie</strong> (o más recientemente <strong>Yooka-Laylee</strong>) o <strong>Crash Bandicoot</strong>.</p>
<p>Está disponible para PC, Xbox, PlayStation 4, PlayStation 5 y Nintendo Switch. Yo lo vengo jugando en mi Nintendo Switch 2.</p>
<p>Una de las primeras cosas que me gustó es que está disponible en español. Pero no sólo los subtítulos y la interfaz de usuario, los personajes tienen voz en español. Me gustó mucho escuchar las voces de distintos personajes en español, le agregan mucho carácter a la ambientación del mundo de Dracamar. ¡También vemos carteles con texto en Catalan! Si bien mi conocimiento de Catalán es muy reducido, me encantó verlo. Mi conexión familiar con Palma de Mallorca hace que no pueda evitar identificar algunos paisajes con la isla.</p>
<div id="attachment_18730" style="width: 1010px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-18730" class="wp-image-18730 size-full" src="https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-partit.jpg" alt="Dracamar partit" width="1000" height="563" srcset="https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-partit.jpg 1000w, https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-partit-300x169.jpg 300w, https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-partit-768x432.jpg 768w, https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-partit-600x338.jpg 600w, https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-partit-900x507.jpg 900w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /><p id="caption-attachment-18730" class="wp-caption-text">Hace años que no como unos buenos canelones...</p></div>
<p>En el inicio elegimos entre uno de 3 personajes: <em>Caliu</em>, <em>Foc</em> y <em>Espurma</em>, pero podemos cambiarlo en cualquier momento. Todos juegan igual, las diferencias están en la apariencia. A lo largo de la aventura podemos ir obteniendo distintos atuendos para personalizar más al personaje.</p>
<p>Comenzando la partida nos encontramos con una pantalla tipo tutorial. Nos enseña cómo jugar, las habilidades de nuestro personaje así como información de los ítems que vamos a ir encontrando. En cada nivel tenemos una serie de objetos coleccionables siguiendo el legado de este tipo de plataformeros 3D y que a veces se denomina "Colectatón".</p>
<p>¿Se acuerdan cuando coleccionábamos figuritas? Tratando de completar el álbum. O tarjetas intercambiables de deportes o personajes ficticios. Supongo que esto es lo más parecido que tenemos hoy en día...</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-18741" src="https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-inicio.jpg" alt="Dracamar" width="1000" height="563" srcset="https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-inicio.jpg 1000w, https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-inicio-300x169.jpg 300w, https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-inicio-768x432.jpg 768w, https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-inicio-600x338.jpg 600w, https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-inicio-900x507.jpg 900w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></p>
<p>El juego cuenta con 15 niveles normales y 5 extra. Además de enfrentar a enemigos, plataformas y puzzles, tenemos que explorar para lograr encontrar esos coleccionables. Los niveles son bastante grandes y a veces hasta se hacen un poco largos. Me hubiera gustado contar con un mapa del nivel para saber dónde ya he estado, y que facilite encontrar los objetos escondidos. De todas formas se premia la exploración en general y el volver a jugar una pantalla para encontrar más secretos.</p>
<p>Nos van a acompañar unos seres mágicos, Okis. El malvado dragón Rey Crad ha absorbido la energía de Coroki y la convirtió en energía negativa. La usa para transformar a los Okis en Mokis, una versión oscura y malvada de los Okis. Tenemos que rescatarlos y recoger la energía negativa que liberan en forma de moki-bolas para reconstruir los puentes entre las islas.</p>
<p>Los Okis son unos bichitos adorables y se siente un poco mal tener que atacarlos para liberarlos. Pero los desarrolladores incluyeron la habilidad de acariciarlos. Así que el primer rato del juego me pasé acariciando a cuanto animalito me encontrara. Particularmente a los que me sentía mal por haber golpeado para sacarles la energía negativa...</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-18733" src="https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-acariciando-okis-1024x461.jpg" alt="Dracamar - Acariciando Okis" width="1024" height="461" srcset="https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-acariciando-okis-1024x461.jpg 1024w, https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-acariciando-okis-300x135.jpg 300w, https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-acariciando-okis-768x346.jpg 768w, https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-acariciando-okis-600x270.jpg 600w, https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-acariciando-okis-900x405.jpg 900w, https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-acariciando-okis.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<p>Lo que más se destaca de este juego para mí es la ambientación. Los gráficos, el diseño de los ambientes y la música tienen un encanto particular.</p>
<p>Es un juego sumamente accesible, el nivel de dificultad en general es bajo. Además de las plataformas y puzzles en cada nivel, hay secciones variadas más rápidas como partes con toboganes, deslizándonos por rieles al estilo Sonic, siguiendo la corriente de un río en un inflable o niveles en los que pilotamos un avión. Esto le agrega un poco de variedad al estilo de juego. También hay pantallas de bonus donde podemos obtener más estrellas.</p>
<p>Los personajes cuentan con un doble salto y un ataque con Y que los hace girar y golpear cosas alrededor (tanto enemigos como elementos del ambiente). Encontré que combinando el doble salto con el ataque, a veces podemos alcanzar cosas que están más lejos. En ese sentido me dió un poco un aire a <strong>Super Mario Odyssey</strong>.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-18735" src="https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-variedad.jpg" alt="Dracamar" width="1280" height="720" srcset="https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-variedad.jpg 1280w, https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-variedad-300x169.jpg 300w, https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-variedad-1024x576.jpg 1024w, https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-variedad-768x432.jpg 768w, https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-variedad-600x338.jpg 600w, https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-variedad-900x506.jpg 900w" sizes="auto, (max-width: 1280px) 100vw, 1280px" /></p>
<p>Hay 7 jefes finales, donde la dificultad salta un poco. En mi caso porque perdía intentando aprender cómo atacar a cada jefe. Lo molesto de esto es que cada vez que perdemos contra un jefe, tenemos que volver a jugar una parte donde "llegamos al jefe" que no aporta demasiado, y saltar la presentación del jefe a mano. Esto se vuelve tedioso bastante rápido. Pero una vez que entendemos los patrones de cada jefe, no es demasiado difícil vencerlos.</p>
<p>Hay varios personajes con diálogos en las distintas islas. Por ejemplo en la isla donde encontramos uvas y viñedos, un trabajador nos dice <em>"tengo la espalda doblada de tanto recolectar uva"</em>. Habría que convencerle de armar un sindicato. Otro en tono medio agresivo pasivo comenta <em>"podrías echar una mano, ¿no crees?"</em>. En la ciudad nos cuentan que con la invasión de Moki se han cancelado los partidos de fútbol!</p>
<p>Todo esto suma a la ambientación del juego, y me dejó muy contento volver a ver después de muchos años la palabra <a href="https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-recorcholis.jpg" target="_blank" rel="noopener">recórcholis</a>.</p>
<a href="https://picandocodigo.net/2026/resena-dracamar-nintendo-switch/"><img decoding="async" src="https://i.ytimg.com/vi/37z-ACCA9IU/hqdefault.jpg" alt="YouTube Video"></a><br /><br /></p>
<p>Dracamar es un juego que sigue la fórmula clásica de plataformas 3D con una ambientación especial que le da un encanto particular. Recomendado si les gusta este estilo de juego. Para completistas, hay contenido para rato. Creo que es ideal para jugadores de cualquier edad, pero particularmente para los más jóvenes (y quienes no somos jóvenes, pero tenemos mente de niño).</p>
<ul>
<li><a href="https://store.steampowered.com/app/3306480/Dracamar/" target="_blank" rel="nofollow noopener">Página en Steam</a></li>
<li><a href="https://dracamar.cat" target="_blank" rel="noopener">Página oficial</a></li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-18739" src="https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-buenas-noches.jpg" alt="Dracamar - ¡Muy buenas noches!" width="1000" height="563" srcset="https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-buenas-noches.jpg 1000w, https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-buenas-noches-300x169.jpg 300w, https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-buenas-noches-768x432.jpg 768w, https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-buenas-noches-600x338.jpg 600w, https://picandocodigo.net/wp-content/uploads/2026/05/dracamar-buenas-noches-900x507.jpg 900w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></p>El post <a href="https://picandocodigo.net/2026/resena-dracamar-nintendo-switch/">Reseña: Dracamar - Nintendo Switch</a> fue publicado originalmente en <a href="https://picandocodigo.net">Picando Código</a>.]]></content:encoded>
					
					<wfw:commentRss>https://picandocodigo.net/2026/resena-dracamar-nintendo-switch/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Scripts para actualizar Navidrome</title>
		<link>https://picandocodigo.net/2026/scripts-para-actualizar-navidrome/</link>
					<comments>https://picandocodigo.net/2026/scripts-para-actualizar-navidrome/#comments</comments>
		
		<dc:creator><![CDATA[Fernando]]></dc:creator>
		<pubDate>Tue, 12 May 2026 20:50:33 +0000</pubDate>
				<category><![CDATA[Shell]]></category>
		<category><![CDATA[Navidrome]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Scripts]]></category>
		<guid isPermaLink="false">https://picandocodigo.net/?p=18698</guid>

					<description><![CDATA[<p>Una de las responsabilidades de gestionar mi propio servidor personal de streaming de música Navidrome, es el mantenimiento.&#160;Siguiendo la línea de Scripts de mantenimiento para FreshRSS, comparto mis scripts para actualizar Navidrome. Al igual que con FreshRSS, estoy suscripto al feed de lanzamientos. De esta forma me entero cuando se publica una versión nueva y necesito actualizar mi instalación. FreshRSS viene corriendo en Docker, pero Navidrome lo tengo instalado a nivel sistema. Y no hay un repositorio de dónde actualizarlo, así que hay que hacerlo a mano. Pero como soy vago, escribo scripts. En primera instancia decidí escribir un script [&#8230;]</p>
El post <a href="https://picandocodigo.net/2026/scripts-para-actualizar-navidrome/">Scripts para actualizar Navidrome</a> fue publicado originalmente en <a href="https://picandocodigo.net">Picando Código</a>.]]></description>
										<content:encoded><![CDATA[<p>Una de las responsabilidades de gestionar mi propio <a href="https://picandocodigo.net/2024/navidrome/">servidor personal de streaming de música Navidrome</a>, es el mantenimiento.&nbsp;Siguiendo la línea de <a href="https://picandocodigo.net/2026/scripts-de-mantenimiento-para-freshrss/">Scripts de mantenimiento para FreshRSS</a>, comparto mis scripts para actualizar Navidrome.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-18705" src="https://picandocodigo.net/wp-content/uploads/2026/05/navidrome.jpg" alt="Navidrome" width="1000" height="471" srcset="https://picandocodigo.net/wp-content/uploads/2026/05/navidrome.jpg 1000w, https://picandocodigo.net/wp-content/uploads/2026/05/navidrome-300x141.jpg 300w, https://picandocodigo.net/wp-content/uploads/2026/05/navidrome-768x362.jpg 768w, https://picandocodigo.net/wp-content/uploads/2026/05/navidrome-600x283.jpg 600w, https://picandocodigo.net/wp-content/uploads/2026/05/navidrome-900x424.jpg 900w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></p>
<p>Al igual que con FreshRSS, estoy suscripto al <a href="https://github.com/navidrome/navidrome/releases.atom" target="_blank" rel="nofollow noopener">feed de lanzamientos</a>. De esta forma me entero cuando se publica una versión nueva y necesito actualizar mi instalación. FreshRSS viene corriendo en Docker, pero Navidrome lo tengo instalado a nivel sistema. Y no hay un repositorio de dónde actualizarlo, así que hay que hacerlo a mano. Pero como soy vago, escribo scripts.</p>
<p>En primera instancia decidí escribir un script en Ruby:</p>
<div class="codigo">
<p><span style="color: #75715e;" data-darkreader-inline-color="">#!/usr/bin/env ruby</span></p>
<p><span style="color: #f6aa11;" data-darkreader-inline-color="">require</span> <span style="color: #e6db74;" data-darkreader-inline-color="">'json'</span><br />
<span style="color: #f6aa11;" data-darkreader-inline-color="">require</span> <span style="color: #e6db74;" data-darkreader-inline-color="">'net/http'</span><br />
<span style="color: #f6aa11;" data-darkreader-inline-color="">require</span> <span style="color: #e6db74;" data-darkreader-inline-color="">'open-uri'</span></p>
<p><span style="color: #75715e;" data-darkreader-inline-color=""># La dirección del release más reciente en la API de GitHub:</span><br />
<span style="color: #ffffff;" data-darkreader-inline-color="">url</span> <span style="color: #f92672;" data-darkreader-inline-color="">=</span> <span style="color: #e6db74;" data-darkreader-inline-color="">'https://api.github.com/repos/navidrome/navidrome/releases/latest'</span><br />
<span style="color: #75715e;" data-darkreader-inline-color=""># En esta línea anidada de cosas, primero uso URI para parsear el String url y crear el URI</span><br />
<span style="color: #75715e;" data-darkreader-inline-color=""># Eso se lo paso a net/http para que haga un pedido HTTP GET.</span><br />
<span style="color: #75715e;" data-darkreader-inline-color=""># La respuesta es en formato JSON, así que lo parseo con JSON.parse:</span><br />
<span style="color: #ffffff;" data-darkreader-inline-color="">data</span> <span style="color: #f92672;" data-darkreader-inline-color="">=</span> <span style="color: #66d9ef;" data-darkreader-inline-color="">JSON</span><span style="color: #ffffff;" data-darkreader-inline-color="">.</span><span style="color: #a6e22e;" data-darkreader-inline-color="">parse</span><span style="color: #ffffff;" data-darkreader-inline-color="">(</span><span style="color: #66d9ef;" data-darkreader-inline-color="">Net</span><span style="color: #f92672;" data-darkreader-inline-color="">::</span><span style="color: #66d9ef;" data-darkreader-inline-color="">HTTP</span><span style="color: #ffffff;" data-darkreader-inline-color="">.</span><span style="color: #a6e22e;" data-darkreader-inline-color="">get</span><span style="color: #ffffff;" data-darkreader-inline-color="">(</span><span style="color: #66d9ef;" data-darkreader-inline-color="">URI</span><span style="color: #ffffff;" data-darkreader-inline-color="">(</span><span style="color: #ffffff;" data-darkreader-inline-color="">url</span><span style="color: #ffffff;" data-darkreader-inline-color="">)))</span></p>
<p><span style="color: #75715e;" data-darkreader-inline-color=""># Acá filtro la arquitectura arm64 de Raspberry Pi y el paquete .deb:</span><br />
<span style="color: #ffffff;" data-darkreader-inline-color="">package</span> <span style="color: #f92672;" data-darkreader-inline-color="">=</span> <span style="color: #ffffff;" data-darkreader-inline-color="">data</span><span style="color: #ffffff;" data-darkreader-inline-color="">[</span><span style="color: #e6db74;" data-darkreader-inline-color="">'assets'</span><span style="color: #ffffff;" data-darkreader-inline-color="">].</span><span style="color: #a6e22e;" data-darkreader-inline-color="">find</span> <span style="color: #ffffff;" data-darkreader-inline-color="">{</span> <span style="color: #f92672;" data-darkreader-inline-color="">|</span><span style="color: #ffffff;" data-darkreader-inline-color="">a</span><span style="color: #f92672;" data-darkreader-inline-color="">|</span> <span style="color: #ffffff;" data-darkreader-inline-color="">a</span><span style="color: #ffffff;" data-darkreader-inline-color="">[</span><span style="color: #e6db74;" data-darkreader-inline-color="">'name'</span><span style="color: #ffffff;" data-darkreader-inline-color="">].</span><span style="color: #a6e22e;" data-darkreader-inline-color="">match?</span><span style="color: #ffffff;" data-darkreader-inline-color="">(</span><span style="color: #f6aa11;" data-darkreader-inline-color="">/arm64\.deb/</span><span style="color: #ffffff;" data-darkreader-inline-color="">)</span> <span style="color: #ffffff;" data-darkreader-inline-color="">}</span><br />
<span style="color: #75715e;" data-darkreader-inline-color=""># Aviso qué paquete encontré:</span><br />
<span style="color: #f6aa11;" data-darkreader-inline-color="">puts</span> <span style="color: #e6db74;" data-darkreader-inline-color="">"Encontrado </span><span style="color: #e6db74;" data-darkreader-inline-color="">#{</span><span style="color: #ffffff;" data-darkreader-inline-color="">package</span><span style="color: #ffffff;" data-darkreader-inline-color="">[</span><span style="color: #e6db74;" data-darkreader-inline-color="">'name'</span><span style="color: #ffffff;" data-darkreader-inline-color="">]</span><span style="color: #e6db74;" data-darkreader-inline-color="">}</span><span style="color: #e6db74;" data-darkreader-inline-color="">"<br />
</span><span data-darkreader-inline-color=""># Obtengo la dirección para descargar el paquete, que está en el mismo JSON:</span><br />
<span style="color: #ffffff;" data-darkreader-inline-color="">deb_file</span> <span style="color: #f92672;" data-darkreader-inline-color="">=</span> <span style="color: #ffffff;" data-darkreader-inline-color="">package</span><span style="color: #ffffff;" data-darkreader-inline-color="">[</span><span style="color: #e6db74;" data-darkreader-inline-color="">'browser_download_url'</span><span style="color: #ffffff;" data-darkreader-inline-color="">]</span></p>
<p><span style="color: #ffffff;" data-darkreader-inline-color="">filename</span> <span style="color: #f92672;" data-darkreader-inline-color="">=</span> <span style="color: #ffffff;" data-darkreader-inline-color="">package</span><span style="color: #ffffff;" data-darkreader-inline-color="">[</span><span style="color: #e6db74;" data-darkreader-inline-color="">'name'</span><span style="color: #ffffff;" data-darkreader-inline-color="">]</span><br />
<span style="color: #75715e;" data-darkreader-inline-color=""># En estas líneas descargo el paquete .deb</span><br />
<span style="color: #75715e;" data-darkreader-inline-color=""># Lo guardo a un archivo con el mismo nombre (ej: navidrome_0.61.2_linux_arm64.deb)</span><br />
<span style="color: #66d9ef;" data-darkreader-inline-color="">File</span><span style="color: #ffffff;" data-darkreader-inline-color="">.</span><span style="color: #a6e22e;" data-darkreader-inline-color="">open</span><span style="color: #ffffff;" data-darkreader-inline-color="">(</span><span style="color: #ffffff;" data-darkreader-inline-color="">filename</span><span style="color: #ffffff;" data-darkreader-inline-color="">,</span> <span style="color: #e6db74;" data-darkreader-inline-color="">'w'</span><span style="color: #ffffff;" data-darkreader-inline-color="">)</span> <span style="color: #f92672;" data-darkreader-inline-color="">do</span> <span style="color: #f92672;" data-darkreader-inline-color="">|</span><span style="color: #ffffff;" data-darkreader-inline-color="">downloaded_file</span><span style="color: #f92672;" data-darkreader-inline-color="">|</span><br />
&nbsp;&nbsp;<span style="color: #66d9ef;" data-darkreader-inline-color="">URI</span><span style="color: #ffffff;" data-darkreader-inline-color="">.</span><span style="color: #a6e22e;" data-darkreader-inline-color="">open</span><span style="color: #ffffff;" data-darkreader-inline-color="">(</span><span style="color: #ffffff;" data-darkreader-inline-color="">deb_file</span><span style="color: #ffffff;" data-darkreader-inline-color="">,</span> <span style="color: #e6db74;" data-darkreader-inline-color="">'rb'</span><span style="color: #ffffff;" data-darkreader-inline-color="">)</span> <span style="color: #f92672;" data-darkreader-inline-color="">do</span> <span style="color: #f92672;" data-darkreader-inline-color="">|</span><span style="color: #ffffff;" data-darkreader-inline-color="">artifact_file</span><span style="color: #f92672;" data-darkreader-inline-color="">|</span><br />
&nbsp;&nbsp;<span style="color: #ffffff;" data-darkreader-inline-color="">downloaded_file</span><span style="color: #ffffff;" data-darkreader-inline-color="">.</span><span style="color: #a6e22e;" data-darkreader-inline-color="">write</span><span style="color: #ffffff;" data-darkreader-inline-color="">(</span><span style="color: #ffffff;" data-darkreader-inline-color="">artifact_file</span><span style="color: #ffffff;" data-darkreader-inline-color="">.</span><span style="color: #a6e22e;" data-darkreader-inline-color="">read</span><span style="color: #ffffff;" data-darkreader-inline-color="">)</span><br />
&nbsp;&nbsp;<span style="color: #f92672;" data-darkreader-inline-color="">end</span><br />
<span style="color: #f92672;" data-darkreader-inline-color="">end</span></p>
<p><span style="color: #75715e;" data-darkreader-inline-color="">#Después puedo usar dpkg -i para instalarlo:</span><br />
<span style="color: #e6db74;" data-darkreader-inline-color="">`sudo dpkg -i </span><span style="color: #e6db74;" data-darkreader-inline-color="">#{</span><span style="color: #ffffff;" data-darkreader-inline-color="">filename</span><span style="color: #e6db74;" data-darkreader-inline-color="">}</span><span style="color: #e6db74;" data-darkreader-inline-color="">`</span></p>
</div>
<p>Obviamente no todo es tan fácil en la vida como escribir un script Ruby y ya está. En la Raspberry Pi tenía la versión de Ruby del sistema, que era bastante antigua. Creo que algo no anduvo de primera, y pensé "<em>bueno, puedo editarlo para que funcione con un Ruby más viejo, tampoco es un código tan complejo</em>". Pero decidí que era hora de tener un gestor de Rubíes en mi Raspberry Pi. La uso para tanta cosa, que quiero tener la libertad de escribirle scripts en Ruby cuando necesite.</p>
<p>Así que en eso me puse a instalar <em>rbenv</em> en la Raspberry Pi y <em>ruby-build</em> desde git para poder instalar Ruby 4. Mientras tanto, me puse a probar de implementar el mismo script con Bash. En algún momento me di por vencido porque sabía lo que necesitaba pero no sabía cómo hacerlo con <code>jq</code>.</p>
<p><code>jq</code>es como <code>sed</code>pero para JSON. Se puede hacer un montón de cosas al estilo <code>awk</code>, <code>grep</code> y <code>sed</code>pero con JSON. El tema que no lograba encontrar el código exacto que me permitiera hacer el equivalente a <code><span data-darkreader-inline-color="">package</span> <span data-darkreader-inline-color="">=</span> <span data-darkreader-inline-color="">data</span><span data-darkreader-inline-color="">[</span><span data-darkreader-inline-color="">'assets'</span><span data-darkreader-inline-color="">].</span><span data-darkreader-inline-color="">find</span> <span data-darkreader-inline-color="">{</span> <span data-darkreader-inline-color="">|</span><span data-darkreader-inline-color="">a</span><span data-darkreader-inline-color="">|</span> <span data-darkreader-inline-color="">a</span><span data-darkreader-inline-color="">[</span><span data-darkreader-inline-color="">'name'</span><span data-darkreader-inline-color="">].</span><span data-darkreader-inline-color="">match?</span><span data-darkreader-inline-color="">(</span><span data-darkreader-inline-color="">/arm64\.deb/</span><span data-darkreader-inline-color="">)</span> <span data-darkreader-inline-color="">}</span></code> en Ruby.</p>
<p>A todo esto estaba charlando con mi amigo Gonza, con el que siempre charlamos de éstas cosas, sobretodo cuando estamos haciendo algo copado. ¿Ustedes no hablan con sus amigues de los scripts que están escribiendo? ¿O de sus Raspberry Pis? ¿No usan XMPP? Bueno, problemas tenemos todos. En eso Gonza encuentra la sintaxis que preciso para que ande el <code>jq</code> y lo <a href="https://mastodon.online/@picandocodigo/116144947227735790">comento online</a>. Lo comparto acá porque la respuesta que se mandó Gonza es digna de ser compartida: <em>siempre distrayendo de lo que importa, estoy para trabajar en los medios</em> (<a href="https://mastodon.uy/@grilix/116144954356460419" target="_blank" rel="noopener nofollow">enlace</a>, síganlo y denle "favorito").</p>
<p>Y con la pieza que faltaba, quedó el script en Bash:</p>
<div class="codigo">
<p><span style="color: #75715e;" data-darkreader-inline-color="">#!/bin/bash</span></p>
<p><span style="color: #f6aa11;" data-darkreader-inline-color="">set</span> <span style="color: #f92672;" data-darkreader-inline-color="">-eo</span> pipefail</p>
<p><span style="color: #75715e;" data-darkreader-inline-color=""># Primero descargo la información del release con curl</span><br />
<span style="color: #75715e;" data-darkreader-inline-color=""># Se la pipeo a jq que filtra el nombre del paquete de la arquitectura que preciso y .deb</span><br />
<span style="color: #75715e;" data-darkreader-inline-color=""># Lo guardo en la variable DATA</span><br />
<span style="color: #ffffff;" data-darkreader-inline-color="">DATA</span><span style="color: #f92672;" data-darkreader-inline-color="">=</span><span style="color: #e6db74;" data-darkreader-inline-color="">`</span>curl <span style="color: #e6db74;" data-darkreader-inline-color="">'https://api.github.com/repos/navidrome/navidrome/releases/latest'</span> | jq <span style="color: #f92672;" data-darkreader-inline-color="">-c</span> <span style="color: #e6db74;" data-darkreader-inline-color="">'.assets[]|select(.name | contains("arm64.deb"))'</span><span style="color: #e6db74;" data-darkreader-inline-color="">`</span><br />
<span style="color: #75715e;" data-darkreader-inline-color=""># Saco el nombre del paquete</span><br />
<span style="color: #ffffff;" data-darkreader-inline-color="">NAME</span><span style="color: #f92672;" data-darkreader-inline-color="">=</span><span style="color: #e6db74;" data-darkreader-inline-color="">`</span><span style="color: #f6aa11;" data-darkreader-inline-color="">echo</span> <span style="color: #ffffff;" data-darkreader-inline-color="">$DATA</span> | jq <span style="color: #f92672;" data-darkreader-inline-color="">-r</span> <span style="color: #e6db74;" data-darkreader-inline-color="">'.["name"]'</span><span style="color: #e6db74;" data-darkreader-inline-color="">`</span><br />
<span style="color: #f6aa11;" data-darkreader-inline-color="">echo</span> <span style="color: #e6db74;" data-darkreader-inline-color="">"Found </span><span style="color: #ffffff;" data-darkreader-inline-color="">$NAME</span><span style="color: #e6db74;" data-darkreader-inline-color="">"</span><br />
<span style="color: #75715e;" data-darkreader-inline-color=""># Obtengo la dirección para descargar el paquete, que está en el mismo JSON:</span><br />
<span style="color: #ffffff;" data-darkreader-inline-color="">PACKAGE</span><span style="color: #f92672;" data-darkreader-inline-color="">=</span><span style="color: #e6db74;" data-darkreader-inline-color="">`</span><span style="color: #f6aa11;" data-darkreader-inline-color="">echo</span> <span style="color: #ffffff;" data-darkreader-inline-color="">$DATA</span> | jq <span style="color: #f92672;" data-darkreader-inline-color="">-r</span> <span style="color: #e6db74;" data-darkreader-inline-color="">'.browser_download_url'</span><span style="color: #e6db74;" data-darkreader-inline-color="">`</span><br />
<span style="color: #f6aa11;" data-darkreader-inline-color="">echo</span> <span style="color: #e6db74;" data-darkreader-inline-color="">"Downloading </span><span style="color: #ffffff;" data-darkreader-inline-color="">$PACKAGE</span><span style="color: #e6db74;" data-darkreader-inline-color="">"</span><br />
<span style="color: #75715e;" data-darkreader-inline-color=""># Descargo:</span><br />
wget <span style="color: #f92672;" data-darkreader-inline-color="">-q</span> <span style="color: #ffffff;" data-darkreader-inline-color="">$PACKAGE</span></p>
<p><span style="color: #f6aa11;" data-darkreader-inline-color="">echo<br />
read</span> <span style="color: #f92672;" data-darkreader-inline-color="">-p</span> <span style="color: #e6db74;" data-darkreader-inline-color="">"Install </span><span style="color: #ffffff;" data-darkreader-inline-color="">$NAME</span><span style="color: #e6db74;" data-darkreader-inline-color="">? [y/N] "</span> <span style="color: #f92672;" data-darkreader-inline-color="">-n</span> 1 <span style="color: #f92672;" data-darkreader-inline-color="">-r</span><br />
<span style="color: #f6aa11;" data-darkreader-inline-color="">echo<br />
</span><span style="color: #f92672;" data-darkreader-inline-color="">if</span> <span style="color: #f92672;" data-darkreader-inline-color="">[[</span> <span style="color: #ffffff;" data-darkreader-inline-color="">$REPLY</span> <span style="color: #f92672;" data-darkreader-inline-color="">=</span>~ ^[Yy]<span style="color: #ffffff;" data-darkreader-inline-color="">$ </span><span style="color: #f92672;" data-darkreader-inline-color="">]]</span><br />
<span style="color: #f92672;" data-darkreader-inline-color="">then<br />
&nbsp;&nbsp;</span><span style="color: #f6aa11;" data-darkreader-inline-color="">echo</span> <span style="color: #e6db74;" data-darkreader-inline-color="">"Installing </span><span style="color: #ffffff;" data-darkreader-inline-color="">$NAME</span><span style="color: #e6db74;" data-darkreader-inline-color="">"</span><br />
&nbsp;&nbsp;<span style="color: #f6aa11;" data-darkreader-inline-color="">sudo </span>dpkg <span style="color: #ffffff;" data-darkreader-inline-color="">$NAME</span><br />
<span style="color: #f92672;" data-darkreader-inline-color="">fi</span></p>
</div>
<p>Ahí queda de referencia para quien le pueda venir bien (y para mí cuando me olvide cómo hacer alguna de estas cosas).</p>El post <a href="https://picandocodigo.net/2026/scripts-para-actualizar-navidrome/">Scripts para actualizar Navidrome</a> fue publicado originalmente en <a href="https://picandocodigo.net">Picando Código</a>.]]></content:encoded>
					
					<wfw:commentRss>https://picandocodigo.net/2026/scripts-para-actualizar-navidrome/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Nuevo comando git history para modificar commits en git</title>
		<link>https://picandocodigo.net/2026/nuevo-comando-git-history-para-modificar-commits-en-git/</link>
					<comments>https://picandocodigo.net/2026/nuevo-comando-git-history-para-modificar-commits-en-git/#respond</comments>
		
		<dc:creator><![CDATA[Fernando]]></dc:creator>
		<pubDate>Thu, 30 Apr 2026 08:30:08 +0000</pubDate>
				<category><![CDATA[Control de versiones]]></category>
		<category><![CDATA[control de versiones]]></category>
		<category><![CDATA[git]]></category>
		<guid isPermaLink="false">https://picandocodigo.net/?p=18671</guid>

					<description><![CDATA[<p>Recientemente se publicó la versión 2.54 de Git, el sistema de control de versiones distribuido. Esta incluye un comando nuevo experimental git history que permite cambiar el texto de un commit en la historia, o dividirlo. Al ser experimental, el comportamiento puede cambiar en versiones futuras. Pero por el momento lo podemos usar como comento por acá. En lo personal estoy muy acostumbrado a usar git rebase para cambiar la historia de un repositorio. Entrando a un rebase interactivo con git rebase -i se puede elegir el commit y hacer un reword para cambiar el mensaje o edit para dividirlo, [&#8230;]</p>
El post <a href="https://picandocodigo.net/2026/nuevo-comando-git-history-para-modificar-commits-en-git/">Nuevo comando git history para modificar commits en git</a> fue publicado originalmente en <a href="https://picandocodigo.net">Picando Código</a>.]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-14147" src="https://picandocodigo.net/wp-content/uploads/2021/05/git.jpg" alt="Git" width="1000" height="563" srcset="https://picandocodigo.net/wp-content/uploads/2021/05/git.jpg 1000w, https://picandocodigo.net/wp-content/uploads/2021/05/git-300x169.jpg 300w, https://picandocodigo.net/wp-content/uploads/2021/05/git-768x432.jpg 768w, https://picandocodigo.net/wp-content/uploads/2021/05/git-600x338.jpg 600w, https://picandocodigo.net/wp-content/uploads/2021/05/git-900x507.jpg 900w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></p>
<p>Recientemente <a href="https://gitlab.com/git-scm/git/-/blob/HEAD/Documentation/RelNotes/2.54.0.adoc" target="_blank" rel="nofollow noopener">se publicó la versión 2.54 de Git</a>, el sistema de control de versiones distribuido. Esta incluye un comando nuevo <strong>experimental</strong> <code>git history</code> que permite cambiar el texto de un commit en la historia, o dividirlo.</p>
<p>Al ser experimental, el comportamiento puede cambiar en versiones futuras. Pero por el momento lo podemos usar como comento por acá.</p>
<p>En lo personal estoy muy acostumbrado a usar <code>git rebase</code> para cambiar la historia de un repositorio. Entrando a un rebase interactivo con <code>git rebase -i</code> se puede elegir el commit y hacer un <code>reword</code> para cambiar el mensaje o <code>edit</code> para dividirlo, entre otras cosas. El objetivo de <code>history</code> es hacer que esta tarea sea más fácil. Tengo tan memorizados los comando git que uso a menudo que me va a costar, pero estoy intentando probar git history.</p>
<p>Para explicar estos comandos, voy a usar de ejemplo el código de <a href="https://codeberg.org/picandocodigo/ci_uy" rel="noopener nofollow " target="_blank">ci_uy</a>. En la consola ejecuto <abbr title="log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative"><code>git lg</code></abbr> y veo lo siguiente:</p>
<div class="codigo">* 17400f2 - (HEAD -&gt; git_nuevo, origin/main, local/main, codeberg/main, main) Amerita un salto de versión menor. (4 months ago)<br />
* 5f916fb - Corrige teclazo accidental (4 months ago)<br />
* d4606fa - Actualiza encabezado de licencia, metadata de gema (4 months ago)<br />
* 52a9430 - Actualiza el CHANGELOG (4 months ago)<br />
* ae7b104 - Actualiza README (4 months ago)</div>
<p>Primero veo cómo cambiar un mensaje de commit con <code>git history reword</code>. Supongamos que quiero cambiar el texto del commit <code>5f916fb</code> (<em>Corrige teclazo accidental</em>). Ejecuto:</p>
<div class="codigo">$ git history reword 5f916fb</div>
<p>Esto llama el editor de texto configurado en el sistema (en mi caso <a href="https://picandocodigo.net/software-libre/emacs/" target="_blank" rel="noopener">Emacs</a>, siempre Emacs...) con el texto del commit: "Corrige teclazo accidental". Le agrego un punto al final, guardo, y quedó editado el mensaje. Los hash de éste commit y los siguientes se actualizan:</p>
<div class="codigo">* ea10324 - (HEAD -&gt; git_nuevo, main) Amerita un salto de versión menor. (4 months ago) &lt;Fernando Briano&gt;<br />
* 648c6f8 - Corrige teclazo accidental. (4 months ago) &lt;Fernando Briano&gt;</div>
<p>Para probar <code>git history split</code>, podemos usar de ejemplo el commit <code>d4606fa</code> que tiene dos cambios (<em>Actualiza encabezado de licencia, metadata de gema</em>). Ejecuto:</p>
<div class="codigo">$ git history split d4606fa</div>
<p>Esto nos muestra el comando interactivo de Git donde van apareciendo todos los cambios del commit. Nos pregunta qué queremos hacer con cada uno (a efectos de esta acción, si incluirlo o no). Lo primero que me aparece es el cambio de licencia, así que lo agrego y hago un commit con esa parte sóla:</p>
<div class="codigo">$ git history split d4606fa<br />
<span style="color: #7cafc2;;font-weight: bold">diff --git a/LICENSE b/LICENSE<br />
index a5c2088..1cdb3ad 100644<br />
</span><span style="color: #ab4642">--- a/LICENSE<br />
</span><span style="color: #a1b56c">+++ b/LICENSE<br />
</span><span style="color: #d8d8d8">@@ -1,5 +1,5 @@</span><br />
<span style="color: #d8d8d8">CiUY - A gem to validate Uruguayan Identity Documents (Cedula de Identidad Uruguaya)<br />
</span><span style="color: #ab4642">-Copyright (C) 2013-2019 Fernando Briano<br />
</span><span style="color: #a1b56c">+Copyright (C) 2013 Fernando Briano<br />
</span><br />
<span style="color: #d8d8d8">&nbsp;GNU LESSER GENERAL PUBLIC LICENSE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Version 2.1, February 1999</span><br />
(1/1) Stage this hunk [y,n,q,a,d,?]?</div>
<p>Respondo que no a todos los cambios que le siguen y git me vuelve a mostrar Emacs para agregar un nuevo mensaje de commit. Me trae el mensaje viejo "<em>Actualiza encabezado de licencia, metadata de gema</em>". Así que borro todo lo que está después de la coma y guardo. Al guardar y cerrar, aparece nuevamente el editor de texto con el mismo mensaje anterior. Este va a ser el mensaje de commit del resto de los cambios, así que escribo "<em>Actualiza metadata de gema</em>." y guardo y cierro. El nuevo estado de la historia:</p>
<div class="codigo">* 45aa718 - (HEAD -&gt; git_nuevo, main) Amerita un salto de versión menor. (4 months ago)<br />
* d091ac1 - Corrige teclazo accidental. (4 months ago)<br />
* 2c19741 - Actualiza metadata de gema. (4 months ago)<br />
* dfba80c - Actualiza encabezado de licencia. (4 months ago)</div>
<p>Son comandos bastante prácticos, creo que sí terminan ahorrando tiempo. Veremos si me termino de acostumbrar o sigo usando <code>git rebase -i</code> por costumbre. Tendré que estar atento para ver cómo evoluciona git history. Para empezar a usarlo, podemos instalar la versión 2.54 de git en nuestro sistema.</p>
<h3>Instalar la versión más reciente de git</h3>
<p>Si usamos alguna distribución Linux basada en Debian, podemos agregar un PPA oficial que ofrece la última versión estable de Git:</p>
<div class="codigo"># add-apt-repository ppa:git-core/ppa<br />
# apt update; apt install git</div>
<p>En <a href="https://git-scm.com/install/linux" target="_blank" rel="noopener nofollow">la página de instalación</a> hay información para más distribuciones Linux y otros sistemas operativos: Fedora, Gentoo, openSUSE, Mageia, Nix/NixOS, FreeBSD, Solaris, OpenBSD, Alpine, Red Hat, Slitaz y más. Como es habitual, también podemos compliar la versión más reciente desde el código fuente.</p>El post <a href="https://picandocodigo.net/2026/nuevo-comando-git-history-para-modificar-commits-en-git/">Nuevo comando git history para modificar commits en git</a> fue publicado originalmente en <a href="https://picandocodigo.net">Picando Código</a>.]]></content:encoded>
					
					<wfw:commentRss>https://picandocodigo.net/2026/nuevo-comando-git-history-para-modificar-commits-en-git/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Haggis Ruby 2026 - Glasgow, Escocia</title>
		<link>https://picandocodigo.net/2026/haggis-ruby-2026-glasgow-escocia/</link>
					<comments>https://picandocodigo.net/2026/haggis-ruby-2026-glasgow-escocia/#respond</comments>
		
		<dc:creator><![CDATA[Fernando]]></dc:creator>
		<pubDate>Wed, 29 Apr 2026 10:00:23 +0000</pubDate>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Conferencia]]></category>
		<category><![CDATA[Escocia]]></category>
		<category><![CDATA[Haggis Ruby]]></category>
		<guid isPermaLink="false">https://picandocodigo.net/?p=18631</guid>

					<description><![CDATA[<p>Después de la primera edición de Haggis Ruby en Edimburgo en 2024, volvió en 2026. Se realizó durante 2 días el jueves 23 y viernes 24 de abril. Esta vez se mudó a la ciudad de Glasgow. La sede fue thestudio, en el 8° y 9° piso de un edificio sobre la calle Hope, enfrente a la Estación Central de Glasgow. Día 1 El primer día llegué un poco tarde. Calculé mal los tiempos y me fijé los horarios de los trenes muy tarde. Viajé desde Edimburgo a la estación de Queen Street, que queda a unos pocos minutos de [&#8230;]</p>
El post <a href="https://picandocodigo.net/2026/haggis-ruby-2026-glasgow-escocia/">Haggis Ruby 2026 - Glasgow, Escocia</a> fue publicado originalmente en <a href="https://picandocodigo.net">Picando Código</a>.]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="alignright size-full wp-image-18641" src="https://picandocodigo.net/wp-content/uploads/2026/04/haggis-ruby.jpg" alt="Haggis Ruby 2026" width="200" height="450" srcset="https://picandocodigo.net/wp-content/uploads/2026/04/haggis-ruby.jpg 200w, https://picandocodigo.net/wp-content/uploads/2026/04/haggis-ruby-133x300.jpg 133w" sizes="auto, (max-width: 200px) 100vw, 200px" />Después de la primera edición de <a href="https://picandocodigo.net/2024/haggis-ruby-2024-edimburgo-escocia/">Haggis Ruby en Edimburgo en 2024</a>, volvió en 2026. Se realizó durante 2 días el jueves 23 y viernes 24 de abril. Esta vez se mudó a la ciudad de Glasgow. La sede fue <em>thestudio</em>, en el 8° y 9° piso de un edificio sobre la calle Hope, enfrente a la Estación Central de Glasgow.</p>
<h3>Día 1</h3>
<p>El primer día llegué un poco tarde. Calculé mal los tiempos y me fijé los horarios de los trenes muy tarde. Viajé desde Edimburgo a la estación de Queen Street, que queda a unos pocos minutos de la Central. Había una calle cerrada por un incendio grande que hubo recientemente. Sabía de esto y la organización incluso en alguna de las comunicaciones nos lo recordó. Pero a la hora de planear la ruta más eficiente posible para caminar hasta el lugar, me olvidé. Eventualmente me encontré en la calle Esperanza.</p>
<p>Cuestión que una vez que llegué y me acredité, ya había empezado la primera charla: <strong>What happened to RubyGems and what can we learn?</strong> (<em>¿qué pasó con RubyGems y qué podemos aprender?</em>) por <strong>Mike McQuaid</strong>. Me quedé afuera porque la idea de entrar a la sala e interrumpir la charla o que todo el mundo me quedara mirando porque llego tarde me causó mucha ansiedad. Una vez que conocí el lugar un poco mejor me di cuenta que no era para tanto. Pero bueno, así es la ansiedad.</p>
<p>Por suerte la charla también fue presentada en Fosdem 2026, y <a href="https://mikemcquaid.com/talks/what-happened-to-rubygems-and-what-can-we-learn/" target="_blank" rel="noopener">está online en el sitio web de Mike McQuaid</a>. Imagino que de repente fue parecida, aunque con un público más familiarizado con en el tema. No había espacio para preguntas entre las charlas, así que tampoco es que hubiera generado discusión ni nada. Pero en el enlace está el video a la charla de Fosdem que imagino es similar.</p>
<p>La segunda charla estuvo a cargo de <strong>Jess Sullivan</strong>: <strong>How I Upgraded Rails (and Only Broke Production Once)</strong> (<em>Cómo actualicé Rails [Y sólo rompí producción una vez]</em>). Estuvo interesante, comentó su experiencia y los pasos a dar para actualizar Rails a "Rails edge", la última versión. Recomendó ir subiendo de una versión menor a la vez (ej.: 7.0 a 7.1), tener muchos tests, saber cómo revertir código puesto en producción y más. Acá fue una de las pocas veces que escuché "Podés usar AI para esto", pero hablaré más del tema más adelante.</p>
<p><strong>Developer skills worth learning when AI can write code</strong> (<em>Habilidades de desarrollo que valen la pena aprender cuando "AI" puede escribir código</em>) por <strong>Sue Smith</strong> me gustó mucho. Al tener esas dos letras juntas en el título, "<em>AI</em>", mi primera reacción es de rechazo. Pero fue una charla muy equilibrada e interesante. Comentó cómo es importante reconocer que lo que estamos viendo entorno al término "<em>AI</em>" es marketing. Que a la vez genera un estado de miedo por nuestros trabajos y se usa mucho como excusa para hacer despidos masivos. La utilidad y el impacto de los <abbr title="Modelos extensos de lenguaje, Large Language Models">LLMs</abbr> varía muchísimo.</p>
<p>Están surgiendo patrones. La forma en que se está imponiendo en la industria hace que personas en una etapa temprana de sus carreras no vayan a adquirir las habilidades que necesitan. Esto genera una brecha en la comprensión a nivel de un proyecto. Puede ser un factor en cortes de servicio, problemas de seguridad, mitigación más lenta de incidentes.</p>
<p>La idea que escribir código no es necesario gracias a los LLMs tiene una desconexión con las habilidades implícitas. En esta parte me resultó súper interesante aprender sobre las habilidades implícitas, que uno no siempre es consciente de tenerlas. Mencionó por ejemplo conducir y llegar a un lugar sin necesariamente recordar el camino hasta ahí. Son habilidades que se vuelven persistentes.&nbsp;</p>
<p>La habilidad es algo repetible. Por eso tratar a los prompts como abstracción es problemático. La salida de un LLM no es repetible, no es un sistema idempotente. Habló de varias cosas desde un punto de vista pedagógico, cómo revelar nuestras suposiciones lleva a conocimiento compartido. La metacognición, ser consciente de nuestros procesos de pensamiento y patrones. Los LLMs facilitan evitar aprender, pero también presentan oportunidades. Hay bastante pedagogía en la programación que podría ser complementada con LLMs.</p>
<p>Hay un balance en cuan profundo hay que entrar en el código para enseñar/aprender algo y qué se podría delegar. Generar código puede ser contraproducente porque escribir el código es parte de explorar el problema. Hay valor en el proceso, no sólo en el artefacto que se produce. A veces hay un valor oculto que se pierde, el código actúa como una representacion compartida de un sistema que nos permite razonar y actuar sobre él de forma confiable. Es un lugar valioso para construir modelos mentales.</p>
<p>Sue Smith comenta sobre esta charla <a href="https://www.sue.codes/blog/oneanswer/" target="_blank" rel="noopener">en su blog</a>, y ahí también se encuenta un enlace a la presentación con las notas y todo. Ah, y ya tenía varias razones para hacerlo, pero creo que me terminó de convencer que tengo que mirar The Golden Girls.</p>
<p><strong>Aji Slater</strong> de thoughtbot dió una charla titulada <strong>How to build a haunted house</strong> (<em>Cómo construir una casa embrujada</em>). Cuando empezó la charla, no tenía ni idea dónde iba a llegar. Durante los primeros minutos recorrió la historia de un rifle Winchester, <em>Winchester 73</em> si no recuerdo mal. Pero todo cobró sentido cuando desencadenó en Sarah Winchester, cuya residencia es conocida como la <a href="https://es.wikipedia.org/wiki/Mansi%C3%B3n_Winchester" target="_blank" rel="nofollow noopener">Mansión Winchester</a> (y la conexión con el arma viene por ser la viuda del magnate dueño de la empresa Winchester).&nbsp;</p>
<p>Acá se mencionó <a href="https://picandocodigo.net/tag/dragonruby/">DragonRuby</a>, una de mis herramientas preferidas en Ruby. Me sentí muy identificado con la razón para usar DragonRuby. Aji entró a despotricar contra el estado general de las cosas (me encantaría poder citar textualmente esta parte, porque empecé a sonreír como un idiota mientras escuchaba) y cómo DragonRuby es como una escapatoria que te hace recordar por qué te gusta la programación.</p>
<p>Hace unos años en un Bootcamp implementó con su equipo un juego en JavaScript. En el juego implementaron una casa embrujada con cuartos generados de manera procedimental. Decidió volver a ese proyecto y reimplementarlo con DragonRuby. Durante la charla habló de los distintos algoritmos para crear un juego procedimental y mostró ejemplos de código. Estuvo muy buena y muy interesante, y siempre me alegro cuando veo DragonRuby en una conferencia.</p>
<p>Acá cortamos para ir a almorzar. Terminé yendo a almorzar a un lugar de comida mexicana con mi amigo Peter y un grupo de gente que tuve el gusto de conocer en el momento. Las charlas durante el almuerzo estuvieron muy buenas. Terminé hablando con alguien con quien resulté tener una conexión laboral y aprendí un poco más de la génesis de cosas que eventualmente definieron mi historia laboral. Muy meta, interesante.</p>
<div id="attachment_18643" style="width: 1010px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-18643" class="wp-image-18643 size-full" src="https://picandocodigo.net/wp-content/uploads/2026/04/vista.jpg" alt="La vista desde una de las ventanas del edificio donde se realizó la conferencia. Se ve un cielo azul y los techos de algunos edificios de la ciudad de Glasgow." width="1000" height="563" srcset="https://picandocodigo.net/wp-content/uploads/2026/04/vista.jpg 1000w, https://picandocodigo.net/wp-content/uploads/2026/04/vista-300x169.jpg 300w, https://picandocodigo.net/wp-content/uploads/2026/04/vista-768x432.jpg 768w, https://picandocodigo.net/wp-content/uploads/2026/04/vista-600x338.jpg 600w, https://picandocodigo.net/wp-content/uploads/2026/04/vista-900x507.jpg 900w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /><p id="caption-attachment-18643" class="wp-caption-text">La vista desde una de las ventanas del edificio donde se realizó la conferencia</p></div>
<p>A la vuelta del almuerzo hubo un panel con <strong>James Bell</strong>, uno de los organizadores de la conferencia, como moderador. Los participantes fueron oradores que estuvieran de alguna forma conectados al tema de comunidad, organizando eventos y grupos: <strong>Hana Harencarova</strong>, <strong>Jess Sullivan</strong>, <strong>Murray Steele</strong> y <strong>Peter Aitken</strong>. Hablaron de algunas de las motivaciones, desafíos y otros aspectos de trabajar en formar comunidad.</p>
<p>Las motivaciones van desde devolver a la comunidad, conocer gente que está haciendo lo mismo e intercambiar ideas, opiniones, etcétera. Una de las recompensas, si bien no va a ser la misma experiencia para todo el mundo, es conseguir trabajo, o conexiones que eventualmente nos sirvan para conseguir trabajo.</p>
<p>Uno de los grandes desafíos es traer más gente a una comunidad, y particularmente llegar a grupos más diversos de gente. También se habló sobre el burnout, o quemarse con el trabajo. Es difícil balancear trabajo con familia, tiempo libre y además hacer este otro trabajo que en la mayoría de los casos no es pago. Me da la impresión que las intenciones son buenas, como resultado comunidades entorno a Ruby que siguen siendo amigables, amables y acogedoras.</p>
<p><strong>Carme Mias</strong> presentó <strong>Under the hood - exploring digital assistive technology</strong>&nbsp; (<em>bajo el capó - explorando tecnología de asistencia digital</em>). Comenzó con una cifra, el 24% de las personas que trabajan en el Reino Unido tiene una discapacidad. La accesibilidad otorga la habilidad a personas con discapacidad a acceder a las cosas. Aprendí que los sistemas operativos tienen sus APIs de asistencia y las aplicaciones acceden a esta API. Mostró ejemplos de cómo funcionan los lectores de pantalla en distintos navegadores web y mencionó la importancia del text Alt en las imágenes.</p>
<p>Fue una charla muy interesante para aprender más del tema. Hace mucho que no hago desarrollo web, pero debería dedicarle un tiempo a aprender más sobre accesibilidad y empezar a implementar cosas en este blog mismo. Carmen compartió un enlace a <a href="https://www.w3.org/WAI/" target="_blank" rel="nofollow noopener">Web Accessibility Initiative de la W3C</a> que puede resultar interesante para empezar a darle más atención al tema en el desarrollo web.</p>
<p><strong>Donal McBreen</strong> habló sobre <strong>Making Solid Cache the Rails Default</strong> (<em>haciendo Solid Cache el por defecto en Rails</em>). Fue una charla bastante técnica. Aprendimos sobre la biblioteca Solid Cache, cómo surgió la idea, la política de eliminar caché antiguo con FIFO y los desafíos con los que se encontraron.</p>
<p>A eso de las 17:00 terminó el primer día de la conferencia. A las 19:00 estaba planeado un evento con <em>ceilidh</em> (pronunciado "keili") en Drygate, una cervecería de Glasgow. En gaélico escocés, <em>cèilidh</em> es como una visita, como caer en la casa de alguien a charlar (opcionalmente para contar historias y cuentos, tocar música o bailar). Pero el ceilidh moderno es un evento con baile donde una banda en vivo toca música folklórica y quien quiera puede bailar. Es muy divertido y no hay que saber bailar para participar. He ido a más de uno y creo que parte de la gracia es ir aprendiendo el baile y hacerlo mal, está la mayoría de la gente en la misma.</p>
<p>Estaba agotado y ya había tenido suficiente exposición social por el día. Así que me fui con un amigo de Glasgow a un pub para tomar unas pintas y ponernos al día. Estoy seguro que el ceilidh estuvo muy divertido y se pasó bien.</p>
<h3>Día 2</h3>
<p>El segundo día me preparé para salir con más tiempo y llegar temprano. En la mañana y entre las charlas habían recreos en la sala compartida. Podíamos nutrirnos con café, té, agua y algunas golosinas como galletitas, brownies y flapjacks (la traducción que se me ocurre es que son como unas barritas de cereales artesanales <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f937.png" alt="🤷" class="wp-smiley" style="height: 1em; max-height: 1em;" />). También estaban las mesas de sponsors, con stickers y demás elementos esponsorizados.</p>
<p>Como en la conferencia anterior, James pedía que durante los recreos siguiéramos la "regla de Pac-Man": Cuando charlamos en un grupo, no cerremos el círculo. Dejemos un lugar abierto, de manera que el grupo visto desde arriba se vería como la forma de Pac-Man. Así dejamos lugar para cualquier persona que se quiera unir a la conversación. Y cuando una persona nueva se suma, asegurarnos de dejar otro lugar para darle la bienvenida a alguien más.</p>
<p><strong>Hana Harencarova</strong> dio la charla&nbsp;<strong>What working in a high-performing team taught me about shipping my own projects fast and while having fun</strong> (<em>Qué me enseñó sobre lanzar mis propios proyectos rápido y divirtiéndome trabajar en un equipo de alto rendimiento</em>). Hana trabaja en un equipo distribuido en GitHub. Con "equipo de alto rendimiento" se refería a un equipo eficiente que también se toma su tiempo para descansar y hacer cosas fuera del trabajo, no que trabajen 80 horas por semana. Tienen el concepto de DRI - Directly responsible individual, como que cada parte del sistema tiene una persona que sabe qué hacer o dónde si pasa algo.</p>
<p>Hana contó de varios de sus proyectos personales implementados con Ruby. Muchos de ellos súper específicos a sus intereses. Hubo más instancias de esto en otras charlas, y la idea que con Ruby podemos hacer uso "personal" de la computadora escribiendo código para necesidades personales. Hana comentó que en una época de su vida leía las convenciones de estilo de Rubocop para irse a dormir <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f606.png" alt="😆" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p><strong>Colin Gemmell</strong> de FreeAgent habló de <strong>Replacing React with Hotwire for developer happiness</strong> (<em>reemplazando React con Hotwire para la felicidad de los desarrolladores</em>). Había tenido la oportunidad de ver una charla similar a ésta por Colin en uno de los meetups de ScotRUG. <a href="https://mastodon.online/@picandocodigo/115187627387804151" target="_blank" rel="nofollow noopener">En el momento</a> me dieron ganas de desarrollar cosas web para probar Hotwire. La charla fue técnica, compartiendo las experiencias y el objetivo de cambiar todo detrás de cámaras y que los usuarios ni noten el cambio.</p>
<p>Tuvieron una muy buena experiencia. Empezaron con Backbone + Handlebars, luego Backbone + React, después Redux + React. React no estaba funcionando para FreeAgent y Redux es muy complejo. Tenían serie de componentes que llevaba muchísimo trabajo cambiar en React. Casi enseguida después de migrar a Hotwire, otros equipos empezaron a actualizar cosas y trabajando en el frontend "se siente como trabajar en Rails".</p>
<p><strong>Murray Steele</strong> presentó la charla <strong>What's Ruby fo(u)r?</strong> (Un juego de palabras que puede leerse como "<em>¿Para qué es Ruby?</em>" y "<em>¿Qué es Ruby cuatro?</em>"). La idea era presentar lo nuevo en Ruby 4, pero repasando la historia de Ruby a nivel del lenguaje. Empezó con los proto rubies, las versiones antes de 1.0 que iban armando el lenguaje y definiendo cómo iba a ser en el futuro. Si no recuerdo mal (y entiendo las notas que escribí), habló de la evolución de los bloques y definición de métodos en Ruby 0.49 y 0.76.</p>
<p>Siguió recorriendo las versiones 1.x y los grandes cambios o características nuevas que aparecían en cada una. Saqué un montón de apuntes, pero creo que sería demasiada información para este post. Pero Murray tiene <a href="http://h-lame.com/talks/what-is-ruby-four/" target="_blank" rel="noopener">una página web con la presentación</a>. Promete tener la presentación entera con la transcripción en el futuro. Estuvo muy divertida y nostálgica. Hace muchos años que vengo prestando atención a Ruby.</p>
<p>Cerró con la idea que comenté más arriba de que Ruby es para uso personal de la computadora. Para manifestar nuestras ideas en la computadora, es un lenguaje optimizado para la felicidad humana, así que lo facilita. Comentó de varias aplicaciones también personales que desarrolló con Ruby. Entre ellas una que le dijera qué bebida tomar, lo que me hizo acordar a una aplicación que quería desarrollar para elegir qué tomar cuando iba a Ennis Pub en Tres Cruces hace muchos años. Por último, nos invitó a divertirnos con Ruby.</p>
<p><strong>Miranda Heath</strong> habló desde un punto de vista académico sobre <strong>Burnout in Open Source: a structural problem we can fix together</strong> (<em>Agotamiento en Código Abierto: un problema estructural que podemos arreglar juntos</em>). Creo que mucho de lo que habló de agotamiento también aplica al trabajo. Entre las señales de <em>burnout</em> (no sé si "agotamiento" significa exactamente lo mismo), está la clásica que algo que nos daba placer o alegría cambia a pavor. Con el agotamiento vienen la falta de motivación, fatiga, cinismo y negatividad, escapismo, humor negro y más.</p>
<p>En el mundo del código abierto mucho trabajo se hace por altruismo, pero varios factores aumentan las posibilidades de que alguien se canse y lo abandone. Los problemas que señaló fueron la (falta de) paga, la cantidad de trabajo y compromiso de tiempo, mantener código puede ser un trabajo poco graticicante y la hiper-responsabilidad en los proyectos. Me gustó la analogía de cómo un Pull Request es "free as in free puppy" (<em>gratis como en un cachorrito gratis</em>). Si alguien te regala un cachorro, es un regalo que tenés que cuidar por el resto de su vida. Los generadores de slop, LLMs, son también generadores de cachorros de regalo para proyectos de código abierto.</p>
<p>Las comunidades pueden resultar tóxicas, la gente actúa como si tuviera derechos o con exigencias. <a href="https://picandocodigo.net/2025/publicado-list-category-posts-v0-92-0-con-mejoras-en-seguridad/">He tenido experiencia con este tema</a> con mi plugin de WordPress. De acá surgió la duda de si Ruby era una comunidad tóxica, y hubo discusión al respecto más adelante.</p>
<p>Un punto importante que señaló es que "No es tu culpa". Algunas de las formas en las que podemos mejorar la situación es consiguiendo que la gente que trabaja en código abierto reciba remuneración adecuada. Mencionó <a href="https://opensourcepledge.com/" target="_blank" rel="noopener">Open Source Pledge</a>,un grupo de empesas con el compromiso de pagarle a desarrolladoras de software código abierto. Su objetivo es establecer un nuevo modelo social en la industria para dejar atrás el burnout y problemas de seguridad. También agregó que trabajemos juntos, colaboremos y compartamos la responsabilidad. Construyamos relaciones de mentoreo y particularmente compartamos el amor.</p>
<p>Cortamos para el almuerzo y a la vuelta había dos opciones. Una era el workshop <strong>Event Sourcing, but in Ruby</strong> por <strong>Ismael Celis</strong> con laptops en el piso 8. Yo asistí a la otra, una actividad al estilo Lean Coffee en el salón principal. Moderada por Colin Gemmel, se agregaron temas de conversación a un pizarrón con post-its. Después los votamos y se llegó a 4 temas a discutir. Nos dividíamos en dos grupos, conversábamos y después nos juntábamos para compartir las conclusiones. Los temas fueron los siguientes:</p>
<ul>
<li><em>Cambio de contexto</em> - discutimos varias formas de lidiar con el cambio de contexto en el trabajo. Se mencionó la técnica pomodoro y variaciones. Compartí mi experiencia porque el cambio de contexto es parte esencial de mi trabajo actual (y supongo que de muchos trabajos de programación). Comenté que no tengo ninguna técnica especial, simplemente escribo notas de las cosas para ir guiándome en lo que tengo para hacer. Pero mi aporte fue que en mi caso con la experiencia se ha ido haciendo un poco más fácil.</li>
<li><em>¿Deberíamos abandonar Rails?</em> Rails es el framework Ruby más popular. Pero su creador es un racista imundo supremacista blanco. Discutimos cómo usando Rails indirectamente le estamos dando poder y una plataforma para que vomite sus repugnantes puntos de vista. Hablamos de Hanami como alternativa, forkear el proyecto, pero no recuerdo si alcanzamos una conclusión específica.</li>
<li><em>¿Es Ruby (como comunidad) tóxica?</em> Hablamos de que la gente que se acerca a Ruby es generalmente creativa y apasionada. Así que se ha documentado mucho <a href="https://rubydramas.com/" target="_blank" rel="nofollow noopener">el drama</a> en la comunidad. Se bromeó sobre levantar los sitios para phpdramas.com, pythondramas.com, etc. Creo que el consenso fue que Ruby es una comunidad acogedora y de gente con buenas intenciones.</li>
<li><em>Comparte tu momento feliz de Ruby</em> - Para terminar en un punto alto, compartimos distintas experiencias relacionadas a Ruby que nos hicieron bien. Hubo más de una mención sobre cómo usando Ruby se pudo ayudar a otras personas a entrar en el desarrollo y conferencias. Cómo usar ciertas herramientas nos alegró, y demás. Buena manera positiva de cerrar la actividad.</li>
</ul>
<p>No sé si llegamos a demasiadas conclusiones, pero estuvo interesante conversar de estos temas.</p>
<p>La siguiente charla fue por mi amigo <strong>Peter Aitken</strong>: <strong>It’s a Kind of Magic: Shipping Rails Upgrades with Confidence</strong> <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" /> (<em>Es un tipo de magia, actualizando Rails con confianza</em>). Este es el tipo de charlas que nunca debe faltar en los eventos Ruby. No sólo por el contenido sino la forma en que fue presentada. James presentó a Peter mientras hablaba por teléfono con un tipo de "agente" y salió del salón mientras sonaba música de Queen. La pantalla mostraba dinámicamente con letras en una terminal cómo se iba cargando un "disfraz".</p>
<p>Al rato apareció Peter completamente transformado en Freddie Mercury con bigote y todo. Se repartieron bigotes falsos por todo el salón.</p>
<p>Como la charla tenía cosas en común con la charla de Jess Sullivan, Freddie dijo que iba a ser un cover de esa charla. Comentó cómo para actualizar versiones de Rails había que prepararse buscando la lista de cambios, guías y artículos sobre la versión a la que queremos migrar. Hacer una lista y fijarse si las cosas arrancan, si los tests pasan, si funciona en staging. Habló de la técnica de generar una rama nueva con la versión actualizada, y empezar a hacer backport de cambios necesarios a una rama basada en la principal, para ir viendo qué se rompe o no.&nbsp;</p>
<p>Muy divertida la charla, ¡que los eventos Ruby sigan siendo divertidos (y raros)!</p>
<p>El cierre estuvo a cargo de <strong>María Gutierrez</strong> con la charla <strong>I’ve seen this movie before: what three inflection points taught me about the only career strategy that works</strong> (<em>Esta película ya la vi antes: lo que me enseñaron 3 puntos de inflección sobre la únca estrategia que funciona para mi carrera</em>). Fue interesante escuchar sobre su involucramiento con Ruby y la comunidad desde muy temprano en la vida de Ruby.&nbsp;</p>
<p>Comentó cómo todos los "líderes"&nbsp; de las empresas de tecnología están preocupados con problemas existenciales con los cambios que ha tenido la industria en los últimos tiempos. Como todos están siendo presionados para abaratar costos y aumentar la productividad a la vez. Después contó cómo los LLMs la ayudaron a crear cosas después de un tiempo sin tocar código.</p>
<p>La conferencia cerró con un juego masivo de piedra, papel o tijera donde todos nos enfrentamos hasta que quedó un ganador. También <a href="https://ruby.social/@haggisruby/116460957774573976">se sacó la foto tradicional para el Friday Hug</a> y se hizo la despedida.</p>
<h3>Ruby Passport</h3>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-18662" src="https://picandocodigo.net/wp-content/uploads/2026/04/haggis-ruby-ruby-passport.jpg" alt="Imagen de mi acreditación a la conferencia, un par de stickers y mi pasaporte Ruby" width="1000" height="473" srcset="https://picandocodigo.net/wp-content/uploads/2026/04/haggis-ruby-ruby-passport.jpg 1000w, https://picandocodigo.net/wp-content/uploads/2026/04/haggis-ruby-ruby-passport-300x142.jpg 300w, https://picandocodigo.net/wp-content/uploads/2026/04/haggis-ruby-ruby-passport-768x363.jpg 768w, https://picandocodigo.net/wp-content/uploads/2026/04/haggis-ruby-ruby-passport-600x284.jpg 600w, https://picandocodigo.net/wp-content/uploads/2026/04/haggis-ruby-ruby-passport-900x426.jpg 900w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></p>
<p>En uno de los recreos conversé con Caroline, Embajadora de Ruby Passports, y obtuve mi Pasaporte Ruby. Es un pasaporte oficial (no oficial) que obviamente no sirve como documento para viajar ni es reconocido por ningún gobierno. Es un cuadernito muy lindo para llevar a los eventos Ruby y coleccionar recuerdos. Está conectado a <a href="https://www.rubyevents.org" target="_blank" rel="nofollow noopener">Rubyevents.org</a> donde podemos crear una cuenta y agregar eventos Ruby a los que hemos asistido. Está bueno tener algo así, espero acordarme de traerlo cuando vaya a otras conferencias. Por ahora tiene la fecha de cuando "se emitió", el 23 de abril en Haggis Ruby, y un sello de la conferencia. Hay más información en <a href="https://therubypassport.com/" target="_blank" rel="nofollow noopener">el sitio web del pasaporte</a>.</p>
<h3>Sobre IA</h3>
<p>A pesar de mi rechazo absoluto a la <a href="https://www.maaikebrinkhof.nl/do-you-enjoy-working-in-the-shit-factory/" target="_blank" rel="noopener">ideología</a> <a href="https://2ndbreakfast.audreywatters.com/the-right-to-say-no/?ref=maaikebrinkhof.nl">fascista</a> que nos quieren vender (e imponer) como "IA" o "Inteligencia Artificial", quedé contento con el estado de las cosas en el mundo Ruby. Si bien hubo alguna mención, en general me parece que la comunidad Ruby no está tan envenenada con este cáncer como otras. Y a pesar de que en el trabajo esté escuchando sobre estas boludeces todo el tiempo, el panorama afuera pinta más optimista, por lo menos lo que vengo viendo de Ruby.</p>
<p>Algo que escuché en alguna de las charlas de discusión o entre pasillos fue que la gente que programa Ruby disfruta de escribir el código. Así que es una de las cosas que no le delegarían a estos generadores de basura.</p>
<p>Noté que la gente que habló en contra de la IA tiene un montón de fundamentos, incluso si tienen que usarla por obligación de su trabajo. Pero la que lo mencionaba como manera positiva o de pasada, ni siquiera reconocían el aspecto moral como un factor en el tema. En mi experiencia también todo lo que he oído de "más productividad" ha sido anecdótico. Sin embargo todo lo que he leído de daño cognitivo, problemas que genera y ni que hablar de todo el lado ético, está soportado por datos, evidencia científica.</p>
<p>Obviamente el empuje a favor de este veneno viene más por el lado del marketing que otra cosa. Y los psicópatas que se benefician de todo esto. Pero no me quiero adentrar más en el tema porque ya me entró a subir la presión.&nbsp;A rasgos generales, me fui de la conferencia sintiéndome optimista con Ruby y su relación con los slop generators.</p>
<h3>Conclusiones</h3>
<p>Siempre es bueno volver a Glasgow. Hizo un clima increíble e inesperado para la costa oeste, cielos azules y mucho sol, clima <em>taps aff</em>. Cada vez que voy a Glasgow digo "debería venir más seguido". Esta vez conocí el centro en hora pico, un montón de gente caminando de acá para allá en pleno centro de la ciudad. Generalmente voy a toques en la tarde/noche, o los fines de semana, así que fue una experiencia distinta.</p>
<p>Quedé contento con la conferencia. Siempre me resulta un poco un desafío por el tema de la ansiedad social, pero la comunidad de Ruby me sigue pareciendo genial y siempre termino pasando bien. Tuve el gusto de conocer a mucha gente nueva, volver a ver a gente que no veía hace un rato, tener muchas charlas interesantes y ser relativamente social por dos días.</p>
<p>Como pasa muchas veces en estos eventos, me fui inspirado y con muchas ganas de hacer más cosas con Ruby. Quiero seguir con mi agenda para <a href="https://picandocodigo.net/aprende-ruby">Aprende Ruby</a>, desarrollar un par de proyectos web y seguir creando cosas divertidas con DragonRuby. Vamos a ver cuánto me dura antes que el trabajo me vuelva a drenar completamente de ganas de hacer cosas. Por lo pronto también intentaré seguir yendo a los meetups de Ruby y espero el año que viene poder asistir a Haggis Ruby 2027. Con suerte me mandaré a alguna otra conferencia de Ruby en Europa también.</p>
<p>James, uno de los organizadores, comentó que quería hacer la conferencia en un lugar distinto de Escocia cada año. Yo sugerí Shetland, pero de repente complica demasiado la logística. Veremos dónde termina siendo la próxima.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-18648" src="https://picandocodigo.net/wp-content/uploads/2026/04/chunky-bacon.jpg" alt="Chunky bacon en Haggis Ruby" width="400" height="400" srcset="https://picandocodigo.net/wp-content/uploads/2026/04/chunky-bacon.jpg 400w, https://picandocodigo.net/wp-content/uploads/2026/04/chunky-bacon-300x300.jpg 300w, https://picandocodigo.net/wp-content/uploads/2026/04/chunky-bacon-150x150.jpg 150w" sizes="auto, (max-width: 400px) 100vw, 400px" /></p>El post <a href="https://picandocodigo.net/2026/haggis-ruby-2026-glasgow-escocia/">Haggis Ruby 2026 - Glasgow, Escocia</a> fue publicado originalmente en <a href="https://picandocodigo.net">Picando Código</a>.]]></content:encoded>
					
					<wfw:commentRss>https://picandocodigo.net/2026/haggis-ruby-2026-glasgow-escocia/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
