<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>inicio on luis angel ortega</title><link>https://luisangel.me/es/</link><description>Recent inicio on luis angel ortega</description><generator>Hugo</generator><language>es-MX</language><managingEditor>hey@luisangel.me (Luis Angel Ortega)</managingEditor><webMaster>hey@luisangel.me (Luis Angel Ortega)</webMaster><copyright>2025 Luis Angel Ortega Holguin All rights reserved</copyright><lastBuildDate>Thu, 18 Jun 2026 00:31:06 +0000</lastBuildDate><atom:link href="https://luisangel.me/es/index.xml" rel="self" type="application/rss+xml"/><item><title>Bicicleta</title><link>https://luisangel.me/es/post/2026/06/18/bicicleta/</link><pubDate>Thu, 18 Jun 2026 00:31:06 +0000</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2026/06/18/bicicleta/</guid><description>&lt;p>&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/77152ed1-0848-4cd9-b7bf-4976c71c0bd3_1600x1600.jpeg" alt="">&lt;/p>
&lt;p>Una breve nota sobre este cuento.&lt;/p>
&lt;p>&lt;em>La cueva&lt;/em> es una antología de cuentos financiada por el &lt;a href="https://fomac.icm.gob.mx/">FOMAC&lt;/a> y actualmente en proceso de edición sin editorial o fecha de publicación. Gira en torno a un personaje: el cavernícola, un reparatodo. A través de él, los cuentos exploran la relación entre las personas y sus objetos queridos, el derecho a reparar, la cultura maker y esa inventiva cotidiana y necesaria que en México no necesita otro nombre que &lt;em>mexicanada&lt;/em>.&lt;/p>
&lt;p>“Bicicleta” surgió durante ese proceso. En él, el cavernícola encuentra a un reportero varado al costado de la carretera con una bicicleta que no sabe cómo arreglar. Lo que pasa después es un encuentro breve entre dos formas de entender el mundo, mediadas por algo descompuesto.&lt;/p>
&lt;p>Lo comparto aquí porque puede que no esté en la versión final del libro. Los manuscritos, como los objetos que se reparan, no siempre conservan todas sus piezas: a veces hay que decidir qué queda y qué encuentra otro lugar. Este es ese otro lugar. También, de cierta forma, un registro de lo que fue hacer &lt;em>La cueva&lt;/em>.&lt;/p>
&lt;p>Si llegaste aquí desde el encuentro FOMAC 8, gracias por acudir y escucharme. Si llegaste desde otro lado, igual.&lt;/p>
&lt;hr>
&lt;p>El calor rebota contra el asfalto creando olas que distorsionan el horizonte. Voy de regreso al pueblo en mi camioneta después de comprar provisiones cuando veo una figura sentada al lado de la carretera. Me acerco despacio. Es un chico güero, lentes gruesos, con pantalones de mezclilla y una chamarra de cuero que usa para cubrirse del sol. A su lado, una bicicleta volcada, rodeada de bolsas amarradas al marco. Tiene cables expuestos y herramientas regadas por el suelo.&lt;/p>
&lt;p>Me estaciono a un lado y bajo con una botella de agua.&lt;/p>
&lt;p>—¿Todo bien? —le pregunto.&lt;/p>
&lt;p>El chico levanta la vista, me mira por encima de los lentes y sonríe con cansancio.&lt;/p>
&lt;p>—&lt;em>Oh thank god. Sí, yes, I’m fine. Well, not really&lt;/em>. Mi &lt;em>bike&lt;/em> murió y llevo como dos horas tratando de revivirla pero &lt;em>fuck if I know what’s wrong.&lt;/em> —Toma la botella que le ofrezco y bebe como si fuera la primera agua que prueba en días— &lt;em>Thanks, man. You’re a lifesaver.&lt;/em>&lt;/p>
&lt;p>—¿Qué tienes ahí? —señalo la bicicleta.&lt;/p>
&lt;p>—Es una &lt;em>e-bike&lt;/em>, o bueno, era. Dejó de funcionar de la nada. &lt;em>I’ve been checking everything&lt;/em> pero no soy electricista, &lt;em>you know?&lt;/em> Mi papá me enseñó algunas cosas pero esto&amp;hellip; —hace un gesto de frustración hacia el nido de cables— &lt;em>This is beyond me.&lt;/em>&lt;/p>
&lt;p>Me agacho para revisar. Es una bicicleta eléctrica de tracción trasera con forma de café racer clásica, verde con acentos negros y un asiento de piel alargado color café con leche. Tiene tres baterías cilíndricas, una en cada lado del triángulo del cuadro. Las llantas están cubiertas de lodo y las bolsas son una mezcla de mochilas rotas y cosidas, más pedazos de tela amarrados estilo furoshiki. Varias tienen pintada con aerosol blanco una calavera con casco militar que dice “PRESS”.&lt;/p>
&lt;p>—¿Reportero de guerra? —le pregunto.&lt;/p>
&lt;p>—&lt;em>Photographer and videographer&lt;/em>, para ser exacto. Soy Nate, &lt;em>by the way&lt;/em> —Extiende su mano manchada de grasa.&lt;/p>
&lt;p>—Mucho gusto. ¿Para quién trabajas?&lt;/p>
&lt;p>—Soy parte de un &lt;em>collective&lt;/em>, somos independientes. No queremos que se normalice la guerra más de lo que ya está, &lt;em>you know?&lt;/em> Así que tenemos varios sitios donde tratamos de darle cobertura a todas las guerras que podamos. La gente nos dona y nos repartimos todo en partes iguales, &lt;em>for food and stuff&lt;/em>. —Se limpia el sudor de la frente— &lt;em>But right now&lt;/em> mi prioridad es esta bike porque sin ella no puedo moverme y sin moverme no puedo trabajar.&lt;/p>
&lt;p>Reviso el motor y las conexiones. El cableado es un desastre organizado, funcional pero frágil.&lt;/p>
&lt;p>—Esto necesita más que una revisión rápida. Tengo un taller cerca, puedo llevarte y revisarla bien. Te tomará un par de días.&lt;/p>
&lt;p>—¿En serio? &lt;em>That would be amazing.&lt;/em> ¿Cuánto cobras?&lt;/p>
&lt;p>—Depende de qué tenga, pero no te preocupes ahora. Primero veamos qué se puede hacer.&lt;/p>
&lt;p>Subimos la bicicleta a la caja de la camioneta junto con todas sus bolsas. Nate se sube al asiento del copiloto y durante el camino no para de hablar. Me cuenta que viene del norte, de donde cae nieve en invierno y los lagos se congelan. Que compró la bicicleta para viajar al sur y conocer, pero terminó documentando conflictos. Que su padre era handy-man y su madre nunca supo de dónde era, pero que si hubiera sido niña lo habrían llamado Mar.&lt;/p>
&lt;p>Llegamos a la cueva cuando el sol empieza a caer. Le muestro dónde puede acampar cerca del árbol al otro lado del cerro.&lt;/p>
&lt;p>—Es un buen &lt;em>spot&lt;/em> —dice— &lt;em>Perfect&lt;/em>. Vendré mañana temprano, ¿&lt;em>okay&lt;/em>? Quiero ver cómo trabajas, &lt;em>maybe&lt;/em> puedo documentar algo. Es bueno para el &lt;em>blog&lt;/em> un post diferente de vez en cuando.&lt;/p>
&lt;p>—Como quieras —le digo— pero no hagas mucho ruido.&lt;/p>
&lt;hr>
&lt;p>Al día siguiente llega cuando el sol apenas ha salido, cámara en mano.&lt;/p>
&lt;p>—&lt;em>Good morning&lt;/em>! ¿Puedo pasar?&lt;/p>
&lt;p>—Adelante, pero todavía no tengo café.&lt;/p>
&lt;p>—&lt;em>No problem&lt;/em>, traje el mío. —Saca una prensa francesa de una de sus bolsas— ¿Tienes agua caliente?&lt;/p>
&lt;p>Mientras preparamos café, empiezo a desarmar la bicicleta. Nate toma fotos y video de todo el proceso.&lt;/p>
&lt;p>—&lt;em>So&lt;/em>, ¿qué tan malo es? —pregunta.&lt;/p>
&lt;p>—Bastante. Tu cableado es impresionante para alguien que no es eléctrico, pero es un desastre esperando a suceder. Además, esta bicicleta no está hecha para el terreno que quieres cruzar. Las llantas son para ciudad, la suspensión es mínima y el motor no tiene la potencia necesaria para subir montañas con todo este peso.&lt;/p>
&lt;p>—&lt;em>Fuck&lt;/em>. ¿Se puede arreglar?&lt;/p>
&lt;p>—Peor no puede quedar ¿Confías en mí?&lt;/p>
&lt;p>Nate me mira por encima de los lentes, sonríe.&lt;/p>
&lt;p>—&lt;em>I mean&lt;/em>, no tengo muchas opciones, &lt;em>right&lt;/em>? Adelante.&lt;/p>
&lt;p>Comienzo extendiendo todos los cables sobre la mesa de trabajo como si fuera un sistema nervioso expuesto. Primero tengo que entender la lógica de lo que Nate construyó: tres baterías en paralelo conectadas a un controlador improvisado, envuelto en cinta aislante, que regula el voltaje hacia el motor. Es funcional pero frágil, cualquier vibración o golpe podría causar un corto.&lt;/p>
&lt;p>Corto todos los cables con pinzas hasta tener solo el motor, las baterías y el controlador. Necesito rehacerlo desde cero.&lt;/p>
&lt;p>Tomo soldadura de estaño y un cautín. El estaño se derrite a 183 grados Celsius, lo suficientemente bajo para no dañar los componentes pero lo suficientemente alto para crear una unión permanente. Cada conexión debe ser firme, sin exceso de soldadura que pueda crear puentes no deseados. Limpio cada punto con alcohol isopropílico antes de soldar, la grasa o el óxido pueden arruinar la conductividad.&lt;/p>
&lt;p>Para proteger las conexiones, uso tubo termocontráctil: plástico que se encoge con calor y crea un sello hermético. Paso el tubo por el cable, hago la conexión, deslizo el tubo sobre la unión y aplico calor con un encendedor. El plástico se abraza al cable como una segunda piel.&lt;/p>
&lt;p>El controlador original es inadecuado, así que instalo uno nuevo con mayor capacidad. Este tiene un sistema de gestión de batería (BMS) integrado que monitorea la carga de cada celda y previene sobrecargas o descargas excesivas. Lo monto en una caja de aluminio que fabrico doblando lámina con una dobladora de banco, creando pestañas que atornillo al cuadro de la bicicleta. Ya no estará envuelto en cinta aislante vulnerable a los elementos.&lt;/p>
&lt;p>Reorganizo el cableado usando código de colores: rojo para positivo, negro para negativo, amarillo para señales de control. Cada cable lo aseguro con bridas al cuadro, siguiendo las líneas naturales del metal para que quede limpio y protegido. Las bridas deben estar firmes pero no tanto que corten el aislamiento.&lt;/p>
&lt;p>Conecto todo a un protoboard primero para probar el circuito. Al girar el switch simulado, el motor gira con un chirrido metálico. Le falta lubricante, pero el circuito funciona. El problema original era la tarjeta madre de la pantalla, completamente frita por un sobrevoltaje. La reemplazo con una nueva que muestra carga, velocidad y autonomía en tiempo real.&lt;/p>
&lt;p>—El problema eléctrico está solucionado —le digo a Nate— Mañana la hacemos montañera.&lt;/p>
&lt;hr>
&lt;p>El segundo día empieza antes del amanecer. Nate ya está afuera de la cueva con su café cuando abro la puerta.&lt;/p>
&lt;p>—&lt;em>Couldn’t sleep&lt;/em> —dice— Estoy emocionado de ver qué más le vas a hacer.&lt;/p>
&lt;p>Empiezo con las llantas. Las originales son delgadas, para pavimento. Las cambio por llantas de montaña con tacos profundos que muerden la tierra. Son más anchas, lo que significa que también necesito cambiar los rines. Uso una palanca para desmontar las llantas viejas, trabajo que requiere paciencia y fuerza. El neumático se resiste, pero cede poco a poco. Instalo las nuevas y las inflo a 30 PSI, la presión ideal para terreno mixto: suficiente para no pincharse con rocas pero con algo de flexibilidad para absorber impactos.&lt;/p>
&lt;p>La suspensión es el siguiente desafío. La bicicleta original tiene una horquilla rígida al frente y ninguna suspensión trasera. Para el terreno que Nate va a cruzar, esto es insuficiente.&lt;/p>
&lt;p>Desmonto la horquilla delantera usando una llave Allen de 6mm para aflojar los tornillos de sujeción del manubrio, luego los pernos de la corona de dirección. La horquilla sale como un diente flojo. En su lugar, instalo una horquilla de suspensión con 100mm de recorrido. Estas horquillas funcionan con resortes internos y aceite hidráulico que amortigua el rebote. Cuando la rueda golpea un obstáculo, el resorte se comprime y el aceite controla qué tan rápido regresa a su posición original, evitando que la bicicleta rebote descontroladamente.&lt;/p>
&lt;p>Ajusto la precarga del resorte girando una perilla en la parte superior de la horquilla. Muy suave y la suspensión se hundirá con el peso del ciclista antes de que toque un obstáculo; muy dura y no absorberá impactos pequeños. Pruebo comprimiendo la horquilla con mi peso: debe usar aproximadamente el 20% de su recorrido solo con el peso del ciclista. Ajusto hasta que se siente correcto.&lt;/p>
&lt;p>Para la suspensión trasera, no puedo modificar el cuadro, pero instalo un asiento con suspensión integrada: un poste con un resorte interno que absorbe los golpes verticales. No es tan efectivo como una suspensión completa en el cuadro, pero ayuda enormemente en terreno irregular.&lt;/p>
&lt;p>La transmisión también necesita cambios. El sistema original tiene un solo plato adelante y nueve piñones atrás, diseñado para ciudad plana. Para montaña necesita más rango. Reemplazo el cassette trasero por uno de once velocidades con piñones que van desde 11 hasta 42 dientes. Esto le da velocidades muy bajas para subir pendientes empinadas con todo el peso de sus bolsas, y velocidades altas para descensos o caminos planos.&lt;/p>
&lt;p>Instalo un desviador trasero de jaula larga que puede manejar la diferencia de tamaño entre el piñón más pequeño y el más grande. El desviador tiene poleas que mantienen la cadena tensa y la mueven de un piñón a otro cuando cambias de velocidad. Ajusto el límite de movimiento con dos pequeños tornillos: uno evita que la cadena se caiga hacia el cuadro, el otro que se caiga hacia afuera. La afinación es milimétrica, probando cada cambio hasta que suben y bajan sin ruido ni vacilación.&lt;/p>
&lt;p>La cadena original es muy corta para el nuevo cassette. Mido una nueva usando la regla del plato más grande con el piñón más grande, más dos eslabones adicionales. Uso una herramienta llamada tronchacadenas para romper la cadena al tamaño correcto y conecto los extremos con un eslabón maestro que se cierra a presión.&lt;/p>
&lt;p>Finalmente, ajusto los frenos. Los originales son de tipo V-brake, mecánicos y débiles. Los reemplazo con frenos de disco hidráulicos. Estos funcionan con líquido DOT o aceite mineral que transmite la fuerza de la palanca a las pastillas que aprietan un disco de metal montado en el centro de la rueda. Son mucho más potentes y confiables, especialmente en lodo o agua.&lt;/p>
&lt;p>Instalo los calipers en los soportes del cuadro y la horquilla, monto los discos en los cubos de las ruedas, y conecto las mangueras hidráulicas a las palancas. Luego purgo el sistema: proceso de expulsar cualquier burbuja de aire del líquido. Las burbujas comprimen y hacen que los frenos se sientan esponjosos. Uso una jeringa especial para inyectar líquido nuevo desde el caliper hacia arriba mientras abro un tornillo de purga en la palanca. El líquido viejo y las burbujas salen hasta que solo fluye líquido limpio sin aire. Aprieto todo y pruebo las palancas: deben sentirse firmes y detener la rueda por completo sin esfuerzo.&lt;/p>
&lt;p>Mientras trabajo, Nate documenta todo con su cámara. A veces pregunta qué estoy haciendo, otras solo observa en silencio. Me cuenta más historias: zonas de conflicto que ha visitado, gente que ha conocido, momentos que lo marcaron. Habla con una mezcla de entusiasmo juvenil y una seriedad que no corresponde a su edad.&lt;/p>
&lt;p>—¿Por qué sigues haciéndolo? —le pregunto mientras ajusto el último freno— Suena peligroso y no parece que pague bien.&lt;/p>
&lt;p>—&lt;em>Because someone has to, you know?&lt;/em> La guerra se vuelve normal cuando nadie la ve. Cuando solo son números en una pantalla o un mapa con colores cambiando. &lt;em>But&lt;/em> cuando ves a una familia que perdió su casa, o a un niño que no entiende por qué ya no puede ir a la escuela&amp;hellip; —se queda callado un momento— &lt;em>I can’t fix anything&lt;/em>, pero puedo hacer que la gente vea. &lt;em>That’s something, right?&lt;/em>&lt;/p>
&lt;p>—Sí —le digo— es algo.&lt;/p>
&lt;hr>
&lt;p>Al tercer día, la bicicleta está lista. Ya no parece la misma máquina que llegó descompuesta. Las llantas agresivas le dan un aspecto robusto, la horquilla de suspensión la hace ver más seria, el cableado limpio y protegido promete confiabilidad. Pero falta algo.&lt;/p>
&lt;p>Tomo una pequeña placa de aluminio y la corto en forma rectangular. Con un punzón y martillo, grabo cuidadosamente una palabra: “TESTIGO”. La pulo hasta que brilla y la atornillo al tubo superior del cuadro, justo donde Nate la verá cada vez que monte.&lt;/p>
&lt;p>Cuando llega por la mañana con su café, le muestro la bicicleta.&lt;/p>
&lt;p>—&lt;em>Holy shit&lt;/em> —dice, caminando alrededor— &lt;em>This is&amp;hellip;&lt;/em> esto es increíble, &lt;em>man&lt;/em>. Se ve completamente diferente.&lt;/p>
&lt;p>Le explico todas las modificaciones: el sistema eléctrico rehecho, las llantas de montaña, la suspensión, los frenos hidráulicos, la transmisión ampliada. Le muestro cómo usar todo, cómo cambiar las velocidades, cómo ajustar la suspensión.&lt;/p>
&lt;p>Entonces ve la placa.&lt;/p>
&lt;p>—¿Testigo? —pregunta, tocándola con los dedos.&lt;/p>
&lt;p>—Dijiste que no puedes arreglar nada, pero que puedes hacer que la gente vea. Eso te hace un testigo. Es importante. No lo olvides cuando las cosas se pongan difíciles.&lt;/p>
&lt;p>Nate se queda mirando la placa un momento largo. Luego sonríe, esa sonrisa juvenil llena de esperanza que ha mantenido a pesar de todo lo que ha visto.&lt;/p>
&lt;p>—Gracias, amigo. &lt;em>Really&lt;/em>. ¿Cuánto te debo?&lt;/p>
&lt;p>Le doy un precio justo. Saca el dinero de una de sus bolsas, empaca todo con una eficiencia que habla de meses de práctica, y monta la bicicleta. La enciende. El motor responde con un suave zumbido, sin chirridos.&lt;/p>
&lt;p>—Suena perfecto —dice— &lt;em>Feels good too!&lt;/em>&lt;/p>
&lt;p>Arranca sin mirar atrás, sin despedidas largas. Solo levanta una mano en el aire a modo de saludo mientras desciende por el camino. Lo veo alejarse, las bolsas con las calaveras “PRESS” balanceándose con el movimiento, hasta que desaparece en una curva del camino.&lt;/p>
&lt;p>Regreso a la cueva. El sol ya está alto y el calor comienza a ser insoportable. Me siento en mi reclinadora afuera, tomo mis binoculares y observo el horizonte. En algún lugar allá afuera, un joven con lentes gruesos está pedaleando hacia la siguiente guerra, hacia el siguiente testimonio, llevando consigo la promesa de que alguien verá, alguien recordará, alguien dará cuenta.&lt;/p>
&lt;hr></description></item><item><title>Sin aviso</title><link>https://luisangel.me/es/post/2026/05/14/sin-aviso/</link><pubDate>Thu, 14 May 2026 16:53:08 +0000</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2026/05/14/sin-aviso/</guid><description>&lt;p>&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/da5b3083-554c-41f9-8d50-49c0f35710e2_1600x1600.jpeg" alt="">&lt;/p>
&lt;pre>
Verde y amarillo 
un movimiento ligero
hacia la izquierda 
al ritmo del viento 
y las nubes

No tengo opción 
me vuelvo pasto
sin opción
sin aviso

Nuestra canción sonó 
el baile de nuestra boda 
y el peso del mundo que era
me vino encima
sentí un hoyo en mi pecho 
ardor en mi estómago 
y mi alma salir de mi cuerpo

Seis.
Control.
Ocho.
Respira.
Seis—

Aprieto.
Fuerte.
Duele.
Suelto.

Un peso.
Se va.

Los pájaros vuelan.
Las hojas tiemblan.
Yo quiero
ser
pasto.
&lt;/pre></description></item><item><title>A sabiendas</title><link>https://luisangel.me/es/post/2026/05/04/a-sabiendas/</link><pubDate>Mon, 04 May 2026 16:28:17 +0000</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2026/05/04/a-sabiendas/</guid><description>&lt;p>&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/d5820f7e-f737-4a60-b467-d76f14376d7f_1600x1600.jpeg" alt="">&lt;/p>
&lt;pre>
Ramos de flores secas 
						 soledad
cerveza 
							delirio
encaje café 
							cuerpo
una oración
para no perderme
en sus ojos avellana

un vacío en mi
 angustia
 miedo
estar perdido
en sus manos
y salir
 abandonado
&lt;/pre>
&lt;hr>
&lt;h2 id="sobre-el-poema">Sobre el poema&lt;/h2>
&lt;p>Este poema surgió de una serie de ejercicios en un taller de poesía surrealista: pinturas, collage, escritura automática. En algún punto del proceso algo más personal me encontró.&lt;/p>
&lt;p>Es un poema sobre los rituales que construimos para protegernos, y sobre cómo a veces entramos al fuego de todas formas. El saber no lo hace más fácil, solo lo hace más honesto.&lt;/p></description></item><item><title>Temporales</title><link>https://luisangel.me/es/post/2026/03/19/temporales/</link><pubDate>Thu, 19 Mar 2026 17:25:48 +0000</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2026/03/19/temporales/</guid><description>&lt;p>&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/a5cb1897-f36f-4ea7-b814-f62b33f99e80_1600x1600.jpeg" alt="">&lt;/p>
&lt;pre>
Cuatro cubos
en un vaso —
transparentes.
Temporales.

Dentro del plástico
tan cerca
sin manera
de llegar
al horizonte ámbar
con corona blanca

Sin razón
un ramo
de manzanilla —
el único
que he recibido
me acompaña

Las flores secas
se quedan
conmigo
tomando
de mí

Algún día
volveré
a mi equilibrio
ellas revivirán
y yo habré cumplido
mi destino
&lt;/pre>
&lt;hr>
&lt;h2 id="sobre-el-poema">Sobre el poema&lt;/h2>
&lt;p>Este poema salió de un taller de poesía surrealista. La consigna era escribir desde la perspectiva de un vaso de hielo, en mi caso con una cerveza y una ramita de manzanilla cerca.&lt;/p>
&lt;p>Me quedé un momento con esos objetos y en algún punto el hielo empezó a sentirse familiar. El anhelo por algo que está casi al alcance, la compañía inesperada de una ramita de manzanilla seca, y la paz tranquila de saber que el cambio viene, no como pérdida, sino como regreso.&lt;/p>
&lt;p>El hielo sabe que es temporal. Eso no es lo triste. Lo triste es qué tan cerca está la cerveza.&lt;/p></description></item><item><title>Lila (para Rita)</title><link>https://luisangel.me/es/post/2026/02/10/lila-para-rita/</link><pubDate>Tue, 10 Feb 2026 17:25:48 +0000</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2026/02/10/lila-para-rita/</guid><description>&lt;p>&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/31a8b065-0ec8-4fd7-ac0a-14a6dbc4df62_1600x1600.jpeg" alt="">&lt;/p>
&lt;pre>
seis y media, 
el cielo se divide—
amarillo pálido
donde cae el sol, 
azul
sobre mi cabeza. 
El parque 
más verde de la ciudad,
pinos altos 
que nunca pierden sus agujas, 
un sicomoro
que guarda su corteza.
Y esta lila, 
sola entre tanto
permanente, 
sin hojas,
llena de semillas—
café-amarillo,
agrupadas en la copa
donde no puedo alcanzarlas.

La lila de mi abuela 
era el centro de su patio. 
Después que murió, 
alguien dijo que traía mala suerte. 

La cortaron.

No recuerdo cuándo dejé
de ver lilas. 
Hasta hace poco—
Tomé una semilla del suelo,
la traje en mi bolsillo
como cuando era niño.

Ahora estoy 
bajo este árbol
sin hojas, 
en el parque más verde,
mirando 
lo que no puedo tocar.
La bolita sigue en mi bolsillo—
pequeña, 
seca, 
imposible de perder.
&lt;/pre></description></item><item><title>Enero en la poesía</title><link>https://luisangel.me/es/post/2026/02/08/enero-en-la-poesia/</link><pubDate>Sun, 08 Feb 2026 19:25:21 +0000</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2026/02/08/enero-en-la-poesia/</guid><description>&lt;p>Salí a caminar esta mañana buscando un árbol. No cualquier árbol, sino uno que me dijera algo, que me diera permiso para escribir el poema de hoy. He hecho esto varias veces en enero, al menos una vez a la semana, a veces más. A veces encuentro el árbol, a veces me encuentran los insectos, el cielo, el aire moviéndose entre las ramas. La ciudad de Chihuahua se ha vuelto extraña para mí, o tal vez yo me he vuelto extraño en ella: ahora sé dónde están los árboles del desierto, cuáles están en flor, cuáles solo resisten.&lt;/p>
&lt;p>Enero ha sido un mes de ejercicio. No en el sentido poético y elevado de la palabra, sino en el sentido literal: algo que hay que hacer, un músculo que hay que flexionar aunque no siempre quiera. Algunos días el poema sale interesante. Otros días sale y ya. Pero sale, y eso es lo que importa en este experimento que me impuse sin saber bien hacia dónde iba.&lt;/p>
&lt;p>Lo que no esperaba era que hacerlo público cambiara tanto las cosas. Publico cada poema sabiendo que alguien podría leerlo, y eso me obliga a cuidar más, a refinar, a preguntarme si realmente quiero que esto esté ahí afuera. He descubierto que tengo poemas guardados, poemas que escribí en enero pero que no me siento listo para compartir. No porque sean malos, no lo sé todavía, sino porque tocan algo demasiado reciente, demasiado a flor de piel. Son privados de una manera que no puedo explicar del todo. Me sorprende que otros poemas, en cambio, no me cuesten nada soltarlos al mundo. No sé qué dice eso de mí, pero ahí está la información.&lt;/p>
&lt;p>La naturaleza se volvió mi inspiración sin que yo lo decidiera conscientemente. Supongo que es lo que pasa cuando sales a buscar poemas con regularidad: empiezas a prestar atención a lo que está ahí, a lo que siempre estuvo ahí pero que nunca habías visto. Me he enamorado de los árboles, de los insectos, del ruido del viento en la tarde. Conozco mi ciudad de una manera nueva, más íntima. Sé dónde crecen ciertos árboles, cuántos hay, qué tan comunes son. Antes caminaba por Chihuahua pensando en otras cosas, escuchando podcasts seguramente, ahora camino para ver.&lt;/p>
&lt;p>Pero debajo de los árboles y los insectos hay otra cosa. Hay un subtexto que corre por muchos de estos poemas, un reflejo de lo que va pasando en mi mente, juegos personales que solo yo entiendo completamente. Algunos más obvios que otros. Es curioso cómo la naturaleza se puede volver metáfora sin que uno se lo proponga, cómo escribir sobre un árbol puede ser escribir sobre uno mismo.&lt;/p>
&lt;p>No sé si estos son buenos poemas. El tiempo me lo dirá, supongo. Lo que sí sé es que enero me enseñó algo sobre sostener un compromiso creativo, sobre salir a buscar aunque no haya ganas, sobre hacer pública la vulnerabilidad incluso cuando incomoda. Me enseñó que la poesía puede ser un ejercicio y al mismo tiempo ser genuina, que puedo experimentar y refinar al mismo tiempo, que conocer mi ciudad es una forma de conocerme.&lt;/p>
&lt;p>Ahora es febrero. El músculo está un poco más fuerte. Los árboles siguen ahí, esperando.&lt;/p>
&lt;p>&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/19a0c4f3-7abf-4c59-9369-52652947fb4e_3024x3024.jpeg" alt="">&lt;/p></description></item><item><title>Enero</title><link>https://luisangel.me/es/post/2026/02/03/enero/</link><pubDate>Tue, 03 Feb 2026 17:25:20 +0000</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2026/02/03/enero/</guid><description>&lt;p>&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/2fbe8029-4347-4931-8241-5e8f1ece0f67_1600x1600.jpeg" alt="">&lt;/p>
&lt;pre>
Un café
caliente en enero
ruidoso para pensar

afuera
en la sombra de edificios
corriente de aire

hojas verdes falsas
hojas marrones muertas

el murmullo adentro
la música, las charlas

mis orejas calientes
mi bebida fría

elegí el frío
quería calor
&lt;/pre></description></item><item><title>Camino del deseo</title><link>https://luisangel.me/es/post/2026/01/29/camino-del-deseo/</link><pubDate>Thu, 29 Jan 2026 17:25:15 +0000</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2026/01/29/camino-del-deseo/</guid><description>&lt;p>&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/5cf1e180-02a9-4375-b50e-626041abff02_1600x1600.jpeg" alt="">&lt;/p>
&lt;pre>
Al lado
de la carretera transitada
entre hierba seca
cruzando un terreno baldío
está el camino
marcado por cientos de zapatos
sin banquetas
rodeado de autos
el asfalto humea bajo el sol
la única opción para cruzar
&lt;/pre></description></item><item><title>Kiosco</title><link>https://luisangel.me/es/post/2026/01/22/kiosco/</link><pubDate>Thu, 22 Jan 2026 17:25:22 +0000</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2026/01/22/kiosco/</guid><description>&lt;p>&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/e491b2b7-f763-405e-ad8f-267c6a9b7e95_1600x1600.jpeg" alt="">&lt;/p>
&lt;pre>
Al centro del parque
como muchos de la ciudad
hay un kiosco:
techo de lámina
arquitectura mediterránea fallida
pintura colorida
imágenes políticas en el metal

Castillo de niños
cobijo de adolescentes
sombra de adultos
refugio de poetas

Tan universales
que olvidé detenerme
a recordar lo importantes que son
&lt;/pre></description></item><item><title>Agave</title><link>https://luisangel.me/es/post/2026/01/20/agave/</link><pubDate>Tue, 20 Jan 2026 17:39:38 +0000</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2026/01/20/agave/</guid><description>&lt;p>&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/ecec093e-11d2-4874-a725-b8415a498d0b_1600x1600.jpeg" alt="">&lt;/p>
&lt;pre>
Medio día—
un día despejado
y casi cálido de invierno.
A la sombra de un encino
está arraigado un agave.

Verde pálido al sol,
verde oscuro en la sombra—
rayas amarillas, espinas
a lo largo de sus pencas.

Tan alto como yo,
rodeado de pasto seco
y árboles sin cuidar,
en un parque vacío,
en el silencio de la tarde temprana.

Me acerco sin cuidado—
las espinas me cortan.
En este parque descuidado
todo parece marchitarse,
pero el agave permanece.

Sus pencas marcadas por años,
sus raíces más profundas
que el pasto seco a su alrededor—
tan antiguo como el encino
que le da su sombra.
&lt;/pre></description></item><item><title>Sicomoro</title><link>https://luisangel.me/es/post/2026/01/13/sicomoro/</link><pubDate>Tue, 13 Jan 2026 19:35:27 +0000</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2026/01/13/sicomoro/</guid><description>&lt;p>&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/3dedbe49-50b8-4b12-a75d-7ed908cc86d0_1600x1600.jpeg" alt="">&lt;/p>
&lt;pre>
El sol cae detrás del sicomoro
apenas luz suficiente
sentado, observo.
 
Sus hojas
amarillas y marrones yacen
mientras pocas verdes 
aún están en sus ramas.

Su corteza café se desprende
a la izquierda, un blanco
luego crema
a la derecha, amarillo—
cualquiera puede arrancar un pedazo.
&lt;/pre></description></item><item><title>Migraña</title><link>https://luisangel.me/es/post/2026/01/07/migrana/</link><pubDate>Wed, 07 Jan 2026 17:30:35 +0000</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2026/01/07/migrana/</guid><description>&lt;p>&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/c8bea5e2-0599-451a-960d-4dab9ad47320_1600x1600.jpeg" alt="">&lt;/p>
&lt;pre>
Hojas de moro
contra el cielo de cobre—
cada una demasiado brillante,
girando

Zumbido estático
donde debería haber silencio
eléctrico, incesante

Reclinado en el asiento del carro
mandíbula apretada
conteniendo
lo que quiere subir

El sabor a metal
se extiende

La única palabra
que queda:
dolor
&lt;/pre></description></item><item><title>Niebla de Londres</title><link>https://luisangel.me/es/post/2026/01/05/niebla-de-londres/</link><pubDate>Mon, 05 Jan 2026 17:30:36 +0000</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2026/01/05/niebla-de-londres/</guid><description>&lt;p>&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/ba640f12-c631-40ab-99cf-73e5847e402e_1600x1600.jpeg" alt="">&lt;/p>
&lt;pre>
En una esquina,
un café
a la orilla de la calle,
bajo luces amarillas,
paredes de tripla
ladrillo blanco falso.
Frente a la silla verde olivo
se encuentra:
popote de vidrio,
vaso lleno de hielo
gélido al tacto.

El sabor del té
se ha perdido
en el color crema
de la leche de avena.

Lavanda y vainilla
de frente, imperdibles,
se posan a los lados de la lengua
mientras el Earl Grey se esconde
al fondo del paladar.
&lt;/pre></description></item><item><title>Romero</title><link>https://luisangel.me/es/post/2026/01/02/romero/</link><pubDate>Fri, 02 Jan 2026 17:30:29 +0000</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2026/01/02/romero/</guid><description>&lt;p>&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/e452ea71-8a7c-462a-90a8-e1826bfab75a_1600x1600.jpeg" alt="">&lt;/p>
&lt;pre>
Te veo sobre toda la mesa—
ramitas de romero
decorando las bebidas de todos,
los platillos de algunos.
Siempre festivo,
tu olor herbal único.
Ramas eternamente verdes
de algún arbusto
de origen desconocido,
perfumando esta noche de posada.
&lt;/pre></description></item><item><title>Ocotillo</title><link>https://luisangel.me/es/post/2025/12/09/ocotillo/</link><pubDate>Tue, 09 Dec 2025 18:56:07 +0000</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2025/12/09/ocotillo/</guid><description>&lt;p>&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/292b4d14-3554-43c0-8ecf-e459d2228af0_1280x1600.jpeg" alt="">&lt;/p>
&lt;pre>
Enseguida de la calle
dedos grises
sobresalen del suelo
pasando la pared blanca
en la que algunas se apoyan

Gris, con luces verdes
de madera porosa, frágil quizás—
cortas espinas impiden comprobarlo,
están a lo largo de cada rama
&lt;/pre></description></item><item><title>6:45</title><link>https://luisangel.me/es/post/2025/12/08/645/</link><pubDate>Mon, 08 Dec 2025 23:44:57 +0000</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2025/12/08/645/</guid><description>&lt;p>&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/e7df9579-e7bf-4f1e-9a22-488e75d4f594_1600x1600.jpeg" alt="">&lt;/p>
&lt;pre>
Una corona amarilla y naranja
detrás de los cerros
una capa de neblina
a mitad de ellos
el cantar de las aves
el frío trae olor a pasto
colores grises y azules
llenando mis pulmones
niños cruzan el parque
camino a la escuela
&lt;/pre></description></item><item><title>Sombras en las azoteas</title><link>https://luisangel.me/es/post/2025/12/07/sombras-en-las-azoteas/</link><pubDate>Sun, 07 Dec 2025 17:07:42 +0000</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2025/12/07/sombras-en-las-azoteas/</guid><description>&lt;p>&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/c7473ac2-268d-408a-978e-576478b5ce7d_1600x1600.jpeg" alt="">&lt;/p>
&lt;pre>
Siempre viéndote
arriba en las azoteas,
en las luces,
siguiéndote por el parque.

Al llegar y salir
cantas, me anuncias.

Aunque solo de lejos
me dejas observarte.

Maestros del canto,
de ese plumaje azulado,
peleando por el territorio
y los suyos.

En casa contigo—
envergadura de 30 centímetros,
ojos negros
velando por el barrio.
&lt;/pre></description></item><item><title>Primer frio</title><link>https://luisangel.me/es/post/2025/12/06/primer-frio/</link><pubDate>Sat, 06 Dec 2025 17:30:51 +0000</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2025/12/06/primer-frio/</guid><description>&lt;p>&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/04adcfdd-5a74-40bb-8914-66c84f9d64f6_1600x1600.jpeg" alt="">&lt;/p>
&lt;pre>
A través de mi ventana 
coronando a los cerros 
una tenue niebla—
olor a chimenea

Un manto gris
donde antes reinaba el azul
que calla todo

Sin lluvia.
Sin nieve.

Solo frío
y mis manos contra el vidrio
&lt;/pre></description></item><item><title>El pájaro herido</title><link>https://luisangel.me/es/post/2025/12/04/el-pajaro-herido/</link><pubDate>Thu, 04 Dec 2025 22:02:00 +0000</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2025/12/04/el-pajaro-herido/</guid><description>&lt;p>&lt;img src="https://substack-post-media.s3.amazonaws.com/public/images/e6cbbeed-49fe-4f1e-ab0a-d7d1031f61bb_1600x1600.jpeg" alt="">&lt;/p>
&lt;pre>
Ayer mientras paseaba 
encontré a un pájaro 
estaba lastimado, postrado 
debí de ayudarlo.

Frío.
 Miedo.
 Muerte.
Pude hablarle ahorrado eso.

No tengo el valor de volver,
no quiero ver el cuerpo,
y saber que yo pude evitarlo –
cambiar el futuro

Cuantas cosas se pasan 
por tener las manos ocupadas
la cabeza llena
¿A cuantos podríamos salvar?
&lt;/pre></description></item><item><title>La falta de alegría en la era de la inteligencia artificial generativa</title><link>https://luisangel.me/es/post/2025/10/03/falta-alegria-con-la-ia/</link><pubDate>Fri, 03 Oct 2025 17:00:00 +0000</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2025/10/03/falta-alegria-con-la-ia/</guid><description>&lt;p>Hace poco estaba recordando el programa del famoso pintor Bob Ross: &lt;em>The Joy of Painting&lt;/em>. Durante 30 a 40 minutos, Bob nos enseñaba paso a paso cómo convertir un lienzo blanco en una obra de arte. Durante el camino nos recordaba que está bien cometer errores y que cualquiera, si quisiera, podría seguir sus pasos y crear la misma obra de arte. Este programa de origen americano se transmitía en canales de televisión públicos en aquel país, y en Reddit hay testimonios de personas que sí lograron recrear estas pinturas, probando que Ross tenía razón cuando decía &amp;ldquo;la imperfección es lo que hace que algo sea hermoso, eso es lo que lo hace diferente y único de todo lo demás.&amp;rdquo;&lt;/p>
&lt;p>Pocas veces he tratado de pintar, pero este sentimiento yo lo relacionaba con la programación. Me tomó tres años de carrera encontrarle el gusto, pero conforme pasó el tiempo empecé a encontrar temas que me apasionaban y a apreciar el código de otras personas: ver la manera en la que alguien resolvió algo particular después de pasar un par de horas leyendo código en su repositorio, la diferencia entre las librerías que resuelven un mismo problema y, claro, ver algo que yo había creado después de horas ser usado por otras personas.&lt;/p>
&lt;p>Al mismo tiempo en el que esto pasaba, se me dio la oportunidad de ser mentor en un club de robótica de una preparatoria. Esto consistía, mayoritariamente, en enseñar los fundamentos de programar con Java y a usar las librerías que necesitaba el robot. Esa fue mi primera experiencia frente a un grupo, yo no tenía la menor idea de cómo dar una clase así que las primeras sesiones fueron exponer solamente un tema, igual que en la universidad. El problema es que por la edad, y por la hora a la que tenía que dar la clase, no lograba mantener su interés y aquellos que me pusieron atención no acababan de entender el tema. Buscando una manera de comunicarme con ellos, hablar el mismo lenguaje, me di cuenta de que el gusto por el anime era el común denominador entre todos los que estábamos en aquel salón. Así que comencé a cambiar términos técnicos o ejercicios genéricos por ejemplos relacionados con anime: el ejercicio para practicar los condicionales pasó de ser un sistema de calificaciones a un &lt;em>simulador de citas simplificado&lt;/em>. Los objetos pasaron, de ser automóviles o animales, a arquetipos de personajes en el anime. Con esto logré conectar con ellos y ellos lograron aprender lo que les quería enseñar. Esto me sembró la semilla de querer dar clases.&lt;/p>
&lt;p>Varios años después de titularme como licenciado, tuve la oportunidad de dar una materia para la misma carrera de la que me había graduado, un exprofesor (ahora colega) mío me había recomendado para ello. Acepté con gusto y empecé a dar clases de la misma manera que lo había hecho con el club de robótica: como pude. Con este grupo encontré el lenguaje común de manera diferente, dándoles la oportunidad de expresarse sin censurarse frente a mí y ofreciéndoles mis consejos en el ámbito escolar y laboral. Ese semestre estuve entre los diez profesores mejor calificados de la Coordinación de Ingenierías, por lo que este año inicié mi maestría en educación, con enfoque en la educación en línea. Estaba seguro de que, si bien no sería mi trabajo de tiempo completo, llevaba años con ganas de dar clases. Ahora estamos a medio semestre con el segundo grupo al que le doy esta materia pero las cosas no podían ser más diferentes.
En un año, el panorama de la inteligencia artificial ha avanzado mucho. Muchísimo. Tanto en lo técnico, con más modelos, más grandes y más herramientas para usarlos, como en la confianza de la gente con los mismos. Hace un año, en el trabajo, solía usar &lt;em>algún&lt;/em> LLM para sacarme de alguna duda, resolver un error o crear un bloque pequeño de código. Ahora, la misma empresa nos da herramientas para que, con el ticket correcto, nosotros solo le demos la instrucción al chatbot y lo supervisemos mientras él resuelve el ticket en su totalidad. Fuera del trabajo, implementé un &lt;em>script&lt;/em> para actualizar la sección de &amp;ldquo;últimas lecturas&amp;rdquo; del blog de acuerdo a mi cuenta de Raindrop. Pasé de idea a ejecución en una hora, pero no sentí ninguna sensación de logro por haberlo hecho.&lt;/p>
&lt;p>Mis alumnos ahora utilizan alguna forma de inteligencia artificial generativa en todas las tareas y trabajos de la clase. Los ejercicios (diseñados para hacerlos reflexionar, investigar un tema o aprender a usar una herramienta) pasan: de la plataforma de la escuela a un chatbot y de vuelta a la plataforma. Pocas veces se puede ver que los alumnos hicieron la mayor parte del trabajo, la mayoría solamente leyó la respuesta que los modelos les generaron. Algunos no la leen, solo copian, pegan y, si hay que exponerla, leen las diapositivas.&lt;/p>
&lt;p>En el trabajo, usada de la manera correcta, la inteligencia artificial es más eficiente para mí y para la empresa. Me da un mejor balance de vida personal y laboral. De esa misma manera, ¿por qué mis alumnos no la usarían en clase? Entregan lo que pido, resuelven los problemas y antes del examen estudian lo suficiente para pasar. Lo único que queda fuera de la ecuación es la alegría que sentía por enseñar. Este semestre, pocas veces la he sentido, y ,en esas ocasiones, fue con actividades precisamente diseñadas para que los estudiantes no pudieran usar ningún LLM. Pero esas actividades son difíciles de conceptualizar, en especial en esta área.&lt;/p>
&lt;p>No sé si es una falla mía como profesor, por no esforzarme lo suficiente. No sé si es falta de saber. En la maestría, he comprendido que es necesario aprender a enseñar. No sé si mis estudiantes no deberían usar inteligencia artificial en la escuela, pues es algo que van a tener que usar en el campo laboral o van a estar en desventaja. No sé si es el sistema, que se tiene que reformar ante un cambio de paradigma. Lo único que sé es que ya no siento la alegría por programar o por enseñar. Ya no hay, como decía Bob Ross, errores que solamente son accidentes felices.&lt;/p>
&lt;blockquote>
&lt;p>Públicado originalmente en el blog de &lt;a href="https://eltelar.xyz/blog/falta-alegria-con-la-ia/">El telar&lt;/a>&lt;/p>
&lt;/blockquote></description></item><item><title>¿Para quién estamos digitalizando la educación? Una llamada urgente a la accesibilidad</title><link>https://luisangel.me/es/post/2025/06/26/digitalizando-la-educacion/</link><pubDate>Thu, 26 Jun 2025 17:00:00 +0000</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2025/06/26/digitalizando-la-educacion/</guid><description>&lt;p>Desde hace más de dos décadas, hablar de transformación digital en la educación se ha vuelto casi obligatorio. Se invierte en plataformas, se promueven nuevas metodologías y se celebran los avances tecnológicos en las aulas. Pero hay una pregunta que rara vez se formula con claridad: &lt;strong>¿para quién estamos digitalizando?&lt;/strong>&lt;/p>
&lt;p>El entusiasmo por la innovación ha dejado fuera un elemento esencial: la accesibilidad. No se trata solamente de si una persona tiene internet, sino de si puede usar, entender y beneficiarse de las herramientas educativas disponibles desde su contexto. Y en México, ese contexto suele ser un celular de gama media, una conexión móvil intermitente y la ausencia de una computadora en casa.&lt;/p>
&lt;p>Según datos del INEGI (2024), &lt;strong>más del 97% de las personas usuarias de internet en el país se conecta desde su celular&lt;/strong>, mientras que &lt;strong>menos del 44% de los hogares tiene una computadora&lt;/strong>. Además, la velocidad promedio de conexión móvil —25 Mbps— es apenas suficiente para navegación básica, no para plataformas pesadas llenas de animaciones, videos incrustados y carga visual innecesaria.&lt;/p>
&lt;p>Pese a esta realidad, seguimos impulsando plataformas que no están pensadas para esa mayoría. Herramientas como Genially, Canva o incluso Moodle con temas pesados se convierten en un obstáculo para muchos estudiantes. No por falta de interés, sino porque simplemente &lt;strong>no cargan&lt;/strong> o saturan el equipo. El mensaje es claro: si no tienes el hardware o la conexión correcta, estás fuera.&lt;/p>
&lt;p>No se trata de rechazar la tecnología. Se trata de exigir que se piense desde el usuario real y no desde el escritorio del diseñador o del tomador de decisiones. Una plataforma educativa que no funcione sin conexión, que no se adapte a pantallas pequeñas o que requiera equipos costosos &lt;strong>no está pensada para incluir, sino para excluir&lt;/strong>.&lt;/p>
&lt;p>Docentes, directivos y desarrolladores deben comprender que la transformación digital no es sinónimo de sofisticación ni de estética. Es una oportunidad para hacer las cosas mejor, para cerrar brechas, no para abrir nuevas. Apostar por sitios ligeros, diseño responsivo, estándares abiertos y software libre no es solo una decisión técnica: &lt;strong>es una postura ética y pedagógica&lt;/strong>.&lt;/p>
&lt;p>En un país con tanta diversidad social y tecnológica, no basta con ofrecer acceso. Hay que pensar en el uso real, cotidiano, situado. Mientras no tomemos en serio la accesibilidad digital, cualquier intento de inclusión será solo una promesa vacía. Y la brecha, lejos de cerrarse, seguirá creciendo… cargando lento.&lt;/p>
&lt;hr>
&lt;h3 id="referencias">Referencias&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>Covarrubias Hernández, L. Y. (2021). &lt;em>Educación a distancia: transformación de los aprendizajes&lt;/em>. &lt;em>Telos: Revista de Estudios Interdisciplinarios en Ciencias Sociales&lt;/em>. Recuperado de la base de datos Gale: Informe Académico &lt;a href="https://doi.org/10.36390/telos231.12">https://doi.org/10.36390/telos231.12&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Fernández-Enguita, M. (2023). &lt;em>La quinta ola: la transformación digital del aprendizaje, de la educación y de la escuela&lt;/em>. Ediciones Morata, S. L. Recuperado de la base de datos eLibro Cátedra &lt;a href="https://elibro.net/es/lc/bibliotecauveg/titulos/232678">https://elibro.net/es/lc/bibliotecauveg/titulos/232678&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Instituto Nacional de Estadística y Geografía. (2025, mayo 6). &lt;em>Encuesta Nacional sobre Disponibilidad y Uso de Tecnologías de la Información en los Hogares (ENDUTIH) 2024: Principales resultados&lt;/em>. &lt;a href="https://www.inegi.org.mx/programas/endutih/2024/">https://www.inegi.org.mx/programas/endutih/2024/&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Speedtest by Ookla. (2024). &lt;em>Speedtest Global Index – Mexico&lt;/em>. &lt;a href="https://www.speedtest.net/global-index/mexico">https://www.speedtest.net/global-index/mexico&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>The Competitive Intelligence Unit. (2024). &lt;em>Mercado de smartphones en México, 1T-2024&lt;/em>. &lt;a href="https://www.theciu.com/publicaciones-analisis/2024/03/smartphones-en-mexico-1T-2024">https://www.theciu.com/publicaciones-analisis/2024/03/smartphones-en-mexico-1T-2024&lt;/a>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Públicado originalmente en el blog de &lt;a href="https://eltelar.xyz/blog/para-quien-estamos-digitalizando-la-educacion/">El telar&lt;/a>&lt;/p>
&lt;/blockquote></description></item><item><title>Reporte: Proyecto Hail Mary de Andy Weir</title><link>https://luisangel.me/es/post/2025/02/05/project-hail-mary/</link><pubDate>Wed, 05 Feb 2025 17:00:00 +0000</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2025/02/05/project-hail-mary/</guid><description>&lt;p>Hace tiempo terminé &lt;em>Project Hail Mary&lt;/em> de Andy Weir y tenía ganas de escribir sobre él.&lt;/p>
&lt;p>La premisa es sencilla: un hombre despierta en una nave sin recordar quién es ni qué está haciendo ahí. Está solo, sus compañeros están muertos y, poco a poco, se da cuenta de que su misión es salvar a la humanidad. La historia sigue un formato de descubrimiento progresivo, donde tanto el personaje como el lector van entendiendo juntos qué está pasando. La amnesia es un recurso narrativo que puede ser un cliché si no se usa bien, pero aquí funciona porque le da a la historia un ritmo muy envolvente.&lt;/p>
&lt;p>Algo que me gustó bastante es que el protagonista no es el típico héroe de ciencia ficción. No es el astronauta valiente y perfecto que ya lo sabe todo. Es más bien un tipo común que se enfrenta a una situación extraordinaria con lo único que tiene: su conocimiento científico. Me recordó mucho a The Martian (bueno, solo he visto la película, pero se siente el mismo tipo de protagonista). Es ciencia ficción que no intenta ser súper filosófica o revolucionaria, sino que busca entretenerte y hacerte sentir que todo lo que sucede podría ser posible.&lt;/p>
&lt;p>Sobre la ciencia, Andy Weir tiene una habilidad impresionante para explicarte cosas complejas sin que se sientan pesadas. No es ciencia ficción dura en el sentido clásico, pero sí hay suficientes detalles técnicos para que todo parezca realista. Desde el problema que amenaza a la humanidad hasta las soluciones espaciales y la forma en que el protagonista resuelve cada obstáculo, todo está lleno de datos científicos que logran que te creas la historia sin sentirte en una clase de física avanzada.&lt;/p>
&lt;p>También hay un giro interesante en la trama que no quiero spoilear demasiado, pero involucra el descubrimiento de una nueva forma de vida inteligente. Lo que me gustó es que no es el clásico alien humanoide con el que puedes hablar desde el primer momento. La manera en que se desarrolla esa relación es uno de los puntos más fuertes del libro y le da un toque extra de originalidad.&lt;/p>
&lt;p>Si tengo que decir algo que podría no gustarle a algunas personas, es el protagonista. No a todos les va a caer bien. Es un personaje con mucha energía, mucho monólogo interno y un humor que puede sentirse repetitivo si no conectas con él. A mí no me molestó, pero entiendo que puede no ser del agrado de todos.&lt;/p>
&lt;p>No creo que el libro tenga un mensaje profundo. No es de esos que te hacen cuestionar la existencia o replantearte el futuro de la humanidad. Sí toca temas como la cooperación global, la importancia de la ciencia y el sacrificio, pero nunca de manera demasiado profunda. Y no creo que eso sea un problema. No todos los libros tienen que cambiarte la vida; algunos solo tienen que ser divertidos.&lt;/p>
&lt;p>En cuanto a a quién se lo recomendaría, creo que es perfecto para alguien que disfruta la ciencia ficción pero no quiere meterse en cosas muy densas como Fundación o Dune. Es un libro rápido, fácil de leer, con buena ciencia y un ritmo que no te suelta. Si te gusta cuando las historias tienen un montón de explicaciones científicas pero sin sentirse como un manual técnico, este libro es para ti. Si por el contrario te aburren los detalles científicos, tal vez no sea la mejor opción porque Andy Weir sí dedica bastante espacio a explicar cómo funcionan las cosas.&lt;/p>
&lt;p>Definitivamente lo volvería a leer. No porque tenga misterios ocultos que necesiten una segunda lectura, sino porque lo disfruté lo suficiente como para querer revivir la experiencia en unos años, cuando ya haya olvidado algunos detalles. También me dejó con ganas de leer &lt;em>The Martian&lt;/em> y &lt;em>Artemis&lt;/em>, así que probablemente esos sean los siguientes en mi lista.&lt;/p></description></item><item><title>Adiós Nextra, hola Hugo</title><link>https://luisangel.me/es/post/2024/07/31/adios-nextra-hola-hugo/</link><pubDate>Wed, 31 Jul 2024 17:00:00 +0000</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2024/07/31/adios-nextra-hola-hugo/</guid><description>&lt;p>Este blog ha estado abandonado años para este punto. Desde que dejé de escribir en &lt;a href="https://aviyel.com">Aviyel&lt;/a> no he hecho nada muy técnico y sobre escritos más personales se me ha aconsejado no publicarlos en línea de manera tan libre como lo solía hacer, ya que hay convocatorias que cuentan como publicado un cuento si se encuentra en una web.&lt;/p>
&lt;p>Eso no quiere decir que durante estos años me haya desinteresado el tema, al contrario. Gracias a Hacker News y Mastodon he conocido un montón de blogs que me encantan y de donde he estado tomando inspiración para la siguiente etapa del mío.&lt;/p>
&lt;h2 id="el-gran-cambio-de-generador-de-sitios-estáticos">El gran cambio de generador de sitios estáticos&lt;/h2>
&lt;p>Anteriormente mi web se usaba &lt;a href="https://github.com/shuding/nextra">Nextra&lt;/a> y estaba &lt;em>hosteada&lt;/em> en&lt;a href="https://vercel.com/"> Vercel&lt;/a>. La verdad es que este combo hizo que el desarrollo y el &lt;em>deploy&lt;/em> fuera muy sencillo, así como agregar mi dominio personalizado. Pero dado a que adopté el Nextra en una etapa muy temprana la personalización que se podía hacer era mínima. Ahora parece estar más enfocado en páginas de documentación de proyectos y el estilo puede ser cambiado a través de los &lt;em>helpers&lt;/em> de &lt;a href="https://tailwindcss.com/">Tailwind&lt;/a>.&lt;/p>
&lt;p>Aún con esto, durante mi tiempo inactivo conocí a Hugo y empecé a jugar con él. Hice varios proyectos de prueba con diferentes temas y objetivos a manera de práctica, y si bien Hugo tiene muchas ventajas en cuanto a la velocidad de generar el sitio web gracias a que está hecho en Go, lo que me llamó la atención fue la cantidad de temas ya hechos y la facilidad de personalizarlos. Desde cosas sencillas como los colores u otros estilos a través de un archivo de CSS hasta poder modificar partes esenciales del tema como los &lt;em>headers&lt;/em>, la &lt;em>navbar&lt;/em> y el &lt;em>feed&lt;/em> &lt;em>RSS&lt;/em>. Finalmente me decidí por el tema&lt;a href="https://github.com/goodroot/hugo-classic"> hugo-classic&lt;/a> con modificaciones en todo lo mencionado anteriormente.&lt;/p>
&lt;p>Para el hosting pasé de Vercel a GitHub Pages, por facilidad de tener todo lo relacionado con el blog en un mismo lugar. La migración del dominio no fue compleja pero sí tuvo sus detalles, nada que borrar todos los registros en&lt;a href="https://porkbun.com/"> Porkbun&lt;/a> y agregarlos de nuevo no haya resuelto. Por otro lado, el &lt;em>deployment&lt;/em> fue más complejo. Hugo tiene en su documentación una&lt;a href="https://gohugo.io/hosting-and-deployment/hosting-on-github/#prose"> guía&lt;/a> de como hacer el &lt;em>deploy&lt;/em> a través de una acción, pero en mi opinión está incompleta. Faltan cosas como si se está usando un tema asegurarse de incluir el submódulo de git entre otras pequeñas cosas que se puede tener que llegar a necesitar modificar. Al día de escribir esto el sitio está libre de errores de este tipo aunque sí hay algunos temas con el estilo en pantallas de móviles.&lt;/p>
&lt;p>En general, a pesar de los múltiples intentos que me tomó tener el sitio arriba de manera correcta estoy muy contento con el nuevo setup y lo recomiendo a cualquiera que esté pensando en seguir por este camino.&lt;/p>
&lt;h2 id="la-nueva-organización-y-filosofía-sobre-blog">La nueva organización y filosofía sobre blog&lt;/h2>
&lt;p>Cuando recién creé la primera versión de la web no tenía mucha experiencia leyendo o siguiendo blogs de otras personas, entonces lo estructuré lo mejor que pude. Ahora las cosas han cambiado, se lo que me gusta y lo que no; que y como compartirlo.&lt;/p>
&lt;p>Por ahora el acomodo de las páginas será el siguiente. Como el enfoque principal de la página es como blog la sección más extensa es la de los escritos. Si bien el feed rss va a meter todos los post en un solo lugar, no quería que vivieran así dentro de la página. Blogposts será para este tipo de cosas, simplemente escritos al vacío del internet. Los artículos son para guías y cosas más técnicas. Reseñas es para escribir sobre películas, libros, juegos, etc. Finalmente los trabajos son para mis obras publicadas, aunque por el momento solo vivo una espero que sea una de las más amplias.&lt;/p>
&lt;p>Fuera de los escritos, proyectos la carta de presentación de mi trabajo, como un pequeño cv de mi huella en linea. Sobre mí es bueno, una pequeña biografía y finalmente, el jardín es algo raro y complejo pero básicamente ahí vive lo demás. La mejor sección honestamente.&lt;/p>
&lt;p>En el índice aparte listo que es lo que estoy &amp;ldquo;haciendo&amp;rdquo;. Qué es lo que estoy jugando, leyendo, escuchando y viendo. Solo es una manera de compartir que me apasiona en el momento, con suerte muchos de esos &lt;em>bulletpoints&lt;/em> se volverán reseñas. También tiene mis últimas lecturas, artículos que me parece interesante compartir y/o comentar.&lt;/p>
&lt;p>En cuanto a la filosofía del blog, específicamente con los &amp;ldquo;blogposts&amp;rdquo; quiero escribir más. Tratar de capturar el espíritu de los blogs que sigo con la manera que comparten cosas, sin necesariamente llegar a escribir ensayos o guías técnicas. Además me gustaría escribir más también reseñas, compartir mis notas, mis quotes favoritos. Dejar de consumir sin pensar.&lt;/p>
&lt;p>En resumen, que la página sea una excusa para seguir escribiendo y compartiendo.&lt;/p>
&lt;h2 id="la-diferencia-ante-las-redes-sociales">La diferencia ante las redes sociales&lt;/h2>
&lt;p>Finalmente estoy haciendo esto porque ya no disfruto como antes las redes sociales. Lo que era Twitter se fragmentó, Facebook e Instagram tienen un feed horrible lleno de anuncios. Realmente donde paso mi tiempo es YouTube y TikTok.&lt;/p>
&lt;p>Aparte de que simplemente ya no es lo mismo, el saber que todos mis contactos ven lo que publique en su feed me ha dado un pesar al publicar. Aquí sigue siendo público, puedo seguir compartiendo las cosas que me apasionan sin la certeza de que todo mundo lo va a ver, todo mundo lo &lt;em>puede&lt;/em> ver pero a nadie se le va a servir forzosamente.&lt;/p>
&lt;p>Este post era solamente para compartir estas cosas, documentar el cambio que sufrió esta página, un rant y monólogo al aire. No tengo una verdadera conclusión, así que con esto los dejo.&lt;/p></description></item><item><title>últimas lecturas</title><link>https://luisangel.me/es/garden/ultimas-lecturas/</link><pubDate>Fri, 24 May 2024 12:26:36 -0500</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/garden/ultimas-lecturas/</guid><description>&lt;ul>
&lt;li>
&lt;p>(01/10/25) &lt;a href="https://www.theguardian.com/lifeandstyle/2025/oct/01/artificial-intelligence-em-dashes-ai-stealing-my-livelihood">My petty gripe: not only am I losing my livelihood to AI – now it’s stealing my em dashes too&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(01/10/25) &lt;a href="https://www.wallpaper.com/design-interiors/booker-prize-2025-longlist-writers-desks">This is where The Booker Prize nominees write: from kitchen tables to a cemetery bench&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(30/09/25) &lt;a href="https://www.joanwestenberg.com/p/remember-kurt-vonnegut-was-47">Remember: Kurt Vonnegut was 47&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(30/09/25) &lt;a href="https://literalmagazine.com/cuentos-imprescindibles-del-siglo-xx-de-america-latina/">Cuentos imprescindibles del siglo XX de América Latina - Literal Magazine&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(24/09/25) &lt;a href="https://cjauvin.github.io/posts/learning-persian/">Learning Persian with Anki, ChatGPT and YouTube&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(18/09/25) &lt;a href="https://kokada.dev/blog/kde-is-now-my-favorite-desktop/">KDE is now my favorite desktop — kokada&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(17/09/25) &lt;a href="https://jriddell.org/2025/09/14/adios-chicos-25-years-of-kde/">Adios Chicos, 25 Years of KDE – Jonathan Riddell&amp;rsquo;s Diary&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(17/09/25) &lt;a href="https://herman.bearblog.dev/slow-social-media/">Slow social media&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(17/09/25) &lt;a href="https://www.sfgate.com/tech/article/bay-area-tech-scene-dorky-now-terrifying-21042943.php">The old SF tech scene is dead. What it&amp;rsquo;s morphing into is far more sinister.&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(17/09/25) &lt;a href="https://www.bbc.com/news/articles/c1lelqg0jy3o">What happened when teens tried out tech-free bedrooms?&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(09/09/25) &lt;a href="https://www.xipu.li/posts/the-last-programmers">The Last Programmers ｜｜ Xipu Li&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(18/08/25) &lt;a href="https://ofdollarsanddata.com/its-the-housing-stupid/">It&amp;rsquo;s the Housing, Stupid&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(18/08/25) &lt;a href="https://xeiaso.net/blog/2025/who-assistant-serve/">Who does your assistant serve?&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(18/08/25) &lt;a href="https://buttondown.com/hillelwayne/archive/why-i-prefer-rst-to-markdown/">Why I prefer rST to markdown&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(14/08/25) &lt;a href="https://teejeetech.com/2025/08/14/debian_13_tips/">Optimizing Your Debian 13 Desktop&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(08/08/25) &lt;a href="https://bytemash.net/posts/i-went-down-the-linear-rabbit-hole/">Linear sent me down a local-first rabbit hole ｜ Bytemash&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(22/07/25) &lt;a href="https://sophiebits.com/2025/07/21/todos-arent-for-doing">TODOs aren&amp;rsquo;t for doing – Sophie Alpert&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(22/07/25) &lt;a href="https://kau.sh/blog/how-to-firefox/#fnref:2">🦊 How to Firefox - Kaushik Gopal&amp;rsquo;s Website&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(21/07/25) &lt;a href="https://yberreby.com/posts/i-used-arch-btw-macos-day-1/">I Used Arch, BTW: macOS, Day 1 - @yberreby&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(21/07/25) &lt;a href="https://hamy.xyz/blog/2024-02_htmx-for-side-projects">Why you should choose HTMX for your next web-based side project - and ditch the crufty MPA and complex SPA&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(19/07/25) &lt;a href="https://varunraghu.com/im-rebelling-against-the-algorithm/">I&amp;rsquo;m rebelling against the algorithm&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(09/07/25) &lt;a href="https://websmith.studio/blog/astro-is-a-developers-dream/">Astro is a developers f***ing dream — Websmith Studio&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(27/06/25) &lt;a href="https://kramkow.ski/article/2025/06/27/my_lights_run_on_bash.html">My Lights Run on Bash - Tomasz Kramkowski&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(27/06/25) &lt;a href="https://ralphammer.com/thomas-aquinas-the-world-is-divine/">Thomas Aquinas — The world is divine&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(27/06/25) &lt;a href="https://fireborn.mataroa.blog/blog/you-dont-own-the-word-freedom-a-full-burn-response-to-the-gnulinux-comment-that-tried-to-gatekeep-me-off-my-own-machine/">You Don&amp;rsquo;t Own the Word &amp;ldquo;Freedom&amp;rdquo;: A Full-Burn Response to the GNU/Linux Comment That Tried to Gatekeep Me Off My Own Machine — fireborn&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(24/06/25) &lt;a href="https://jyn.dev/how-i-use-my-terminal/">how i use my terminal&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(17/06/25) &lt;a href="https://gizvault.com/archives/hack-the-planet">Hack the Planet: 90s Hacker Culture vs. Today&amp;rsquo;s AI Devs&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(17/06/25) &lt;a href="https://literalmagazine.com/la-sombria-primavera-de-unica-zurn/">La sombría primavera de Unica Zürn - Literal Magazine&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(16/06/25) &lt;a href="https://bowshock.nl/irc/">Start your own Internet Resiliency Club – Bow Shock Systems Consulting&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(04/06/25) &lt;a href="https://happihacking.com/blog/posts/2025/why_I_wrote_theBEAMBook/">Why I Wrote the BEAM Book&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(02/06/25) &lt;a href="https://notsocommonthoughts.com/blog/ai-and-judgement/">Not So Common Thoughts&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(02/06/25) &lt;a href="https://shkspr.mobi/blog/2025/05/whatever-happened-to-cheap-ereaders/">Whatever happened to cheap eReaders?&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(27/05/25) &lt;a href="https://www.faisalabid.com/p/you-share-a-house-with-einstein-hawking">You share a house with Einstein, Hawking and Tao&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(16/05/25) &lt;a href="https://www.orwellfoundation.com/the-orwell-foundation/orwell/essays-and-other-works/a-nice-cup-of-tea/">A Nice Cup of Tea ｜ The Orwell Foundation&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(16/05/25) &lt;a href="https://thepointmag.com/examined-life/gateway-books/">Gateway Books ｜ The Point Magazine&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(14/05/25) &lt;a href="https://bloggeroo.dev/articles/202504031434">I failed a take-home assignment from Kagi Search - Bloggeroo&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(08/04/25) &lt;a href="https://www.theverge.com/tech/639126/india-frankenstein-laptops">The rise of &amp;lsquo;Frankenstein&amp;rsquo; laptops in New Delhi&amp;rsquo;s repair markets&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(02/04/25) &lt;a href="https://www.theatlantic.com/family/archive/2025/03/e-bike-family-parenthood/682052/?gift=2PSdP8nFdCJv4156wCBBiLgFRUe05yhjKAjml8A4Wrk">An E-Bike Transformed My Family&amp;rsquo;s Life&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(26/03/25) &lt;a href="https://supernuclear.substack.com/p/stoop-coffee-how-a-simple-idea-transformed">Stoop Coffee: How a Simple Idea Transformed My Neighborhood&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(03/03/25) &lt;a href="https://moultano.wordpress.com/2024/05/03/a-few-of-the-birds-i-love/">A Few of the Birds I Love&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(03/03/25) &lt;a href="https://oem.com.mx/elheraldodechihuahua/local/enfrenta-chihuahua-un-deficit-de-6-metros-cuadrados-de-areas-verdes-por-habitante-alerta-el-implan-21810703">Enfrenta Chihuahua un déficit de 6 metros cuadrados de áreas verdes por habitante: alerta el IMPLAN - El Heraldo de Chihuahua ｜ Noticias Locales, Policiacas, de México, Chihuahua y el Mundo&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(01/03/25) &lt;a href="https://www.404media.co/the-digital-packrat-manifesto/">The Digital Packrat Manifesto&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(23/02/25) &lt;a href="https://www.contraption.co/rails-versus-nextjs/">Why Ruby on Rails still matters&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(30/01/25) &lt;a href="https://www.henrikkarlsson.xyz/p/start-a-blog">Advice for a friend who wants to start a blog&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(07/01/25) &lt;a href="https://den.dev/blog/be-a-property-owner-not-a-renter-on-the-internet/">Be A Property Owner And Not A Renter On The Internet&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(07/01/25) &lt;a href="https://medium.com/@metapgmr/software-is-eating-the-world-all-right-faedbab6d623">Software is eating the world, … all right&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(04/01/25) &lt;a href="https://healeycodes.com/building-game-prototypes-with-love">Building Game Prototypes with LÖVE&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(02/01/25) &lt;a href="https://blog.jacobvosmaer.nl/0036-beeper/">My favourite computer ergonomics hack&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(02/01/25) &lt;a href="https://lehnews.wordpress.com/2014/03/25/walter-isaacson-my-so-called-writing-life/">Walter Isaacson: &amp;ldquo;My So-Called Writing Life&amp;rdquo;&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(23/12/24) &lt;a href="https://ntietz.com/blog/feel-dont-think/">Feel, don&amp;rsquo;t think ｜ nicole@web&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(20/12/24) &lt;a href="https://www.404media.co/apparently-this-is-how-you-jailbreak-ai/">APpaREnTLy THiS iS hoW yoU JaIlBreAk AI&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(12/12/24) &lt;a href="https://www.youtube.com/watch?v=T31HKuabyMA">When Your Hero Is A Monster&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(11/12/24) &lt;a href="https://calebhearth.com/dont-get-distracted">Don&amp;rsquo;t Get Distracted&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(11/12/24) &lt;a href="https://www.ntietz.com/blog/evolving-ergo-setup/">Evolving my ergonomic setup (or, my laptop with extra steps) ｜ nicole@web&lt;/a>&lt;/p>
&lt;/li>
&lt;/ul></description></item><item><title>Titan (Microficción)</title><link>https://luisangel.me/es/post/2024/04/24/titan/</link><pubDate>Wed, 24 Apr 2024 15:15:49 -0500</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2024/04/24/titan/</guid><description>&lt;p>Mi cuento Titán obtuvo el tercer lugar en el 4to Concurso de Cuento Corto de la Red de Bibliotecas Lasallistas en 2024. Esta obra será publicada en una antología próxima, que actualmente se encuentra en proceso editorial. Es un honor ver Titán formar parte de esta colección junto con los trabajos de otros talentosos escritores. ¡Pronto compartiré más detalles sobre la publicación!&lt;/p></description></item><item><title>El Templo sin Tiempo (poema) y L05T P03T45 (cuento corto)</title><link>https://luisangel.me/es/post/2024/03/07/aventuras-de-papel/</link><pubDate>Thu, 07 Mar 2024 15:15:49 -0500</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2024/03/07/aventuras-de-papel/</guid><description>&lt;p>¡Me alegra anunciar que mis obras El Templo sin Tiempo (poema) y L05T P03T45 (cuento) fueron presentadas en la exposición literaria internacional Aventuras de Papel en Mar del Plata, Argentina, en 2024! Este evento reunió a escritores de diversas partes del mundo para celebrar la creatividad y la literatura, y es un honor haber formado parte de esta experiencia.&lt;/p>
&lt;p>Descúbrelos aquí:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://aventuraspapel.blogspot.com/2024/03/el-templo-sin-tiempo.html">El Templo sin Tiempo (poema)&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://aventuraspapel.blogspot.com/2024/02/atencion-cazadores.html">L05T P03T45 (cuento corto)&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Dropdowns y Toggles con puro CSS</title><link>https://luisangel.me/es/post/2022/11/05/dropdowns-y-toggles-con-css/</link><pubDate>Sat, 05 Nov 2022 11:53:11 -0500</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2022/11/05/dropdowns-y-toggles-con-css/</guid><description>&lt;p>Podríamos imaginar las tecnologías de la plataforma en la cual trabajo, &lt;a href="https://www.joinbuildit.com/">Build It&lt;/a>, como un platillo; donde Ruby on Rails es nuestro platillo principal pero está acompañada de una buena porción al lado de JavaScript a través de &lt;a href="https://stimulus.hotwired.dev/">Stimulus JS&lt;/a>, y mientras esta trae la funcionalidad y ese sentimiento mágico de una aplicación de una sola página (SPA, por sus siglas en inglés) hay cosas que queremos mantener simple en lugar de usar una bomba para matar una hormiga, como un profesor de la universidad solía decir. Por ello decidimos tomar nota de la página de &lt;a href="https://apple.com/mx">Apple&lt;/a> a la hora de manejar menús desplegables o dropdown y hacerlo por medio de puro CSS y HTML; sin requerir una línea de JavaScript.&lt;/p>
&lt;h2 id="los-pilares">Los pilares&lt;/h2>
&lt;p>Nuestros dos pilares en la vista serán los elementos &lt;code>&amp;lt;input&amp;gt;&lt;/code> de tipo checkbox y las etiquetas &lt;code>&amp;lt;label&amp;gt;&lt;/code>. Formaremos nuestro esqueleto básico de la siguiente manera:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#ca9ee6">input&lt;/span> &lt;span style="color:#8caaee">id&lt;/span>&lt;span style="color:#99d1db;font-weight:bold">=&lt;/span>&lt;span style="color:#a6d189">&amp;#34;toggle&amp;#34;&lt;/span> &lt;span style="color:#8caaee">type&lt;/span>&lt;span style="color:#99d1db;font-weight:bold">=&lt;/span>&lt;span style="color:#a6d189">&amp;#34;checkbox&amp;#34;&lt;/span>&amp;gt;&amp;lt;/&lt;span style="color:#ca9ee6">input&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#ca9ee6">label&lt;/span> &lt;span style="color:#8caaee">for&lt;/span>&lt;span style="color:#99d1db;font-weight:bold">=&lt;/span>&lt;span style="color:#a6d189">&amp;#34;toggle&amp;#34;&lt;/span>&amp;gt;&amp;lt;/&lt;span style="color:#ca9ee6">label&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Estaremos usando la propiedad checked de los inputs tipo checkbox para poder controlar el contenido que mostramos y cuando lo mostramos. Para esto nos estaremos apoyando del elemento &lt;code>&amp;lt;label&amp;gt;&lt;/code> ya que al relacionarlo a través de su propiedad &lt;code>for&lt;/code> también será afectado por el cambio de clases cuando la propiedad checked de nuestro checkbox se encuentre presente.&lt;/p>
&lt;p>Todo nuestro código realmente se encontrará dentro de &lt;code>&amp;lt;label&amp;gt;&lt;/code> en dos secciones: container y toggle como se muestra a continuación.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#ca9ee6">input&lt;/span> &lt;span style="color:#8caaee">id&lt;/span>&lt;span style="color:#99d1db;font-weight:bold">=&lt;/span>&lt;span style="color:#a6d189">&amp;#34;toggle&amp;#34;&lt;/span> &lt;span style="color:#8caaee">type&lt;/span>&lt;span style="color:#99d1db;font-weight:bold">=&lt;/span>&lt;span style="color:#a6d189">&amp;#34;checkbox&amp;#34;&lt;/span>&amp;gt;&amp;lt;/&lt;span style="color:#ca9ee6">input&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;&lt;span style="color:#ca9ee6">label&lt;/span> &lt;span style="color:#8caaee">for&lt;/span>&lt;span style="color:#99d1db;font-weight:bold">=&lt;/span>&lt;span style="color:#a6d189">&amp;#34;toggle&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#ca9ee6">div&lt;/span> &lt;span style="color:#8caaee">class&lt;/span>&lt;span style="color:#99d1db;font-weight:bold">=&lt;/span>&lt;span style="color:#a6d189">&amp;#34;toggle&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#737994;font-style:italic">&amp;lt;!-- El elemento con el cual el usuario va a interactuar --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;/&lt;span style="color:#ca9ee6">div&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;&lt;span style="color:#ca9ee6">div&lt;/span> &lt;span style="color:#8caaee">class&lt;/span>&lt;span style="color:#99d1db;font-weight:bold">=&lt;/span>&lt;span style="color:#a6d189">&amp;#34;container&amp;#34;&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#737994;font-style:italic">&amp;lt;!-- Lo que queremos mostrar--&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;/&lt;span style="color:#ca9ee6">div&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;/&lt;span style="color:#ca9ee6">label&lt;/span>&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="la-magia">La magia&lt;/h2>
&lt;p>Ahora que ya tenemos nuestro esqueleto con HTML listo, es hora de agregar el CSS que le dará el toque mágico a nuestro componente:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-css" data-lang="css">&lt;span style="display:flex;">&lt;span>#&lt;span style="color:#ef9f76">toggle&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">display&lt;/span>: &lt;span style="color:#ef9f76">none&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#e5c890">container&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">display&lt;/span>: &lt;span style="color:#ef9f76">none&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>#&lt;span style="color:#ef9f76">toggle&lt;/span>:&lt;span style="color:#8caaee;font-weight:bold">checked&lt;/span> &lt;span style="color:#99d1db;font-weight:bold">+&lt;/span> &lt;span style="color:#ca9ee6">label&lt;/span> .&lt;span style="color:#e5c890">container&lt;/span> { 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">display&lt;/span>: &lt;span style="color:#ef9f76">inherit&lt;/span>; 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Nuestro input con el id de toggle nunca se mostrará para que no tengamos la checkbox presente en nuestra página, lo que mostraremos y con lo que interactúa el usuario es lo que esté dentro de nuestra div con clase de toggle. Una vez que le den click a nuestro toggle el input tendrá el valor de checked y con &lt;code>#toggle:checked+label&lt;/code> afectamos el estilo de nuestro &lt;code>&amp;lt;label&amp;gt;&lt;/code> para obtener un resultado como el siguiente&lt;/p>
&lt;p>&lt;img src="https://luisangel.me/images/post/dropdowns-toggle-css-1.gif" alt="Demo 1">&lt;/p>
&lt;p>Y con un poco más de estilo (cortesía de Thulio Philipe) podemos tener resultados como este&lt;/p>
&lt;p>&lt;img src="https://luisangel.me/images/post/dropdowns-toggle-css-2.gif" alt="Demo 2">&lt;/p>
&lt;p>O como los ejemplos que tenemos dentro de Build It&lt;/p>
&lt;p>&lt;img src="https://luisangel.me/images/post/dropdowns-toggle-css-3.gif" alt="Demo 3">&lt;/p>
&lt;p>Un pequeño popover que siempre está presente, dando información vital al usuario&lt;/p>
&lt;p>&lt;img src="https://luisangel.me/images/post/dropdowns-toggle-css-4.gif" alt="Demo 4">&lt;/p>
&lt;p>O un menú de filtros que puede ser mostrado con facilidad.&lt;/p>
&lt;p>Como podemos ver, el CSS moderno nos permite hacer páginas interactivas sin necesidad de hacer un script para ello; dándonos una nueva solución a un problema con infinidad de maneras de resolverlo, por lo que habrá que considerar las necesidades del proyecto y que es lo que más conviene.&lt;/p>
&lt;p>Finalmente les dejo &lt;a href="https://github.com/LinkSake/toggle-dropdown-css">un repositorio&lt;/a> con un par de ejemplos vistos en este artículo para referencia futura y los invito a ver &lt;a href="https://www.joinbuildit.com/early_access/client">la plataforma&lt;/a> y en especial &lt;a href="https://www.joinbuildit.com/u/luis-ortega-160">mi perfil&lt;/a>, donde podremos conectar para proyectos futuros.&lt;/p></description></item><item><title>Docker + Rails: Una solución para tus dolores de cabeza</title><link>https://luisangel.me/es/post/2021/09/02/docker-y-rails/</link><pubDate>Thu, 02 Sep 2021 15:15:49 -0500</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2021/09/02/docker-y-rails/</guid><description>&lt;p>¿Has llegado a pasar una semana solamente tratando de correr el proyecto al que te acabas de unir? ¿O tu aplicación no corre en producción como corría en local?&lt;br>
Hay una multitud de factores que pueden contribuir esto, por ello &lt;a href="https://www.docker.com/">Docker&lt;/a> nos ofrece una solución con la cual podemos tener un mayor control sobre estas variables a través de las computadoras que sean necesarias.&lt;/p>
&lt;p>Dicho esto, en este articulo veremos como falicitarnos la vida al tener toda nuestra aplicación de Ruby on Rails corriendo sobre Docker; incluidas las bases de datos que sean necesarias.&lt;/p>
&lt;h2 id="prerequisitos">Prerequisitos&lt;/h2>
&lt;p>Para poder seguir esta guía necesitaras tener &lt;a href="https://docs.docker.com/get-docker/">Docker instalado&lt;/a> así como un proyecto el cual quieras &lt;em>dockerizar&lt;/em>, si solamente quieres prácticar puedes usar &lt;a href="https://github.com/LinkSake/docker-rails">este proyecto de ejemplo&lt;/a> el cual necesita una conexión a &lt;a href="https://es.wikipedia.org/wiki/PostgreSQL">Postgres&lt;/a> y a &lt;a href="https://es.wikipedia.org/wiki/Redis">Redis&lt;/a> para funcionar.&lt;/p>
&lt;p>¿Eres impaciente? ¡Puedes clonar &lt;a href="https://github.com/LinkSake/docker-rails/tree/docker">esta rama&lt;/a> del proyecto donde ya se encuentran los archivos necesarios para correr el projecto dentro de Docker!&lt;/p>
&lt;h2 id="primero-viene-el-dockerfile">Primero viene el Dockerfile&lt;/h2>
&lt;p>Lo primero que haremos será hacer una &lt;a href="https://docs.docker.com/get-started/overview/#docker-objects">imagen&lt;/a> personalizada para nuestro proyecto, así que crearemos un archivo en la raíz del mismo llamado &lt;code>Dockerfile&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>touch Dockerfile
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>La primer linea de nuestro archivo definirá la imagen de la cual nos basaremos, en este caso será la &lt;a href="https://hub.docker.com/_/ruby">imagen oficial de Ruby&lt;/a>, pero usaremos la versión de &lt;a href="https://es.wikipedia.org/wiki/Alpine_Linux">Alpine&lt;/a> para tener una imagen más ligera como resultado.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-Dockerfile" data-lang="Dockerfile">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ca9ee6">FROM&lt;/span>&lt;span style="color:#a6d189"> ruby:3.0.1-alpine&lt;/span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>⚠️ Asegurate que la version de Ruby (ruby:X.X.X-alpine) sea la misma que en tu proyecto, o tendrás errores a la hora de tratar de construir la imagen. Puedes encontrar la versión que usa tu proyecto en tu Gemfile.&lt;/p>
&lt;/blockquote>
&lt;p>Después sigue la parte más dificil de este Dockerfile, instalar la dependendencias necesarias para que funcione el proyecto; las que se muestran aquí son las que funcionan para nuestro &lt;a href="https://github.com/LinkSake/docker-rails">proyecto de ejemplo&lt;/a>, que incluyen las necesarias para realizar una conexión con Postgres, pero tendrás que descubrir cuales son necesarias para tu proyecto.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-Dockerfile" data-lang="Dockerfile">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ca9ee6">FROM&lt;/span>&lt;span style="color:#a6d189"> ruby:3.0.1-alpine&lt;/span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">RUN&lt;/span> apk add --update --no-cache --virtual run-dependencies &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>build-base &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>postgresql-client &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>postgresql-dev &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>yarn &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>git &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>tzdata &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>libpq &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>&lt;span style="color:#99d1db;font-weight:bold">&amp;amp;&amp;amp;&lt;/span> rm -rf /var/cache/apk/*&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>Puedes esperar a construir la imagen (&lt;code>docker build .&lt;/code>) para revisar el error que imprima Docker, con eso podrás ir averiguando que depenencias hacen falta 😉&lt;/p>
&lt;/blockquote>
&lt;p>La última linea (&lt;code>rm -rf /var/cache/apk/*&lt;/code>) borra los paquetes de las dependencias que acabamos de instalar, esto ahorrará espacio en la imagen.&lt;/p>
&lt;p>Lo siguiente que debemos de realizar es crear un directorio dentro del contenedor donde podamos copiar el código de nuestra aplicación para su ejecución, eso lo haremos con el siguente comando dentro de nuestro Dockerfile.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-Dockerfile" data-lang="Dockerfile">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ca9ee6">FROM&lt;/span>&lt;span style="color:#a6d189"> ruby:3.0.1-alpine&lt;/span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">RUN&lt;/span> apk add --update --no-cache --virtual run-dependencies &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>build-base &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>postgresql-client &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>postgresql-dev &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>yarn &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>git &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>tzdata &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>libpq &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>&lt;span style="color:#99d1db;font-weight:bold">&amp;amp;&amp;amp;&lt;/span> rm -rf /var/cache/apk/*&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">WORKDIR&lt;/span>&lt;span style="color:#a6d189"> /docker-rails&lt;/span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>¡Recuerda cambiar el &lt;code>docker-rails&lt;/code> por el nombre de tu proyecto!&lt;/p>
&lt;/blockquote>
&lt;p>Así como le dimos un hogar a tu proyecto dentro del contenedor que crearemos, las gemas del mismo necesitan una carpeta también. Por ello, le informaremos a &lt;a href="https://bundler.io/es/">bundler&lt;/a> donde colocarlas a través de una variable de ambiente.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-Dockerfile" data-lang="Dockerfile">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ca9ee6">FROM&lt;/span>&lt;span style="color:#a6d189"> ruby:3.0.1-alpine&lt;/span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">RUN&lt;/span> apk add --update --no-cache --virtual run-dependencies &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>build-base &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>postgresql-client &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>postgresql-dev &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>yarn &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>git &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>tzdata &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>libpq &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>&lt;span style="color:#99d1db;font-weight:bold">&amp;amp;&amp;amp;&lt;/span> rm -rf /var/cache/apk/*&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">WORKDIR&lt;/span>&lt;span style="color:#a6d189"> /docker-rails&lt;/span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">ENV&lt;/span> BUNDLE_PATH /gems&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Y aunque ya instalamos las dependencias necesarias para correr Rails dentro del contenedor, tu proyecto necesitará algunas gemas y algunos paquetes de JavaScript para funcionar de manera correcta, vamos a encargarnos de eso de la siguiente manera.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-Dockerfile" data-lang="Dockerfile">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ca9ee6">FROM&lt;/span>&lt;span style="color:#a6d189"> ruby:3.0.1-alpine&lt;/span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">RUN&lt;/span> apk add --update --no-cache --virtual run-dependencies &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>build-base &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>postgresql-client &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>postgresql-dev &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>yarn &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>git &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>tzdata &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>libpq &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>&lt;span style="color:#99d1db;font-weight:bold">&amp;amp;&amp;amp;&lt;/span> rm -rf /var/cache/apk/*&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">WORKDIR&lt;/span>&lt;span style="color:#a6d189"> /docker-rails&lt;/span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">ENV&lt;/span> BUNDLE_PATH /gems&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">COPY&lt;/span> package.json yarn.lock /docker-rails/&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">RUN&lt;/span> yarn install&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">COPY&lt;/span> Gemfile Gemfile.lock /docker-rails/&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">RUN&lt;/span> bundle install&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Ahora que ya tenemos todo lo necesario para que funcione tu proyecto, vamos a copiar el código al contenedor dentro de la que carpeta que creamos con el comando &lt;code>WORKDIR&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-Dockerfile" data-lang="Dockerfile">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ca9ee6">FROM&lt;/span>&lt;span style="color:#a6d189"> ruby:3.0.1-alpine&lt;/span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">RUN&lt;/span> apk add --update --no-cache --virtual run-dependencies &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>build-base &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>postgresql-client &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>postgresql-dev &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>yarn &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>git &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>tzdata &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>libpq &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>&lt;span style="color:#99d1db;font-weight:bold">&amp;amp;&amp;amp;&lt;/span> rm -rf /var/cache/apk/*&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">WORKDIR&lt;/span>&lt;span style="color:#a6d189"> /docker-rails&lt;/span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">ENV&lt;/span> BUNDLE_PATH /gems&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">COPY&lt;/span> package.json yarn.lock /docker-rails/&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">RUN&lt;/span> yarn install&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">COPY&lt;/span> Gemfile Gemfile.lock /docker-rails/&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">RUN&lt;/span> bundle install&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">COPY&lt;/span> . /docker-rails/&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>¿Por qué copiamos primero los manifiestos (package.json, Gemfile, etc.) y después el resto del proyecto? Esto nos evita tener que reinstalar las dependencias (dado a que se quedan en caché) después de cambiar el código base y reconstruir la imagen; de esta manera solo cuando cambien los manifiestos se volverá a correr sus comandos de instalación.&lt;/p>
&lt;/blockquote>
&lt;p>Finalmente le diremos a Docker que comando correr cuando iniciemos nuestro contenedor (&lt;code>rails&lt;/code>), así como los argumentos de este (&lt;code>s -b 0.0.0.0&lt;/code>) y que puerto exponer para que nosotros podamos accesar a nuestra aplicación.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-Dockerfile" data-lang="Dockerfile">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ca9ee6">FROM&lt;/span>&lt;span style="color:#a6d189"> ruby:3.0.1-alpine&lt;/span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">RUN&lt;/span> apk add --update --no-cache --virtual run-dependencies &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>build-base &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>postgresql-client &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>postgresql-dev &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>yarn &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>git &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>tzdata &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>libpq &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8caaee">&lt;/span>&lt;span style="color:#99d1db;font-weight:bold">&amp;amp;&amp;amp;&lt;/span> rm -rf /var/cache/apk/*&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">WORKDIR&lt;/span>&lt;span style="color:#a6d189"> /docker-rails&lt;/span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">ENV&lt;/span> BUNDLE_PATH /gems&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">COPY&lt;/span> package.json yarn.lock /docker-rails/&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">RUN&lt;/span> yarn install&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">COPY&lt;/span> Gemfile Gemfile.lock /docker-rails/&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">RUN&lt;/span> bundle install&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">COPY&lt;/span> . /docker-rails/&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">ENTRYPOINT&lt;/span> [&lt;span style="color:#a6d189">&amp;#34;bin/rails&amp;#34;&lt;/span>]&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">CMD&lt;/span> [&lt;span style="color:#a6d189">&amp;#34;s&amp;#34;&lt;/span>, &lt;span style="color:#a6d189">&amp;#34;-b&amp;#34;&lt;/span>, &lt;span style="color:#a6d189">&amp;#34;0.0.0.0&amp;#34;&lt;/span>]&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e78284">&lt;/span>&lt;span style="color:#ca9ee6">EXPOSE&lt;/span>&lt;span style="color:#a6d189"> 3000&lt;/span>&lt;span style="color:#e78284">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>El puerto default sobre el que Rails corre es el 3000, pero si has designado otro puerto dentro de tu aplicación asegurarte de exponerlo de manera correcta.&lt;/p>
&lt;/blockquote>
&lt;p>Y con esto tenemos listo nuestro Dockerfile, aunque estamos lejos de tener nuestra aplicación lista. Si construyeramos nuestra imagen con &lt;code>docker build .&lt;/code> y trataramos de correrla con &lt;code>docker start docker-rails&lt;/code> nos encontraríamos con un error, ya que Rails no encuentra las bases de datos que necesita para iniciar de manera correcta; pero pronto nos encargaremos de ello.&lt;/p>
&lt;h2 id="luego-el-docker-composeyml">Luego el docker-compose.yml&lt;/h2>
&lt;p>Para poder coordinar todos los servicios que necesitamos para el correcto funcionamiento de nuestra aplicación (en este caso 2 bases de datos: Posgres y Redis) usaremos &lt;a href="https://docs.docker.com/compose/">docker-compose&lt;/a>, esta útilidad de Docker nos ayudará a crear multimples contenedores de diferentes imagenes, &lt;a href="https://docs.docker.com/compose/networking/">conectarlos&lt;/a>, darles &lt;a href="https://docs.docker.com/compose/environment-variables/">variables de ambiente&lt;/a> e incluso &lt;a href="https://docs.docker.com/storage/volumes/">volumenes&lt;/a>.&lt;/p>
&lt;p>Empezaremos creando un archivo llamado &lt;code>docker-compose.yml&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>touch docker-compose.yml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Y en su primera linea especificaremos que &lt;a href="https://docs.docker.com/compose/compose-file/#compose-and-docker-compatibility-matrix">versión&lt;/a> de la herramienta queremos usar, en este caso usaremos la más reciente a la redacción de este articulo.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ca9ee6">version&lt;/span>: &lt;span style="color:#a6d189">&amp;#39;3.8&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Después indicaremos los servicios que queremos que corra docker-compose, esto lo haremos dentro de la etiqueta &lt;code>services&lt;/code>. A cada servicio le daremos un nombre el cual será importante cuando estemos configurando nuestra imagen así que asegurate de nombrarlo de una manera que haga sentido para ti. Vamos como primer ejemplo servicio de Posgres, al cual llamaremos &lt;em>db&lt;/em>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ca9ee6">version&lt;/span>: &lt;span style="color:#a6d189">&amp;#39;3.8&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ca9ee6">services&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">db&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">image&lt;/span>: postgres:latest
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">container_name&lt;/span>: docker-rails-db
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">environment&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - POSTGRES_DB=docker-rails-dev
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - POSTGRES_PASSWORD=password
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">ports&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ef9f76">5432&lt;/span>:&lt;span style="color:#ef9f76">5432&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">volumes&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#a6d189">&amp;#39;dbdata:/var/lib/postgresql/data&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>Los archivos YAML son sensibles a la identación, así que asegurate de tener todo en orden y andidado de forma correcta.&lt;/p>
&lt;/blockquote>
&lt;p>La etiqueta &lt;code>db&lt;/code> es el nombre que le dimos al servicio y dentro de la cual especificaremos toda la configuración del mismo.&lt;/p>
&lt;p>Lo primero con lo que nos encontramos es &lt;code>image&lt;/code> que tal como su nombre lo indica es el nombre de la imagen que queremos usar para ese servicio, en este caso es la imagen oficial de Posgres en su última versión (puedes especificar una versión remplazando el &lt;code>latest&lt;/code> por alguna otra versión válida).&lt;/p>
&lt;p>Después nos encontramos con &lt;code>container_name&lt;/code>, que también es autodescriptivo y el cual vendra útil a la hora de checar nuestros contendores con &lt;code>docker ps&lt;/code>.&lt;/p>
&lt;p>&lt;code>enviroment&lt;/code> se refiere a las variables de ambiente, y si nos referimos a la documentación de la imagen de &lt;a href="https://hub.docker.com/_/postgres">Docker de Posgres&lt;/a> podemos ver que la única variable obligatoria es &lt;code>POSTGRES_PASSWORD&lt;/code> pero nosotros también definiremos &lt;code>POSTGRES_DB&lt;/code> para darle un nombre personalizado a la base de datos que crea la imagen por defecto.&lt;/p>
&lt;blockquote>
&lt;p>⚠️ ¡Asegurate de elegir una contraseña segura para la base de datos!&lt;/p>
&lt;/blockquote>
&lt;p>&lt;code>ports&lt;/code> son los puertos que necesitaremos pasar de dentro del contenedor a nuestra maquina, los indicados en el archivo son los que por defecto usa Posgres.&lt;/p>
&lt;p>Finalmente los &lt;code>volumes&lt;/code> son la infomación persistente que necesitaremos para no correr las migraciones cada vez que encendamos el contenedor, esto porque Docker borra todos los datos una vez que damos de baja la información, si quieres aprender más sobre este tema te recomiendo &lt;a href="https://docs.docker.com/storage/volumes/">esta&lt;/a> sección de la documentación.&lt;/p>
&lt;p>Ahora, el siguiente servicio es el de Redis pero no ahondaremos mucho en el pues cuenta solo con un par de etiquetas las cuales ya hemos revisado, para más información puedes visitar &lt;a href="https://hub.docker.com/_/redis">la imagen oficial.&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ca9ee6">version&lt;/span>: &lt;span style="color:#a6d189">&amp;#39;3.8&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ca9ee6">services&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">db&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">image&lt;/span>: postgres:latest
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">container_name&lt;/span>: docker-rails-db
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">environment&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - POSTGRES_DB=docker-rails-dev
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - POSTGRES_PASSWORD=password
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">ports&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ef9f76">5432&lt;/span>:&lt;span style="color:#ef9f76">5432&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">volumes&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#a6d189">&amp;#39;dbdata:/var/lib/postgresql/data&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">redis&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">image&lt;/span>: redis:latest
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">container_name&lt;/span>: docker-rails-redis
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">ports&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ef9f76">6379&lt;/span>:&lt;span style="color:#ef9f76">6379&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Nuestro último servicio lo llamaremos &lt;code>web&lt;/code> y será la imagen que hemos construido con nuestro &lt;code>Dockerfile&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ca9ee6">version&lt;/span>: &lt;span style="color:#a6d189">&amp;#39;3.8&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ca9ee6">services&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">db&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">image&lt;/span>: postgres:latest
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">container_name&lt;/span>: docker-rails-db
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">environment&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - POSTGRES_DB=docker-rails-dev
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - POSTGRES_PASSWORD=password
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">ports&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ef9f76">5432&lt;/span>:&lt;span style="color:#ef9f76">5432&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">volumes&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#a6d189">&amp;#39;dbdata:/var/lib/postgresql/data&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">redis&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">image&lt;/span>: redis:latest
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">container_name&lt;/span>: docker-rails-redis
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">ports&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ef9f76">6379&lt;/span>:&lt;span style="color:#ef9f76">6379&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">web&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">build&lt;/span>: .
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">image&lt;/span>: docker-rails
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">container_name&lt;/span>: docker-rails-web
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">ports&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ef9f76">3000&lt;/span>:&lt;span style="color:#ef9f76">3000&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">depends_on&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - db
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - redis
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">environment&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - POSTGRES_HOST=db
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - POSTGRES_USER=postgres
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - POSTGRES_PASSWORD=password
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - REDIS_URL=redis://redis:6379
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>La primer etiqueta nueva con la que nos topamos es &lt;code>build&lt;/code>, la cual indica el directorio donde se encuentra nuestro Dockerfile; dado a que nuestro Dockerfile está en la raíz solamente pondremos &lt;code>.&lt;/code>; si tu Dockerfile no está en la raíz o tiene otro nombre es recomendable que leas &lt;a href="https://docs.docker.com/compose/compose-file/compose-file-v3/#build">esta&lt;/a> sección de la documentación para asegurarte que Compose lo encuentre.&lt;/p>
&lt;p>La etiqueta &lt;code>image&lt;/code> en este caso servirá para nombrar la imagen que construirá Compose, ya que al estar presente &lt;code>build&lt;/code> no irá al repositorio a buscar una imagen preconstruida.&lt;/p>
&lt;p>Por último, la etiqueta &lt;code>depends_on&lt;/code> informará a Compose que no se debe de tratar de iniciar el contenedor hasta que estén creados los servicios &lt;code>db&lt;/code> y &lt;code>redis&lt;/code>, así como los conectará de manera interna para que nosotros podamos accesar a ellos mediante un URL (como se puede observar en la variable de ambiente de Redis) o por sus respectivas credenciales (como es el caso de Postgres), si quieres aprender como Docker maneja eso puedes leer sobre &lt;a href="https://docs.docker.com/compose/networking/">Docker Network&lt;/a>.&lt;/p>
&lt;p>Ahora que ya terminamos con los servicios, lo unico que debemos es listar los volumenes que usaremos y a los cuales &lt;a href="https://docs.docker.com/compose/compose-file/compose-file-v3/#volumes">nombramos&lt;/a> de la siguiente manera.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ca9ee6">version&lt;/span>: &lt;span style="color:#a6d189">&amp;#39;3.8&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ca9ee6">services&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">db&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">image&lt;/span>: postgres:latest
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">container_name&lt;/span>: docker-rails-db
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">environment&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - POSTGRES_DB=docker-rails-dev
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - POSTGRES_PASSWORD=password
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">ports&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ef9f76">5432&lt;/span>:&lt;span style="color:#ef9f76">5432&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">volumes&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#a6d189">&amp;#39;dbdata:/var/lib/postgresql/data&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">redis&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">image&lt;/span>: redis:latest
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">container_name&lt;/span>: docker-rails-redis
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">ports&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ef9f76">6379&lt;/span>:&lt;span style="color:#ef9f76">6379&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">web&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">build&lt;/span>: .
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">image&lt;/span>: docker-rails
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">container_name&lt;/span>: docker-rails-web
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">ports&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ef9f76">3000&lt;/span>:&lt;span style="color:#ef9f76">3000&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">depends_on&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - db
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - redis
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">environment&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - POSTGRES_HOST=db
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - POSTGRES_USER=postgres
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - POSTGRES_PASSWORD=password
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - REDIS_URL=redis://redis:6379
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">volumes&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - .:/app
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ca9ee6">volumes&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ca9ee6">dbdata&lt;/span>:
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>¡Y listo! Nuestro &lt;code>docker-compose.yml&lt;/code> está listo, ahora solo falta un paso para empezar a crear nuestra aplicación contenida en Docker.&lt;/p>
&lt;h2 id="ojos-que-no-ven-dockerignore-que-no-siente">Ojos que no ven, .dockerignore que no siente&lt;/h2>
&lt;p>Muchas veces no queremos que ciertos archivos estén en nuestra imagen de Docker pues estos no son necesarios para su contrucción (o se generan en la misma) y solo terminan haciendo el proyecto más grande de lo que necesita ser, como puede ser el caso de los &lt;code>node_modules&lt;/code> y la carpeta &lt;code>.git&lt;/code>.&lt;br>
Para ahorrarnos este espacio crearemos un archivo llamado &lt;code>.dockerignore&lt;/code> en la raíz de nuestro proyecto y añadiremos estas dos carpetas:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#99d1db">echo&lt;/span> &lt;span style="color:#a6d189">&amp;#34;.git \n node_modules&amp;#34;&lt;/span> &amp;gt;&amp;gt; .dockerignore
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Para más información sobre lo que puede contenener un archivo &lt;code>.dockerignore&lt;/code> puedes consultar la &lt;a href="https://docs.docker.com/engine/reference/builder/#dockerignore-file">documentación oficial de Docker&lt;/a>&lt;/p>
&lt;h2 id="unas-bases-de-datos-para-llevar">Unas bases de datos para llevar&lt;/h2>
&lt;p>Antes de correr el proyecto será necesario crear la base de datos que Rails espera, y crearla es tan sencillo que se puede hacer en un solo comando.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>docker-compose run web db:create
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Este comando le dice a Docker que use la imagen (que construirá) para correr un comando, en este caso &lt;code>db:create&lt;/code>. Docker, con lo especificado en el &lt;code>docker-compose.yml&lt;/code> sabe que como &lt;em>web&lt;/em> depende de &lt;em>db&lt;/em> tendrá que correr primero la instancia de Postgres, por lo que la base de datos se creará en este contenedor.&lt;/p>
&lt;blockquote>
&lt;p>¿Por qué solamente &lt;code>db:create&lt;/code> y no &lt;code>rails db:create&lt;/code> o &lt;code>rake db:create&lt;/code>? En nuestro &lt;code>Dockerfile&lt;/code> dimos como punto de entrada el comando &lt;code>rails&lt;/code>, por ello solo es necesario pasar los parametros. Si quisieramos efectuar otro comando dentro del contenedor esto tendría que ser a través de &lt;a href="https://docs.docker.com/engine/reference/commandline/exec/">docker exec&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;h2 id="nuestra-aplicación-en-un-contenedor">Nuestra aplicación en un contenedor&lt;/h2>
&lt;p>Con la base de datos creada, solo queda un comando que corra los contenedores en &lt;a href="https://docs.docker.com/compose/reference/up/">modo separado&lt;/a> y podremos ver el fruto de nuestro trabajo.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>docker-compose up -d
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>¡Y listo! Ya podrás accesar a traves de tu navegador a &lt;a href="http://localhost:3000/">localhost:3000&lt;/a> y ver la página de bienvenida de Rails.&lt;/p>
&lt;p>&lt;img src="https://luisangel.me/images/post/docker-rails-1.png" alt="Welcome to Rails!">&lt;/p>
&lt;h2 id="conclusión">Conclusión&lt;/h2>
&lt;p>Puede que todo este proceso sea algo intimidante al principio, en especial si no sabes Docker, pero su resultado es un ambiente de desarrollo mucho más sencillo para todos los involucrados en el proyecto, pues ahora solo con tener Docker instalado podrán iniciar a programar; sin mencionar los beneficios que esta tecnología puede traer a tu ambiente de producción cuando se combina con Kubernetes o Docker Swarm.&lt;/p>
&lt;p>Espero que te haya sido útil, cualquier cosa puedes &lt;a href="https://luisangel.me/es/about">contactarme&lt;/a> y responderé lo más pronto posible.&lt;/p>
&lt;h2 id="referencias">Referencias&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://docs.docker.com/samples/rails/">Docker Docs&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://gorails.com/episodes/docker-basics-for-gorails">Go Rails&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>¿Home office o no home office? Esa es la cuestión</title><link>https://luisangel.me/es/post/2021/04/20/el-dilema-del-home-office/</link><pubDate>Tue, 20 Apr 2021 15:07:57 -0500</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2021/04/20/el-dilema-del-home-office/</guid><description>&lt;p>Durante este fin de semana que pasó me encontré a mitad de una plática familiar, en ella salió el tema del &lt;em>home office&lt;/em> a lo que mi padre comentó que no era una práctica buena. &amp;ldquo;No es sano&amp;rdquo;, repitió múltiples veces mientras movía la cabeza de derecha a izquierda en manera de negación.&lt;/p>
&lt;p>Mi primo y yo no estábamos de acuerdo con él, pues los dos (que como dato, ambos trabajamos en el ámbito de TI) hemos percibido beneficios enormes al trabajar desde nuestra casa. Tratamos de explicarle, pero él seguía negándolo con la cabeza y finalmente dejamos así la conversación.&lt;/p>
&lt;p>Pero desde entonces no he podido dejar de pensar en ello ¿Realmente es sano el &lt;em>home office&lt;/em>? ¿Realmente tiene los beneficios que yo promulgo? Después de un par de días de reflexión me encontré que este tema, como todo en la vida, es complicado.&lt;/p>
&lt;p>Ya hemos pasado la marca del 1er año de &lt;a href="https://es.wikipedia.org/wiki/Pandemia_de_COVID-19">pandemia&lt;/a>, y desde mi experiencia y mi privilegio, el &lt;em>home office&lt;/em> ha traído a mi vida un montón de beneficios (aunque aquí solo liste 3).&lt;/p>
&lt;hr>
&lt;h3 id="lo-bueno">Lo bueno&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Oportunidades laborales&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>Esta situación me ha permitido tener un empleo a distancia, cosa que si bien antes se podía, no estoy seguro que a mi como desarrollador &lt;em>junior&lt;/em> me dieran la oportunidad de manera tan sencilla.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Más tiempo para mi&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>Creo que esta es la más obvia, pues sin tener que transportarse (o siquiera bañarme en las mañanas) para ir a una oficina he podido dormir más, pasar más tiempo con mi familia y darme tiempo para mi. He podido aventarme a más actividades, que aunque son dentro de mi casa o con un número limitado de gente, que antes no había podido probar; no sabía cuánto tiempo de mi vida se iba solamente en transporte a otros lugares.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Mayor paz mental&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>Este era el punto al que quería llegar, pues creo que no a todos les ha pasado así, pero para mi (después del golpe inicial del confinamiento) mi salud mental ha mejorado considerablemente. Verán, yo tengo un &lt;a href="https://es.wikipedia.org/wiki/Trastorno_de_ansiedad_generalizada">trastorno de ansiedad generalizada&lt;/a> y hay días que la paso muy muy mal. Esos días, cuando llegué a trabajar en una oficina, los pasaba terrible. El día laboral se me hacía eterno, estoy seguro de que envejecía 4 años por cada día que era así; no me podía concentrar durante esas horas y me sentía horrible al respecto, sentía que no valía la pena mi trabajo y no estaba seguro de lo que hacía ahí. Era un momento en el que ni mi mente ni. mi cuerpo podían escapar de ahí, lo más que podía hacer era ver un par de vídeos de Youtube, hablar con colegas o salir a caminar; pero eso era todo, tus colegas solo pueden hablar un tanto contigo antes de que tengan que volver a sus labores y después de cierto número de caminatas tu jefe te empieza a ver raro (los vídeos de Youtube son infinitos, para bien o para mal).&lt;/p>
&lt;p>Pero en el &lt;em>home office&lt;/em> tengo el privilegio de trabajar desde mi cuarto, donde tengo todas las herramientas que necesito para lidiar con esos malos días, los cuales solo ya no son terribles ¡Pero han bajado en cantidad y frecuencia! Si bien tomó un par de meses en que llegara a una estabilidad en mi rutina y a tener la disciplina de trabajar desde casa, ahora si empiezo a tener un día particularmente terrible, tomaré un rápido baño, saldré al patio y jugaré con mi mascota; y eso funcionará como un &lt;em>reset&lt;/em> a mi cuerpo, donde ya no perdí todo el día tratando de escapar de mi propia mente, en su lugar solamente 20 minutos en recobrar la compostura. En días menos terribles, pero igual difíciles, con parar cada descanso de &lt;a href="https://es.wikipedia.org/wiki/T%C3%A9cnica_Pomodoro">pomodoro&lt;/a> y caminar por la casa o jugar una partida de algo como recompensa por haber terminado una tarea servirá como suficiente incentivo para tener buen ánimo todo el día.&lt;/p>
&lt;hr>
&lt;h3 id="lo-malo">Lo malo&lt;/h3>
&lt;p>Esto no quiere decir que todo haya sido color de rosa, como mencioné, fue un trabajo de un par de meses llegar a este punto. Además yo sé que estoy hablando desde un privilegio enorme, porque no solo tuve la fortuna de tener el equipo para trabajar cómodamente desde casa; pero tuve un lugar donde hacerlo y un entorno tranquilo, cosa que muchas personas no han tenido.&lt;/p>
&lt;p>Aún así, con todo mi privilegio, han un punto grande y un tema importante durante toda la pandemia: la socialización.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Socialización&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>Como &amp;ldquo;adulto&amp;rdquo; que soy, ya estoy empezando a notar algo que había escuchado de gente mayor que yo: cuando eres adulto cuesta hacer amigos. Y es que en mi primer empleo en TI lo mejor que me pude llevar fueron las amistades que hice, pues son gente que hasta la fecha frecuento y con quien hablo a diario; pasaron de ser colegas a ser amigos cercanos. Hablando con ellos me gusta comentarles que realmente esa oficina no era una oficina, pero que realmente estábamos en un &lt;em>reality show&lt;/em> al estilo &lt;a href="https://es.wikipedia.org/wiki/The_Office">&lt;em>The Office&lt;/em>&lt;/a> donde grababan todo lo que pasaba.&lt;/p>
&lt;p>Si bien, en los empleos/prácticas que tuve en durante la pandemia pude conocer a gente increíble, personas que considero mentores, no puedo evitar pensar que tendría una mejor relación con ellos si los pudiera haber visto en persona más seguido. Tampoco puedo negar que es mucho más sencillo conseguir ayuda de alguien si este está sentado enseguida de ti, aunque solamente sirva de &lt;a href="https://es.wikipedia.org/wiki/M%C3%A9todo_de_depuraci%C3%B3n_del_patito_de_goma">patito&lt;/a>.&lt;/p>
&lt;p>En pocas palabras, extraño mucho la calidéz humana que traía trabajar en una oficina y sería mentira si no dijera que me preocupa que pierda la habilidad de hacer amigos si este modelo me esperara por el resto de mi vida.&lt;/p>
&lt;p>Sin embargo, este es solo uno de los problemas que trae el trabajar desde casa; no he tocado cosas tan importantes como que los negocios se ahorran dinero si nosotros no estamos físicamente en una oficina mientras que nosotros gastamos más por el hecho de pagar los insumos que usamos al laborar sin tener un aumento de sueldo que refleje ese ahorro de parte del patrón. Este no era el punto que quería tocar en este escrito, pero no hay que quitar el dedo de ese tema.&lt;/p>
&lt;hr>
&lt;h2 id="lo-que-propongo">Lo que propongo&lt;/h2>
&lt;p>¿Entonces cuál es la solución? ¿Qué sería lo ideal? Desde mi punto de vista, joven e ingenuo, y tomando en cuenta que esta es una solución para mis problemas en específico; yo creo que la solución sería un modelo híbrido, 2 días de oficina presencial y 3 de trabajo en casa. Podría funcionar de manera inversa también, pero en lo personal prefiero la primera opción.&lt;/p>
&lt;p>Esto permitiría tener una dinámica ágil para situaciones como lo serían juntas, planeaciones o algún otro tipo de evento que se beneficie de estar físicamente en una habitación, dejando 3 días de espacio para que el empleado trabaje de una manera cómoda y a su estilo desde su casa. Además, si la oficina ya va a estar abierta algunos días ¿por qué no permitir a los empleados que quieran ir a laborar ahí? Esto podría beneficiar, por ejemplo, a quien no pueda contar con internet bueno en su casa o a quien tenga hijos en casa y no le permitan tener un lugar adecuado para concentrarse.&lt;/p>
&lt;p>En este último ejemplo también funciona al revés, permitiría (si es que las cosas vuelven a algo que se parezca al &lt;em>pasado&lt;/em>) que los padres que trabajan puedan ver más tiempo a sus hijos después de que lleguen de la escuela, incluso permitiendo que todos coman al mismo tiempo, en la misma mesa.&lt;/p>
&lt;hr>
&lt;p>Al final, como muchas de las cosas bellas de la vida, creo que todo se debería dejar al libre albedrío de las personas; que ellos puedan escoger el modelo que mejor les funcione, pues creo que nosotros como humanos somos mucho más que un pedazo de carne capaz de producir dinero para una empresa y el &lt;em>home office&lt;/em> puede ser un apoyo en nuestra búsqueda de sentido y de felicidad.&lt;/p>
&lt;p>Si les interesa más sobre el tema de la vida post-covid, les recomiendo este &lt;a href="https://www.youtube.com/watch?v=6iILrpgbAMY">vídeo&lt;/a> de Ophelia Pastrana.&lt;/p></description></item><item><title>Una cucharadita de sol (Poema)</title><link>https://luisangel.me/es/post/2020/09/19/a-teaspoon-of-sun/</link><pubDate>Sat, 19 Sep 2020 15:15:49 -0500</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2020/09/19/a-teaspoon-of-sun/</guid><description>&lt;p>Me emociona compartir que mi poema Una Cucharadita de Sol fue seleccionado como ganador en la convocatoria Quarantine Poetry: Homemade Poems Competition en 2020. Esta obra forma parte de la antología internacional Quarantine Poetry: 2020 Homemade Poems, donde fue traducida al inglés, francés, italiano e indonesio. Este reconocimiento es muy especial para mí, ya que refleja un momento de introspección en tiempos difíciles.&lt;/p>
&lt;p>Obtenlo en &lt;a href="https://payhip.com/b/aqXmV">payhip.com&lt;/a> o en &lt;a href="https://luisangel.me/docs/quarantine-poetry.pdf">el respaldo de este sitio&lt;/a>.&lt;/p></description></item><item><title>Lo mejor de la escuela es el recreo</title><link>https://luisangel.me/es/post/2020/08/11/lo-mejor-de-la-escuela-es-el-recreo/</link><pubDate>Tue, 11 Aug 2020 13:50:59 -0500</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2020/08/11/lo-mejor-de-la-escuela-es-el-recreo/</guid><description>&lt;h2 id="lo-mejor-de-la-escuela-es-el-recreo">&amp;ldquo;Lo mejor de la escuela es el recreo&amp;rdquo;&lt;/h2>
&lt;p>Hoy leí un &lt;a href="https://www.escritas.org/es/t/4758/el-mediodia-en-la-calle-atropellando-angeles">poema&lt;/a> de Jaime Sabines, uno de sus versos decía lo siguiente:&lt;/p>
&lt;p>    &lt;em>&amp;ldquo;Lo mejor de la escuela es el recreo&amp;rdquo;,&lt;/em>&lt;br>
    &lt;em>dice Judit, y pienso:&lt;/em>&lt;br>
    &lt;em>¿cuando la vida me dará un recreo?&lt;/em>&lt;br>
    &lt;em>¡Carajo! Estoy cansado. Necesito&lt;/em>&lt;br>
    &lt;em>morirme siquiera una semana.&lt;/em>&lt;/p>
&lt;p>Estas palabras hicieron eco en mi, yo también quiero morirme una semana para poder despertar, y más importante mantener, los animos y la claridez mental que experimento de 8:30 a 9 de la mañana, mientras leo (tiempo en el que leí este y otros poemas, por cierto) y escucho música.&lt;/p>
&lt;p>Pero lo cierto es que llevo muerto más de 1 semana, 140 días para ser preciso, o al menos así se siente. Ya quiero ir al recreo, un descanso de esta era de la historia humana, y poder volver a sentir euforia por la vida, no un miedo constante a perderla.&lt;/p></description></item><item><title>El domingo que duro un verano</title><link>https://luisangel.me/es/post/2020/07/26/el-domingo-que-duro-un-verano/</link><pubDate>Sun, 26 Jul 2020 13:34:27 -0500</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/post/2020/07/26/el-domingo-que-duro-un-verano/</guid><description>&lt;p>Hay un sentimiento recurrente en mi vida. Un sentmiento que asocio a un tiempo y a un lugar. El sentimiento de una tarde de domingo, que por alguna razón sabe a melancolía e incluso a un poco de desesperanza. Como si el inicio de una nueva semana significara la muerte de el ser que habitó en la semana que recién acaba.&lt;br>
Tengo este sentimiento desde que tengo memoria desde la secundaría. Cuando paseaba a mi perro un domingo por la tarde, había algo en la tranquilidad y el vacio de las calles que me incomodaba.&lt;br>
Al principio le temía a este sentimiento, pues no lo entendía, pero ya entrada la preparatoría lo fui aceptando y me fui acostumbrando; simplemente lo llamba &lt;em>tristeza de domingo&lt;/em>.&lt;br>
Aprendí un poco a escapar de ello. En universidad empecé a salir con una chica, que eventualmente sería novia mia, los domingos en la tarde; un día yo le expliqué este sentimiento y ella lo entendió.&lt;br>
Con ella descubrí que mientras sintiera el calor de la compañía humana, el sentimiento desaparecería. Con esto empecé a apreciar las cosas que traía un domingo por la tarde; la belleza de las calles desoladas al atardecer, el lejano sonido de niños jugando en algún parque o la ocasional &lt;a href="https://es.wikipedia.org/wiki/Kerm%C3%A9s">&lt;em>kermés&lt;/em>&lt;/a> de alguna iglesia que celebraba algo.&lt;/p>
&lt;p>Explico lo anterior, porque al momento de escribir esto han pasado 125 días desde que inició la pandemia provocada por el &lt;a href="https://es.wikipedia.org/wiki/COVID-19">SARS-CoV-2&lt;/a>, y apenas he encontrado como he sentido la pandemia para mi, como una larga tarde de domingo. Ese sentimiento agridulce prolongado durante todo un verano. Pues así como el atardecer anuncia el final de una semana y el comienzo de una nueva, cada tanto se anuncia con bombos y tambores el final de la pandemia, pero hasta el momento no acaba (ni las cosas mejoran, honestamente). Mi familia ha sido aforutunada durante todo este tiempo, pues no hemos perdido a ningún ser querido por la enfermedad, y las perdidas economicas han sido manejables hasta el momento; pero no para todos mis cercanos ha sido así.&lt;/p>
&lt;p>Así que si, escribo esto porque me siento como en secundaría o prepa. Sin posibilidades de hacer algo para mejorar la situación, sin poder ver a mis amigos, pareja o mi familia con la facilidad a la que ya me había acostumbrado. Encerrado constantemente, rodeado de pantallas y viviendo &lt;a href="https://www.brainyquote.com/quotes/mitch_kapor_163583">aquella metafora del internet&lt;/a> día a día.&lt;/p>
&lt;p>Ahora solo veo por la ventana este atardecer eterno, esperando pronto poder volver a ver a mis abuelos, caminar de la mano de quien amo por un parque y juntarme a reir con mis amigos, porque sencillamente los extraño.&lt;/p></description></item><item><title>proyectos</title><link>https://luisangel.me/es/projects/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/projects/</guid><description>&lt;p>A lo largo de los años he trabajado en varias cosas, aquí tienes una lista de ellas por si quieres echarles un vistazo.&lt;/p>
&lt;h2 id="activo-más-o-menos">activo (más o menos)&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://uveg.edu.mx/index.php/es/info-mael">&lt;strong>Maestría (educación)&lt;/strong>&lt;/a>: Actualmente estoy cursando mi maestría en Educación con enfoque en Educación en Linea en la Universidad Virtual de Guanajuato.&lt;/li>
&lt;li>&lt;a href="https://eltelar.xyz/posts/luis-angel-fomac-8/">&lt;strong>La cueva (libro)&lt;/strong>&lt;/a>: Estoy trabajando en mi primer libro.&lt;/li>
&lt;li>&lt;a href="https://eltelar.xyz/">&lt;strong>El telar (colectivo)&lt;/strong>&lt;/a>: Un grupo de escritores chihuahenses que se juntan semanalmente a leer nuestras obras y darnos retroalimentacion, queremos hacer mas actividades en el futuro. Ademas de ser parte de ellos, mantengo el sitio web.&lt;/li>
&lt;li>&lt;a href="https://github.com/LinkSake/metwo">&lt;strong>luisangel.me v2 (web)&lt;/strong>&lt;/a>: ¡La cosa que está detrás de estas palabras!&lt;/li>
&lt;/ul>
&lt;h2 id="pausado">pausado&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://curcubita.art/">&lt;strong>Curcubita (colectivo)&lt;/strong>&lt;/a>: Colectivo/estudio de arte fundado junto con algunos amigos artistas con la intención de tener sinergia entre nosotros.&lt;/li>
&lt;/ul>
&lt;h2 id="archivado">archivado&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://www.ivoox.com/podcast-nerdverse_sq_f1261615_1.html">&lt;strong>Nerdverse (podcast | 2015 - 2016)&lt;/strong>&lt;/a>: Fue mi primer podcast, lo hice como parte de una comunidad de podcasting llamada Estudio Geek / XLR Studio y nosotros (algunos colaboradores y yo) hablábamos de cómics, videojuegos, películas y cultura pop.&lt;/li>
&lt;li>&lt;a href="https://linksake.github.io/DimeQuien/">&lt;strong>DimeQuien (web | 2018)&lt;/strong>&lt;/a>: Un sitio web en colaboración con &lt;a href="https://github.com/eagleera">Daniel Aguilera&lt;/a> y Wikipolitica para mostrar el perfil de diferentes candidatos para las elecciones locales de ese año.&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/@uwusuarios/featured">&lt;strong>uwusuarios (podcast | 2021 - 2022)&lt;/strong>&lt;/a>: Mi último podcast donde no teníamos un tema principal pero hablábamos de que estaba en nuestra mente. Realmente disfruté mi tiempo haciendo esto con Nessie, así que espero que algún día podamos darle otra oportunidad.&lt;/li>
&lt;li>&lt;a href="https://github.com/LinkSake/me">&lt;strong>luisangel.me v1 (web | 2020 - 2024)&lt;/strong>&lt;/a>: Mi web/blog anterior hecha con Nextra.&lt;/li>
&lt;li>&lt;a href="https://github.com/LinkSake/startpage">&lt;strong>startpage (web | 2023)&lt;/strong>&lt;/a>: Página de inicio minimalista basada en varias páginas que vi en &lt;a href="https://www.reddit.com/r/startpages/comments/12bobou/my_first_custom_start_page/">r/startpages&lt;/a>.&lt;/li>
&lt;/ul></description></item><item><title>sobre mí</title><link>https://luisangel.me/es/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>hey@luisangel.me (Luis Angel Ortega)</author><guid>https://luisangel.me/es/about/</guid><description>&lt;h2 id="whoami">whoami&lt;/h2>
&lt;p>Soy Luis Ángel, un desarrollador de software y escritor de México. Soy una persona curiosa, lo que me ha llevado a varias cosas que realmente disfruto como la tecnología, el cine, la música, los videojuegos, la literatura, la filosofía, la jardinería y el gumpla. Escribo sobre muchas de estas cosas en &lt;a href="https://luisangel.me/es/categories/">la sección de escritos&lt;/a> de esta página, así que te animo a que las revises.&lt;/p>
&lt;p>&lt;img src="https://luisangel.me/images/about/i-really-like-computers.jpg" alt="me gustan mucho las computadoras meme">&lt;/p>
&lt;h2 id="contacto">contacto&lt;/h2>
&lt;p>Hoy en día realmente no uso mucho las redes sociales, pero ¡me encantaría conversar! Así que la mejor manera de ponerse en contacto es por correo electrónico (&lt;a href="mailto:hey@luisangel.me">hey@luisangel.me&lt;/a>), Mastodon (&lt;a href="https://vmst.io/@link">@link@vmst.io&lt;/a>) o Bluesky (&lt;a href="https://bsky.app/profile/linksake.bsky.social">@linksake.bsky.social&lt;/a>) (￣▽￣)ノ&lt;/p></description></item></channel></rss>