PyCon España 2025

Y pasó que volví a una PyCon, ¡y como exponente! Fue hace unos días en la PyCon España 2025; Sevilla, España.

No volé hasta Sevilla porque me parecía caro, así que saqué avión hasta Madrid, con la idea de ir hasta Sevilla en tren. Cómo tenía un par de días antes y medio día después, lo usé para ver si armaba algún plan en algún lado. Al final no salió nada así que maximicé el tiempo en Sevilla, que nunca había ido.

Llegué bastante entrada la noche del martes. El vuelo de vuelta era el otro martes, pero relativamente temprano, así que volví a Madrid en tren el lunes y pasé allí la noche (¡gracias Juanlu por hospedarme!).

Cuando llegué a Sevilla fui derechito al hostel, revoleé las cosas y me fui a cenar, ya que corría riesgo que no encontrara bar con la cocina abierta. El miércoles lo tuve completo para pasear, caminé para todos lados, saqué un montón de fotos. Es linda Sevilla.

Ya el jueves hice el checkout y me mudé al departamento que habíamos alquilado entre varios.

Las Setas de Sevilla

El resto de la estadía fue en ese departamento, que compartí con Manu y Johanna, Ezequiel, y Fabrizio. Estuvo bárbara la experiencia. Yo a Ezequiel y Fabrizio no los conocía, pero me cayeron bárbaro.

Más allá de la convivencia en sí (ir a comprar cosas, decidir qué cenar, en casa o salir a algún lado, etc) que fue impecable, como somos todos muy nerds fue casi casi como vivir un pseudo PyCamp... jugamos al truco, nos cruzamos info sobre cómo hacer determinadas cosas en la compu, tuvimos charlas muy profundas sobre física, química, domótica, política, situación laboral, etc, etc.

Ezequiel, Manu, Johanna, el que suscribe, y Fabrizio

La PyCon en sí también estuvo muy bien. El venue era un poco alejado del centro (que era donde estábamos nosotres) pero estaba muy bien.

Fui a varias charlas (pero también me quedé bastante charlando por los pasillos); las que más me gustaron fueron "Detrás de escena de FastAPI y amigos para desarrolladores y creadores" de Sebastián Ramírez, "Computación cuántica con Python" de Jara Juana Bermejo Vega, y "Como todo va a cambiar para los debuggers en Python 3.14" de Pablo Galindo Salgado. También estuvo copada la mesa redonda sobre mujeres en STEM e investigación.

A Pablo lo conocí personalmente en la primer noche, en un cóctel de bienvenida para exponentes y organizadores. Yo venía charlando con él por un tema que develaré en el próximo post (ah, se hace el misterioso el pibe), pero nunca nos habíamos cruzado.

Atendeme el "puntero": un abanico que venía en la bolsita de la conf

Mi ponencia fue "Gentil introducción al mundo asincrónico". Es una charla que había dado varias veces, pero siempre peleando contra el tiempo. Acá directamente la propuse como taller.

La extendí apenas para aclarar algunos puntos, y durante la presentación expliqué bien los códigos. Estuve apenas más de dos horas, y la gente se fue muy contenta. Me estuvieron felicitando por los pasillos el resto de los dos días.

Hermosísimo el hostel

Fue un viaje que disfruté montón. Vamos a tratar de ir volviendo al ruedo.

Comentarios Imprimir

Página principal

Luego de tantísimo años cambié la página de entrada a mi sitio. Ahora cuando van a taniquetil.com.ar, en vez de llevarles al blog como siempre, redirecciona a facundo.taniquetil.com.ar.

Esta es una página nueva que armé con motivo de la pronta liberación del libro Python en Ciencia y Tecnología (que estuvimos escribiendo durante cinco años con mi amigo personal Manuel Carlevaro).

En realidad ya venía con ganas de hacer algo así: una página default con links principales a mis otras actividades (para lo cual mucha gente usa Linktree), pero todavía no me había tomado el trabajo. Tener que apuntar la bio del libro a una "página base" me terminó de decidir, y ahí la armé.

Una cena con mil cositas ricas, del último viaje de laburo

Obviamente que desde esta página principal apunto a mi blog (el principal medio para registrar eventos de mi vida), pero también a Github (la principal plataforma que uso para compartir código y colaborar en otros proyectos), Bluesky (lo que uso hoy en día para microblogging, reemplazando a la cloaca nazi de Twitter), el historial de charlas dadas (a la cual le vendría bien una renovación estética), mi correo electrónico (por si alguien se quiere contactar), y mi Linkedin (por si hay un interés profesional o de contratación).

Quizás en el futuro agregue otros enlaces, o alguna otra data, pero este es un buen comienzo.

Comentarios Imprimir

La experiencia de manejar con nieve

Durante las vacaciones de invierno nos hicimos un piccolo paseo por el sur. La vuelta era Piedra del Águila (la mayor cantidad de días en un lugar), luego Bariloche un par de días, rebotar en Villa La Angostura y Junín de los Andes, y ya volver.

Por las dudas, cargamos en el auto las cadenas para andar sobre nieve, por si las necesitábamos... ya que las teníamos las llevamos, ¿no? Las habíamos comprado cuando fuimos a Mendoza hace un par de años y estaban ahí, listas para ser aprovechadas. No esperábamos tener que usarlas sí o sí porque nos habían dicho que el invierno venía raro en el sur, incluso hubieron muchas cancelaciones en los hoteles porque no había nieve, pero mejor prevenir que curar.

Llegamos a Piedra del Águila sin problema. Ya fue atípico que el tercer día llovió un montón, pero no pasó de tener que lidiar con barro. El 25 de Julio salimos para Bariloche. Habíamos escuchado que iba a llover todo el día en la ruta, quizás nevar, pero no le dimos demasiada importancia.

Se complicó el viaje.

A la horita de arrancar empezamos a ver más y más nieve al costado de la ruta. Y nevaba, al principio poco, luego más intenso. En un momento vemos que la gente frena y empieza a ponerle cadenas a los autos. Nosotros no sabíamos que hacer, ¿era realmente necesario? Afuera nevaba bastante, hacía frío, y estábamos en la mitad de la ruta... y en verdad el pavimento estaba re bien para circular, ¿en algún momento se iba a poner denso? Entonces, nos repetimos, ¿era necesario poner las cadenas?

En un momento tomamos la decisión de que sí. Me bajé del auto, me abrigué, saqué las cadenas... Nevaba mucho, hacía frío. Felu se bajó también. Moni también pero la mandé de nuevo al auto porque ella ya traía una gripe, no hacía falta que tomara más frío. Con Felu leímos las instrucciones, tratamos, no pudimos. Se mojaba el papelito de las instrucciones, creíamos entender lo que había que hacer pero no podíamos seguir los pasos indicados.

Vimos que los autos se habían movido, nos subimos e hicimos unas cuadras más. Otra gente poniendo cadenas. Me bajo y pregunto, no sabían bien cómo. Uno de más adelante sí sabía, nos mostró. Volvimos, traté y traté. Pero no podía, o estaba haciendo algo mal o había un problema con las cadenas. No llegaban a enganchar como "deberían", parecían chicas.

Complicado para poner las cadenas en el medio de la ruta

Reviso la caja, ¡y encuentro que las cadenas no correspondían con nuestras ruedas! Me meto en el auto puteando, cagadísimo de frío, y con Moni nos dimos cuenta que esas cadenas las habíamos comprado para el Stepway, que es con el que fuimos a Mendoza! Claro, la Taos tiene ruedas más grandes. Bueno, perdidos por perdidos, decidimos seguir viaje hasta que nos digan que no podemos seguir y nos manden de vuelta.

Muchos quilómetros yendo despacio (a paso humano, 20km/h como mucho), algunas partes con nieve pero "planas", sin riesgo real, aunque una vez frené y el auto resbaló como medio metro. Me dio cagazo, mantuve más distancia al próximo auto, aunque íbamos a súper lentos. Al final estuvo todo bien, y el viaje duró como seis horas, pero siempre la duda era "si en unos kilómetros más adelante iba a estar demasiado complicado para seguir". Tampoco vimos ningún accidente de otros vehículos, aunque había un camión volcado en la banquina y un auto chocado pero parecía un accidente del día anterior, y sí vimos en la otra mano un camión que se había quedado "estancado" porque resbalaba en hielo y no podía traccionar para arrancar.

Pero llegamos sin mayor inconvenientes al lugarcito que alquilamos en Bariloche. Era en las afueras de Bariloche, como subiendo un poco desde Avenida de los Pioneros, una vista hermosa.

La vista desde una de las ventanas de arriba

Al otro día a la mañana nos levantamos temprano y apenas desayunamos unos mates porque el plan era tomarnos el teleférico para subir a la confitería del Cerro Otto y desayunar allá.

El auto estaba bañadísimo de nieve, pero arrancó bien. Lo sacamos del lugar y lo bajamos a la calle, pero ahí me di cuenta que la misma estaba toda nevada, y con nieve compacta... ¡hielo! En algunas partes apenas se podía caminar, y encima teníamos que tomar la decisión de si bajábamos a Pioneros por el lado que el auto apuntaba (que sabíamos que era una bajada más complicada) o hacíamos la maniobra de darlo vuelta y bajar por el otro lado que la pendiente era más gentil.

Decidimos lo segundo, pero en vez de darlo vuelta ahí que no teníamos espacio, hacer marcha atrás unos cuarenta metros (en subida) hasta una especie de estacionamiento que íbamos a tener lugar para la maniobra. Empezamos, pero no llegamos... en un punto las ruedas delanteras resbalaban y no traccionaban. Como el auto se me empezaba a ir para los costados, decidí traccionar para adelante y volver a donde habíamos salido, que podía quedar estacionado.

Charlé con un vecino que estaba moviendo nieve, y con otro que justo pasaba. Me dijeron que hacía bien en no salir por la bajada "complicada", iba a ser imposible. La otra quizás zafaba, pero si nunca había manejado en hielo, que ni lo intente. Ok, cadenas. ¿Dónde compro cadenas? Me recomendaron una ferretería que seguro tenía, que estaba cerca de un "centro comercial" a unas veinte cuadras de distancia. Yo había hecho ese trecho la tarde/noche anterior, para hacer unas compras, con buena parte nevando y todo, así que me animé a un plan B: voy a comprar cadenas, vuelvo, las ponemos, y listo. La familia decidió acompañarme.

Empezamos a caminar, e hicimos la bajada "complicada"... la cual estaba complicada incluso para caminar! Nos caímos una vez cada uno, mínimo, y Moni se golpeó feo la mano. Cuando llegamos a Avenida de los Pioneros justo vemos una camioneta viejita bajando por esta bajada! Pero iba medio traccionando, medio resbalando. Nos protegimos en unos autos por las dudas y esperamos que termine de bajar; cuando llegó a la zona segura Felipe aplaudió y todo. Ahí yo veo que apunta para el lado que teníamos que ir nosotros, le hago seña al pibe, le explico en qué estábamos, y accedió a llevarnos :). Resulta que el pibe bajaba la camioneta con la doble tracción y así y todo se le complicó! Nosotros no teníamos chances.

La calle y la vista saliendo de donde alquilábamos

Nos dejó en la esquina de la ruta, caminamos dos cuadras y estábamos en la ferretería. Conseguimos las cadenas, y de paso compré una especie de líquido que se le podía poner a las ruedas para mejorar la tracción (también me lo comentó uno de los vecinos con el que hablé antes), pero más que nada para las suelas de las zapatillas de Moni a las que se le pegaba el hielo y resbalaba un montón. A todo esto, Male tenía mucha hambre y Moni estaba dolorida de la mano, así que les ofrecí a todes que se quedaran desayunando que yo caminaba de regreso y ponía las cadenas. Ellas accedieron, Felipe se vino conmigo.

Caminamos un rato largo, subimos "la bajada complicada", llegamos al auto. Y empezamos a tratar de poner las cadenas según lo que nos había mostrado el tipo de la ferretería (más lo que decía el manualcito, más lo que habíamos aprendido en la ruta). Traté con una de las ruedas, no había caso, me quedaba siempre corta. Intenté con la otra (por si había hecho los pasos iniciales mal) y me pasaba lo mismo. Evidentemente no iba a funcionar.

A esa altura el sol había salido, habían pasado un par de horas desde el arranque inicial, y la calle estaba mejor. Entonces fuimos con el plan C: tratemos de llevar el auto (sin cadenas) marcha atrás como la vez anterior hasta ese pequeño estacionamiento, darlo vuelta, y ver qué hacíamos. Llegamos, pero ahí perdí un poco el control, el auto se iba de costado. Decidí meterlo en ese estacionamiento, y ahí se me ocurrió el plan D: ponerle a las cuatro ruedas el líquido ese para mejorar la tracción, e intentarlo de nuevo.

Pude dar vuelta el auto, y los primeros cincuenta metros de calle que eran subiendo no tuvimos problema. Luego vino una curva medio fea, pero estuvimos bien. Y luego otra con una bajada empinada posterior... donde perdí el control del auto.

Sí, perdí el control del auto.

Es horrible la sensación, no podés hacer nada, el auto va para abajo por la pendiente y sólo sos un pasajero sin poder decidir nada. Obviamente girás el volante y no responde. Yo "bombeaba" el freno, intentando recuperar tracción (el ABS no llega a funcionar, creo que por la corta distancia). Algo de eso pude, y medio lo terminé llevando a una zona sin hielo antes que tome demasiada velocidad. Zafamos. Nos quedaba un trecho. Otra vez perdí apenas el control, el auto no es que siguió tanto pero se empezó a cruzar en la calle (las ruedas de adelante frenaron pero las de atrás no). Encima más adelante venía subiendo un muchacho. Cuando vi que ya se había ido para otro lado, volví a mover el auto, y terminamos llegando a la parte final de la bajada que era todo barro, sin hielo, y ahí no tuvimos más problema.

Fuimos a la ferretería, donde encontraron que esas no eran las cadenas que correspondían! Porque la camioneta blah blah, y que el rodado bleh bleh. No sé, a mí me parece que todas las "215/55 R 18" son iguales, no entiendo cómo si la cadena dice que la soporta después son chicas. Sí entiendo que si es una SUV, las cadenas tienen que ser más robustas, porque el vehículo pesa más. El vendedor terminó encontrando las que iban, y las puso en una rueda, y ahí aprendimos bien cómo era la técnica. Pero después las sacamos, porque para andar por ahí no se necesitaba y puede ser que se calienten y se corten si se usan sobre asfalto (en realidad se ven un montón de autos que van con las cadenas en el asfalto así que algo aguantan, pero también he encontrado cadenas cortadas en la banquina en esas caminatas que mencioné).

Nos nevaba durante el paseo por el Centro Cívico

A esta altura Moni y Male habían vuelto a la ferretería. Fuimos al teleférico (aunque ya era como la una de la tarde), pero habían cerrado el servicio porque había mucho viento. Decidimos ir a pasear un poco al centro, y almorzar. Encontramos medio de casualidad un lugar donde comimos bárbaro, y después salimos a caminar por ahí. Aunque había empezado a nevar de nuevo, paseamos por el centro, fuimos a la costa del lago, centro cívico, etc.

Pero apuramos el paseo: por un lado nevaba mucho y hacía un frío bárbaro, por el otro yo quería llegar "a la subida" con luz para poner las cadenas. Eso estuvo bien, la macana que el único lugar para parar el auto era sobre el barro, así que terminé bastante enchastrado con toda la operación. Lo bueno es que con las cadenas (así y todo puestas por mí en mi primera vez) funcionaron bastante bien y tuvimos buena tracción en toda la subida hasta llegar al hospedaje.

Rueda con la cadena (bastante) bien puesta

Al otro día la temperatura levantó un poco y las calles estuvieron mucho mejor, no hizo falta usar cadenas! Incluso al volver a la cabaña me tiré a hacer la subida así nomás y estuvo todo bien.

Pero luego empezó a nevar y bajó un poco la temperatura. Al otro día a la mañana, el día que nos íbamos, las calles estaban complicadas de nuevo. Salí a ver un poco, charlé con unes vecines, y la verdad que estaba en el límite. Me dijeron que la municipalidad había tirado arena y sal, pero que salir sin cadenas era un riesgo. Quizás zafaba, quizás no.

Fui a lo seguro. Mientras la familia terminaba de armar sus bolsos, le puse las cadenas. Luego del checkout, nos fuimos y el auto se comportó bárbaro. Terminamos la bajada y le saqué las cadenas, y ya las guardé para el resto del viaje, porque luego los próximos días (incluso el viaje y estadías en Villa La Angostura y Junín de los Andes) tuvimos mucha lluvia pero con temperaturas de uno a cinco grados, así que nada de hielo.

En el lago Huechulafquen, ya sin nieve y luego de los cinco días de lluvias constantes

Conclusión, a modo de consejo: hay que tener cadenas. Compralas antes del viaje, con tiempo. Y ponelas en la tranquilidad de tu casa, entendé cómo hacer para que queden centradas, avanzá el auto dos metros y re-tensalas, etc. Luego las guardás y esperás no tener que usarlas nunca :)

Ah! Mini consejo extra: está buenísimo tener un par de guantes de trabajo en el auto para cuando necesitás hacer estas cosas...

Comentarios Imprimir

Fórmula 1 en vivo

Estuve unos días en Barcelona, por trabajo. Cuando comunicaron al equipo el lugar y la fecha del sprint, uno de mis compañeres se dió cuenta que durante el fin de semana siguiente al evento se corría la carrera de Fórmula 1 en el Circuito de Barcelona.

Dudé un poco en ir. Me tenía que quedar más días, la entrada a la carrera no es precisamente barata, y no sabía cuanto valía la pena toda la movida. Le pregunté a unos amigos, consulté en casa. Finalmente tomé la decisión y activé: saqué el pasaje (que me lo paga la empresa, claro) para volver tres días más tarde, reservé un Airbnb, y compré la entrada para la carrera.

El Airbnb lo reservé en la ciudad de Badalona, al noreste del centro de Barcelona, muy cerquita. Mi idea era alquilar algo alejado para que sea más barato, pero a "un subte de distancia" del centro como para poder viajar sin problema, y de paso que esté cerca de la playa. No sabía muy bien cómo iba a llegar al circuito, pero el mismo compañero de antes encontró que había unos bondis que te llevaban y traian durante los tres días de carrera.

Un saludito para les muchaches

Es que "la carrera" no es sólo "una carrera". Por lo pronto hay dos tandas de prácticas libres el viernes, otra más el sábado, luego la clasificación el mismo sábado, y la carrera en sí el domingo. Pero aparte hay muchas actividades. Corre también la fórmula 2 y la 3, hay shows, presentaciones, varias cositas.

El circuito no queda en Barcelona, sino que está situado en las poblaciones de Montmeló y de Granollers (por eso además de Circuito de Barcelona-Cataluña se lo llama Circuito de Montmeló). Queda a unos 26 kilómetros del centro de Barcelona, y considerando que hay autopistas, uno pensaría que el trayecto de ida y vuelta tendría que ser rápido. No mi ciela. Es que toda la cercanía al circuito colapsa totalmente esos días, así que se pierde un montón de tiempo con el bondi yendo a paso de hombre. Sumado a las largas colas para tomar los bondis, hicieron que pierda bastante tiempo al ir y venir. El sábado, luego de la qualy, fue el peor día al respecto: luego de que terminara, caminé mucho para salir del circuito (hay que atravesar un túnel que también estaba saturado de gente), luego una cola de varias cuadras para tomar el bondi, el trayecto con toda la primera parte a paso de hombre, entrar en la ciudad que no es precisamente rápido, y luego dos subtes hasta el Airbnb... ¡en total tres horas y media!

Decía que tuve que caminar bastante para salir del circuito. ¡Es que el lugar es inmenso! Y encima el bondi te deja cerca de las puertas 3 y 4, que es en la otra punta de donde yo tenía el asiento reservado. Yo había elegido uno de los lugares más baratos, pero techado: tenía miedo que lloviese (lo cual haría que las horas ahí fuesen un embole total), y aunque no llovió ni un poquito, fue acertadísimo porque los tres días hubo un sol que rajaba la tierra. Re garpó el lugar que elegí.

Tomando la curva

Estaba en la curva 9. Veia venir los autos por una recta, frenaban, agarraban la curva y aceleraban. No es una gran zona donde hubo mucha acción. En las prácticas uno de los autos frenó mal y tomó el control siguiendo un poco derecho, entrando en una zona de despiste controlado que hay. Más divertida fue la Fórmula 3, hubieron muchas peleítas en esa zona.

También había una pantalla gigante al frente de la tribuna, cruzando la pista, por donde pasaban algo parecido a la transmisión oficial (me parece que la imagen de los autos es la misma, pero la infografía superpuesta seguro era otra, más simple). También tenía una radio que me habían dado en el lugar (gratis, si tenías una tarjeta American Express) donde se podía escuchar algo que podríamos denominar como "el relato de la carrera". Lo pongo entre comillas porque aunque se comentaba un poco la carrera, no había demasiada profundidad en la información; es entendible, porque al ser en varios idiomas el que hablaba en castellano al final terminaba repitiendo lo mismo que el que hablaba en inglés (también comentaban en catalán, pero no mucho, y en francés sólo daban cada tanto las posiciones de los corredores franceses).

Mi punto es que si querés seguir la carrera en profundidad, quedate en tu casa. Pero es toda una experiencia ver esas naves espaciales desacelerando y acelerando. Una locura, especialmente cuando hacían la vuelta rápida en la qualy, van al límite. El contraste es el "safety car" (que es un deportivo superespecial), iba mucho más lento que los autos de carrera, y le costaba notablemente agarrar la curva (rolaba que asusta), lo que le da un poco de perspectiva a la monstruosidad que son los otros autos.

El auto de seguridad: un poco incómodo para ir de compras al Makro

También ves cosas que yo nunca había visto. Por ejemplo que barren un montón la pista entre carrera y carrera. Incluso pasa un camioncito con unas telas enganchadas que van limpiando la pista. Era muy gracioso porque cuando pasaba esta gente de mantenimiento la tribuna gritaba y vitoreaba hasta que el chofer saludaba como si fuera una estrella y ahí todes aplaudíamos :)

Creo que el punto más negativo es la cantidad absurda de gente que hay en el evento. Creo que el pico un día fueron 125 mil personas, una locura. Al terminar el día, por ejemplo, decenas de miles caminando para salir del lugar, y caminando cruzado porque hay varias puertas y varios estacionamientos (o lugares donde tomar transporte) cerca de esas puertas. Los baños, por ejemplo, al final, eran un asco total (y entrar y salir era todo un desafío).

En fin. Toda una experiencia que recomiendo, pero no estoy seguro que repetiría :) Les dejo fotos varias y un par de videos.

Comentarios Imprimir

El tamaño sí importa

Un poco de contexto

Resulta que estoy haciendo una interfaz gráfica para Neovim. Hay millón, sí, ya sé, pero cada una tiene su quilombo. Y mi idea igual no es hacer la "interfaz gráfica definitiva", sino aprender en el proceso.

<nerd> Vengo aprendiendo un montón, ya que estamos, es re divertido este "proyecto mascota". </nerd>

El escollo o tema más importante que me encontré hasta ahora que no sé cómo resolver (estoy cada vez más convencido de que no hay una "manera correcta" de resolverlo) es cómo manejar los caracteres anchos en una grilla de caracteres monoespaciados.

A ver, vamos por partes (como diría mi amigo Jack).

Estoy haciendo una interfaz gráfica para Neovim. Neovim es un editor de textos muy usado para programar (entre otras muchas funciones) y tiene una interfaz muy limpia originalmente pensada para la terminal. Y las terminales (la mayoría, anywyay) usan tipografías monoespaciadas.

Una tipografía monoespaciada es aquella donde sus caracteres ocupan el mismo ancho. Si estás leyendo esto en mi blog, vas a ver que la tipografía está orientada a la "facilidad de lectura de textos" y los caracteres tienen distinto ancho. Mirá el ancho de las i y las m en la siguiente secuencia: mimimim. Y compará con la siguiente secuencia donde estoy forzando que use una tipografía monoespaciada: mimimim`. La elección para estos ejemplos de la m y la i no es casual, la i es bastante finita, y se considera que la M tiene el ancho completo.

Las tipografías monoespaciadas son muy importantes para programar en casi cualquier lenguaje. Este código "tiene sentido":

def test_levels_assert_ok_exception(logs):
    try:
        raise ValueError("test error")
    except ValueError:
        logger.exception("test message")
    assert "test.message" in logs.error
    assert "ValueError" in logs.error
    assert "test.error" in logs.error

El mismo código en una tipografía de ancho variable queda una porquería (especialmente en Python donde la indentanción importa, pero quedaría igual de feo en cualquier otro lenguaje).

El problema

Todo muy lindo. Pero ahora vamos a la realidad. En el planeta tenemos un montón de caracteres que son más anchos que una M (lo dejo escrito así genérico porque no queremos caernos en un agujero de conejo). Y no sólo caracteres de idiomas escritos. Unicode cubre todo eso pero también, por ejemplo, emoticones o dibujitos de todo tipo.

Vamos al caso de estos 3 caracteres: el "FULL STOP" (o más conocido "punto"), "HEAVY MULTIPLICATION X", y "CJK UNIFIED IDEOGRAPH-6614": . ✖ 昔 -- o en monoespaciado: . ✖  昔.

Los nombre en mayúsculas que puse en la oración anterior son los nombres formales que le da Unicode a esos caracteres. Y en relación a lo que venimos hablando, Unicode nos da también un dato importante: el "ancho inherente" del carácter, un tema para nada trivial, al punto que Unicode tiene todo un anexo al respecto.

Como gran parte de la especificación de Unicode está dentro de Python, podemos ver sencillamente esos valores para los caracteres en cuestión:

>>> unicodedata.east_asian_width(".")
'Na'
>>> unicodedata.east_asian_width("✖")
'N'
>>> unicodedata.east_asian_width("昔")
'W'

¿Y qué significa eso? No voy a entrar en todo el detalle, ahí ya les dejé el Anexo si quieren explorar. Pero básicamente Unicode nos dice que hay caracteres "wide", "fullwidth", "narrow", "halfwidth", "ambiguous", y "neutrals". Un quilombo. Que podemos reducir un poco haciendo una simplificación: tomamos algunos como anchos y otros como angostos.

Volviendo a los tres casos nuestros, el punto es Na (angosto), la cruz pesada es N (neutra), y el ideograma es W (ancho). Y más allá de esas características "formales", se puede notar visualmente que los anchos no son los mismos.

La dificultad real que me llevó a estudiar todo esto, en el contexto de hacer una interfaz gráfica a Neovim, es: ¿cómo meto caracteres anchos en lo que a priori sería una grilla regular? ¿qué hago cuando el carácter ancho me rompe la columna? ¿hay algo que se puede hacer que tenga sentido o que se considere "correcto"?

La exploración

¿Qué hacen otros editores con este bardo?

Los tres que estuve estudiando son Neovim mismo en la terminal, neovim-qt (una interfaz gráfica hecha en Qt que se comporta muy muy parecida a Neovim en la terminal), y Visual Studio Code. Para simplificar, de los dos primeros voy a mostrar sólo a neovim-qt, porque se comportan igual.

Miren lo que hace neovim-qt (o Neovim mismo en la terminal):

Screenshot y ampliado de cómo se comporta neovim-qt

La primer línea tiene al . como referencia; sabemos que es angosto y cómo debería comportarse. En la segunda línea tenemos el ideograma: como Unicode dice que es ancho, ocupa dos espacios; fíjense que el ideograma ocupa todo el ancho del par .P de arriba, y luego la P está encolumnada con la y de arriba. En la tercer línea tenemos la cruz pesada: Unicode dice que es angosta, pero el dibujo ocupa un montón! Mala suerte, en este caso se respeta el ancho, mirá como la P está encolumnada con la P de la primer línea, pero el problema es que el carácter excedido en ancho queda pisado por la letra siguiente.

Por otro lado, esto es lo que hace Visual Studio Code:

Screenshot y ampliado de cómo se comporta VSC

En la primera línea no hay sorpresas. En la segunda vemos que el ideograma tiene el ancho que ocupa, a nivel dibujo, pero luego el espacio contra la P no está exagerado: esto es porque VSCode no hizo que el ideograma ocupara "dos espacios", sino sólo lo que ocupó el dibujo en sí. Esto también lo vemos en la tercer línea, donde más allá que Unicode diga que es un carácter angosto, VSCode dibuja la cruz pesada al ancho que tenga y luego sigue con el resto del texto. Claramente esta forma de renderizar el texto queda más lindo, pero rompe totalmente las columnas: fíjense como se pierde la alineación vertical entre las tres líneas.

¿Hay valor en mantener en lo posible la alineación de las columnas? neovim-qt mismo en algún punto la rompe porque si ponés un carácter en dos espacios, parece todo ordenadito pero realmente las columnas están rotas, aunque no se nota tanto.

Entonces, ¿qué hago?

Por lo pronto, puedo implementar cualquiera de las dos soluciones que vimos recién.

La primera, como nvim-qt, con los anchos que indica Unicode:

Ocupando uno o dos espacios, según su ancho

(tengo esos puntitos azules porque todavía tengo en desarrollo todo lo que es "dibujar la grilla", después los voy a sacar)

Un detalle: a diferencia de nvim-qt, en vez de que el caracter de después tape completamente al anterior, estoy haciendo que los dibujos de los caracteres se superpongan... creo que queda mejor, pero no es definitivo.

La segunda solución, como VSCode, con el tamaño natural de los caracteres que se escapan del ancho angosto:

A lo que ocupe el glifo, si se escapa de lo angosto

Hay una tercera opción, que se le ocurrió a Felipe, que se basa en el ancho real de cada glifo, pero luego ajustando a que ocupe uno o dos espacios según corresponda. Esta tiene la ventaja que todos los caracteres se verán bien (como en VSCode), y que las columnas parecen ordenaditas (como en neovim-qt), aunque sufre el mismo problema de que las columnas no están realmente alineadas.

Acomodando los anchos en cantidad de espacios fijos

Y una cuarta opción también, idea mía: llevar todo todo a un sólo espacio. La ventaja es indiscutible: al tener siempre un carácter por espacio, la grilla queda perfecta a nivel alineación de columnas. Pero los caracteres al achicarse pierden mucho detalle, y creo que al final no es práctico.

Todo a un sólo espacio

Cabe acotar que Neovim espera que la GUI funcione como la primer manera ("unicode"), porque sino se rompen otras cosas que el editor dibuja "alrededor de la grilla del código"; en la siguiente imagen (del segundo caso, "natural") se puede ver qué mal que queda la barra vertical de la derecha que marca 99 columnas, y cómo se desplaza toda la línea que tiene la cruz pesada al principio:

Neovim espera que la grilla se comporte de una manera específica

Si voy a mantener que Neovim haga esos dibujos de alrededor, tengo que hacer que la GUI se comporte sí o sí de la primer manera ("unicode"), pero quizás en un futuro haga yo mismo desde la GUI esos dibujos de "asistencia", lo cual me liberaría a dibujar los anchos como yo quiera (y esos otros dibujos quedarían más elegantes, por ejemplo la línea que marca el límite de columnas que sea una línea, y no un caracter pintado).

Conclusiones

No tengo una decisión tomada. No me parece que haya una forma que sea claramente mejor que el resto. Todas tienen algún problema.

Pero después de todo este análisis, lo próximo que voy a hacer es usar el modo "unicode", el que usa nvim-qt y que es mejor soportado por Neovim, ya que en la primera etapa (al menos) voy a mantener los "dibujos de asistencia de alrededor" hechos por Neovim mismo, así que no quiero romper eso.

Tampoco me queda claro que las otras opciones sean mejores. Neovim eligió ese modo por alguna razón, aunque quizás esa razón no sea la más importante en este momento/contexto (quizás porque Vim hacía lo mismo, o quizás porque la interfaz primaria es la terminal).

VSCode eligió la otra solución, la "natural", pero que queden las columnas levemente desalineadas es horrible. Aunque quizás eso no sea un problema ya que al final les hispanoparlantes usamos normalmente caracteres "angostos", especialmente para programar... pero después metiste un emoji y perdiste.

En fin. Si tienen más info sobre este tema, es bienvenida. ¡Gracias!

Comentarios Imprimir