Adrianistán (5), Adrián Perales (10), La Página Definitiva (10), otro blog más (10), Página de inicio on Un sitio solicitado por la comunidad, para la comunidad (10)

2026-02-04

Nibelungos: la Guerra de los reinos (Movistar+, 2025) (La Página Definitiva)

Adaptaciones de clásicos: un mundo para criticar.

2026-02-01

Emacs en Android (Adrianistán)

Existen diversas formas de usar Emacs desde un dispositivo con sistema operativo Android. Creo que una forma es la ideal, pero voy a comentar todas por si acaso a ti te viene bien.

La primera es instalar Emacs nativo desde F-Droid o desde desde el FTP de GNU Emacs. Son equivalentes. Este Emacs es gráfico, permite mostrar imágenes por ejemplo pero no puede interactuar con el sistema ya que se encuentra aislado del resto de apps y del sistema.

Otra opción es instalar Termux, un entorno que nos permite tener una terminal y un entorno muy parecidos al Linux tradicional, y desde allí instalar Emacs con su herramienta pkg.pkg install emacs. Esta opción nos permite tener un Emacs que es capaz de interactuar con su entorno Termux, es decir, podremos ejecutar git, compiladores, etc Pero es la versión de terminal, la cuál aunque funcional, no es la más completa de Emacs.

Aquí existiría otra opción que es instalar un entorno de X11 sobre Termux y ejecutar el Emacs gráfico allí. Esto en teoría funciona aunque no lo he probado porque es un setup un poco complejo.

Finalmente la mejor opción en mi opinión es instalar unas versiones especiales de Termux y de Emacs nativo de Android que comparten IDs y comparten sandbox. Por tanto ese Emacs nativo podrá acceder a los comandos y ficheros de Termux. Pero hay que seguir unos pasos para que esto funcione. Lo más importante es que tanto el APK como Emacs estén firmados con la misma clave. Pero por defecto no lo están.

Los pasos son los siguientes: descargamos una versión actualizada de Termux de su GitHub. Por ejemplo, esta: https://github.com/termux/termux-app/releases/download/v0.119.0-beta.3/termux-app_v0.119.0-beta.3+apt-android-7-github-debug_arm64-v8a.apk. Descargamos la clave de firma de Emacs de aquí: https://github.com/emacs-mirror/emacs/tree/master/java/emacs.keystore. Refirmamos el APK con este comando: apksigner sign --v2-signing-enabled --ks emacs.keystore -debuggable-apk-permitted --ks-pass pass:emacs1 termux-app_v0.119.0-beta.3+apt-android-7-github-debug_arm64-v8a.apk y pasamos al APK a nuestro móvil/tablet y lo instalamos. No abrimos Termux todavía.

A continuación instalamos Emacs del FTP de GNU Emacs, por ejemplo este: https://ftp.gnu.org/gnu/emacs/android/termux/emacs-30.2-29-arm64-v8a.apk. Abrimos Termux y ejecutamos: pkg update && pkg upgrade. Esto nos servirá para actualizar los paquetes dentro de Termux. Una vez acabado podríamos ya instalar programas que querramos usar conjuntamente con Emacs como Git, GCC, SBCL, OpenJDK, SWI Prolog, etc

Abrimos Emacs y abrimos el fichero .emacs.d/early-init.el (no existirá). Le agregamos las siguientes líneas:

(setenv "PATH" (format "%s:%s" "/data/data/com.termux/files/usr/bin" (getenv "PATH"))) (push "/data/data/com.termux/files/usr/bin" exec-path)

Reiniciamos Emacs y, ¡tachán! Ya tenemos nuestro Emacs en Androig nativo y gráfico y con acceso a herramientas de Termux como Git. A partir de aquí ya podemos empezar a personalizar nuestro Emacs con paquetes, temas, etc, ... Las diferencias con Emacs de ordenador ya deberían ser mínimas

2026-01-27

Sandisk Extreme Fit: mide antes de comprar (otro blog más)

(Hoy toca batallita especialmente intrascendente, quedáis avisados.)

Dichoso primer ingeniero el que decidió que no tenía sentido poderle cambiar el disco a un portátil. Desde entonces, todos acabamos haciendo, tarde o temprano, encaje de bolillos. Porque, por enorme que te parezca un disco, dentro de dos años ya no va a ser enorme, y dentro de tres será demasiado pequeño. En Sandisk, que tienen vista, anuncian sus USB Extreme Fit (aquí la página) con esta imagen:

Vamos, el USB ideal para dejarlo conectado al portátil, y se acabó (durante una temporada) tener que, o bien preocuparse por el espacio en el portátil, o bien conectar y desconectar continuamente un «pen». Y para allá que me fui, a por mi USB de 512 gigas (ir por ir…). Y todo bien, hasta que lo he enchufado…

Mono, ¿eh? Ahora… ¿veis que deja un espacio tirando a justo para el puerto USB-C que queda justo al lado? Pues bien: para enchufar el portátil a los hubs que tenemos en la oficina, cuyos cables no son lo más ajustados del mundo, me he pasado un rato hasta que he encontrado uno que había perdido su carcasa, porque si no, no entraba de ninguna de las maneras:

Ni un milímetro de margen, oiga.

Hay cables USB-C que no dan ningún problema (el de mi «ladrón» USB, sin ir más lejos, afortunadamente). Pero. Antes de comprar un Sandisk Extreme Fit, si vuestro portátil tiene los puertos USB-C uno al lado del otro, echadle un vistazo al resto de cosas que queráis conectar antes de comprar.

2026-01-25

Byte, enero del 86 (otro blog más)

Lo de siempre: seguimos con nuestro proyecto de leernos la revista Byte… con cuarenta años de retraso, y esta vez con un añadido final extra. El tema del mes… ¡la robótica! (Tema que vamos a ignorar bastante completamente, porque no me pone nada. Pero las portadas de Byte son un clásico, o sea que aquí va la del mes:

Comencemos, pues, por la editorial:

¿Creíais que Apple se quejaba solo de que Microsoft la copia? (Todo sea dicho: a lo largo de la historia Microsoft ha copiado cosas de Apple… y hasta hay casos en los que Apple ha copiado de Microsoft. Y donde dice Microsoft, puede decirse Google/Android.) Pues antes de quejarse de Microsoft y Windows, se quejaron de GEM, la capa gráfica de Digital Research para sistemas PC/MS-DOS (y no solo estos: volvemos sobre el tema más abajo). Respetando la propiedad intelectual de Apple (más que el editor de Byte, después de leerle), comparto con él que con estas cosas, entonces y ahora, el consumidor sale perdiendo bastante.

Seguimos con los «microbytes» la sección de noticias breves. En esta ocasión, por un lado, evolucionamos con algo que ya habíamos visto por aquí… a las pantallas planas LCD les llega el color:

Y por el otro (literalmente, hay que girar la página para llegar a ello), desmontamos un poco el mito de que Kodak murió por no innovar en fotografía digital:

…y es que pocas compañías investigaron e invirtieron en el campo de la fotografía digital como Kodak, que acumuló una inmensa bolsa de patentes sobre el tema. Lo que mató a Kodak (bastantes años después de 1986) fue, sobre todo, el miedo a canibalizar su mercado «químico».

Nos vamos, ahora, a la publicidad:

Sí, amigas, 1986 es el año de volar a 2400 baudios, no a los «viejos». Casi dos kilobits y medio, sí. ¿Recordáis la tortura que es tener cobertura «solo» 4G y descargar cosas a pocos megabits? (Pero no os emocionéis: no todas las líneas telefónicas de la época soportaban esa barbaridad de velocidad.)

Y seguimos mirando anuncios, con un momento histórico: ¡el primer anuncio que vemos de Windows!

No os pongo el publireportaje entero (8 páginas tenía en total, que Microsoft ya tenía unos dineros en la época), pero sí os dejo aquí esta maravilla de gráficos:

¿Reconocéis vuestro Windows «de toda la vida»? Yo tampoco.

Hablábamos antes de GEM… y lo recuperamos aquí, porque en este número se analizaba el Atari ST, la tercera de las máquinas con procesador Motorola 68000, después del Macintosh y el Amiga (recordemos siempre: Amiga mejor que ST mejor que Mac). Y el sistema operativo del ST era, efectivamente, el GEM de Digital Research (bueno, GEM era, como con los PCs, la capa gráfica sobre TOS, el verdadero sistema operativo).

Y… ¿vamos a comparar GEM con Windows, tal y como lo presentaba la mismísima Microsoft en su campaña publicitaria?

(Eso sí: reconoceremos que el parecido con el sistema operativo de los Macintosh es más que notable. Es innegable.)

Seguimos con nuestra sección «esto no lo ponemos en una revista hoy, que nos lapidan» con un programa en BASIC para dibujar superficies 3D:

Ojo, que el programa tenía una cierta complejidad y hasta ocultaba las superficies ocultas:

(Si esto no os fuera suficiente, os podéis ir a la página 397 para ver cómo implementar el algoritmo de Euclides para calcular el máximo común divisor.)

He dicho que me iba a saltar la robótica, pero sí me quedo con uno de los artículos de la sección:

Y después de la visión venía una pieza dedicada a los sensores táctiles, otra sobre navegación autónoma y una sobre IA en visión por ordenador. De nuevo, uno no sabe si estamos en el 86 o en el 26 (y no se siente con ánimos de explicar a los autores que a la cosa aún le quedaban unas pocas décadas).

Y echamos una última mirada a la publi, y es que creo que no habíamos reflejado por aquí la maravillosa campaña «Charlot» de IBM:

Que no fue un único anuncio, os lo aseguro. Años, duró la campaña, siempre visualmente maravillosa. Os dejo aquí un recopilatorio de anuncios televisivos.

Y nos vamos a ir con otro momento histórico:

Acorn RISC Machine… A, R, M. La arquitectura del chip de tu móvil. O de tu Mac, si tienes uno. Y ahí estáis, viendo, en riguroso directo, su nacimiento. Casi nada.

Y hasta aquí la Byte del mes. Si queréis hacer los deberes para el mes que viene, como siempre, aquí tenéis los archivos de la revista Byte en archive.org.


Y esto habría sido todo… pero el otro día me enteré de la muerte de Stewart Cheifet (hasta el New York Times le dedicó un obituario). ¿Que quién es Stewart Cheifet? No me digáis que no habéis visto nunca su Computer Chronicles. Si Byte es, al menos para mí, uno de los recursos imprescindibles en formato prensa escrita para revisar la historia de la informática, Computer Chronicles es lo mismo, pero en formato vídeo. Los archivos del programa de la PBS, la tele pública de Estados Unidos (lamentablemente en peligro de muerte, gracias a la administración Trump y su alergia a la información de calidad), son un documento esencial si te interesa el periodo de 1983 a 2000. Y como homenaje, y como estas entradas sobre Byte <ironía>no son lo suficientemente largas</ironía>, he pensado que completarlas con el visionado de los programas correspondientes sería, cuando menos, un ejercicio curioso1. Y os dejo aquí los programas de enero del 86…

El 7 de enero el programa arrancaba con… ¡inteligencia artificial!

(¿No os ha encantado el anuncio del patrocinio de Byte? 😅)

No podemos dejar de comentar el copresentador del programa con Cheifet: nada más y nada menos que el malogrado Gary Kildall, creador de CP/M… y de GEM. Hay múltiples universos paralelos al nuestro en que amamos y odiamos a Kildall, CP/M y GEM y no recordamos quién era Bill Gates ni sabemos nada de un sistema operativo llamado Windows.

El Jerrold Kaplan que sale en la primera entrevista, por cierto, trabajaba por aquel entonces con Mitch Kapor, fundó en 1987 Go, dedicada a lo que luego se llamarían PDAs y luego fundaría el primer sitio web de subastas (cinco meses antes de eBay). Not bad. Y también podemos destacar la presencia del filósofo Hubert Dreyfus dudando fuertemente de la expertez de los sistemas expertos de la época :-).

Maravilloso también que los expertos apuntaban que 1986 podría ser el año del reconocimiento del habla 😅.

Después, el día 14, otro tema del que no se habla nada en la actualidad: seguridad informática.

…aunque en aquel momento esto se refería al uso de ordenadores para perseguir delitos, peleándose con catálogos de huellas digitales o usando sistemas de información geográficos, por ejemplo, pero también digitalizando procesos como en cualquier otra organización.

Os recomendaría, eso sí, saltar al minuto 27:30 del vídeo, en el que Cheifet habla de los gráficos de la peli El Secreto de la Pirámide… creador por un «nuevo ordenador gráfico, creado por Industrial Light & Magic, una división de LucasFilm. El ordenador se llama… Pixar».

Y no sigo porque, según esta lista de episodios en la Wikipedia2, el siguiente no se emitiría hasta febrero.

Apa, el mes que viene más (ya decidiremos si solo con Byte o con el añadido de Computer Chronicles).

  1. Un ejercicio curioso que, inevitablemente, no se me ha ocurrido solo a mí: veo que alguien ha montado un computerchronicles.blog y que ya lleva nada menos que los primeros 133 programas revisitados. ↩︎

2026-01-06

2025 en música (otro blog más)

En esta casa es tradición abrir el año bloguero repasando la música que escuchamos en los doce meses anteriores (aquí la entrada del año pasado). Y las tradiciones están para cumplirse.

No es tradicional recuperar los conciertos que vimos, pero a ver si cuaja a partir de ahora… El 17 de enero vimos a los suecos Gidge en La Nau. No nos volvimos a ir de concierto hasta el 17 de marzo, cuando cayó Music for Airports en el Auditori (a cargo del francés Ensemble Dedalus, aquí el programa de mano del concierto en PDF). El 25 vimos al estadounidense Panda Bear en la Paral·lel 62. El 28, a los londinenses Moin en el DNIT del Caixafòrum. El 29, Ben Sims pinchaba en la Laut. A partir de ahí saltamos a junio, con el atracón del Primavera Sound, cuando cayeron, que yo recuerde, Idles, Waxahatchee, Stereolab, TV on the Radio, Fontaines D.C. y Squid (cayeron más, seguro, pero es lo que hay). El 15 de julio nos fuimos a ver a Max Richter al Grec. El 1 de agosto, las argentinas Fin del Mundo en la Upload. El 30, la pinchada del angloturco Erol Alkan en el Apolo. El 15 de noviembre, las estadounidenses hermanas Lovell, a.k.a. Larkin Poe, en el Razz. El 20, la badalonesa Maria Arnal en el Palau Güell dentro del ciclo Orgànic. Y cerramos el año musical (salvo error u omisión) el 30 del mismo mes, con el luxemburgués Francesco Tristano revisitando a Bach (y amigos y conocidos), otra vez en el Caixafòrum. 9 conciertos, 2 sesiones de DJ y un festival. Podría (y debería) mejorar, pero me voy a poner un aprobado sin ningún tipo de remordimiento.

¿Que cuál os recomendaría? ¡Todos! Que no suelo ser yo de que me gusten todos los conciertos a los que voy, pero 2025 estuvo muy bien en ese aspecto :-).

(Nota: alucino con que haya gente sin web propia, que dependen de una cuenta de Bandcamp —o mucho peor: Instagram— para su presencia en la web.)

Este agosto nos fuimos de Spotify, o sea que el wrapped se quedó a medias, pero aún así, me gustó que…

😎

En cualquier caso, en esta casa el verdadero wrapped es el de last.fm, y el mío está, como simepre, en https://www.last.fm/user/chechar/listening-report/year. Y dice last que han sido 25,040 reproducciones (el año pasado 27,609) de 14,554 canciones diferentes (por las 16,182 de 2025) de 3,648 artistas (3,811), para un total de 69 días y 23 horas (un poco menos de una quinta parte del año, vaya). Curiosamente, casi he clavado mis números… de 2024.

Mi top 25 de artistas es…

Voy a presumir, sobre todo, de que esos 25 artistas y bandas representan poco más de la sexta parte de la música que escuché el año pasado. La punta del iceberg, vamos. Viva la dieta variada.

Repasando los datos de last, los principales descubrimientos son las «indie roqueras» Mortimer Nyx (muy poco escuchada, al menos entre la clientela de last, por lo que veo, y Spotify tampoco dice que triunfe mucho, pero mola un montón), y Merce Lemon y el shoegaze valenciano de Gazella (los tres comenzaron a darme fuerte en 2024, por lo que veo, y a Gazella se les verá por Barcelona en febrero), la cantautora argentina Juana Molina (que lleve dando vueltas desde finales de los 80 no significa nada (veo, por cierto, que también pasa por Barcelona este año, en abril)), las también «indie roqueras» Friedberg, londinenses de origen austríaco, las poppies gijonesas Pauline en la Playa (un cuarto de siglo llevan por ahí, sí) y la autoproclamada primera dama del soul de Londres (no seré yo quien se lo discuta, ni aún sabiendo que nació en Estados Unidos) PP Arnold (80 años cumplirá en octubre). Y luego tenemos la recuperación del postrock escocés de Mogwai (llevaba un par de años sin hacerles caso, pobres, pero son una de mis bandas más escuchadas), Sleigh Bells (dice last que lo suyo es el noise pop, y que les tenía bastante abandonados desde 2022) y la psicodelia made in Australia de Tame Impala (no le escuchaba así desde 2020 (viene en abril al Sant Jordi, y no me da la economía para los precios de la reventa, que dan un vértigo considerable: ¿desde cuándo lo peta tanto?)).

¿Géneros del año? Los de costumbre, más o menos:

Geográficamente, sigo siendo un surtido Cuétara, aunque la concentración anglosajona se mantiene dominante:

No repito la gráfica de música por década, porque es la misma del año pasado: si Spotify «opina» que tengo 19 años, es porque escucho mucha más música de los 20 que de los 10, más de los 10 que de los 00, y así hasta el infinito…

En fin, una vez cumplida la tradición… ¡que tengáis un 2026 bien musical!

PS 2026.1.7 Edito para añadir la gráfica de escuchas a lo largo del día, que ayer no la había visto. Diría que no aporta nada de información, pero los homenajes a los clásicos del diseño gráfico siempre están bien :-).

2025-12-31

¿Que ya pasó 2025? (Adrián Perales)

Hoy escribo esto poco tiempo antes de que comience la celebración, así que será una entrada mucho más corta que en ocasiones anteriores.

Si tuviera que definir el año que acaba con una palabra, sin duda sería «estabilidad». Ha sido un año de descanso, de reencuentro conmigo mismo y de estabilizar hábitos.

Lo más destacable y lo que más impacto ha tenido en mi día a día ha sido el cambio de instituto. Trabajar a diez minutos de casa se nota muchísimo, y esos beneficios tan solo han comenzado porque el primer trimestre siempre es más duro. Pero, a pesar de la cuesta inicial (aprender el funcionamiento, más alumnado y bajón de ánimos estacional), he sabido gestionar el estrés bastante bien, cosa que me alegra y me enorgullece.

Más allá del trabajo, he logrado que el deporte, ya sí que sí, se haya convertido en un hábito. Pocas han sido las semanas en las que no me moví aunque sea un poquito. Caminatas de kilómetros, calentamiento de fuerza o sesiones completas. Como efecto secundario, este año he perdido más de diez kilos de peso y han mejorado mis indicadores de salud.

He pisado Madrid no menos que tres veces, he ido a muchos conciertos y visto varias películas en cine. También he completado algunas series, aunque el apartado cultural no ha sido muy destacado este año.

Como ya conté, me he centrado mucho en la actualidad política, y precisamente eso es lo que quiero cambiar. Redirigir mi energía a cuestiones que me hagan más feliz.

Este año hemos publicado 9 episodios de Radio Al compás, en 2026 se hacen 20 años del blog y tengo planes al respecto. Es un proyecto del que estoy muy orgulloso y quiero darle cariño.

Por lo tanto, mis energías en 2026 van destinadas a cuatro objetivos fundamentales:

  • Mantener a raya el estrés.
  • Hacer ejercicio.
  • Darle cariño a Al compás gaditano y Radio Al compás.
  • Dedicar tiempo a la cultura: cine, series, música y, sobre todo, libros.

Diría que este año no he leído absolutamente nada fuera del trabajo.

Pueden parecer poca cosa, pero no quiero exigirme más de lo que pueda cumplir. En mis circunstancias actuales, si termino el año habiendo leído varios libros y visto películas pendientes, estaré más que contento.

Tengo otros objetivos a largo plazo que me acompañan desde hace años: aprender a tocar la guitarra, profundizar en el esperanto, acreditar un B2 de Inglés, escribir una novela. Pienso que 2026 no es momento de centrarme en ellos. Tampoco desoiré mi cuerpo si me dan ganas de ponerme, pero termino el año decidido a bajar los títulos pendientes en la biblioteca y filmoteca.

Por supuesto, este blog seguirá siendo depositario de mis pensamientos. También el pódcast. Sin periodicidad, sin presiones. Escribo cuando puedo y programo una entrada a la semana. Así quito de mi cabeza esos pensamientos que necesito compartir.

Y me encanta saber que hay gente al otro lado que disfruta de leer esos pensamientos.

Feliz 2026. Nos vemos en el otro lado. Un abrazo.

2025-12-30

Byte, diciembre del 85 (otro blog más)

Toca cerrar el año con nuestra relectura habitual de la revista Byte… de hace cuarenta años. Esta vez, temas de moda… de 2020.

(Me vais a reconocer que aprovechar un conector tipo D así es, cuando menos, creativo :-).)

Y comenzamos con publicidad, más que por el producto… porque en 1985 ya hacía unos años (pocos, eso sí) que Bill Gates había dicho (o no) que 640 Ks deberían ser suficiente… y ya sabíamos que no.

Por cierto. Cuarenta años más tarde, tu ordenador tiene… ¿cuatro mil veces más memoria? ¿Ocho mil?

En la sección «cosas que no son nuevas»…

…y es que el debate sobre los modelos de financiación del software vendría a ser tan viejo como el propio software.

No nos vamos a saltar nunca las tecnologías para mejorar la accesibilidad de los ordenadores:

Vamos a escandalizarnos, eso sí, de los 3450 dólares de la época que costaba el cacharro. Mucho más barato era este prototouchpad (que más que touchpad era un teclado para macros):

Aquí una cosa que no deja de sorprenderme que no hubiesen añadido antes en la revista. Uno se pasó una parte no negligible de los ochenta tecleando código que venía en diferentes revistas. Con mis nulos ingresos en la época, tiempo bien empleado. Pero el comprador de una revista como Byte muy probablemente tenía recursos económicos como para no verlo así:

Y, de regalo, nos dan el ránquin de los ordenadores más populares entre los lectores de la revista en la época. Nótese también, primero, que ahí están los discos de 8″ en formato estándar CP/M, y que los precios, teniendo en cuenta que la operación tenía que ser bastante manual, me parecen bastante razonables.

No pongo captura porque el escaneado de las páginas correspondientes en el Archive no está bien (podéis navegar a la página correspondiente de Byte – a visual archive), pero está bien la sección de libros del número. Comienza con la crítica de Back to BASIC: The History, Corruption, and Future of the Language (se puede conseguir en Amazon, curiosamente), en que los diseñadores de BASIC, al parecer, se quejan amargamente de la cosa en que se ha convertido su lenguaje, veinte años después de su creación, y explican por qué lanzaban en 1985 True BASIC (que exista el dominio y se puedan comprar en él versiones del lenguaje actuales y vintage, y manuales, me ha reventado la cabeza). Explican los autores que BASIC no fue diseñado para ser un lenguaje interpretado, sino compilado, y que esto, sumado a las estrecheces de la RAM de los ordenadores en que se estaba usando en los 80, se habían cargado su diseño. Qué cosas.

Más adelante se critica Ethical Issues in the Use of Computers. De nuevo, la digitalización del Archive está mal, pero se puede acceder al visual archive, para recordarnos que este no es un tema de nuestro siglo XXI, precisamente, y que hace cuarenta años ya nos preocupaban los riesgos de las grandes bases de datos para nuestra privacidad, la brecha digital o la toma de decisiones algorítmicas sobre nuestra salud.

Volviendo al servicio de venta de disquetes con el código de la revista, y en nuestra habitual sección «cosas que no se incluirían hoy en una revista ni por casualidad»…

Y no podemos cerrar la sección sin incluir las interfaces por voz. Si alguien es capaz de viajar al pasado, por favor, tened la delicadeza de no comentarle al autor que a la cosa aún le faltaban unas cuantas décadas.

Nos vamos ahora al tema de portada:

Sí, era obvio, querida lectora, que no podíamos estar hablando de los Zoom de los 80, sino de los Discords asíncronos (a todo estirar, que más bien son Reddits lo que se menciona) que podían soportar los ordenadores y redes de telecomunicación de la época.

A destacar: (i) no aparece la palabra «Internet» en la pieza y, (ii) os podéis ir a la página 174 para ver una separata sobre los efectos que iban a tener estos sistemas sobre personas y sociedades. Si no me equivoco, por cierto, el firmante estaba, en aquella época, fundando el mítico The Well.

Volvemos a los anuncios. ¿Cuántos años le echábais a Logitech y sus ratones?

Vale, unas cuantas le echábais al menos cuarenta. Pero… ¿cuántas sabías que Logitech se dedicaba a los compiladores?

(Según la Wikipedia, Logitech se fundó en Suiza en el 81 con el objetivo de crear un procesador de texto, y de ahí se pasaron a los «roedores». En 1984 ya los tenían inalámbricos (por infrarojos). El C7 que tenéis aquí arriba era su primer ratón de venta al público. Vosotros también habríais pagado más de doscientos euros (actualizando la inflación) por tener uno, ¿verdad? Lo de Modula-2, parece ser, fue solo una veleidad temporal.)

No me iré sin darle un repasillo a los ordenadores de la época, c

¿Os habéis fijado que mencionan que ambos pueden funcionar alimentados por su propia batería? (Comentan del NEC, que con cuatro pilas tipo C (¿quién dijo «batería recargable»?) aguantaba un par de horas.) ¿Y que no hablan de ningún tipo de almacenamiento interno? No me molesto en calcular cuánto serían hoy los mil dólares que costaban, pero sí que comentan que el NEC, funcional, se va más bien a más de dos mil… Y también comentaré que la pieza se cierra con un «para qué un laptop» que, dada la tecnología de la época, era una pregunta más que razonable. Oh, los maravillosos ochenta.

Y cerramos con un clásico del software:

Las Norton Utilities del celebérrimo (y actualmente octogenario) Peter Norton llevaban el mercado desde el 82 (y quizás más sorprendente, se lanzarían versiones nuevas hasta 2012).

Como de costumbre, tenéis los archivos de la revista Byte en archive.org, y si queréis, podéis ir avanzando trabajo con el número de enero ¡del 86! Hasta el año que viene :-).

2025-12-26

Cómo trabajar con la pantalla apagada usando Virtual Display Driver (Página de inicio on Un sitio solicitado por la comunidad, para la comunidad)

La pantalla del ordenador es ese periférico que siempre está mostrando algo. Nunca falla, no puede permitírselo. Si lo hace, es porque falla el sistema entero. Es la piedra angular de cualquier ordenador, cualquier sistema, cualquier aplicación. He visto portátiles en casi perfectas condiciones desechados sólo porque la pantalla estaba rota. Así que suena absurdo trabajar con ella apagada. Tan absurdo que los fabricantes, con el paso de los años, han ido acabando con cualquier mínima posibilidad que pudiera existir de desactivarla. Porque ¿quién querría hacer algo así? Pues sin ir más lejos, un usuario ciego que no la necesita, como yo.

Trabajar con la pantalla apagada tiene múltiples ventajas. La principal, sin duda alguna, es la privacidad. Nos suele gustar usar el PC sin que alguien se acerque discretamente y vea lo que estamos haciendo. Y por desgracia, pasa con más frecuencia de la que parece. No es la primera vez que la gente me pregunta por qué no se ve nada y si el ordenador está realmente encendido, y no será la última. Pero como la privacidad no lo es todo, también tenemos otro buen motivo para querer apagarla: la exposición prolongada a una luz que no vemos y que, a largo plazo, acaba afectando a nuestra salud.

Hasta el descubrimiento que presento en esta entrada, y que hice ayer mismo, sólo conocía estas tres formas de desactivar la pantalla, cada una con sus pros y sus contras. Hablamos de la pantalla de un portátil. Evidentemente, en equipos de sobremesa, la solución es tan simple como darle al interruptor o tirar del cable:

  • Bajar el brillo al 0%: reducir la luminosidad puede funcionar mejor o peor, dependiendo de la marca. La luz será menos dañina y el consumo de energía disminuirá, pero es posible que todavía se siga viendo el contenido con el que interactuamos.
  • Utilizar una segunda pantalla que no está conectada: la mayoría de portátiles con Windows vienen con un conector para usar una pantalla adicional. Podemos pulsar la combinación windows+p y elegir “Sólo segunda pantalla”. Si todo va bien, el sistema puede preguntar si queremos conservar o revertir los cambios, o efectuar el cambio de pantalla sin preguntar nada. El problema es que casi nunca va bien, ya que las tarjetas gráficas y los sistemas operativos más recientes son capaces de identificar si realmente hay una segunda pantalla conectada y, si no es así, el proceso no continúa. Otro punto en contra va relacionado con la resolución de la nueva pantalla, que tiene un impacto a la hora de navegar por el escritorio, la web, y otras aplicaciones. Como única gran ventaja, eso sí, tenemos que la pantalla principal se desactiva por completo, ahorrando energía. Si el equipo tiene conector VGA, o se usa un adaptador HDMI a VGA, este método funcionará siempre.
  • Cortinas de pantalla: ciertos lectores de pantalla, como Jaws for Windows, NVDA y VoiceOver, incluyen una función llamada cortina de pantalla. Al activarla no se apaga la pantalla, sino que sus píxeles emiten de manera uniforme el mismo contenido, de tal manera que no se ve nada. Esto no reduce el consumo de energía, pero es una solución eficaz para preservar nuestra privacidad. No obstante, no está exenta de problemas. Y es que la cortina se activa a nivel de software, por lo que la pantalla tampoco se verá al realizar tareas tales como aplicar OCR, compartir en videollamada el escritorio o tomar capturas de pantalla. Las capturas aparecerán vacías, y el OCR no encontrará texto.

La solución óptima siempre ha sido utilizar una tarjeta gráfica simulada a la que se conecten pantallas simuladas. El problema es que no existía, y cuando existió no la conocimos… hasta hace poco. El nombre no es muy original, pero tampoco importa: se trata de Virtual Display Driver.

Pasos para configurar Virtual Display Driver

En primer lugar, deberemos disponer de tres cosas importantes: el propio driver, una cuenta con privilegios de administrador, y un sistema Windows 10 o posterior X64 o ARM64. Para descargar el driver, se puede visitar la página de la última release en GitHub y descargar el archivo vdd.control en la lista que hay bajo el botón desplegable “Assets”. Por ejemplo, y para ahorrar tiempo, aquí está la descarga directa de la versión 25.7.23, la más reciente en el momento en que escribo esta entrada. Ahora que tenemos todo lo necesario, se pueden seguir estos pasos:

  1. Extraemos el archivo zip descargado a una carpeta en la raíz de la unidad del sistema. Por ejemplo, C:\virtualMonitor.
  2. Accedemos a la carpeta, y ejecutamos el archivo VDD Control.exe. Aparecerá una alerta de escritorio seguro.
  3. La interfaz no es muy accesible, pero tiene un cuadro de texto con información de depuración, y algo que por suerte podemos usar: una barra de menú.
  4. En la barra de menú, vamos a “Virtual Display Driver”, luego a “System”, y finalmente a “Install Driver”. Aparecerá una advertencia de Windows preguntando si queremos instalar el controlador, ya que el firmante no es de confianza. Pulsamos Instalar, y al hacerlo, escucharemos que un nuevo dispositivo se conecta. ¡Nuestra nueva pantalla virtual está lista! Se puede desinstalar el driver del mismo modo, eligiendo la opción “Uninstall driver”.
  5. Pulsa el botón con una x para salir de la aplicación.

Hora de apagar la pantalla

Una vez esté todo instalado, podemos pulsar windows+p. En la lista, observaremos que está seleccionada la opción “Duplicar”. Bajamos hasta “Solo segunda pantalla”, pulsamos intro, y la pantalla principal se apagará. Sin embargo, esta nueva pantalla comienza por defecto con una resolución de 800x600. Desde Configuración > Sistema > Pantalla, y tras seleccionar la pantalla 2, se puede modificar a un valor más adecuado, como 1920x1080, y conservar los cambios al acabar. Para encender la pantalla, es suficiente con pulsar Windows+p de nuevo, elegir en la lista “Solo pantalla de PC” y pulsar intro.

Posibles problemas

Si el driver o la aplicación de control no funcionan, puede deberse a la falta de librerías en el sistema. Tal y como mencionan sus autores en GitHub, se deben instalar las versiones más recientes de Microsoft .Net Runtime y Microsoft Visual C++ Redistributable. Por ahora, no explicaremos cómo hacerlo, pero en el futuro se podría ampliar esta sección.

Si has llegado hasta aquí siguiendo todos los pasos, ahora puedes apagar la pantalla de tu portátil de la mejor forma posible: físicamente, ahorrando energía, sin impacto en las aplicaciones, y con la garantía de que se mantiene tu privacidad en todo momento. Es hora de que las miradas, ya sean discretas o indiscretas, vayan al lugar que les corresponde: los portátiles de los demás.

¡A disfrutar!

Otra de podcasts (otro blog más)

Yo recordaba haber escrito una entrada recomendando podcasts en obm. Y he buscado… y efectivamente, la escribí. ¿Alguien quiere apostar cuánto hace de aquello? Fue nada más y nada menos que en… diciembre… de 2011 (aquí la entrada correspondiente). Por aquello de no dejar de pasar más de catorce años entre recomendación y recomendación, aquí va la lista de 2025.

(Hay que decir, antes de entrar en materia, dos cosas.

  • La primera, que mi consumo podcastil se ha disparado en estos catorce años. En 2011 recomendaba diez podcasts. Ahora son, si no me he descontado… treinta y siete. El pronóstico del tiempo anuncia entrada tamaño sábana. Proceded con precaución.
  • Y la segunda, que servidor pasa bastante tiempo casi cada día en el transporte público y caminando, y que suele hacerlo con auriculares y el reproductor de podcasts1 a toda marcha. Y con «a toda marcha» quiero decir con los podcasts no musicales acelerados un 20% (30% para los [pocos] que están en castellano) y con la funcionalidad de saltarse las micropausas, con lo que un podcast de una hora suele durarme unos 45 minutos.

Y hay que decirlo, sobre todo, para que no os escandalicéis [mucho] cuando leáis las horas que he escuchado de cada podcast. Escandalizaos un 25% menos.

Fin del paréntesis.)

Los de deportes

Cosas que la gente no suele pensar de mí: soy fan del fútbol americano y otros deportes yanquis (la NBA, sobre todo). Y eso hace que mi podcast más escuchado sea The Bill Simmons Podcast, con un total de 123 horas en las últimas 52 semanas. Sí, más de cinco días enteros. Pero «solo» os podéis escandalizar por los cuatro que le he dedicado en la práctica 😬. En mi defensa, Simmons también entrevista a figuras de la cultura popular de vez en cuando 😇.

Le siguen los programas de KNBR, la radio de deportes de San Francisco, dedicados a mis «niners» y a los Golden State Warriors, con apenas 107 horas. Después viene 49ers Talk (de título autoexplicativo), con 71, The Athletic Football Show, con 62, o The Tom Tolbert Show, con 58 —Tolbert es un exjugador de la NBA (recaló también en la ACB una temporada), locutor de KNBR hasta que le echaron en un recorte presupuestario. Y cierran la lista los diferentes programas de la emisora The Game (también de San Francisco, quién lo habría imaginado), con 52, The Mina Kimes Show, con 47 (Kimes es de las pocas voces femeninas de esta lista, me temo, y la única de este apartado), y The Bill Barnwell Show, con 23.

En mi defensa solo diré que estoy intentando reducir mi consumo…

Los de música

Aquí solo hay un par de programas de radio… Turbo 3, de Radio 3 (una vez lo vi descrito como «Los 40 para mayores de 30», y algo de cierto hay en ello), y El Celobert, de Catalunya Ràdio, con 51 y 47 horas, respectivamente. Producen unas diez y cinco horas de contenido a la semana, pero yo solo me bajo los que «prometen» (en el caso del Celobert, los que repasan discografías y los dedicados a algún año o década, principalmente).

Los divulgativos

Comienza aquí la parte de la entrada que interesará más al lector (¡espero!). Se viene batiburrillo.

Ologies (47 horas) es el programa de Alie Ward dedicado a las «ologías»: de la astrobromatología a la neuropatoinmunología, pasando por la toxicología histórica. Los tres son programas de los últimos seis meses, lo juro. A veces me gustaría que fuera más al grano, pero es el podcast que lidera esta categoría por algo (ayudado, todo sea dicho, porque, junto con el siguiente de la lista, son los únicos que publican una hora de contenido a la semana). Calificación obm: 8 sobre 10.

Short Wave (44 horas) es el podcast diario de divulgación científica de la NPR, la radio pública estadounidense. La administración Trump le ha cortado el grifo de la financiación a la NPR (comprometídisima con el buen periodismo, y eso no está bien visto :-S), o sea que su vida pende de un hilo. Programas de diez a doce minutos, que últimamente se van a cerca de quince, engordados por las peticiones desesperadas de soporte económico por parte del público. Calificación obm: 8,5 sobre 10.

Because Language (31 horas), podcast de frecuencia irregular sobre lingüística, con episodios tirando a largos, que yo me (re)parto en capítulos. Muy fan, sobre todo, de Hedvig Skirgård. Calificación obm: 8,5 sobre 10.

Clear+Vivid (20 horas). ¿Os acordáis de Alan Alda? Yo, desde que en mi casa se consumía religiosamente la serie MASH, allá por los ochenta. Pues bien, resulta ser que, no contento con su carrera de actor, Alda se dedica desde hace un porrón de años a la divulgación científica, que es de lo que va mayormente este podcast, aunque de vez en cuando también pasan por él figuras de la farándula. Calificación obm: 8,5 sobre 10.

More or Less (17 horas), el programa de la Radio 4 de la BBC dedicado a reventar la estadística mal hecha o mal interpretada en los medios. Alterna programas de media hora semanales cuando está «en temporada» (con el economista Tim Harford a la cabeza) con cápsulas mucho más breves a lo largo de todo el año. Maravilloso. Mi reino por un equivalente «de aquí». Calificación obm: 9,5 sobre 10.

The Infinite Monkey Cage (13 horas). Más Radio 4 de la BBC. Esta vez con el físico Brian Cox y el cómico Robin Ince. En cada programa invitan a investigadores de renombre y a algún cómico para hablar de temas científicos diversos y hacerse unas risas. Vamos, un poco como lo que hace por aquí Naukas, pero con tono británico. En las últimas temporadas no me han hecho reir tanto como antes, pero sigue valiendo mucho la pena. El «episodio de las fresas» justifica, él solito, la existencia de no sé cuántas temporadas que han hecho. Es de 2013 y todavía lo recuerdo, vaya. Lamentablemente, Robin Ince acaba de dimitir porque en la BBC no le gustaban sus opiniones personales, excesivamente woke para ellos :-(. Calificación obm: 9 (9,5 en las primeras temporadas, que están ahí para escucharlas sin ningún problema).

Curious Cases (12 horas). Tercer y último podcast de la Radio 4 de la BBC. La matemática Hanna Fry y el cómico Dara ó Briain (¿estáis teniendo un déjà écouté?), que sustituyó hace un tiempo al genetista Adam Rutheford, eligen una duda científica de la audiencia, se buscan unas cuantas expertas en la materia e intentan darle respuesta de manera divertida. Calificación obm: 8 sobre 10.

Merriam-Webster’s Word of the Day (11 horas), Micropodcast (no llega a los tres minutos) diario de los de los diccionarios. Cada día, una palabra, su significado y su etimología (que para los latinos es la parte menos complicada, puesto que dos de cada tres palabras que hacen, más o menos, vienen del latín pasando por el francés, como buena parte de las palabras del inglés). Calificación obm: 8,5 sobre 10.

The Joy of Why (8 horas), podcast de divulgación científicomatemática de Quanta Magazine. Comenzó con el matemático Steven Strogatz (y centrándose en las matemáticas), pero desde hace una temporada lo lleva a cuatro manos con la astrofísica Janna Levin y se ha abierto a bastantes más temas. Calificación obm: 8 sobre 10.

Instant Classics (8 horas). De los últimos «fichajes» que he hecho. Tanto es así que todavía me falta como un mes de episodios por escuchar. La historiadora Mary Beard y Charlotte Higgins, de la sección de cultura del Guardian, repasan la historia clásica. Yo solo he escuchado epidodios «de romanos», pero veo que también hay alguno griego ya publicado. Calificación obm: 8,5 sobre 10.

Los «de tecnología»

The Vergecast (117 horas, disputándose el liderato con el podcast de Bill Simmons), el podcast de The Verge dedicado a la actualidad del mundo de la tecnología digital. Muy muy cerca de la calificación de imprescindible si se quiere estar al tanto de lo que sucede en el mundillo. Ha perdido un poco estos dos últimos años, porque se les han caído colaboradoras importantes y se ha convertido en «el podcast de Nilay y David». Nilay (Patel) muy bien (véase el párrafo siguiente), pero David (Pierce), por algún motivo, no me acaba de entrar. Tampoco ayuda su (muy comprensible, por otro lado) obsesión por la influencia de la administración Trump en el mundo yanqui. Mucha de esa influencia nos la vamos a comer en el resto del mundo, sí, pero al final me resulta cargante, qué le vamos a hacer. Aun así, muy bien. Especialmente cuando tienen a Joanna Stern de invitada (o a Victoria Song, o Allison Johnson). Calificación obm: 8,5 (9,5 hasta hace año y medio, y volverá al excelente si se lo curran un poco más).

Decoder (65 horas). El podcast en que Nilay Patel (véase el párrafo anterior) entrevista a figuras de interés del mundo de la tecnología (es casi un quién es quién de los CEOs de las tecnológicas). Normalmente muy informativo e interesante, con algún momento «oh dios mío cómo ha podido el mandamás este presentarse a la entrevista sin hacer mínimamente los deberes». Calificación obm: 9,5 sobre 10.

Syntax (55 horas). Solo de interés para interesadas en el mundo del desarrollo web. Pero si el tema te llama, a por él de cabeza. Los presentadores (y divulgadores del tema), Wes y Scott, muy majos e informativos. Calificación obm: 9,5 sobre 10.

Hard Fork (32 horas) es «el Vergecast del New York Times». Cuando comencé a escucharlo, bastante bien, pero ha llegado un momento en que se ha convertido en «el Vergecast radiofórmula» y me carga un poco, con lo que solo escucho los episodios con temas especialmente atractivos. Calificación obm: 7 sobre 10.

Hanselminutes (23 horas). De Scott Hanselmann hablamos por aquí hace menos de dos meses, y sigue siendo igual de majo que entonces. En su podcast entrevista semanalmente a un personaje del mundo de la tecnología (del desarrollo de software las más de las veces), relajado pero preguntando con criterio. Si el personaje no te llama, te saltas el episodio pero, al menos en mi caso, sucede con muy poca frecuencia. Calificación obm: 8,5 sobre 10.

Igalia Chats (20 horas) es el podcast gallego de esta lista… pero está en inglés. Y es que Igalia es una cooperativa gallega, pero distribuida por todo el mundo, que es la empresa más importante del mundillo web de la que no has oído hablar nunca (a no ser que seas lector habitual de este blog (véase, véase y véase) o escucharas el episodio de Despacho 42 que les dedicamos hace ya tres años (y que sigue siendo exactamente igual de interesante que entonces). Se dedican al mundo del código abierto, y al desarrollo de navegadores web en particular. Usas su código cada día (si eres lector de 0bm, con total seguridad; si no lo eres… casi que también, incluso cuando no estás delante del ordenador ni del móvil (escuchad el episodio, escuchad)) y la vida de quienes se dedican al diseño y desarrollo web es mucho mejor gracias a ellos. Con su podcast podrás entender por qué los estándares y los navegadores web son como son. Casi imprescindible para quienes os dedicáis al mundillo, pero con muchos episodios muy interesantes solo con que tengas el más mínimo interés en cómo funciona la web (y la web es como interactúas con el mundo un montón de horas a la semana, o sea que…). Calificación obm: 9,5 sobre 10.

Scott and Mark Learn To… (9 horas). Y cuando hablamos de Scott Hanselmann también hablamos de Scott Rusinovich y el podcast sobre desarrollo de software que tienen juntos desde hace poco (comenzaron este verano), un tanto quirky, pero lo suficientemente interesante como para que diera pie a una entrada de este podcast. Calificación obm: 8 sobre 10.

Despacho 42 (5 horas). ¿Por qué habré dicho que no hay podcasts imprescindibles? El podcast de tecnologías digitales y personas. El señor que más oiréis es un tanto particular, pero hablan con gente súper interesante de temas apasionantes. Calificación obm: el jurado se recusa 😅.

Los ¿culturales?

Tetragrammaton (71 horas) es el podcast de Rick Rubin, productor de discos de los Beastie Boys, Run DMC, The Cult, Danzig, Slayer, Red Hot Chili Peppers, AC/DC, Johnny Cash, Tom Petty, Rage Against the Machine, Nusrat Fateh Ali Khan, Audioslave, Weezer o Shakira (sí, Shakira). Y juro que me dejo nombres importantes, y no pocos. Comprobad el enlace. Me juego un café a que hay un disco que te gusta en que Rubin ha tenido un papel importante. Y se sienta casi cada semana con personajes del mundo de la música (y más) para hablar largo y tendido sobre sus procesos creativos. Yo me enganché con el episodio del productor Jimmy Iovine, pero también tenéis a Trent Reznor, Rosalía (en 2023), la diseñadora Paula Scher, Nick Cave, Terry Gilliam, Edward Norton, el arquitecto Bjarke Ingels, Francis Ford Coppola… (de nuevo: me dejo unos cuantos nombres importantes). Advertencia: de vez en cuando también entrevista a tecnobrós y personajes esotéricos. Calificación obm: 9,5 (si pasamos de tecnobrós y esoterismo).

Es la hora de las tortas (34 horas). Va de cómics. Cuatro señores se juntan semanalmente para hablar de tebeos (de los de superhéroes, pero también de lo que hemos venido a llamar novelas gráficas), con formatos (de podcast) diferentes. Yo recomendaría, sobre todo, sus repasos a los premios Eisner a lo largo de la historia. El episodio que le dedicaron a Darwyn Cooke, de lagrimita. Como uno es bastante limitado en su conocimiento comiquil, solo escucho la mitad de los episodios, más o menos. Su «club de lectura» me ha hecho descubrir alguna joya, por cierto. Calificación obm: 8,5 sobre 10.

Radiolab (32 horas). Quizás el podcast que hizo que hablemos de podcasts. No inventó las narrativas para la radio, pero las llevó un paso (o dos) adelante. Más de veinte años en antena y en RSS. Divulgación científica, pero no solo eso. Cultura. Y la garantía de que el guion y la producción son excelentes siempre. Calificación obm: 9 sobre 10.

The Ringer-Verse (26 horas). Cultura nerd de la factoría de Bill Simmons en formato «amigotes que se van de birras». Pelis y series, cómics, videojuegos. Servidor les escucha cuando hablan de cosas que ha leído, visto o escuchado. Calificación obm: 8,5 sobre 10.

Video Game History Hour (23 horas). El podcast de la Video Game History Foundation. Para no perdérselo si te interesa la historia de los videojuegos desde sus orígenes a la actualidad, pero también si te interesa la historia de la tecnología en general, o incluso cómo conservar y documentar la cultura de los últimos cincuenta o sesenta años. Y, en ese caso, recomendable comenzar a escucharlos desde el principio. Calificación obm: 8,5 sobre 10.

A History of Rock Music in 500 Songs (22 horas (y más de 200 en total para las 182 canciones que lleva de momento)). Exactamente lo que dice el título. Proyecto monumental de un über-nerd que se documenta hasta el infinito y más allá. Cada canción da pie a hablar del grupo que la llevó a la fama, de cómo impactó en la evolución de la música de la época y de lo que pasaba entonces en el mundo del rock. Calificación obm: 9 sobre 10.

X-Ray Vision (18 horas). Véase lo dicho sobre Ringer-Verse. Con un pa de nerds muy considerables, Jason Concepcion (ex del equipo de Bill Simmons) y Rosie Knight (periodista y guionista). Cuando hablan de cosas que he visto o leído, me gustan más que el equipo Ringer-Verse… pero eso pasa menos de lo que yo querría (y de aquí que el contador de horas esté más bajo). Advertencia: forman parte de una empresa de podcasts que mete publicidad en cantidades industriales (como la que se pone en las radios comerciales, vaya). Calificación obm: 9 sobre 10.

The Rewatchables (16 horas). Tercer (y último, que ya acabamos) podcast de la factoría Bill Simmons. Dedicado a películas «re-mirables», con predilección por los ochenta y los noventa. Como Ringer-Verse, formato charla de amigotes con unas cañas de por medio, pero a ritmo más relajado. Nivel de documentación de alto a muy alto: seguro que te encuentras con cosas que no sabías. Para ir escuchando aquellas pelis que has visto, o para animarte a ver algunas de las que tocan y no viste en su momento. Calificación: 9 sobre 10.

Marea Nocturna (14 horas). El crac Jordi Sánchez-Navarro se junta con otros otros tres individuos con conocimiento enciclopédico del cine fantástico y de terror (también hablan de ciencia ficción, pero poco para lo que yo querría). Uno no es ni de fantástico ni de terror, pero siempre tocan temas interesantes y engancha. Calificación obm: 9 sobre 10.

Tape Notes (13 horas). Otro descubrimiento reciente (de agosto). Aun estoy recuperando episodios de 2022, que llevan funcionando desde el 17. Otro podcast de documentar procesos creativos, especializado exclusivamente en la producción musical. Se sientan con una banda y su productor, y a explicar batallitas. O eres mucho más nerd del tema que yo, o lo mejor es seleccionar las bandas que te interesen. Han pasado por allí Wolf Alice, Bombay Bicycle Club, Kate Tempest, Floating Points, Tune-Yards, DJ Shadow, Caribou… (he dejado de apuntar en el episodio 42, y llevan 171: seguro que hay algún grupo que te llama). Calificación obm: 9 sobre 10.


Pues nada, ni tres mil palabras 😬. Os pediría que me recomendarais más podcasts, pero ya veis que estamos en el nivel en que un podcast más es una derrota. Una derrota maravillosa, pero una derrota. Va: si me estoy perdiendo algo, dejad vuestra recomendación en los comentarios, y ya veré cómo me lo hago.

Dentro de otros catorce años, más. O igual me animo y me vuelvo a poner dentro de siete.


  1. ¿Qué reproductor de podcasts? Servidor tira de Podcast Addict (el nombre de la app es adecuado, reconoceréis), pero creo que «lo que se lleva ahora» es Pocket Casts. Yo me quedo en Addict porque me compré la licencia «premium forever» hace un millón de años y porque las estadísticas de ese millón de años están escondidas ahí dentro. ↩︎

2025-12-25

“Goering” – Roger Manvell y Heinrich Fraenkel (La Página Definitiva)

El “moderado” del Régimen.

2025-12-22

Los algoritmos de Meta y el «engagement» barato (otro blog más)

Cosas que pasan en el fediverso…

Servidor abandonó X/Twitter hace ya algún tiempo. La cuenta sigue ahí, pero entro muy, muy esporádicamente y suele ser casi exclusivamente para leer algún tuit cuyo enlace me han pasado, comprobar que tengo muy pocas notificaciones y mensajes (0, las más de las veces) y largarme sin llegar a hacer scroll. Vamos, el típico turn on, tune in, cop out (una canción más rescatada del olvido por un anuncio de Levi’s).

Perdón, que me pierdo por mis tangentes1. La [primera parte de la] cuestión es que al irme de Twitter me abrí cuentas en Mastodon y en Bluesky, que son las que uso habitualmente, pero también me hice la de Threads cuando surgió la oportunidad, claro, porque no soy yo capaz de no abrirme cuentas en toda red de microblogging que se abra por ahí. Abandonadita la tengo, pero a veces uso openvibe para postear2 a las tres redes a la vez sin volverme [más] loco [de lo que estoy]… y Threads sigue luego olvidada en algún recóndito lugar de mi cabeza.

Siguiendo con el tema, ayer andaba yo por la calle con un poco de sed, entré en el típico minisúper (de bandera nacional, por cierto, antes de que nadie se meta con un inmigrante) y me encontré con que la botella de medio litro era más cara que la de litro y medio. Y, as you do, tuitée3.

el estado actual del capitalismo, explicado con dos botellas de agua

César Córcoles (@cesar.corcoles.net) 2025-12-21T19:05:30.092167Z

(El incrustado es al tuit en Bluesky porque WordPress lo ha incrustado «a pelo», y no ha hecho lo propio con el de Mastodon, pero yo soy más de esta última.)

Y comprobé cómo ni en Mastodon (186 followers) ni en Bluesky (192) el tuit tenía ni el más mínimo eco. Pero hace un rato me han dicho por el pinganillo que en Threads (menos de doscientos seguidores podrían parecer pocos (y lo son), pero en la red de Zuckerberg… no llego ni a cincuenta)….

Que dices, 215 «me gusta» y 16 comentarios, con 46 seguidores y un triste retuit… ¿qué se ha fumado exactamente el algoritmo? Y le das al «view activity», y…

CIENTO CUARENTA Y UNA MIL CUARENTA Y DOS VISUALIZACIONES. La cosa merece negritas, mayúsculas, y no he sacado el «fosforito» porque la entrada ya se está alargando más que en exceso.

Y me voy a permitir, con un acienticismo extremo, tomarme el número, y su comparación con los de las otras redes, como evidencia para alucinar con el algoritmo de Meta para Threads y su búsqueda del grial engagement a cualquier precio. No me extraña la cuenta de explotación de la compañía… pero me parece un poco, o un mucho, espantoso.

(Y, si usáis Threads, saltad al «following«, y no os quedéis en el «for you«, hostia ya.)


  1. No os quejéis, que podría ser peor. Podríais ser yo. El individuo que después de esos dos vídeos ha tenido que ver también ese otro, de 1995, después de que el anuncio recuperase el temazo del olvido, y se ha conseguido despegar de la canción por los pelos. Bendito Norman Cook (especialmente en Freak Power, por mucho que los Housemartins y Fatboy Slim también lo molasen todo). ↩︎
  2. La RAE admite loguearse, pero no postear (hay un postear en su diccionario, pero no este). Dónde. Iremos. A parar. (Es posible que algún día consiga acabar esta entrada que, en el fondo (y en la superficie), no llega ni a anécdota, pero no contenga la respiración la lectora, por si acaso. De momento, ya llevamos más de ciento setenta y cinco palabras sin haber contado absolutamente nada. ) ↩︎
  3. Si Meloncete renunció a la marca Twitter (bueno, lo hizo en su momento, pero ahora parece que no tanto), yo reclamo «tuitear» para «hacer entradas en microblogs», sí. ↩︎

2025-12-20

The Mixtape App (otro blog más)

Premio para quien reconozca (sin buscar) el disco del que sale la cara A de la carátula de la cinta de arriba a la izquierda. Pista: es parte de la banda sonora de una peli de 1997. Ayudita: si vas a hacer trampa y buscar, te resultará más fácil copiar y pegar del alt de la imagen. ¿Os he comentado que ya en los noventa tenía yo un excelente gusto musical? 😎

Estaba yo escuchando el The Rewatchables de Alta Fidelidad y en algún momento han comentado que una mixtape es mejor que una playlist. Y si bien no estaré de acuerdo en que sea mejor siempre… sí creo que las cintas tienen sus «hechos diferenciales» que, para según qué cosas, tienen su aquel. Desde el punto de vista de quien la recibe, si alguien te ha hecho una mixtape, sabes que le ha dedicado un tiempo considerable. Con la playlist… a lo mejor sí, a lo mejor no. Pero, sobre todo, las cintas de casete tienen una serie de affordances que, no nos engañemos, las condenaron a la muerte comercial, pero que también tienen sus puntos «positivos», desde el punto de vista de quien crea una mixtape, ligados a la atención que requieren:

  • La linealidad: navegar por una cinta se limita a darle al fast forward, a rebobinar, o a sacar la cinta y darle la vuelta.
  • La falta de información: las playlists (al menos las que son capaces de hacer ahora aplicaciones como Tidal o Spotify) tienen toda la información del mundo (qué canción estás escuchando, de quién es, de qué disco sale…). En una cinta, quien la escucha tiene la información que tú le has puesto en la caja. Y nada más.
  • La limitación temporal: una cinta de casete tiene dos caras de la misma duración y, si querías que sonaran razonablemente bien, esa duración era de como mucho treinta minutos.

Todo limitaciones… excepto que sea eso lo que pretendas.

(Off topic. Acabo de comprobar que WordPress no tiene por defecto bloque de listas de definición. Me parece fatal.)

Y se me ha ocurrido que hacer una «Mixtape App» tendría su aquel. Y no debería ser tan complicado hacer un prototipo (vibe-programando, incluso), pero la pereza me puede. (He invertido unos dos minutos buscando por ahí, pero no he encontrado lo que propongo. Si existe y lo encuentras, aquí abajo está el campo de comentarios 😇.)

Desde el punto de la creación, una mixtape es una playlist, con la única limitación de tener dos «caras» de treinta minutos (admitimos de cintas de 46, y si es estrictamente necesario, hasta de 90, va). Esa parte no tiene misterio. Pero el reproductor… el reproductor sería una cosa absolutamente esqueuomórfica, con una interfaz que alternaría entre un reproductor de cinta al más puro estilo eighties…

Foto con licencia Creative Commons de Kumar McMillan. ¡Flickr sigue ahí!

…o la caja de la cinta en concreto. El reproductor solo permitiría darle a los botones «de toda la vida», y no saltar a la siguiente/anterior canción. Si la playlist correspondiente a la cara en la que estamos de la cinta dura menos que la longitud establecida, reproduciríamos silencio (o una imitación del «silencio» de un reproductor de casete) hasta llegar al final de la cinta, en la que se dispararía el sonido de la cinta llegando al final. Si se quiere, se le puede poner auto reverse al reproductor, pero (como podréis imaginar a estas alturas 😅) servidor opina que eso es de blandos 😬. Bonus points: se podría configurar que el reproductor mostrara la posición en tiempo dentro de la cinta… pero servidor preferiría que el contador solo mostrara el número de revoluciones que se han dado (y el reproductor mostraría cómo giran las ruedas del reproductor, y cómo la cinta va pasando de la rueda izquierda a la derecha, evidentemente).

Y en la cinta… aparecería la información que desease quien la hubiese creado. Si nos queremos rebajar, hasta podríamos hacer que, en el caso de haber incluido el listado de canciones, se destacase la canción que está sonando.

Me dejaba: podríamos hacer que la playlist se convierta en mixtape instantáneamente… pero también la podríamos construir de verdad: seleccionamos la canción, y tenemos que oírla completa antes de añadir la siguiente canción. Y la app certificaría que la cinta se ha construido comme il faut.

Idealmente, la app funcionaría sobre las APIs y SDKs de Tidal, Spotify y demás: tú le pasas un enlace a la «víctima», esta se loguina1 con su app de estrímin favorita (las playlists/mixtapes serán universales, y la interfaz de creación te avisaría si alguna pista no estuviese disponible en alguna plataforma). y adelante que nos vamos…

¿Qué? ¿Guay? ¿Desquiciante? ¿La nostalgia es maravillosa, un fallo de nuestra memoria colectiva, o todas las anteriores? Y… ¿alguien lo suficientemente loco como para animarse?


  1. Justo acaba de añadir la RAE a su diccionario «loguearse«… cuando todo el mundo sabe que lo ideal es «loguinarse». Si es que… ↩︎

2025-12-15

De enlaces muertos (otro blog más)

Hace unos días (semanas, ya) decidí instalarme en este WordPress el Internet Archive Wayback Machine Link Fixer de (como su propio nombre indica, sí) el Internet Archive. Dice la página del plug-in que sus principales funcionalidades son:

  • Escanear automáticamente los enlaces salientes de las entradas
  • Comprobar si hay archivo en la Wayback Machine
  • Archivar, si no lo hubiese
  • Redirigir los enlaces rotos o desaparecidos a los archivos
  • Archivar tus propias entradas y actualizaciones

Todo esto con el obvio objetivo de contribuir a la fiabiliadad a largo plazo del contenido en la web.

En primer lugar, toca felicitar a WordPress y al Archive por la iniciativa, claro (yo hace un tiempo que me instalé el plug in del Archive para Firefox con el objetivo principal de ir archivando a mano las entradas de obm, pero se agradece que te automaticen :-)).

En segundo, animaros a los que tengáis un blog con WordPress a instalaros el plug-in: por los menos de cinco minutos que cuesta configurarlo (hay que obtener una «API Key» (gratuita) del Internet Archive, y es por eso que se tarda algo más) consigues archivar automáticamente todo tu contenido y contribuir al archivado de aquellas páginas que enlazas y que se le podrían haber escapado al bot del Archive.

Y, finalmente, como corresponde a la manía catalogadora de esta casa, toca pasar lista. ¿Cuántos enlaces diríais que hemos lanzado en los tropecientos años que lleva obm funcionando? ¿Mil? ¿Diez mil? ¿Cien mil? Pues nada más y nada menos que trece mil cincuenta y dos (cincuenta y tres o cincuenta y cuatro, diría, una vez que se publique esta entrada O:-)). Se dice pronto, ¿eh? Diez mil doscientos de ellos, por cierto, ya están archivados correctamente (el resto no se han podido archivar, bien porque murieron antes de que se pudieran archivar, bien porque no permiten el archivado, por los motivos que sean). Y, de esos trece mil enlaces, ¿qué porcentaje diríais que se ha roto? Tened en cuenta que el blog lleva en funcionamiento más de veinte años (dios, qué viejo soy). ¿Un 1%? ¿Un 10%? ¿Un 20%? Pues nada más y nada menos que 1301 enlaces o, casi exactamente, el 10%. ¿Y cuántos diríais que se han podido redirigir (con esfuerzo ε/2 por mi parte) a su correspondiente archivo? Los 1301 :-) (confieso que me he creído los números del panel de control y que no he hecho el esfuerzo de investigar más). Si eso no es una recomendación para usar el plug-in (y pasarse por el Archive y hacer una pequeña donación), yo ya no sé…

2025-12-08

The Pitt (HBO, 2025) (La Página Definitiva)

La mejor gente.

Redirigir mis energías mentales (Adrián Perales)

He reflexionado varias veces en este blog sobre dos hechos que me definen bastante: la pulsión entre mis facetas de aficionado a internet y culturera, y el hecho de que ya no soy un chaval que pueda hacer muchas cosas a la vez como cuando estudiaba.

Este curso, después de muchos, considero que tengo tiempo libre que puedo dedicar a mis aficiones. Sin embargo, considero que no dedico el tiempo suficiente a cuestiones que me hacen feliz, o no del todo.

Dedico esfuerzo a varios temas:

  • El trabajo se lleva buena parte de mi tiempo. Al final muchos días estoy las seis horas de clase en el instituto y, cuando no, dedico tiempo en casa a preparar clases (bien) o corregir (fatal, porque me cuesta mucho trabajo ponerme y voy más lento por el problema de vista).
  • El ejercicio ya forma parte de mi rutina. Es una necesidad de mi cuerpo (treinta años de sedentarismo hacen que mi hombro derecho se haya resentido) pero también de mi mente (cuando estoy mucho tiempo sin hacer ejercicio lo noto en los ánimos).
  • Radio Al compás. El pódcast de divulgación carnavalesca me da muchas alegrías, así que cada mes le dedico un trocito de mi tiempo y energías.
  • Todo lo demás.

Y ahí viene la pregunta. ¿Qué es ese «todo lo demás»? El tiempo que me queda tras el trabajo y el ejercicio, que son mi absoluta priroidad, ¿a qué lo dedico?

He reflexionado aquí sobre las distracciones, y de verdad considero que las mías (pódcast, leer artículos de blogs, ver vídeos de YouTube sobre divulgación de videojuegos o política, escribir en este blog o estar en el fediverso) son de las sanas. Pero al final ahora mismo dispongo de bastante tiempo libre, y aunque estas ocupaciones me gustan, no me hacen feliz.

Lo que me hace feliz es la cultura. El cine, las series, la música, la lectura, incluso los videojuegos (aunque estos son más demanantes y los toco incluso menos).

Ya no tengo tantos tiempos muertos como antes porque el trabajo lo tengo muy cerquita. Pero aun así, cuando entreno o mientras me preparo sigo dedicando tiempo a esas ocupaciones que no me hacen del todo feliz.

Y ahí es donde entra la reflexión de hoy. Quiero redirigir mi energía mental a aficiones que me llenan de verdad y ponerme un freno mental cuando dedique demasiado tiempo a otras cuestiones.

Estas últimas semanas, cuando tenía el cerebro frito por tanto trabajo, me he puesto series que ya he visto mil veces. Y me he fijado en otros detalles, o he repensado la historia. Entre unas y otras, he visto alguna serie nueva (Adolescencia, la segunda temporada de Miércoles o de Gen V). Y me gusta.

Pero sigo dedicando demasiado tiempo a YouTube o a pódcast que, muchas veces, crean este estado de ánimo latente de que todo va fatal y no puedo hacer nada por cambiarlo.

Si mis energías van destinadas a las cuatro cosas enunciadas anteriormente, quiero que ese «todo lo demás» sea cultura que me llene. Y tengo que hacer un esfuerzo activo por lograrlo. Mientras me preparo para ir a trabajar o entreno, en lugar de un pódcast o un vídeo de YouTube, un disco de música de los tantos que no he escuchado. O un audiolibro. Mientras preparo clases, en lugar de poner de fondo actualidad política, música lo-fi o una serie que ya haya visto y no me requiera atención. Y cuando termino, una serie o película, ya sea nueva o repetida.

Jamás diré que con los pódcast o YouTube he perdido el tiempo, porque no es así. Pero sí son estímulos rápidos, más fáciles de procesar, y al echar la vista atrás ahora que el año acaba, destaco muy poquito a nivel cultural. Quiero cambiar eso. Por ejemplo, este 2025 he leído muy poco y es algo que me pone triste.

No voy a decir, como otras veces, que me voy de redes, que lo dejo todo, porque me conozco demasiado bien y quien me lee desde hace tiempo también me conoce. Voy por fases, soy una persona variable y tampoco quiero desoír a mi cuerpo.

Pero sí creo que este curso tengo las circunstancias propicias para lograr este objetivo que lleva tanto tiempo en mi mente. Derivar más hacia esa parte cultural demasiado abandonada en mí, incluso dedicar tiempo a un relato que lleva años empezado. Y si para ello tengo que dejar (o reducir mucho) los pódcast, los RSS, YouTube o incluso el fediverso, ahora sí que sí, estoy dispuesto.

¿Cuánto tiempo me durará esta vez el propósito? Hagan sus apuestas.

2025-12-05

Byte, noviembre del 85 (otro blog más)

¡Voy tarde! Es diciembre y en la portada de Byte dice que aún es noviembre (sí, de 1985, claro). Anyway, vamos allá, de urgencia, con el repaso a la revista

Y comenzamos con el que sigue siendo el tema, en 2025, de revistas de informática, entradas de blogs y vídeos de YouTube a tutiplén: utilidades de dominio público:

Cuarenta años más tarde seguimos igual de locos por obtener utilidades gratuitas y seguimos teniendo que explicar que «gratis» no necesariamente es «malo». Es curioso, eso sí, comprobar que en 1985 había que explicar que muchas de las utilidades venían con su código fuente («código abierto» se puso de moda a finales de los noventa, dice la Wikipedia). Y a uno le entran sudores fríos pensando en descargarse software de BBS a través de los módems de la época (por mucho que los programas pesaran entonces una miseria al comparalos con los actuales).

Si hacéis click en la página y seguís leyendo encontraréis utilidades de disco, de memoria, de estatus del sistema, de ayuda para el uso del teclado, de manipulación de texto y de archivos, de control de pantalla, pequeñas aplicaciones, utilidades de impresión, software de comunicaciones o lenguajes de programación (Forth, LISP, Logo). Lo de siempre: hemos cambiado, en cuarenta años, pero no tanto como uno podría imaginar.

Creo que llevábamos un tiempo sin fijarnos en la publicidad:

Diez megas en 8 minutos son algo más de 20 kilobytes por segundo (mi conexión de fibra da fácilmente 50 megabytes por segundo, o bastante más de 20 gigas en 8 minutos, y los puertos USB 3 llegan a los 500 megabytes por segundo) por apenas 180 dólares de la época (460 euros de hoy). Quejaos de que el pen USB os va lento y es caro, va… Y si seguimos con el tema, podemos repasar las velocidades de los discos de la época en general:

¿Lo más rápido de la época? 300 kilobytes por segundo. Y ni siquiera me siento viejo recordándolo… ¿Que a qué precio salían, decís?

Sí. Menos de mil dólares (más de dos mil quinientos de hoy con la inflación) es «inexpensive». ¿Por qué capacidades? 800 dólares te dan un disco externo (súper llevable: 19 por 42 por 9 centímetros, más o menos; no me atrevo a consultar el peso) de diez megas y que «solo» hace falta encender 30 segundos antes que el ordenador (lo juro, haced clic en la imagen, pasad página y leed). Uno de los internos, el SyQuest (compañía que duraría hasta su bancarrota en 1998), llega a la barbaridad de 30 megabytes #madreDelAmorHermoso. Y si hay que economizar, tenéis el Rodime, que os da 10 megas por apenas 500 dólares. Me los quitan de las manos. Bendita ley de Moore (y familia).

¿Otra cosa que no es exactamente reciente? Dame un problema, no importa qué problema, y alguien te lo resolverá con una hoja de cálculo:

Diseño de circuitos electrónicos con Lotus 1-2-3. En serio. No es una inocentada. O sí, pero suprema.

Y recupero mi tema fetiche, «cosas que ni en broma se publicarían hoy en día en una revista generalista»:

La criba de Erastótenes, amigas y amigos. Que, por cierto, no es un algoritmo especialmente complicado de entender (dejamos como ejercicio para la lectora girar la página e intentar entender el código en BASIC de la siguiente página :-)). Ahora me han enrado ganas de comprobar cuánta RAM consume el programita en Python que genera ChatGPT en menos tiempo del que necesitarías para teclear las tres primeras líneas del programa propuesto en la revista… pero no las suficientes como para hacerlo de verdad O:-).

Y para cerrar… la multitarea:

Y es que, en 1985, que un ordenador personal fuese capaz de ejecutar múltiples programas en paralelo no era exactamente trivial. Tanto no lo era que no resultaba descabellado cobrar 150 dólares por el programa para hacerlo. Aunque te redujese un 75% el rendimiento del software (cosa que solo ibas a notar cuando ejecutases programas intensivos en cálculo, claro, pero eras tú quien tenía que pensar en ello) o se te comiese buena parte de la RAM del ordenador.

Por cierto: las interfaces «de ventanas» de la época no tenían precio (aunque, de hecho, hoy se están poniendo los programas «TUI», en un maravilloso retorno al pasado :-)).

En fin, lo dejamos aquí, que vamos tarde. El mes que viene Dentro de unos días (seguramente semanas), más.

Como de costumbre, tenéis los archivos de la revista Byte en archive.org, y si queréis, podéis ir avanzando trabajo con el número de diciembre.

2025-12-04

Everything is an AI remix (otro blog más)

Llevaba yo tiempo (meses) con una pestaña del navegador abierta en la última versión de ese maravilloso vídeo que es el Everything is a remix…

…con la intención de buscarle la relectura «en tiempos de IA generativa». Y resulta ser que en el último enlace del #67 de Interaccions, la maravillosa newsletter de Sergi Muñoz Contreras, este me descubre que, de hecho, esa relectura ya se la ha hecho su propio autor, Kirby Ferguson. Y después de verla, opino que es de lo mejor que se ha dicho sobre el tema (y es que en muchísimas ocasiones, incluso cuando el discurso se alinea con mis ideas, me parece que la capacidad de argumentación es escasa).

Mi recomendación es que, aunque vieseis alguna de las múltiples versiones del Everything en su momento, la reveáis ahora con calma antes de ver el segundo vídeo.

Y solo añadiré que, siendo uno muy, muy fan del Everything, y estando bastante de acuerdo (pero no del todo) con la relectura, creo que se salta lo que yo llamo «el problema del aprendiz» (que seguro que tiene un nombre mejor): pareciéndome determinados (muchos, incluso, potencialmente) usos de la IA como herramienta (como los propuestos en AI is remixing, por ejemplo) lícitos (estoy obviando los charcos tamaño océano de la sostenibilidad y del respeto a la propiedad intelectual, ciertamente), la IA es un arma de destrucción masiva del proceso de aprendizaje que convierte al aprendiz en maestro, y que eso es algo que me aterra. Creo que lo resolveremos algún día. Pero me aterra.

2025-11-20

La Europa de las Cinco Naciones – Luis Suarez Fernández (La Página Definitiva)

Spiderman es universal, pero Dios es español porque no puede ser otra cosa

Un poco o un mucho de asexual (Adrián Perales)

Esta entrada lleva mucho tiempo apuntada y he intentado varias veces afrontar su escritura, sin éxito. Así que, para darle salida a esta idea que quiero compartir, me limitaré a enumerar diferentes razones por las que me considero asexual.

Lo primero es que la asexualidad es un espectro. No quiere decir que no haya ningún tipo de atracción sexual, puede darse en cierto grado o bajo ciertas circunstancias. Conocer esto fue una de las razones por las que empecé a pensar en el asunto.

Desde siempre me ha incomodado muchísimo hablar de sexo, un tema relativamente habitual en ciertas etapas de mi vida. Cuando todo mi entorno estaba con las hormonas alborotadas, yo era totalmente indiferente al tema. He tenido amigos que no podían estar mucho tiempo sin una pareja sexual, algo que jamás me ha ocurrido.

Dentro del espectro asexual hay varias etiquetas específicas. Conozco al menos demisexual, gris asexual y aegosexual. Pero ni he invertido tanto tiempo en comprenderlas a fondo ni es un tema que me interese demasiado. Con saber que tengo un poco o un mucho de asexual para mí es suficiente.

Al final, conocer una etiqueta de este estilo sirve para ponerle nombre a una forma de sentir y explicar por qué venía toda esa incomodidad cuando se hablaba de sexo o mi poca atracción cuando estaba todo el mundo disparatado.

Podría contar otros detalles pero son más privados e, insisto, me incomoda hablar se sexualidad, así que dejo el tema aquí. No sé si soy un poco o un mucho asexual, pero seguro que estoy dentro de ese espectro. Con saberlo me basta.

2025-11-15

Chilenische Präsidentschaftswahlen 2025: matar o morir (La Página Definitiva)

Históricamente, los catalanes siempre han tenido gran influencia en la vida política chilena. Estuvo Jofre, el primer alcalde-gobernador de Santiago; […]

2025-11-13

¿Está tan mal la educación actual? (Adrián Perales)

Cuando pensamos en la educación de nuestros jóvenes parece que todo está fatal. Vamos a darle una vueltecita al asunto.

Sí...

La situación es verdaderamente complicada. Solo pensando un poco tengo una metralleta de razones para decir que la educación está tan mal como solemos pensar. Faltan medios materiales, falta personal, tanto docente como específico; se cierran líneas para ahorrar sueldos en lugar de aprovechar los espacios para hacer grupos más pequeños, los currículos siguen siendo enciclopédicos, la autoridad docente está en entredicho (siendo amables)... y así podría estar un buen rato.

Por otro lado, siempre que hay un mínimo debate público sobre algún tema que afecte a los docentes sale a la palestra muchísima gente que compara la educación actual con lo que había antiguamente. Cuántas veces habremos leído eso de «en mi clase éramos cuarenta, se respetaba al profesor y estudiábamos todos».

...pero

La enumeración que hice en el primer punto es incontestable (o al menos, creo que nadie mínimamente involucrado en la educación puede contestarla), pero esta comparación con el pasado sí me parece muy tramposa. Empiezo por ahí.

Claro, las clases antiguamente eran de cuarenta alumnos y se mantenía el respeto porque el profesor tenía la potestad de castigar físicamente al alumnado díscolo. Que el profesorado ya no pegue lo podemos considerar un avance, ¿verdad?

Por otro lado, este modelo de escuela que mucha gente parece extrañar era excluyente. Quien no podía seguir el ritmo, pues no estudiaba y ya está. Solo hace falta un poco de memoria o unas búsquedas para recordar cómo estaba la juventud en los ochenta y los noventa. Se habla de «generación perdida». La escolarización obligatoria, con todos sus problemas, hizo que la situación de la juventud mejorara muchísimo.

Además, esta imagen presenta una vuelta al pasado que adultos de mi generación ya no hemos vivido. Yo salí del instituto en 2007. En mi grupo de 2.o de ESO había bastantes delincuentes juveniles y en mi 2.o de bachillerato el comportamiento no se puede decir que fuera ideal. Hablamos de casi veinte años atrás.

Habrá quien pueda argumentar que todos los problemas vinieron con la LOGSE. Yo fui de las primeras generaciones en recibir una educación bajo dicha reforma y tengo una manera de afrontar mi vida y mis clases difrerentes a generaciones anteriores, estará en cada quién valorar si mejores o peores.

El sistema actual es inclusivo. Aunque con dificultad, se intenta atender a todo el alumnado, se realizan pruebas de diagnóstico para detectar tanto dificultades como altas capacidades y adaptar la práctica docente a las características concretas de cada grupo. Y si tuviéramos menos alumnado por grupo, esta atención sería incluso más individualizada.

Llevo doce cursos como docente y en cada curso veo profesores que no deberían estar de cara al alumnado. Esto no debería ser así y sé que una mala experiencia con un docente marca mucho a un joven. Pero son los mínimos. Lo que encuentro en una amplia mayoría es a personas dispuestas a dedicar cuanto tiempo sea necesario para mejorar el aprendizaje de su alumnado y atender a las familias en caso de ser tutor (una labor, dicho sea de paso, muy mal retribuida).

Una vez escuché, diría que en el pódcast de Lynx, que en el instituto todo el mundo lo pasa mal por recibir bullying, y si no lo pasaste mal es porque tú eras el bully. Y aunque sé que una máxima así tiene su buena dosis de razón, en mi experiencia los docentes estamos muy pendientes de cualquier señal para cortar la situación de raíz en cuanto notemos lo más mínimo.

Yo he tenido conversaciones con mi alumnado que jamás hubiera podido tener con mis profesores. El lado humano también hay que valorarlo.

En conclusión

La mayoría de problemas de la educación son principalmente estructurales, y como sociedad deberíamos luchar mucho más fuerte por solucionarlos. Pero, mientras tanto, deberíamos ser capaces de ver lo bueno.

Soy consciente de que este texto radica totalmente en mi experiencia personal como docente de la pública en cierto entorno. Son doce cursos, pueden ser muchos o muy pocos para cada quién. Pero me parece injusto valorar la educación como un sistema totalmente roto cuando tantísimos profesionales hacen su papel lo mejor que pueden para mejorar ni que sea un poquito la educación y el bienestar de su alumnado.

Así que, si me preguntan a mí, sí, la educación está mal. Pero no tan mal.

2025-11-06

Sobre autoexigencia y soltar lastre (Adrián Perales)

Ya no soy ese jovencito con ganas de hacer muchas cosas a la vez, y eso no tiene por qué ser necesariamente malo. Bajar esa autoexigencia supone soltar lastre y renunciar a ciertos proyectos e ideas.

El pasado

Cuando era más joven podía ir a clase, dedicar tiempo a trabajos o estudio por las tardes, jugar videojuegos, hacer imágenes por puro ocio, participar en foros y un larguísimo etcétera.

Cuando empecé a trabajar todo esto cambió por razones obvias. Ya las clases no eran un ejercicio casi pasivo sino que era yo quien debía impartirlas, y eso me obligó a centrarme mucho en ello durante mucho tiempo, junto con todas las exigencias de la docencia. Incluso siendo consciente de ello, siempre me ha rondado la culpa por no hacer más, por ya no ser capaz de abarcar tanto como hace unos años.

Este es otro tema en el que la baja de 2024 me permitió pensar con detenimiento y llegar a varias conclusiones. La más importante: debía soltar lastre.

Proyectos académicos

Una de las ambiciones que tenía era seguir estudiando. Hacer otra carrera, doctorarme, hacer otro máster o lo que fuera. Fui a la universidad a preguntar por el doctorado y me dijeron que, por ser trabajador y discapacitado, disponía de nueve años.

Y ahí fue cuando me entró el vértigo. ¿De verdad me merece la pena dedicar años de mi vida (no necesariamente nueve, pero varios) para conseguir un papelote (perdón por la simplificación) que, a efectos prácticos, no me sirve para nada?

La respuesta fue muy rápida y muy clara. No. Yo ya estoy en una posición con la que me siento cómodo, impartiendo mis clases y, en la medida de lo posible, dedicando tiempo a mi ocio. No tengo necesidad real ni de un doctorado ni de conseguir otra titulación.

Una vez en este punto me paré a analizar el porqué de esta ambición. A mí me gusta investigar y escribir sobre esas investigaciones, me gustaba hacer trabajos académicos con su bibliografía y su lenguaje académico. Todo eso lo dejé de lago cuando empecé a trabajar, más allá de algún tímido acercamiento en este blog.

Precisamente ahí estaba la respuesta. Si quiero escribir en profundidad sobre algún tema, tengo este blog o lo puedo mover sin necesidad de estar matriculado en ninguna parte. Y si quiero investigar sobre algún tema (filosofía, periodismo, pedagogía) tengo montones de libros y artículos para informarme a mi ritmo sin atarme a exámenes, trabajos y fechas de entrega.

El afán por investigar y aprender siempre estará ahí. Al final soy una persona inquieta en lo intelectual. Tengo la suerte de vivir en un momento donde hay muchísimo conocimiento muy accesible y la formación para distinguir qué es bueno y qué me interesa. No necesito matrículas, no necesito plazos de entrega. Puedo ir a mi ritmo.

Proyectos online

Quise hablar de historia de literatura. Quise hablar sobre temas que atraigan a adolescentes. Quise hacer muchísimos proyectos más.

De nuevo, las circunstancias me han llevado a una conclusión parecida a la del apartado anterior. No tengo necesidad ni las circunstancias (propias y ajenas) me son propicias.

Al final soy un pequeño creador (si se me permite el calificativo) que tiene un blog personal y un pódcast sobre carnaval de Cádiz que grabo con un amigo. ¿Tengo necesidad de más?

Inquietud, sí. Necesidad, no.

Más allá de otros proyectos, en más de una ocasión me he sentido mal por no actualizar el pódcast personal, Divagaciones, o por no mantener una periodicidad fija en este blog.

Todo esto tiene que ver con una autoexigencia aprendida que no lleva a nada. Igual que no me beneficio de tener un doctorado, no me beneficio de dedicar más tiempo a proyectos online. Jamás tuve interés en ganar dinero con mis proyectos de la red, lo cual me permite no establecer ningún tipo de deuda con mis lectores u oyentes. Quien lee este blog o escucha mi pódcast sabe que son proyectos personales de alguien muy variable. ¿Por qué obligarme más?

Por supuesto, sé que aportaría mi granito de arena si iniciara un proyecto online más serio, pero llevarlos a buen puerto requiere un compromiso que ahora mismo no me conviene.

Por lo tanto, también he aprendido a deshacerme de esas inquietudes. Si en algún momento me apetece escribir sobre un tema, lo hago en este blog y no pienso en iniciar un proyecto nuevo. Y si lo inicio, lo haré con las exigencias muy medidas.

Autoexigencia aprendida

Quienes han vivido el mismo internet que yo (me gusta decir «quienes nos hemos criado con el mismo internet») saben lo mucho que nos han machacado con conceptos como la marca personal, el emprendimiento y la productividad. Hay que ser productivo incluso en el tiempo libre y dedicarlo a proyectos personajes que nos hagan crecer.

Pues ya no más. Si tan solo puedo dedicar mi tiempo libre a mirar al techo o tener de fondo una película que he visto mil veces porque mi cerebro no da más de sí, no pienso sentirme mal. Si este blog está un mes sin actualizar, no pienso sentirme mal. Si tengo que decirle a mi amigo que necesito parar Radio Al compás, como ya ocurrió, no pienso sentirme mal.

No pienso sentirme mal por todo aquello que no haré y que, en esta página de mi vida, no tengo necesidad de hacer.

Ya soy un adulto con suficientes preocupaciones y exigencias externas, incluso estando soltero y viviendo solo. No pienso dejar que una autoexigencia aprendida y que en realidad no tienen nada que ver conmigo me amarguen la vida más de lo estrictamente necesario.

Conclusión

Esto no quiere decir que jamás vaya a matricularme en nada más, o que jamás vaya a iniciar otro proyecto online. Soy una persona variable e inquieta y cada vez huyo más de sentencias grandilocuentes. Lo que tenga que venir vendrá. Lo que sí tengo claro es que haré un esfuerzo activo para que esa autoexigencia aprendida no sea lo que me marque el camino a seguir.

Por supuesto que tengo ideas para proyectos, por supuesto que me encantaría tener otro título, por supuesto que me gustaría leer más, ver más cine y series, jugar más videojuegos, por supuesto que me encantaría escribir un libro o publicar más en este blog. Pero mis circunstancias son las que son y mi vida es la que es, no pienso fustigarme por no hacer más de lo que me permita el momento vital en el que me encuentre.

Tengo una licenciatura en Filología Hispánica, un máster en Profesorado, un B1 de Inglés por Cambridge, once años de experiencia docente, escribo un blog personal y grabo un pódcast sobre carnaval. Como se dice en mi tierra, ¿qué más quiere, Cadi?

2025-10-30

Montar en bici (Adrián Perales)

Hace tiempo escribí unas confesiones que no interesan a nadie. Una de ellas era, precisamente, que no sé montar en bici, y esta entrada no es más que una divagación al respecto.

De pequeño tuve bicicleta. Una con ruedines. Pero nunca di el paso de quitarlos y montar en una bicicleta normal.

Con el tiempo he probado otros métodos de transporte. El patinete de los normales fue mi mayor éxito, diría. Usé patines y tampoco duró el intento. Muchos años después probé patinetes eléctricos, y en una de esas pruebas reventé un chaquetón de la caída que pegué y el derrape que di.

Porque el equilibrio es un tema. Incluso las veces que me he subido en una moto (no conduciendo, obviamente) he tenido la sensación de caerme.

Todo esto ocurre, en parte, porque tengo problemas de vista. Mi ojo dominante es el derecho y me ha costado muchas horas de ejercicio mejorar mi equilibrio.

Entonces, en el hipotético escenario de montar en bicicleta con mis treinta y seis años de edad, ocurrirían varias cosas. Lo primero es que me costaría un montón por esa falta de equilibrio natural en mí. Y lo segundo es que, en caso de usarla con relativa frecuencia, tampoco podría correr demasiado por el problema de vista. Me podría comer fácilmente una farola, un bordillo o peor, una persona. Y ni hablemos de la posibilidad de ir por carretera, ni la contemplo.

Así que, creo yo, esto de aprender a montar en bici será una espinita clavada porque, aunque alquilara una para no tener que gastar mucho en ello, no sería un método de transporte que usara demasiado. A la hora de la verdad y pensándolo fríamente, prefiero caminar a los sitios para tener total control sobre mi cuerpo y mi entorno.

O a lo mejor un día vengo aquí a contar que aprendí. Al menos, aprender a montar sin pegarme un tortazo, aunque no use la bicicleta de continuo. Lo veo complicado porque la vida me lleva por otros derroteros, pero el tiempo lo dirá.

2025-10-23

Internet alternativo y crecimiento (Adrián Perales)

A quienes estamos «fuera del sistema» en cuestiones de internet nos gustaría que más gente usara lo que nosotros. La razón fundamental es porque consideramos nuestro uso más consciente y más sano para cualquiera.

¿Más gente visitando y haciendo pequeñas webs personales en lugar de publicar contenidos en Instagram y TikTok, pesadillas de privacidad? ¿Más gente usando el fediverso en lugar de X o Facebook, pesadillas de privacidad? ¿Más gente usando XMPP en lugar de WhatsApp, pesadilla de privacidad? ¿¡Dónde hay que firmar!?

Sin embargo, debemos ser conscientes de dos problemas.

El primero es la mentalidad tras este pensamiento. Por más sanas y adecuadas que nos parezcan nuestras elecciones, pretender un crecimiento rápido y exponencial es lo que ha producido que ciertas tecnologías estén como están, principalmente porque ese crecimiento vino propiciado por grandes tecnológicas. Google metió mano en XMPP, por ejemplo. Le dio un empujón y, cuando se le quedó corto ese empujón se convirtió en una patada. Meta ha usado el protocolo ActivityPub en su código, pero a su rollo. Si queremos un crecimiento sano, no podemos esperar que ocurra de un día para otro, es una lógica que no deberíamos abrazar.

Y esto nos lleva al segundo problema. Un crecimiento rápido en estas tecnologías también supone un aumento de los recursos necesarios. Hay instancias relativamente pequeñas del fediverso que deben cerrar por la imposibilidad de asumir los costes. Claro, pensarán algunos, pero si más colectivos y personas ofrecen su espacio la cosa se diversifica y no se necesitan grandes instancias. Y es cierto, pero el problema sigue estando ahí. Son necesarios unos conocimientos, un tiempo y unos recursos. Aunque el modelo sea más sano, aguantar esa infraestructura tampoco es cosa sencilla.

En resumen, todos querríamos que los demás usaran tecnologías más sanas. Debemos tener cuidado de no caer en las mismas lógicas que nos han llevado hasta aquí pero con una base tecnológica diferente. Disfrutemos del camino mientras ese fin llega, si es que llega. Y aunque estaré encantado de que llegue, en lo particular no tengo ninguna prisa.

2025-10-16

Enseñar otra tecnología a los jóvenes (Adrián Perales)

Nuestra relación con la tecnología cambió mucho con la irrupción del smartphone, y creo que enseñar a los jóvenes ciertos conceptos básicos ya olvidado puede ser algo disruptivo y positivo de cara a la autonomía digital de próximas generaciones.

La situación

Puedo afirmar sin temor a equivocarme que los conceptos clásicos de la informática están totalmente superados a la hora de enseñarla a los jóvenes. Desde que el teléfono móvil se popularizara allá por 2011, el púbico en general ni siquiera necesita saber qué es un fichero o un directorio, la vida online se hace frente a una pantallita muy pequeña y se accede a ella mediante aplicaciones.

Para hacer diseños se puede usar Canva, Google Drive para guardar y almacenar documentos, aplicaciones para hacer vida social como TikTok, Instagram o WhatsApp se encargan ellas solitas de organizar las descargas, si las hay. Incluso aplicaciones de productividad como toma de notas vienen con su propio espacio y atan a los usuarios a un sistema concreto, nada de interoperatividad o portabilidad.

El usuario accede con una aplicación de su móvil y no tiene por qué preocuparse lo más mínimo de la organización o el almacenamiento. ¿Has acumulado mucho en tu cuenta de Google? No te preocupes, paga para obtener más espacio, pero no borres nada que no hace falta. O paga un precio absurdamente elevado por un teléfono móvil con más espacio.

Creo que es bastante paradigmático que en 2025 aún se escuche a gente quejarse de que se ha quedado sin espacio en el móvil. Cuando alguien con más conocimiento revisa ese teléfono lo más normal es que se eche las manos a la cabeza por la cantidad de aplicaciones instaladas, el espacio que ocupan o todo lo que tienen almacenado por descargar todo lo que le mandan por WhatsApp,

Recuerdo un día, y hace ya bastantes cursos, en que le dije a mi alumnado que abrieran un navegador de internet y entraran en tal dirección. Usaban la aplicación Google, que ni siquiera les llevaba directamente a la página sino (qué raro) hacía una búsqueda. Alguno ni siquiera tenía Chrome u otro navegador instalado en el teléfono.

Volver a lo básico

Dada esta situación que, insisto, puede suponer una menor autonomía personal en el uso de la tecnología, pienso que enseñar ciertos conceptos básicos puede ser algo revolucionario para ciertas personas con un mínimo de interés, en particular los jóvenes, que pueden estar algo más abiertos a estos temas.

Tu teléfono (especialmente en Android, pero también en iOS desde hace unas cuantas versiones aunque en menor medida) se compone de carpetas y ficheros. Puedes usar un gestor de archivos para ver todo lo que hay.

No tienes por qué usar aplicaciones para absolutamente todo. Si esta aplicación no es más que un acceso a una página web, ¿por qué no usar el navegador para acceder a esa página web? Y además tendrás más control.

Dentro de ese navegador puedes entrar a páginas web o blogs hechas por gente como tú, para compartir sus cosas. Puedes leerlas con un lector RSS, que recoge todo en un solo lugar, así no tienes que entrar en todos cada vez.

A lo mejor no te sientes cómodo publicando bailecitos tontos en TikTok o presumiendo en Instagram y prefieres algo más tranquilo, más tuyo. Puedes hacerte tú una web o un blog y pasarle la dirección a quien te interese que te lea.

Todo esto, claro, puede salpicarse con consejos sobre seguridad, advertir sobre el uso de las IA y todo aquello que se considere importante para, insisto, lograr una mayor autonomía tecnológica.

Conclusión

Yo soy profesor de Lengua y no tengo mucho espacio para hablar de estos temas, pero sí me he propuesto dedicar algún rato, al menos en tutoría, para lanzar conceptos. Es del todo insuficiente, pero yo veo las clases también como una forma de lanzar anzuelos a ver si alguien pica. Y si alguien pica, pues genial. El curso pasado sin ir más lejos hablé de contraseñas y algunas alumnas se fueron con la idea de fortalecerlas y usar un gestor. Mejor eso que nada.

Estoy seguro de que otras personas pueden hacer muy buen trabajo en este sentido. Personas con hijos o en contacto con la juventud, profesores de otras materias. Realmente presentar estos conceptos no tiene por qué llevar mucho tiempo porque para un joven no supondrá en ningún momento un reemplazo total para ese día a día de aplicaciones sociales y despreocupación por el almacenamiento. Pero si tan solo conoce los conceptos y sabe aplicarlos un mínimo a su día a día, el cambio puede ser muy grande. Desde usar mejor la tecnología o acceder a otros lugares más amables de la red hasta ahorrarse unos cientos de euros por saber manejar el almacenamiento de su teléfono.

2025-10-12

Escritorios menos conocidos en Linux (Adrianistán)

Cuando hablamos de Linux en el escritorio a todos nos vienen a la mente nombres como GNOME o KDE. Estos dos escritorios son probablemente los más populares e implementan mucha tecnología de forma interna. Otros escritorios menos populares pero también relativamente conocidos podrían ser XFCE, MATE, Cinnamon, LXDE, LXQt. Sin embargo, en este post vamos a descubrir algunos escritorios y window managers menos conocidos.

Diferencia entre escritorio y window manager

Como en este post voy a hablar de ambas cosas, conviene tener claras las diferencias. Un Window Manager es un software que nos provee de control para mostrar y manipular ventanas. Nada más. Un escritorio en cambio es un conjunto completo, con aplicaciones para controlar nuestro ordenador de forma gráfica (un gestor de ficheros, un editor de texto, paneles de configuración, una terminal, ... y por supuesto un window manager).

NsCDE

NsCDE es una reimplementación del escritorio CDE basado en el window manager FVWM. CDE fue el escritorio estándar de UNIX en los 90. En los 90 la mayoría de sistemas UNIX eran comerciales pero unos cuantos fabricantes, bajo el paraguas de The Open Group, crearon CDE, un escritorio basado en Motif (librería gráfica también de The Open Group) y X. Así, se conviertió en el escritorio de AIX, HP-UX, Solaris, Tru64, UnixWare, UXP/DS y Digital UNIX. También fue el escritorio de OpenVMS, un sistema no UNIX también relativamente popular (y del que Windows NT bebe muchas cosas). Por su parte, RedHat Linux fue el único sistema Linux que llegó a tener CDE en su momento.

En esta foto se puede ver un sistema Tru64 ejecutando CDE en 2025.

Ya en 2012, CDE y Motif fueron liberados como software libre pero para ese momento el mundo Linux ya había desarrollado sus propias tecnologías independientes y más avanzadas que Motif y CDE, como podían ser GTK, Qt y los escritorios GNOME y KDE. De hecho KDE es un juego de palabras con CDE. Sin embargo, siempre he pensado que hubiese estado bien que los sistemas Linux pudieran haber tenido un framework gráfico común durante un tiempo, ya que un problema comparado con otros sistemas es que en este aspecto Linux está fragmentado.

NsCDE no parte del código liberado de CDE, sino que es una implementación que busca imitar el diseño y funcionalidad sobre FVWM.

MaXX Interactive Desktop

MaXX Interactive Desktop es un escritorio basado en el IRIX Interactive Desktop de IRIX. IRIX fue un sistema operativo UNIX propiedad de SGI desarrollado para procesadores MIPS.

Se trató de uno de los primeros escritorios completos que se ofrecían en el mundo UNIX. Usaba las librerías Motif y se ejecutaba sobre X.

MaXX empezó como un proyecto de antiguos empleados de SGI que querían recuperar este escritorio en Linux.

WindowMaker

Window Maker es un window manager inspirado en el escritorio de NeXTSTEP. Está preparado especialmente para ejecutar aplicaciones del proyecto GNUSTEP , la implementación libre del framework OPENSTEP para desarrollar aplicaciones gráficas en Objective-C.

Al tratarse de un Window Manager es muy básico por defecto, pero podemos añadirle las aplicaciones de GNUSTEP para conseguir un escritorio bastante funcional. Esas aplicaciones en WindowMaker se ven nativas.

WindowMaker está implementado sobre las X. Existe un proyecto llamado wlmaker que intenta hacer lo mismo pero usando Wayland.

Sway

Sway es una adaptación de i3, uno de los window manager más populares del mundo de las X a Wayland. Sway es junto con Hyprland y Niri uno de los window managers más populares del mundo Wayland. Se trata de un tiling window manager. Es decir, las ventanas no se superponen una encima de la otra sino que siempre se les asigna huecos. Estos window managers funcionan muy bien para ser controlados por teclado.

Una de sus grandes contribuciones es la librería wlroots, la cuál usan muchos window managers para implementar Wayland. GNOME y KDE tienen sus propias implementaciones de window manager pero no eran usables fuera de sus escritorios. wlroots permite crear escritorios y window managers sin tener que reimplementar Wayland de cero. Otro proyecto similar es Smithay, el cuál usa Niri y otros window managers escritos en Rust.

Enlightenment

Enlightenment es uno de los escritorios más veteranos de Linux. Sin embargo nunca ha gozado de gran popularidad. Desarrolló sus propias librerías gráficas, EFL, las cuáles se han usado principalmente en sistemas embebidos debido a su menor consumo respecto a GTK y Qt.

IceWM

IceWM es un window manager muy ligero y relativamente familiar para la gente que viene de Windows. Funciona sobre las X. Dispone de una gran cantidad de temas.

Hyprland

Hyprland es otro tiling window manager para Wayland. Mientras que Sway es más minimalista, Hyprland dispone de gran variedad de opciones y personalizaciones.

Niri

Niri es uno de mis window managers favoritos. Es un window manager para Wayland, usa Smithay y es un scrollable tiling window manager. Quiere decir que todas las apps se encuentran en una tira infinita de izquierda a derecha. Es uno de los window managers más amigables para alguien que no tenga experiencia con ellos.

2025-10-09

Mi sistema actual de tareas (Adrián Perales)

Como dije en la entrada anterior, llevo un tiempo en el que tengo la necesidad de apuntar todo lo importante. Para ello hago uso del calendario y de las tareas de mis aparatos. En esta entrada especifico las herramientas que uso.

Notas previas

Esto no es un tutorial. No explicaré cómo configurar ninguna de los servicios o aplicaciones que mencionaré.

Una de mis máximas en tecnología es poder mover la información fácilmente entre sistemas. Quizá haya opciones más sencillas o más completas que las mías, pero este es el que yo he encontrado más acorde a mis necesidades y uso.

Sincronización

Si quiero mirar mis eventos y tareas en cualquiera de mis dispositivos (ordenador con Linux, ordenadores con macOS, móvil, tableta...) necesito un lugar donde almacenar esos datos.

Actualmente tengo el calendario en Fastmail y las tareas en Nextcloud. Podría tenerlo todo en Nextcloud pero ha cuadrado así.

La razón de tener las tareas en Nextcloud es que la aplicación para GNU/Linux que he encontrado se sincroniza con dicho sistema y, aunque desde hace poco tiene sincronización genérica con CalDAV, no va bien con Fastmail.

En caso de no disponer de Nextcloud, hay proveedores que ofrecen un poco de espacio y las aplicaciones de tareas y calendario suelen estar instaladas por defecto en muchas de ellas.

En GNU/Linux con Gnome

Para el calendario, la aplicación por defecto de Gnome se lleva muy bien con la sincronización CalDAV que se configura desde Cuentas de internet. No me he complicado la vida. Aunque en Gnome no tengo la posibilidad de añadir lugares concretos como sí tengo en Apple por tener este los mapas integrados, me vale.

Para las tareas, la aplicación que he conseguido sincronizar es Planify. Se parece mucho a los Recordatorios de Apple y tiene soporte para tareas recurrentes, que es una de mis prioridades.

Tan solo tiene dos peguitas. Las tareas se crean por defecto en local y hay que estar pendiente de mover la nueva tarea a la nube, y no permite tanta configuración de las recurrencia. Por ejemplo, en Recordatorios se puede configurar que una tarea se repita el 10 y el 20 de cada mes pero con Planify es más conveniente crear dos con repetición mensual.

Estando pendiente de estos dos detalles, su uso es muy sencillo y funciona divinamente. No he tenido ningún conflicto con otros sistemas.

Calendario de Gnome a la izquierda y Planify a la derecha, con algunas tareas censuradas por privacidad.

En sistemas Apple

Tanto las aplicaciones de Calendario como Recordatorios que vienen por defecto en el sistema se pueden configurar para que utilicen los CalDAV tanto de Fastmail como de Nextcloud, así que no me he molestado ni un poquito en buscar otras opciones.

Si añado eventos al calendario desde Gnome, se notifica en el teléfono o tableta sin problemas. Lo mismo si añado alguna tarea con recordatorio. Es sencillo y funcional, sin más.

Calendario en iPad a la izquierda y Recordatorios en iPhone a la derecha. Muestran la misma semana y mismas tareas.

Conclusión

Como se puede apreciar, mi uso de los sistemas es muy básico en la actualidad. Tengo necesidades muy sencillas que cubro con las aplicaciones por defecto si me es posible, y busco una aplicación concreta si necesito algo más, como es Planify en este caso. Si Gnome tuviera una aplicación de tareas sencillita compatible con sus Cuentas de internet, seguro que me hubiera quedado con esa.

Lo mejor que tiene este sistema es que se basa en CalDAV, un estándar. Desde las aplicaciones puedo mover las tareas de la nube a mi equipo, o entrar en las interfaces web para descargar el archivo y subirlo a otro sitio. Si mi Nextcloud o mi Fastmail desaparecieran (cosa complicada), sería cuestión de mover todo a otro sitio y seguir con mi vida.

Aunque no he sido nada técnico ni específico, espero que esta pequeña entrada sirva a alguien.

2025-10-08

Chyłka (HBO, 2018-2022) (La Página Definitiva)

Historias de la abogada cabrona

2025-10-02

Tengo que apuntarlo todo (Adrián Perales)

Desde hace ya bastante, pero en especial desde la baja por estrés, noto que mi memoria ya no es lo que era. Será la adultez, será la cantidad de obligaciones o será que mi cerebro no para quieto, pero he llegado a un punto en el que tengo que apuntar absolutamente todo lo que sea mínimamente importante para mí.

No me refiero únicamente a cuestiones de trabajo, para lo cual siempre he usado alguna aplicación o libreta, sino también (y sobre todo) cuestiones personales. Desde temas que quiero tocar a futuro y compromisos personales hasta tareas de la casa, todo.

Y lo cierto es que no me disgusta ni me alarma. Mi situación es la que es, y al final la tecnología está para ayudarnos.

Eso sí: esta costumbre no tiene nada que ver con esa obsesión en guardar registro de todo, algo de lo que ya prescindí hace tiempo. No pasa nada si me olvido de cuándo vi tal película, pero sí de que quedé con tal persona.

2025-09-03

Comentario de un viaje a Taiwán (Adrianistán)

Este año he estado de vacaciones en Taiwán en un voluntariado en Taichung. Ha sido un viaje muy fructífero y por ello me gustaría dejar algunos comentarios al respecto.

¿Por qué fui a Taiwán?

Todo empezó en marzo de 2025 ya que en ese mes suelen salir las solicitudes de campos de trabajo internacionales. Hace dos años yo ya había estado en uno, concretamente en Tende, una pequeña localidad francesa en los Alpes situada cerca del Parque Nacional de Mercantour y muy cerquita de Italia y de Niza y Mónaco. Se trataba de una mina de plata, explotada desde la Edad Media hasta casi la Segunda Guerra Mundial. En un paisaje idílico, rodeados de árboles enormes y marmotas, todos los días nos sumergíamos a las profundidades de la montaña para mejorar el interior de la mina y hacerla visitable para turistas.

Este año había estudiado mi primer año de chino en la Escuela de Idiomas y aunque es un nivel muy bajo, sentía curiosidad de ver la cultura china. Es ahí cuando vi que en el listado de países que ofrecían campos de trabajo estaba Taiwan. Tenía dudas. Es cierto que en Taiwan se habla chino, mandarín concretamente que es el dialecto al que solemos referirnos al hablar de chino en Europa. Pero también era cierto que mi nivel no era todavía muy bueno. Y además en Taiwan se usan caracteres tradicionales, cuando en clase he estudiado los simplificados, los cuales se usan en China continental. Aun así decido dar el paso. Puedo permitirme el viaje, no tengo otros compromisos y no será una visita de turisteo normal sino que estaré con gente de allí y me integraré un poco en su cultura. El campo de trabajo no ofrecía mucha información sobre las tareas a realizar aunque tenían pinta de ser sociales, organizando actividades.

El viaje

Era la primera que salía de Europa y nunca había tenido un vuelo tan largo por delante. Fui con Turkish Airlines y todo fue bastante bien.

Tuve problemas para llegar al aeropuerto de Madrid ya que nuestro bus de ALSA perdió el retrovisor en un accidente y no nos podía llevar al aeropuerto. Aunque ALSA nos prometió un bus en 15 minutos, hubo gente que se fue en taxi y gente que protestó. Finalmente wel bus llegó y yo que tenía margen pude llegar a tiempo.

Volaba primero a Estambúl y luego a Taipei. El primer vuelo son cuatro horas, que se pasan rápido con las películas y la comida (la cuál está bastante buena, por lo menos en Turkish). En Estambúl me sorprendió la cantidad de destinos del aeropuerto, como Kabul, donde me quedé un rato observando la gente que cogía ese vuelo. Vi los primeros mensajes escritos en chino como las fuentes de agua. Y me sorprendió que me pareció un aeropuerto más caro incluso que Madrid y que usaba euros, a pesar de la lira turca. Supongo que la depreciación de la lira no lo hace muy rentable.

El vuelo a Taipei son 11 horas y cogí el vuelo con la intención de que de Estambúl saliese por la noche. Un avión grande, un Boeing 777. Creo que lo sorprendente no es solo lo ancho que es sino lo largo que es porque como está dividido en zonas, desde el asiento solo ves una pequeña parte del avión. Pero al salir de repente aprecias la cantidad de filas y filas de asientos que hay. Aparte de la cena, el desayuno y los tés correspondientes en estos vuelos te dan un neceser con calcetines, pantuflas, cepillo de dientes, cascos, antifaz, tapones de oídos y tienes a tu disposición manta y cojín.

Una vez en el aeropuerto cogí un bus hacia Taichung que era donde estaba el albergue que había reservado. Aquí pude decir mis primeras frases en chino (你們也去臺中嗎?). El viaje dura unas dos horas.

Documentación

Los ciudadanos españoles no necesitamos visado para entrar en Taiwán. No obstante, hay dos cosas que hacer al llegar. La primera es el control de productos cárnicos. No se puede llevar jamón o fuet. Además según el origen de tu vuelo te darán un papel rojo o verde para ir por la cola donde se hacen inspecciones o la que se lo salta. La verdad es que había una lista publicada pero España no estaba por ningún lado. Me dieron el verde por venir de Turquía aunque hubiese hecho escala. Francia iba por el verde y Alemania iba por el rojo, así que no sé España en qué lado hubiese estado.

Aunque no se pida visado para estancias inferiores a 90 días, hay que rellenar una Arrival Card antes de pasar por el agente de fronteras. Se puede hacer unos días antes de entrar al país, pero se puede rellenar allí. En ambos casos es online. Yo llevaba eSIM de Nomad y no tuve problemas en conectarme al Internet de allí durante toda mi estancia.

Una vez te han puesto el sello es recomendable comprar una tarjeta EasyCard. La EasyCard es una tarjeta muy útil en Taiwan. Es una tarjeta prepago anónima que te sirve para pagar en algunos comercios, pero lo más interesante es que sirve para trenes, metro, bicicletas y autobuses por todo el país. Me dan a elegir el diseño entre varios modelos. Elijo el oso de la luna bebiendo bubble tea con el Taipei 101 de fondo. ¡Todo muy taiwanés! El oso de la luna u oso negro de Taiwan es un especie de oso endémica de la isla. El bubble tea es una bebida que incorpora té y leche con bolitas negras de tapioca. Es un invento de los años 80 en Taiwan, concretamente en Taichung, y recientemente ha llegado a Europa. Por otro lado el Taipei 101 es un rascacielos de 508 metros de altura, que fue el edificio más alto del mundo hasta la construcción del Burj Khalifa en Dubai.

También es recomendable sacar dinero en efectivo. Fui con varias tarjetas, entre ellas una que no cobraba comisión al sacar en cajero: Revolut. Funcionó perfectamente en el aeropuerto. En Taiwán se paga bastante en efectivo, sobre todo en tiendas pequeñas. El segundo método de pago más común es LINE Pay, que funciona con la aplicación de LINE. Una app de mensajería muy popular en Japón y Taiwán. También se puede pagar con EasyCard como he mencionado antes. Y por último, las tarjetas de VISA o MasterCard pueden funcionar aunque no verás muchos carteles de ellas.

El voluntariado

El voluntariado lo organizaba VYA, una organización de Taiwán. Nuestro anfitrión era Mr. Li, un señor que tenía una academia en Wuqi. Su mujer Sophia y sus hijos le ayudaban a llevar la academia. Además gestionaba el centro comunitario de Wuqi. Tuvimos una monitora llamada Josephine, más o menos de mi edad, con buen nivel de inglés. Posteriormente tuvimos un monitor llamado Hans, un profesor de primaria, mucho más caótico y con peor nivel de inglés.

Me acompañaban tres chicas: Martina, Celeste y Ha, de Mallorca, Aguascalientes y Vietnam respectivamente. Hubo unos cuantos días que nos acompañaron los hijos de una profesora de inglés de la academia: Mario y Rainy.

¿Qué hacíamos? Casi todos los días antes de comer, ayudábamos a empaquetar la comida del centro comunitario. En el centro comunitario había una cocina y señoras mayores (algunas muy mayores) se dedicaban a cocinar. La comida luego se empaquetaba y se repartía. La comida solían ser cajas de cartón, la mitad de arroz y la otra mitad de cosas con sabor: pollo frito, salchichas, tortilla, espinacas, cacahuetes, tofu, higos, etc El día que venía la Fundación Tzu Chi, fundación budista, era vegetariano. También solía haber sopa.

Luego ya cada día era variado. Preparamos una actividad donde enseñábamos cosas de nuestros países y la hicimos para varios grupos de niños de la academia. Un día también la hicimos por la mañana para los señores mayores.

Otro día acompañamos a los mayores mientras hacían sus actividades de estiramientos y bailes diarios y otro día con las manualidades que trajo la fundación Tzu Chi para ellos.

Otro día preparamos comida tradicional de nuestros países (no faltó la tortilla de patata). Y un día hicimos unas charlas en pequeños grupos para ver si los niños se animaban a hablar en inglés con nosotros.

A veces teníamos actividades que eran interesantes para nosotros pero donde no hacíamos mucho: como la visita al museo agrícola, visitar una graduación de guardería, visitar otro grupo de voluntarios, ver el centro comercial, …

Yo muchas veces disfrutaba más los ratos de espera en la academia en la que los niños estaban esperando a que les recogiesen sus padres y podía hablar un poco con ellos.

Al final del día solíamos comentar con Josephine como había ido el día. Ella nos comentaba que algunas cosas que hacía el anfitrión no le parecían bien, parecía que usaba recursos comuntarios para su academia y que en el fondo le estábamos ayudando a Mr. Li en su academia, un negocio privado. Aunque fuese simplemente por nuestra presencia para dar imagen. También que realmente no estábamos haciendo muchas cosas de verdad. Hans llegó más tarde pero desde que llegó por las noches hablaba largo y tendido con Josephine como de algo serio.

El domingo era el día libre. Josephine me preguntó que a qué hora me iba despetar mañana (dormíamos en la misma habitación). Cuando me desperté ya no estaba pero en teoría ese día no teníamos monitor. Sin embargo era extraño. Por la tarde hubo lluvia muy fuerte provocada por un tifón, Hans escribió en el grupo de WhatsApp preguntando por nosotros. Pero Josephine nunca lo leyó. El lunes hicimos actividades pero no vimos a Josephine. Pregunté a Hans y me dijo que se había puesto mala y que no iba a volver. Y justo después de preguntar ya dio la explicación en público. Mi teoría es que Josephine se marchó porque no quería participar en esto que le parecía mal. Pero nadie me lo ha podido confirmar.

Antes he comentado que dormía con Josephine. Esto era porque dormíamos en la propia academia, sobre una especie de colchones plegables con lamas de bambú arriba. El aire acondicionado de la sala donde originalmente nos querían dejar no funcionaba. Y el calor era insoportable. Abajo había clases con pupitres pero por la noche podíamos moverlos y bajar las camas y dormir allí con aire que funcionaba. Esto hicimos Hans, Josephine y yo. Es decir, los propios taiwaneses necesitaban el aire acondicionado. Es cierto que era molesto tener que estar todos los días montando y desmontando la clase, pero era necesario.

Tainan - 臺南

El último día, tras una sección de feedback y con toda la maleta hecha me dirigí a la estación de tren de Shalu. Desde allí tomé trenes locales hasta llegar a Tainan, una ciudad ubicada al sur de la isla. Esta ciudad tiene el mérito de ser la ciudad más antigua de Taiwán. Además es una ciudad relativamente alejada de la capital actual, Taipei, por lo que no es tan turística. Posee multitud de templos y un urbanismo no tan occidental como Taipei. Aún así, sigue siendo una ciudad que puede parecernos industrial.

En Tainan hay varios monumentos. En primer lugar está el distrito de Anping. Este distrito es donde nace literalmente Taiwán. La isla de Taiwán o de Formosa, nombre que le dieron los portugueses estaba habitada pero no por chinos sino por aborígenes. Tribus originarias de la isla que habían tenido poco contacto con el exterior. En el siglo XVIII, España y Holanda intentan establecer bases en la isla para comerciar con ellos. La de Holanda se ubica en el actual Anping y se llama Fuerte Zelandia. A la zona la llama Taoian. No obstante, los chinos liderados por Koxinga son conscientes de estos movimientos y eventualmente se lanzarán a conquistar la isla, expulsando a los europeos, que por otro lado no estaban demasiado establecidos.

Existen restos arqueológicos del Fuerte Zelandia original, aunque lo más visible es una reconstrucción japonesa posterior. Allí también hay algunas calles estrechas originales de la ciudad holandesa. Es típico en esta zona tener leones con una espada en la boca en las puertas de las casas. Mi visita fue muy interesante ya que el guía, un señor mayor, nada más verme quiso que me quedase en su grupo, a pesar de que su nivel de inglés no era muy bueno. Pero creo que le hacía ilusión poderle explicarle cosas a alguien de fuera.

Cerca se ubica un destructor de la marina de Taiwán que es visitable. Quizá lo más sorprendente de este destructor, vendido por EEUU, es que se encuentra decorado con estatuas y dibujos de series de anime. Por lo que se ve, van rotando. Además durante la visita se pueden ir recogiendo los sellos de la serie que toque en cada momento.

También cerca de Fuerte Zelandia hay un gran templo de Matsu.

Yéndonos a la zona actualmente más habitada, distritos centro y oeste, podemos encontrar muchas templos. Quizá uno de los más interesantes es el templo de Confucio, el primero que se abrió en Taiwán. Estos templos eran una especie de escuelas de las enseñanzas de Confucio. En este además, todos los emperadores Qing y posteriormente los presidentes de la República de China han depositado sus respetos con sendos postes.

Cerca se ubica el santuario de Koxinga, un templo dedicado a este pirata que trajo a la etnia han a Taiwán.

Otros templos interesantes son el templo taoísta de Tiantan Tiangong, el templo de Beiji, el Sacrificial Rites Martial Temple, el templo de Matsu y los templos de Avalokitesvara y Sacrificial Rites Xingji Temple (uno al lado del otro).

Aunque lo mejor es dejarse llevar, sin rumbo fijo por la ciudad entrando por las callejuelas. Así fue como descubrí la fiesta de los muertos, un día paseando sin rumbo demasiado fijo. Empecé a ver calles y avenidas llenas de ofrendas de todo tipo (juguetes, comida, cerveza, dinero falso, …), rezos, multitud de conciertos en paralelo, fuegos artificiales y más. Fue una experiencia tan sorprendente que no quería irme de allí hasta que no acabase todo. Y tuve que volver al albergue de memoria.

Kaohsiung - 高雄

Esta ciudad está un poco más al sur y es más grande y moderna. Fui y volví en el día en tren y la verdad es que fue un día muy malo. Estuve mucho tiempo parado sin hacer nada por la lluvia. No tiene muchos monumentos. Existe una estación de metro con una vidriera impresionante y un lago sobre el que han construido pagodas (la del tigre y el dragón), un buda gigante, etc Aunque es todo bastante moderno.

Taipei - 臺北

Taipei es la capital, aunque no es una ciudad excesivamente grande. De hecho no es la ciudad más poblada de Taiwán aunque su área metropolitana sí que es lo más habitado de Taiwán. Es una ciudad moderna y más occidental que las demás.

En Taipei hay varios templos interesantes: el de Longshan, el de Dalongdong, el de Confucio y el de Xingtian por mencionar unos. El de Confucio no es tan interesante a nivel histórico como el de Tainan pero tiene muy buenas explicaciones de las enseñanzas de Confucio, con secciones dedicadas a la caligrafía, la matemática (¿sabías que ya ellos conocían el que nosotros llamamos teorema de Pitágoras?), montar a carro, …

Cerca del río están los antiguos muelles de Dadaocheng, un sitio chulo para ver la puesta de sol. Allí estuve cenando con Claire y Leila.

Otros monumentos más políticos serían el mausoleo a Chiang Kai Sek y el memorial a Sun Yat Sen. Cerca de este último se ubica el Taipei 101, rascacielos que ya he comentado.

En el apartado museos, Taipei tiene los más importantes. El Museo Nacional del Palacio es un emblema de la cultura china. La República de China llevó allí multitud de tesoros para que la República Popular de China no se quedara con ellos. Podemos ver los calderos de bronce, que son algunos de los primeros sitios donde vemos escritura china. Esculturas de jade, mobiliario de la dinastía Qing. Durante mi visita había una exposición dedicada al Go y a otros juegos de mesa chinos sumamente interesante. También visité el museo ferroviario.

En Taipei existen también muchos mercados callejeros y calles gremiales (llegué a pasar por una calle que todo era gente vendiendo aves, ya fuesen patos, gallinas o cotorras) pero caminar por Taipei no es muy cómodo, ya no solo por el clima sino que los pasos de cebra son muy lentos. Existen incluso centros comerciales subterráneos como el Taipei City Mall, que es muy interesante si te gusta el mundo de los videojuegos. Cuando llegué allí me sorprendió ver la cantidad de anuncios de videojuegos que había, muchos de ellos no los conocía por ser japoneses y no tan populares en Europa.

Transporte

El medio de transporte más popular en Taiwán es la motocicleta. La usan para todo. De hecho en los mercadillos de fruta y verdura tradicionales la gente suele ir en moto y ya si van a comprar se bajan de la moto. Puede parecer peligroso y de primeras sorprende la cantidad de gente que vas a ver pasar un moto al ponerse un semáforo en verde pero lo cierto es que no conducen mal y son bastante respetuosos con las normas.

También hay bastantes coches, aunque ciertamente es un artículo más de lujo. Las marcas más comunes son japonesas, coreanas, taiwanesas y alemanas. Toyota, Lexus, Mitsubishi, Subaru, Hyundai, Luxgen, CMC, Audi, BMW, Mercedes y Porsche. Lo cierto es que mucha gente que tiene coche tiene un buen coche ya que en esta cultura tener un coche lujoso es importante.

Existe un sistema de préstamo de bicicletas en todo el país y también se suelen ver bicis aunque en unas zonas más que en otras.

Las ciudades de Taipei, Taichung, Taoyuan y Kaohsiung tienen metro. El metro de Taipei está muy bien diseñado. Los trenes son extremadamente anchos por lo que se entra sin problemas. El acceso a los trenes es mediante puertas externas y existen marcas para que la gente haga cola: y la gente hace cola en esos sitios marcados. La mayoría de estaciones son un andén grande en el centro, con las vías en los laterales. En estaciones con varias líneas, normalmente la vía que pasa enfrente es de otra línea con la que es frecuente hacer transbordo, para no tener que subir ni bajar.

El. metro de Taoyuan es básicamente un acceso al aeropuerto y prácticamente todo el rato va sobre viaducto en el exterior. Es impresionante lo alto que se eleva el metro pasando sobre cruces de autovías y con tramos adentrándose por las montañas.

Para desplazamientos de larga distancia se puede usar el tren de TRA o el tren de alta velocidad (HSR). El tren de TRA cubre buena parte de la isla y de hecho es posible dar la vuelta entera. Es ideal si quieres llegar al centro de las ciudades. Hay trenes más rápidos y más lentos, dependiendo de las paradas que hagan, aunque ninguno supera los 120km/h. Estos trenes tienen una ancho de via especial, de 1067 mm y existen trenes con reserva y sin reserva. Hay que tener cuidado, ya que en mi caso intenté entrar en uno con reserva sin tener la reserva y no pude entrar. El precio es similar a trayectos parecidos en España.

Por otro lado el HSR es un tren basado en el Shinkansen japonés que llega a los 300 km/h. Solo opera en el lado oeste de la isla y en muchas ciudades las estaciones están ubicadas lejos del centro. Aunque estuve tentado, no llegué a coger este tren que era más caro y te dejaba en las afueras. Pero realmente es una buena opción si tienes poco tiempo. Sale un tren cada 10 minutos aproximadamente del norte al sur de la isla y viceversa.

Por último, los autobuses son muy comunes. Los de larga distancia como el que cogí para ir del aeropuerto a Taichung, son bastante cómodos aunque con una decoración un poco hortera. Buses urbanos hay bastantes y puede ser confuso cogerlos. Por lo general se pica al entrar, escuchas 上車, y se pica al salir, se escucha 下車.

El centro comunitario

El centro comunitario de Wuqi es un sitio donde los mayores acuden por las mañanas para mantenerse activos. Allí les toman la tensión, cantan karaoke, hacen estiramientos y manualidades y reciben charlas. Es muy común en estos centros encontrar tiras rojas con nombres pegadas a la pared: se trata de gente que ha donado al centro. También dispone de cocina, donde unas señoras mayores preparaban la comida que luego empaquetábamos.

Mientras estuvimos allí, un templo cercano donó paquetes con comida, que nosotros como voluntarios tuvimos que ordenar. Entre las cajas había dulces como shachima, aceite de cacahuete, vino de arroz, fideos de varios tipos, tés, snacks y mucho más.

El centro estaba muy cerca de la academia, a una manzana de distancia. Pero casi nunca la hicimos por fuera. Casi siempre pasábamos a través de un párking de motocicletas son entrada y salida por los dos lados. De esa forma no nos daba el sol.

Ocio

En general el ocio no es muy distinto al que pueda tener una persona aquí. Comentaba con unas chicas que habían estado viendo la película de F1 y como se habían informado antes de verla ya que el gran circo no es tan popular allí. El deporte más popular es el beisbol y podías ver a gente mayor viendo partidos por la TV así como a los jugadores promocionando cosas (y las animadoras también).

Existen salones recreativos con máquinas bastante modernas y bastante variedad de juegos. Muchos de ellos son japoneses pero traducidos al chino.

En general la cultura japonesa impregna mucho del ocio. Leen mangas, ven animes, y hay mucho merchandising de franquicias japonesas como Shin Chan, Hello Kitty, mofusand, …

En general vi que la gente estaba más abierta a los videojuegos que en Europa y los juegos de móvil eran bastante populares. Por ejemplo a Mario le gustaba ver streamings de gente jugando Arena of Valor. También estaban al tanto de la nueva oleada de memes, que ellos llamaban shanhaijin extranjero (lo que aquí llamamos Italian brainrot).

Pero no por ello dejan de quedar con la gente. Muchas noches acudíamos a ver a un amigo de Mr. Li. Este señor tenía varios negocios en la calle y nos recibía en su mesa de té. Allí iba haciendo té poco a poco (de unas hojas puede sacar 6 o 7 tiradas) y te va sirviendo poco a poco en vasitos pequeños. La mesa dispone de agujeros por los que si el agua cae mientras se prepara el té no pasa nada. También nos ofreció un licor de allí, que sabía como aguardiente y la cerveza más famosa de Taiwán, la Taiwan Beer.

La educación

Hans trabajaba de profesor de primaria, aunque en sus ratos libres le gustaba hacer improvisación teatral. Decía que no era una profesión muy buena porque los padres siempre se quejaban y defendían a sus hijos. También decía que los taiwaneses eran “test machines”. Es decir, estudiaban mucho para sacar buena nota en los exámenes y ya.

La educación en esta zona de Asia es muy competitiva y todo el mundo quiere ser el mejor y sacar la mejor nota. En los últimos años antes de ir a la universidad ya prácticamente viven en el instituto. Comentaba Josephine que salía del instituto a las 22 cuando es un país en el que se cena sobre las 19. Pero incluso desde muy pequeños es normal mandar a los niños a academias (cram schools) para que sigan mejorando cuando no están en clase.

En disciplinas como el inglés, se sienten muy inseguros. Intentan no cometer errores y se vuelven muy tímidos y no se arrancan a hablar.

Claire y Leila habían acudido a un instituto experimental en Taitung donde tenían una educación diferente. Tenían tres ramas: arquitectura, teatro y cocina y se desarrollaban haciendo actividades relacionadas con eso.

La industria tecnológica

Si Taiwán es famoso en el resto del mundo es por su industria tecnológica. En el bus mientras iba del aeropuerto a Taichung me encontré con las sedes de Mediatek y Arcadyan. Estaba en la zona de Hsinchu, donde se ubica un gran parque tecnológico, donde también tienen su sede empresas como TSMC, Acer, Ralink, Zyxel o Realtek. En Taiwán también estan las sedes de empresas como Foxconn, ASUS, MSI, ADATA, BenQ, D-Link, Gigabyte, HTC o VIA.

Josephine, que había estudiado sociología, estaba ahora estudiando informática, y todos sus amigos y su novio trabajaban en Mediatek. Sin embargo me decía que era duro trabajar en esas empresas puesto que se les exigía mucho. También decía que no valoraban mucho a sus trabajadores y que en el fondo buscaban carne fresca que saliese de las universidades. En general trabajar en estas empresas no te dejaba demasiado tiempo libre.

La naturaleza

Un día decidimos ir a unos senderos cercanos a Taichung, los Dakeng trails 9 y 10. Nada más empezar hay puestos de comerciantes que venden frutas, verduras pero también ropa y material de senderismo. Lo cierto es que había muchísima gente por el sendero y durante el primer kilómetro no dejaba de haber puestos por todas partes. Según ibas subiendo los puestos desaparecían. Los senderos estaban asfaltados y eran accesibles. Es un bosque denso, con enormes bambús por todas partes y vistas sobre la gran ciudad y el resto del bosque que quitaban el aliento.

Otro día acudimos a los Gaomei Wetlands a ver la puesta de sol. Es un sitio popular para ir y hacerse fotos cerca del mar. Este fue el único momento en el que toqué el mar en todo mi viaje a Taiwán. Allí la cultura de playa no es como en Europa. Interesante ver como los molinos de viento se han integrado en el paisaje.

La gastronomía

Empecemos por lo fácil, lo que no me gustó. No me gustó el stinky tofu, un tipo de tofu frito que huele fatal y tampoco sabe mucho mejor. A los niños tampoco les suele gustar y con el tiempo le van desarrollando el gusto.

Las comidas típicas serían las famosas cajas de arroz con acompañamiento, los fideos y las sopas. También existe una gran variedad de productos de cerdo. Llegué a ver torreznos, oreja de cerdo y morcilla. También Taiwán al ser una isla tiene una gran variedad de mariscos: calamares, mejillones, ostras, almejas, navajas, … El pollo frito o los dumplings también son populares. Pero la variedad es inmensa y te puedes sorprender con cosas como los huevos cocidos negros (huevos sumergidos en salsa de soja múltiples veces).

En Taiwán son muy populares los night market o mercados nocturnos. Durante ciertas noches en lugares específicos se juntan un montón de puestos callejeros con comida muy variada. Desde patatas dulces hasta helados de alubia, existe una gran variedad. También suele haber tiendas normales abiertas en esas zonas, incluso a altas horas de la noche. Es común también que en estos night market haya máquinas de meter dinero para intentar conseguir premios. Muy populares las del gancho, donde puedes encontrar casi cualquier cosa: incluso detergente para intentar coger con el gancho.

En general la comida es bastante barata y se puede comer, sin grandes lujos, por el equivalente a 4€. Se puede comer en uno de los muchos restaurantes que hay por la calle. No se suele pedir bebida al comer. Pero es relativamente fácil encontrar agua, ya que allí muchos sitios tienen agua templada y agua hirviendo gratis. En los templos y a veces por la calle encontraremos máquinas de estas. En esos mismos templos vamos a poder ir al baño de forma gratuita. Además de ser sitios donde podremos tirar la basura.

Y es que en Taiwán no hay cubos de basura ni papeleras como norma general. Solo hay dos cubos: reciclaje y basura y por la noche pasan dos camiones con una canción de música clásica avisando a los vecinos que se acerca el camión. Es responsabilidad de cada vecino tirar sus bolsas en el camión correcto. Por lo que me contaron a veces los camiones se usan para transmitir mensajes de las autoridades al pueblo.

También es común comer en un 7/11 o un FamilyMart. Son tiendas de conveniencia donde podemos encontrar comida preparada, higiene básica, bebidas, prensa, bollería,… Hay muchísimos por todo el país, es casi imposible no caminar y encontrate uno de frente. Casi todos tienen mesas, agua hirviendo, microondas y palillos para comerte la comida que compras directamente allí.

Hablando de palillos, salvo un día que fuimos a un restaurante “occidental”, siempre se come con palillos. Los hay de madera y de metal. Tampoco es común tener cuchillo sobre la mesa, el cuchillo se queda en la cocina.

Existen bastantes frutas y verduras que no son tan comunes en Europa como la guava, la fruta del dragón o el lichi. La guava me parecía una especie de sandía pequeña, de hecho solo me comí la parte roja creyendo que la parte verde estaba dura y no se comía, pero Mario me avisó que se comía todo. El lichi es una fruta que hay que abrir, ya que por fuera está bastante dura, pero dentro es blandita y jugosa.

Existen helados de multitud de sabores. También en Taiwán existen helados hechos de hielo picado sobre los que se le echa sirope, tapioca, frutas o legumbres. Incluso en algún restaurante estos helados te los dejan al fondo para que los cojas por tu cuenta y te los hagas como veas.

Aunque sin duda yendo por las calles es más común encontrarse sitios de Bubble Tea (Boba Tea para los amigos). Como he mencionado anteriormente es té con leche y bolitas negras de tapioca. Existen muchos sabores y se puede configurar el tamaño de las bolas, la cantidad de azúcar y la cantidad de hielo. Al cambio serían como unos 2€. En un intento de reducir la contaminación por su empaquetado, la mayoría de sitios te cobran menos si llevas tu propia botella de bubble tea.

Existe una gran variedad de snacks y refrescos. Recomiendo encarecidamente pasar por una tienda grande y observar la cantidad de snacks más allá de las patatas Lays que uno se puede encontrar. Desde gusanitos sabor mango, caramelos ácidos, pieles fritas de pescado, tentáculos de maíz sabor calamar, carne picante, …

La religión

La religión en Taiwán es bastante interesante. Es una mezcla de diversas creencias y supersticiones.

Podemos empezar por el budismo taiwanés. Se trata de una rama del budismo independiente al budismo tibetano (la del Dalai Lama). Ha tenido varios referentes como Sheng Yen o Cheng Yen. Esta última es la líder la fundación Tzu Chi. Una organización similar a Manos Unidas o Cáritas en el mundo católico.

Un día vino gente de esta organización al centro comuntario. Primero hicieron media hora de estiramientos siguiendo un vídeo. En ese vídeo toda la gente vestida de forma impoluta realizaba los movimientos mientras sonaba de fondo un rezo. Luego les ponían un vídeo donde la maestra Cheng Yen comentaba una historia de Buda, que era explicada con dibujos animados. Finalmente hicieron manualidades con las personas mayores.

Los templos budistas no obstante son independientes y cada uno se organiza a su manera. También existen templos taoístas y la religión popular que sería la mera adoración de ciertos dioses. En Taiwán, Matsu es muy popular. Es una deidad que ayuda a los marineros y siempre se la representa rodeada de un diablillo que ve desde lejos y un diablillo que oye desde lejos. Al ser la población mayoritaria de Taiwán descendientes de emigrantes chinos que llegaron en barco.

Todos los templos tienen una guía de en qué orden hay que rezar. Normalmente supondrá coger incienso y llevarlo por varios sitios, para finalmente depositarlo en un inciensario frente al altar más importante. También se pueden realizar ofrendas o tirar las piedras adivinatorias. Las ofrendas de dinero se hacen con un dinero falso, amarillo pero sellado. Este dinero se lanza al horno que todo templo tiene que tener. De esa forma puede llegar a sus allegados.

El clima

Sólo he estado en Taiwán en verano, el clima era muy caluroso y húmedo y el aire acondicionado es imprescindible. No obstante, aunque había cambios bruscos de temperatura nunca tuve ningún problema. En zonas de bosque la humedad es muy intensa y simplemente por estar ahí mi cuerpo se llenaba de sudor y las gotas se me iban cayendo según iba caminando.

Esto no quiere decir que todos los días sean soleados ya que hay mucho día nublado. En general la gente le tiene mucho respeto al sol e intentan exponerse a él. Irán con paraguas, se meterán por túneles o irán en moto para evitar ponerse morenos.

Durante mi estancia un tifón pasó cerca. Esto provocó una instensa lluvia. Afortunadamente allí los sistemas de desagüe funcionaron bien. No obstante estar unos segundos en la calle equivalía a entrar a una ducha. Como no paraba nos metimos en un museo que estaba cerrando. En el museo querían cerrar pero en vez de echarnos directamente su estrategia fue regalarnos a todos chubasqueros para que pudiésemos irnos.

El idioma

En Taiwán el idioma oficial es el chino estándar, que es chino mandarín, lo que queremos decir cuando solemos decir “chino” a secas. Se escribe en caracteres tradicionales, a diferencia de China continental que usa los caracteres simplificados. No obstante existen otras lenguas chinas habladas en Taiwán. La más popular es el hokkien, a veces llamado simplemente taiwanés.

Recuerdo cuando entramos al karaoke del centro comunitario y había personas mayores cantando las canciones antiguas que les gustaban. Josephine se ralló porque podía leer perfectamente las letras en caracteres tradicionales pero no las estaban pronunciando bien. Tardó un poco en darse cuenta de que las canciones no estaban en mandarín sino en hokkien. Luego efectivamente comprobamos en el libro de canciones de la máquina que había un buen listado de canciones en hokkien.

Viajando por Taiwán es fácil encontrarse con carteles con romanizaciones. El problema es que en Taiwán ha habido varios sistemas de romanizar el chino. Desde el Wade-Giles hasta el hanyu pinyin que promueve el gobierno actual pasando por MPS II y tongyong pinyin. La realidad es que un completo caos porque calles y estaciones que deberían tener romanizaciones parecidas aparecen con romanizaciones diferentes dependiendo de cuándo se hizo esa romanización. Por supuesto, hablando con ellos muchos no se dan cuenta de este detalle porque se fijan en los caracteres directamente.

Para escribir a ordenador se suele usar Zhuyin. El Zhuyin es un silabario de 37 caracteres y 5 indicadores de tono que se diseñó para enseñar la pronunciación del chino. En China continental dejó de usarse en lugar del hanyu pinyin, que cubre las necesidades de romanización y pronunciación. Pero en Taiwán a los niños se les sigue enseñando Zhuyin. Es frecuente ver libros con Zhuyin anotado al lado de los caracteres para que los niños sepan como se pronuncia el caracter. Además en los teclados de ordenador suelen estar pintadas los símbolos del Zhuyin sobre las teclas. En los smartphones existen teclados Zhuyin para introducir los caracteres.

Los taiwaneses estudian inglés de forma obligatoria pero eso no quiere decir que sean fluidos al hablar. Muchos lo estudian simplemente como algo necesario para aprobar.

Como estudiante de chino he de decir que podía entender algunas palabras sueltas, no me pareció un acento muy cerrado. Pero obviamente hablan muy deprisa.

2025-08-28

Paralelismo para lelos parte 3: usando la GPU con WGPU (Adrianistán)

Por último, para finalizar esta serie de artículos sobre paralelismo, vamos a ver como usar la GPU. Ese componente que hasta hace unos años solo importaba a la gente que jugaba videojuegos pero que ahora se ha vuelto de tremenda importancia, ya que son la base de las IAs estadísticas.

¿Qué es una GPU?

Las siglas GPU significan Graphical Processing Unit. Aunque la tarea que tenemos entre manos, pintar el fractal de Mandelbrot, puede considerarse una tarea gráfica, la realidad es que las GPUs no llegaron a ser como son ahora directamente.

Prácticamente desde las primeras consolas y microordenadores ha habido chips gráficos. Estos eran necesarios, primero porque las salidas de los monitores/TVs eran analógicas y requerían de una sincronización que la CPU no podía garantizar y segundo porque era más eficiente en memoria. En consolas como la NES, podemos usar el chip gráfico (la PPU) para cargar sprites y moverlos sin tener que reescribir toda la pantalla en nuestra RAM principal.

Estos chips sin embargo no eran programables, sino más bien configurables. Es decir, soportan ciertos parámetros, le podemos mandar datos de los sprites, etc Pero no ejecutan código nuestro. Este esquema se mantuvo incluso hasta principios del siglo XXI. Por ejemplo tenemos la PlayStation 2. Una consola con una arquitectura muy compleja pero que podemos resumir en usar técnicas de SIMD, en registros de 128 bits, similares a las que vimos en la primera parte pero en chips paralelos a la CPU principal, que se encargan de dejar todo listo para pasarle al Graphics Synthesizer toda la información de vértices, localización de texturas, modos de funcionamiento,... Y él saca la imagen. Pero no podemos personalizar nada de lo que ocurre dentro con nuestro propio código. Es una caja cerrada.

Tal es así que las primeras APIs gráficas en 3D como OpenGL 1.0 funcionan de una forma parecida. Vamos mandando comandos, activando y desactivando flags, mandando vértices, etc Aunque el concepto no era nuevo y chips como el SuperFX de SNES ya dejaban programar partes del pipeline, no fue hasta que llegó Nvidia que este paradigma no se popularizó.

El paradigma que surgió entonces es tener pequeños programas que se ejecutarían en paralelo, en distintas etapas del procesamiento gráfico. Originalmente serían los vertex shaders y los fragment shaders. A estos pequeños programas se les bautizó como shaders porque con ellos se podía mejorar mucho en el tema de la iluminación. Posteriormente surgieron shaders de más tipos como los geometry shaders. Pero lo interesante es que esta arquitectura extremadamente paralela se abrió a computaciones generalistas y que ha dado lugar a lenguajes como CUDA.

¿Cómo funciona una GPU?

Hemos visto un repaso histórico de como llegamos a las GPUs programables actuales. Pero, ¿cómo funcionan exactamente y en qué se diferencia de usar SIMD en un procesador o los procesadores multicore?

La terminología aquí depende del fabricante pero voy a intentar ser lo más genérico posible. Una GPU está compuesta de uno o varios SMs. SM significa Stream Multiprocessor y tiene asignada parte de la memoria. Un SM recibe bloques de threads, también llamados workgroups. Cuando un bloque llega a un SM, el SM se encarga de organizar su ejecución. Para ello, activará los warps necesarios para ejecutar ese bloque y reservará memoria. Un warp es un conjunto de 32 threads. Cada thread del warp ejecuta el mismo código a la vez, como si fuesen instrucciones SIMD. Esto tiene implicaciones interesantes. Es decir, si un thread del warp tiene un bucle y hace más iteraciones, el resto de threads también hacen esas iteraciones, aunque luego el SM sea listo y descarte los resultados posteriores de los threads que ya habían acabado. ¿Y cuántos threads tiene una GPU? Pues una Nvidia RTX 5090 (tope de gama en 2025) tiene unos 21.760 threads, repartidos en 170 SMs, que pueden seleccionar los warps que consideren en tiempo de ejecución.

Así pues tenemos 21.760 threads en comparación con los 24 de un Intel Core i9-14900K. He aquí una gran diferencia. Aunque es verdad que estos threads tienen importantes limitaciones, como el hecho de que todos los threads ejecutan todas las instrucciones, incluso si no les hace falta.

Comparado con el modelo SIMD de las CPUs, donde también se da el caso de que todos los datos ejecutan las mismas instrucciones, tenemos la diferencia de que en una GPU vamos a poder usar lenguajes donde podemos programar como si fuese en secuencial para un elemento en particular. La paralelización la hace la GPU por nosotros.

WGPU, WebGPU en Rust

Hace ya unos años, la industria se dio cuenta de que APIs como OpenGL, y las versiones antiguas de DirectX, no se adaptaban ya bien al hardware actual de las GPUs. Esto se veía en APIs nuevas como Metal por parte de Apple o Mantle por parte de AMD. Y seguramente se viese en las APIs propietarias de consolas como PlayStation. Dentro de Khronos, la gente detrás de OpenGL, se decidió dejar de desarrollar OpenGL y empezar de cero con Vulkan. En el mundo web sin embargo ya existía una API basada en OpenGL para gráficos 3D: WebGL. Pero WebGL estaba atada a conceptos de OpenGL y al igual que Vulkan, se pensó en hacer una API web siguiendo principios más cercanos a Vulkan, aunque simplificando algunas cosas. Esta API es WebGPU y está diseñada para ser usada desde JavaScript en un navegador. Pero por debajo esos navagadores necesitan una librería. Google ha hecho dawn en C++ y Mozilla ha hecho WGPU en Rust.

Veamos que pinta tiene el código:

let instance = wgpu::Instance::new(&Default::default()); let adapter = instance.request_adapter(&Default::default()).block_on().unwrap(); let (device, queue) = adapter.request_device(&Default::default()).block_on().unwrap(); let shader = device.create_shader_module(wgpu::include_wgsl!("mandelbrot.wgsl")); let pipeline = device.create_compute_pipeline(&wgpu::ComputePipelineDescriptor { label: Some("Mandelbrot"), layout: None, module: &shader, entry_point: None, compilation_options: Default::default(), cache: Default::default(), });

En primer lugar inicializamos WGPU. Hay que tener en cuenta que podemos tener varias GPUs en un mismo ordenador. Lo más interesante es que vamos a conseguir un device, un dispositivo donde podemos crear cosas, y una queue, una cola donde mandaremos las tareas a realizar por el dispositivo.

Después, cargamos el código de nuestro shader y creamos un pipeline, donde lo básico es que el módulo es nuestro shader.

let byte_buffer_size = BUFFER_SIZE * std::mem::size_of::<u32>(); let buffer = vec![0u32; BUFFER_SIZE]; let storage_buffer = device.create_buffer(&wgpu::BufferDescriptor { label: Some("storage"), size: byte_buffer_size as u64, usage: wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::COPY_SRC | wgpu::BufferUsages::STORAGE, mapped_at_creation: false }); let output_buffer = device.create_buffer(&wgpu::BufferDescriptor { label: Some("output"), size: byte_buffer_size as u64, usage: wgpu::BufferUsages::MAP_READ | wgpu::BufferUsages::COPY_DST, mapped_at_creation: false }); let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { label: None, layout: &pipeline.get_bind_group_layout(0), entries: &[ wgpu::BindGroupEntry { binding: 0, resource: storage_buffer.as_entire_binding(), } ], });

Ahora viene un tema fundamental en la programación de GPUs que es tema de la memoria. Aunque existen arquitecturas de memoria unificada, no son las más comunes. Lo más típico es que la GPU tenga su propia memoria RAM y haya que copiar datos entre la memoria de la CPU y la memoria de la GPU. Para esto definimos buffers. Vamos a necesitar mínimo dos. Uno que vamos a enviar nosotros desde la CPU y que una vez en la GPU vamos a modificar. Será de tipo STORAGE. Por otro lado, vamos a necesitar otro con permisos para que pueda ser leído desde la CPU de vuelta (MAP_READ). Por otro lado en el shader vamos a hacer referencia al buffer de STORAGE. Tenemos que realizar un binding entre ese buffer y el pipeline que usa nuestro shader.

Un detalle importante es que WebGPU tiene actualmente un soporte de tipos muy limitado. Por eso en esta versión vamos a tener que usar buffers de u32 para la imagen, cuando lo ideal es que fuesen de u8. Vamos a tener que mandar bastante más datos en las copias, pero WebGPU no soporta u8 todavía.

let mut encoder = device.create_command_encoder(&Default::default()); { let mut pass = encoder.begin_compute_pass(&Default::default()); pass.set_pipeline(&pipeline); pass.set_bind_group(0, &bind_group, &[]); pass.dispatch_workgroups(350, 200, 1); } encoder.copy_buffer_to_buffer(&storage_buffer, 0, &output_buffer, 0, output_buffer.size()); queue.write_buffer(&storage_buffer, 0, bytemuck::cast_slice(&buffer)); queue.submit([encoder.finish()]); { let (tx, rx) = channel(); output_buffer.map_async(wgpu::MapMode::Read, .., move |result| tx.send(result).unwrap()); device.poll(wgpu::PollType::Wait).unwrap(); rx.recv().unwrap().unwrap(); let elapsed = now.elapsed(); println!("Time for WGPU algorithm: {}ms", elapsed.as_millis()); let output_data = output_buffer.get_mapped_range(..); let data: &[u32] = bytemuck::cast_slice(&output_data); let data_u8 = data.into_iter().map(|x| *x as u8).collect(); save_fractal(data_u8, &Path::new("wgpu.png")); }

Por último tenemos que mandar las instrucciones. Primero creamos un command encoder, de tipo computacional, agregamos el pipeline, los bindings y la instrucción más importante: dispatch_workgroups, que viene a ser: ejecútalo. Ahora explicaremos los números.

En el encoder también ponemos que después haga una copia del buffer de storage al buffer de output. Luego en la cola agregamos primero la instrucción de inicializar el buffer de storage y luego mandamos a la GPU con submit todas las instrucciones del encoder. Estas operaciones se ejecutan de forma asíncrona. Desde la CPU solo podemos mandar tareas a la cola. Para leer el buffer de output tenemos que usar la API asíncrona de WebGPU. Es un poco verboso, pero en esencia pide a la GPU leer el dato y el callback se ejecuta cuando ya está disponible. Luego tenemos que transformar esos u32 ineficientes en u8 para reusar nuestra función de guardar la imagen.

@group(0) @binding(0) var<storage, read_write> mandelbrot: array<u32>; const ITERATIONS: u32 = 100; // image size is 3500x2000 // workgroup size 10x10 // dispatch 350x200 workgroups @compute @workgroup_size(10, 10) fn main( @builtin(workgroup_id) workgroup_id: vec3<u32>, @builtin(local_invocation_id) local_invocation_id: vec3<u32>, ) { let x = workgroup_id.x * 10 + local_invocation_id.x; let y = workgroup_id.y * 10 + local_invocation_id.y; let global_id = (y * 3500 + x) * 3; let cx = f32(x) / 1000.0 - 2.5; let cy = f32(y) / 1000.0 - 1.0; var zx = 0.0; var zy = 0.0; var zx_square = 0.0; var zy_square = 0.0; var i = u32(0); while(i < ITERATIONS && zx_square + zy_square < 4.0) { let prev_zx = zx; zx = zx_square - zy_square + cx; zy = 2.0 * prev_zx * zy + cy; i = i + 1; zx_square = zx * zx; zy_square = zy * zy; } if (i == ITERATIONS) { mandelbrot[global_id] = 255; mandelbrot[global_id + 1] = 255; mandelbrot[global_id + 2] = 255; } }

Por último tenemos el código del shader. Este shader está programado en WGSL, un lenguaje especificado por el estándar de WebGPU. Es una evolución del GLSL de las versiones modernas de OpenGL con algunos detalles que recuerdan más a Rust.

Al principio tenemos declarado el storage buffer, que es el binding 0, es read_write y es un array de u32. Luego tenemos una constante y a continuación nuestra función. La anotamos con compute para que sea un compute shader. Y le indicamos que el workgroup_size es 10x10. ¿Qué diantres es esto?

Esta anotación de workgroup_size nos permite definir el tamaño del bloque. El bloque era lo que se mandaba a un SM y el SM buscaba warps con threads para ejecutar nuestro bloque. En este caso he optado por un bloque de 100 elementos. Una peculiaridad es que la mayoría de estos lenguajes nos permiten hacer bloques de 1D, 2D y 3D. En este caso al ser una imagen he optado por bloques 2D. Entonces WGPU va a mandar a la GPU bloques de 10x10 elementos. Pero nuestra imagen es de 3500x2000 píxeles. Si cada bloque es de 10x10, entonces necesitaremos 350 bloques para cubrir la horizontal y 200 para cubrir la vertical. Esos son los números que se veían en Rust en la parte de dispatch_workflow. Esto es lo que se llama nuestra grid y es de 350x200. También puede ser unidimensional o tridimensional. O sea que la GPU va a tener que procesar 70.000 bloques, cada uno de 10x10 píxeles. ¿Podríamos haber puesto bloques más grandes? Sí, pero WebGPU para ser compatible con muchas GPUs tiene un límite de 256 threads por bloque. Si programásemos directamente en CUDA el límite sería de 1024 threads por bloque.

Dentro del shader, ¿cómo sabemos qué píxeles del fractal tenemos que procesar? Para ello tenemos dos argumentos en la función que la GPU rellenará pos nosotros: workgroup_id y local_invocation_id. workgroup_id nos dice en qué bloque estamos dentro de la grid, en nuestro caso como es 2D, el identificador es una coordenada XY. Por otro lado, local_invocation_id nos dice nuestra coordenada dentro del bloque. De nuevo como es un bloque 2D, nos da una coordenada XY. Multiplicando el workgroup_id por el tamaño del bloque y sumando el ID local, obtenemos nuestra posición absoluta dentro del grid de computación. El resto del shader es el algoritmo de otras veces.

Los resultados en mi sistema, con una gráfica integrada de Intel, son buenos aunque no son los mejores. Este método tiene muchas ventajas como hemos visto pero quizá habréis intuido algunos problemas. El setup es muy farragoso y había que realizar copias entre memorias. Además en el caso concreto de WebGPU no soportar u8 nos penaliza. Y esto suponiendo un sistema con drivers de GPU estables, cosa que no siempre es así. El tema de las copias entre memorias es bastante clave y ya que podemos perder más de lo que ganamos con esta paralelización extrema. Por eso en problemas complejos a veces cuanto más tiempo podamos seguir en la GPU, mejor. Aunque hay que tener en cuenta que los ifs y los while en un shader arrastran a otros threads, así que con cuidado. Las arquitecturas con memoria unificada nos permiten que la CPU y la GPU no tengan que hacer copias de los datos en su comunicación. Pero en PC no son comunes e implicarían cambios importantes. Apple en sus equipos con procesador M1 en adelante ha adoptado este esquema por lo que no sería extraño que en el futuro los PCs evolucionasen hacia la memoria unificada aunque sin duda será más difícil porque implicaría mayor integración entre componentes que habitualmente vienen de empresas separadas.

Todo el código de todos los días está en GitHub

2025-08-12

Paralelismo para lelos parte 2 (Adrianistán)

En la entrada anterior de la serie vimos por qué el paralelismo era necesario así como la primera forma de paralelismo que podíamos usar, que eran las operaciones SIMD. Ahora veremos los procesadores multicore.

¿Qué es un procesador multicore?

Como vimos en el post anterior no podíamos subir las velocidades de los procesadores. Pero lo que la ley de Moore sí nos deja hacer es tener transistores más pequeños. Esto significa que podemos empezar a tener dos procesadores en el espacio de uno. Realmente no son procesadores enteros, sino que colaboran entre sí. Estos son los procesadores multicore.

Cada core ejecuta su propio código en paralelo, previa asignación del sistema operativo. Cada core tiene acceso a los mismos recursos que los demás. Esto es especialmente importante si hablamos de la memoria. Cada core tiene el mismo acceso a la memoria que los demás, por lo que hay que tener cuidado si dos cores intentan acceder a la misma memoria. Aunque sí que es cierto que pueden tener cachés individuales.

Threads

Nosotros no podemos decidir en qué core se ejecuta nuestro código. En realidad, el sistema operativo nos ofrece unas abstracciones llamadas procesos o threads (hilos). No son exactamente iguales un proceso y un thread pero para esto es muy similar. Los sistemas operativos nos dejan crear un número bastante elevado de threads y luego estos pueden, y repito pueden, ejecutarse en diferentes cores. Pero esto es una decisión que se toma por el sistema operativo. De esta forma podemos tener más threads que cores, algo vital para que podamos usar sistemas operativos multitarea. Esta es la diferencia entre la concurrencia: tener muchos threads con tareas separadas dentro del sistema que trabajan de forma coordinada y el paralelismo: ejecutar físicamente en paralelo.

En Rust

En Rust, a diferencia de C, tenemos funciones en la librería estándar para trabajar con threads de forma idéntica entre sistemas operativos. Por otro lado si lo que queremos es maximizar el rendimiento de nuestra máquina, no tiene sentido crear más threads que cores tiene nuestro ordenador, porque entonces alguno tendrá que esperar sí o sí.

La versión más básica de nuestro algoritmo de fractales de Mandelbrot sería la siguiente:

println!("Starting Threads algorithm"); let buffer: Vec = vec![0; BUFFER_SIZE]; let buffer = Arc::new(Mutex::new(buffer)); let cores: usize = std::thread::available_parallelism().unwrap().into(); let cores: u32 = cores as u32; let now = Instant::now(); println!("Using {} cores", cores); let mut threads = vec![]; for core in 0..cores { let x_start = core*WIDTH/cores; let x_end = if core == cores-1 { WIDTH } else { (core+1)*WIDTH/cores }; let buffer_rc = Arc::clone(&buffer); threads.push(std::thread::spawn(move || { for x in x_start..x_end { for y in 0..HEIGHT { let c = Complex { real: x as f64 / 1000.0 - 2.5, im: y as f64 / 1000.0 - 1.0, }; let mut z = Complex { real: 0.0, im: 0.0, }; let mut i = 0; while i < ITERATIONS && z.abs() < 2.0 { z.square(); z.plus(&c); i = i + 1; } if i == ITERATIONS { let mut buffer = buffer_rc.lock().unwrap(); let index = ((y * WIDTH + x) * 3) as usize; buffer[index] = 255; buffer[index+1] = 255; buffer[index+2] = 255; } } } })); } for t in threads { t.join().unwrap(); } let elapsed = now.elapsed(); println!("Time for threaded algorithm: {}ms", elapsed.as_millis()); let buffer: Vec<u8> = std::mem::take(&mut buffer.lock().unwrap()); save_fractal(buffer, &Path::new("threaded.png");

La idea básica es que se divide el fractal en trozos iguales y cada trozo lo procesa un thread, que se crean con la función std::thread::spawn. Luego desde el thread original esperamos a que acaben todos. Aquí hay un par de cosas interesantes que en Rust se ven muy bien. La primera es que no podemos pasar el vector directamente a los threads, tenemos que meterlo en un Arc y luego clonarlo por cada core. Esto es por la gestión de memoria de Rust, diseñada para ser lo más parecido a una gestión automática tipo Java o Python pero sin las penalizaciones de rendimiento. Sin embargo cuando hay threads, Rust no puede saber cuantas partes del programa van a tener acceso a un punto concreto de la memoria. La solución es: contarlas. A esto se le llama reference counting y son las letras RC de Arc. Cada vez que hacemos un clone estamos incrementando el contador. Cuando, siguiendo las reglas de Rust, ya no usemos más ese trozo de memoria, restará el contador. Y si ya no queda ninguno, el contador es cero, se liberará la memoria.

La segunda tiene que ver con ese Mutex que vemos ahí. Si nuestro buffer hubiese solo de lectura, realmente no haría falta. Pero como queremos modificar el vector lo necesitamos. Entonces puede darse el caso de que queramos modificar el contenido del vector en dos threads a la vez. ¿Y eso se puede hacer? A nivel de ensamblador sí se puede, pero el resultado puede ser un completo caos. Es por ello que Rust nos fuerza a usar un Mutex, una estructura de datos que en esencia es un bloqueo. Cuando queremos modificar el vector, pedimos acceso, esperamos si no lo tenemos, una vez lo tenemos escribimos y después devolvemos el bloqueo (se libera cuando ya no se usa más en un scope, igual que liberar memoria). Esta distinción se puede hacer gracias a que Rust separa variables mutables e inmutables a nivel de tipos.

Rayon

En Rust existe otra forma de hacer esto, usando una librería que cambia un poco el paradigma, se trata de Rayon. No todos los problemas de paralelización se pueden resolver con Rayon pero este sí. La idea es, programa tu código usando iteradores estándar de Rust (las alternativas de alto nivel a los bucles) y obtén paralelización sin tener que pensar en ello. Esto es precisamente una de las ventajas de los iteradores respecto a los bucles, que pueden ser reordenados por algo en medio, en este caso una librería para paralelizar.

let now = Instant::now(); let mut buffer: Vec<u8> = vec![0; BUFFER_SIZE]; buffer .par_chunks_exact_mut(3) .enumerate() .for_each(|(idx, chunk)| { let x = (idx as u32) % WIDTH; let y = (idx as u32) / WIDTH; let c = Complex { real: x as f64 / 1000.0 - 2.5, im: y as f64 / 1000.0 - 1.0, }; let mut z = Complex { real: 0.0, im: 0.0, }; let mut i = 0; while i < ITERATIONS && z.abs() < 2.0 { z.square(); z.plus(&c); i = i + 1; } if i == ITERATIONS { chunk[0] = 255; chunk[1] = 255; chunk[2] = 255; } }); let elapsed = now.elapsed(); println!("Time for rayon-preallocated algorithm: {}ms", elapsed.as_millis());

Este código hace unas divisiones extra pero queda bastante claro, no vemos ningún Arc ni Mutex y cuando veamos los tiempos os va a sorprender.

Unsafe Rust

Por último vamos a ver una versión que se salta los Mutex y los Arc. Esto se puede hacer en Rust aunque ya se considera unsafe. La idea es que Arc no nos hace falta porque el thread principal, donde lo creamos vive más que los otros threads, por tanto lo controla al 100%. Y el Mutex no hace falta porque aunque modificamos el mismo vector, nunca dos threads van a modificar la misma posición porque están asignadas de forma exclusiva a cada thread.

println!("Starting unsafe Threads algorithm"); let mut buffer = vec![0u8; BUFFER_SIZE]; let raw_buffer = RawBuffer(buffer.as_mut_ptr() as *mut u8); let cores: usize = std::thread::available_parallelism().unwrap().into(); let cores: u32 = cores as u32; println!("Using {} cores", cores); let now = Instant::now(); let mut threads = vec![]; for core in 0..cores { let x_start = core*WIDTH/cores; let x_end = if core == cores-1 { WIDTH } else { (core+1)*WIDTH/cores }; let raw_buffer_clone = raw_buffer.clone(); threads.push(std::thread::spawn(move || { let q = raw_buffer_clone; for x in x_start..x_end { for y in 0..HEIGHT { let c = Complex { real: x as f64 / 1000.0 - 2.5, im: y as f64 / 1000.0 - 1.0, }; let mut z = Complex { real: 0.0, im: 0.0, }; let mut i = 0; while i < ITERATIONS && z.abs() < 2.0 { z.square(); z.plus(&c); i = i + 1; } if i == ITERATIONS { unsafe { let index = ((y * WIDTH + x) * 3) as usize; *q.0.add(index) = 255; *q.0.add(index + 1) = 255; *q.0.add(index + 2) = 255; } } } } })); } for t in threads { t.join().unwrap(); } ... #[derive(Clone)] struct RawBuffer(*mut u8); unsafe impl Send for RawBuffer {} unsafe impl Sync for RawBuffer {}

Esto en teoría nos ahorrará el overhead de Arc y de Mutex.

Resultados

Los resultados son muy interesantes, usando threads de forma simple con Arc y Mutex obtenemos una mejora pero no es mejor que el código SIMD. Y eso que en SIMD vamos de 4 en 4 y aquí tenía 8 cores disponibles. Por otro lado la versión que elimina Arc y Mutex es ligeramente más rápida. Esto es consistente, siempre que ejecuto, esta es un pelín más rápida. Pero eso, muy poquito. Ese es el overhead de Arc y Mutex.

Por otro lado la versión más rápida es la de rayon preallocated, la que os he puesto, hay otra de Rayon que no os he compartido. Se alza como la opción más rápida hasta ahora. Pero si usa threads igualmente, ¿por qué es mucho más rápida?

El motivo es que Rayon ha ido haciendo los threads de forma más inteligente. En este problema hay zonas muy rápidas de hacer y otras más lentas. Rayon ha ido haciendo paquetitos y entregándoselos a los threads según se iban quedando ociosos. En este tipo de problemas es una diferencia muy reseñable, fijaos que tarda menos de la mitad que nuestras versiones con reparto estático.

2025-07-29

The Bear (Hulu, 2022-2025) (La Página Definitiva)

Más cornás da el hambre.

2025-06-18

“Las Guerras Napoleónicas” – Alexander Mikaberidze (La Página Definitiva)

El Hitler de antes de Hitler. Presented to you on the anniversary of Waterloo.

2025-05-26

Star Wars – Andor, Temporada 2 (Disney+, 2025) (La Página Definitiva)

Vuelve nuestro terrorista favorito.

2025-03-17

Ted Lasso (Apple TV, 2020-2023) (La Página Definitiva)

Feel Good Futbol Club

2024-10-25

Cómo usar GeForce Experience con lectores de pantalla: una guía que jamás debió ser escrita (Página de inicio on Un sitio solicitado por la comunidad, para la comunidad)

Actualización: a partir de noviembre de 2024, GeForce Experience queda obsoleto en favor de la nueva aplicación de NVIDIA, que es más accesible con lectores de pantalla. No obstante, se mantiene el contenido por motivos históricos. Como se dijo en una entrada anterior, los controladores son una parte esencial de nuestro sistema que no debemos descuidar. Son los encargados de gestionar la relación entre el sistema operativo y los distintos componentes del equipo, y deben mantenerse actualizados siempre que sea posible. Esto lo sabe muy bien NVidia, que permite mantener al día los controladores de sus tarjetas gráficas mediante la aplicación GeForce Experience; una aplicación que antes era accesible, y ahora no. En este caso, no utilizo el término “accesible” como consultor de accesibilidad, sino como usuario. Si entramos a analizar el cumplimiento de las WCAG, incluso en su versión 2.0, estoy seguro de que aquello fallaría por todos lados. Así que en este caso empleo el término “accesible” como accesible para personas ciegas, una simplificación errónea pero conveniente para la historia que nos ocupa, y muy extendida en el colectivo. GeForce Experience es una aplicación con una interfaz hecha a base de HTML, CSS y JavaScript, que se ejecuta sobre un control de navegador web en una ventana independiente. A priori esto es fantástico, porque un usuario de lector de pantalla puede recorrerla con los modos foco y exploración y acceder a todos sus contenidos. En un momento dado, alguien en NVidia tuvo la maravillosa idea de añadir atributos aria-hidden a todos los componentes. Los posibles porqués pueden ser muchos. Tal vez fue una configuración errónea de una biblioteca de terceros. Tal vez querían proteger su interfaz de programas automatizados, que aprovechan las APIs de las tecnologías de asistencia. Sea como fuere, NVidia demostró que la accesibilidad no le preocupaba demasiado. Nadie allí dentro pensó que las personas ciegas también usan tarjetas gráficas.

Espera un momento, Jose, que yo tampoco había caído. ¿Para qué quiere un ciego una tarjeta gráfica?

Supongo que, si lo explico ahora, no tendré que explicarlo luego. Puede parecer que, como no vemos, no necesitamos tarjetas gráficas decentes, pero nada más lejos de la realidad. Hoy en día se usan para muchas otras cosas:

  • Ejecutar videojuegos accesibles que no van a rebajar sus requisitos gráficos.
  • Usar modelos de inteligencia artificial aprovechando la potencia de la tarjeta.
  • Minar criptomonedas.
  • Usar Jaws for Windows, un lector de pantalla que todavía depende de la tarjeta gráfica para obtener ciertos datos.
  • Ejecutar software que requiere una resolución de pantalla determinada.
  • Mejorar el rendimiento general del sistema.

Ahora que ya hemos abordado el problema y demás prejuicios, entremos en las soluciones que podemos aplicar para conseguir el objetivo: actualizar los controladores. Ya que la parte de iniciar sesión con una cuenta NVidia es accesible, nos olvidaremos de ella.

Primer método: de memoria y a ciegas

Tras abrir GeForce Experience, NVDA nos anunciará que estamos en un “documento”, como sucedería en cualquier página web. El único texto visible en ese documento es “common-crimsion-window”, que no nos dice absolutamente nada. Para actualizar los controladores, procedemos del siguiente modo:

  1. Activamos el modo foco. Es importante no pulsar tabulador antes de activarlo.
  2. Si recorremos la ventana con tabulador, veremos dos botones etiquetados como “main-tab-label” antes de un botón “notificationButton”. Pulsamos el segundo para ir a la pantalla de controladores. Importante, no confundir con los botones “mainTab”, que también existen.
  3. Si habíamos recibido la notificación de que había un controlador nuevo para instalar, es posible que la actualización ya esté descargada y preparada. Tabulamos hasta un botón llamado “express-driver-install” y lo activamos.
  4. Aparecerá un diálogo del control de cuentas de usuario. Al confirmarlo, la instalación continuará por sí sola.
  5. Mientras se instala, navegamos al escritorio y regresamos a GeForce Experience para que el foco pueda volver a navegar por la interfaz.
  6. Sabremos que la instalación se acerca a su fin porque el controlador gráfico se reinicia. En este momento, NVDA puede decir una o varias veces la palabra “horizontal”. Al acabar, aparecerá un diálogo modal, que logra atrapar el foco en su interior si llegamos hasta él.
  7. Llegados a este punto, puede que GeForce Experience nos pida reiniciar el equipo, o puede que no. Lo sabremos por la cantidad de botones en el diálogo de finalización:
    • Si sólo aparece un botón “updatesInstallerDialog-2”, podemos pulsarlo, cerrar GeForce Experience y dar el proceso por concluido hasta la próxima actualización.
    • Si aparecen los botones “updatesInstallerDialog-1” y “updatesInstallerDialog-2”, el segundo reiniciará el equipo, así que cuidado! Para salir sin reiniciar, se debe pulsar el primero.

Segundo método: destripar la aplicación para adaptarla a nuestras necesidades

Esto no siempre funciona, pero esta vez sí, así que aprovechemos! Al principio de la entrada dijimos que el responsable del problema es el atributo aria-hidden. Vamos a deshacernos de él. Para ello, necesitaremos acceso como administrador, y un editor de texto plano, como Notepad++, que pueda ejecutarse con privilegios elevados.

En primer lugar, abrimos el archivo C:\Program Files\NVIDIA Corporation\NVIDIA GeForce Experience\www\index.html. En él, buscamos la siguiente línea:

<div ui-view layout="column" flex aria-label="crimsion-window-space" aria-hidden="true"></div>

Cambiamos el atributo aria-hidden de true a false y guardamos. A continuación, editamos C:\Program Files\NVIDIA Corporation\NVIDIA GeForce Experience\www\app.js. En este caso, debemos usar la función de buscar y reemplazar con los siguientes textos:

  • aria-hidden=true se sustituye por aria-hidden=false
  • aria-hidden="true" se sustituye por aria-hidden=“false”`

Tras guardar los cambios, la mayor parte de la interfaz de GeForce Experience volverá a ser accesible con lectores de pantalla. O al menos, tan accesible como puede serlo una interfaz sin textos alternativos adecuados y con otras etiquetas bastante mejorables. Es posible que sigan haciendo falta algunas de las instrucciones de la sección anterior. Es importante tener en cuenta que esta adaptación no durará para siempre. Si GeForce Experience se actualiza, habrá que volver a repetirla. Por suerte, las actualizaciones de controlador llegan con más frecuencia que las de la aplicación, por lo que tendremos unos meses de respiro.

Tercer método: pasar completamente de la aplicación y las cuentas NVidia

Si conoces el modelo exacto de tu tarjeta gráfica y sabes que hay una actualización, puedes visitar esta página y hacerte con los controladores actualizados. El instalador se puede manejar bastante bien, y su interfaz no oculta controles por defecto.

Conclusión

En esta entrada hemos visto cómo parchear GeForce Experience o recurrir a métodos alternativos para actualizar los controladores de la tarjeta gráfica a ciegas. GeForce Experience resulta ser la alternativa más cómoda para actualizar, pero no es accesible con lectores de pantalla, lo que supone una barrera insalvable para la mayoría de usuarios. Se requieren conocimientos avanzados para llevar a cabo las prácticas explicadas en secciones anteriores, y nunca se deben utilizar documentos como este para justificar que un producto es accesible “porque los ciegos modifican los archivos, cambian un atributo aquí y otro allí y al final se las arreglan”.

He sentido mucha pena y vergüenza (de la ajena, que no de la propia) mientras escribía esto. Pena porque sé que hay usuarios que tendrían que leer este documento, no lo harán y continuarán atascados en un problema sin solución aparente. Vergüenza porque, en pleno 2024, con una norma UNE en Europa y varias directivas, y con la Section 508 en Estados Unidos, NVidia sigue sin tener en cuenta la accesibilidad y se deja potenciales clientes fuera. Espero que en el futuro la situación cambie, y a ser posible para mejor.

¡Gracias por leer!

2024-09-08

¿Conoces la URA de tu ayuntamiento? (Página de inicio on Un sitio solicitado por la comunidad, para la comunidad)

He decidido rescatar este hilo. Lo escribí en Twitter, un 4 de octubre de 2022, y tuvo bastante difusión (si lo comparamos con todo lo que escribía habitualmente). Dos años después, han cambiado muy pocas cosas. No obstante, he editado algunas publicaciones para reflejar esos cambios.

¿Conoces la URA de tu ayuntamiento? Yo tampoco. Posiblemente, no tenga. Pero espera, Jose, ¿qué es eso de una URA? URA significa unidad responsable de accesibilidad, y es obligatoria en todas las administraciones públicas. Venga, vamos a hablar de ellas.

En el año 2018 se aprobó el RD 1112/2018. Todos lo conocemos. Los sitios web de las administraciones públicas deben cumplir con el nivel AA de las WCAG 2.1, salvo excepciones. Las aplicaciones móviles, a partir del 23 de junio de 2021, también. Pero ¿qué administraciones?

La administración general del estado, las de las comunidades autónomas, las entidades locales, las entidades del sector público y las asociaciones constituidas por las mismas. Y todas deben tener una URA, según el artículo 16.

La URA atiende todas las quejas, reclamaciones y consultas relacionadas con la accesibilidad. También elabora informes periódicos, actividades de promoción y concienciación, y es el punto de contacto con el observatorio de accesibilidad web.

Todas las URAs deben enviar 3 informes anuales al observatorio desde el año 2020 (artículo 19). Y todas las administraciones públicas deben disponer de una declaración de accesibilidad. Desde el año 2018. Sin plazos, sin fechas límite, desde que entró en vigor el decreto.

Cuando se habla de accesibilidad, es raro no oír la frase de “Queda mucho por hacer”. Y claro que queda mucho, porque lo que hay que hacer se suele quedar sin hacer, así que siempre sigue ahí.

La teoría sobre el papel es preciosa, ahora vayamos a la práctica. Otra frase que se oye mucho es “la accesibilidad no interesa a nadie”. Y es casi verdad, al menos no tiene la prioridad que debería. Nuestros políticos, sin importar su color, no se la dan. Pero demostrémoslo con hechos.

Aquí hay un listado con todas las URAs actuales: https://administracionelectronica.gob.es/pae_Home/pae_Estrategias/pae_Accesibilidad/implantacion-rd-1112-2018/unidades-responsables-de-accesibilidad.html

A nivel general parece que la cosa va bien. Y a nivel autonómico. De las universidades tampoco nos podemos quejar.

En el excel aparecen 43 universidades (si sumamos la CRUE), y todas tienen URA. Me llama la atención que una de ellas la tenga en márqueting: https://administracionelectronica.gob.es/pae_Home/dam/jcr:7f6d8a92-ff4e-4327-b8bf-92fc8aa93960/2021227_Designaciones_URA_-_Universidad.xlsx

Pero bueno, es su obligación tenerla y la tienen. También es obligación de todos los municipios tenerla, y aquí el panorama cambia: https://administracionelectronica.gob.es/pae_Home/dam/jcr:8b847de9-4b58-4493-8deb-ea4f357985d5/20220921_Designaciones_URA_-_EELL.xlsx

Con fecha de 21 de septiembre de 2022 (el Excel no ha cambiado desde entonces), sólo 347 ayuntamientos tienen URA. Hay 20 grupos de municipios que la dejan en manos de su diputación, y 27 para otras entidades.

Pero según esta web, en 2019 había… 8131 municipios en total en España: https://es.statista.com/estadisticas/633516/numero-de-municipios-segun-numero-de-habitantes-espana/

¿Qué puede estar pasando? A lo mejor los pueblos pequeños no pueden permitírsela y hay bastantes, ¿no? Eso explicaría por qué Madrid capital no la tiene.

A lo mejor es algo que se lleva a nivel provincial. Eso explicaría por qué en Ciudad Real la tienen 2 o 3 pueblos de tamaño similar al mío y el resto no. Nótense las ironías.

El caso es que 6 años después de su implantación, y con alguna que otra bronca de por medio metiendo prisa, muchos sitios web de las AAPP siguen sin ser accesibles. Pero al menos tendrán declaración de accesibilidad, ¿no? Me fijo en los dos municipios donde resido habitualmente.

Me voy a Fuenlabrada y encuentro esta declaración. Algo obsoleta ya y haciendo referencia a una UNE de 2015, pero al menos se pusieron las pilas 2 meses después del hilo original en Twitter: https://www.ayto-fuenlabrada.es/web/portal/accesibilidad

Y me voy a Socuéllamos, y directamente no encuentro. ¿Para qué la iban a meter? ¿Qué es eso de accesibilidad? ¿Se come? https://socuellamos.es/

¿Y cómo es una URA en los sitios donde existe? Dice el decreto lo siguiente: “Las funciones que corresponda desarrollar a las Unidades responsables de accesibilidad serán asignadas a Unidades ya existentes”. Traducción: ni presupuesto extra, ni personal extra.

Resumen: cada uno tira como puede con lo que puede y cuando se acuerda. Y nadie hace nada para cambiarlo. Sabiendo esto, ¿cómo obligamos a las empresas privadas a que sean accesibles? ¿Con otra ley que quede bien de cara a Europa y no se aplique?

Ahora tenemos la Ley 11/2023. Sé de primera mano que, al menos, el sector bancario sí se la toma en serio. Pero está claro que no ocurrirá lo mismo con todas las empresas obligadas a cumplirla. Si me baso en los antecedentes, no queda otra que ser pesimista. De aquí a unos años nueva ley, nueva prórroga, y vuelta a empezar. Ojalá me equivoque.

2024-08-04

Cómo visualizar y crear archivos ZIM, una buena alternativa para almacenar sitios web fuera de línea (Página de inicio on Un sitio solicitado por la comunidad, para la comunidad)

Si buscas en cualquier buscador información para descargar sitios web completos, encontrarás montones de tutoriales que recomiendan toda clase de programas. Este es sólo uno más, que he querido escribir tras encontrarme por casualidad con el formato ZIM, el tipo de archivo que usa la Wikipedia para volcar todo su contenido y permitir su uso sin conexión. Pero espera, ¿quién querría descargar un sitio web entero y para qué? Tal vez, más personas de las que crees. Visitar un sitio web previamente descargado puede tener ventajas, como las siguientes:

  • La más obvia: se puede navegar por el sitio cuando no hay conexión. Por ejemplo, si hay caídas de la red o estamos en una zona con escasa cobertura.
  • La velocidad de carga no es un problema, incluso si la conexión es lenta.
  • Se llevan al máximo conceptos tales como la privacidad y el anonimato al navegar… al menos, para el propietario del sitio web en cuestión, que nunca sabrá que lo estamos visitando.
  • Si el sitio web se actualiza y pierde contenido, se conserva una copia con toda la información.
  • Se puede visitar el sitio web incluso cuando su propietario ha decidido eliminarlo.

En esta entrada haremos algo muy similar a lo que hace el gran archivo de Internet con su Wayback Machine, pero a mucha menor escala y en un formato de fichero distinto, por suerte para nuestros discos duros. Y como es habitual, lo haremos acompañados de un lector de pantalla, preferiblemente NVDA. ¡Empezamos!

Requisitos previos

Para seguir y comprender adecuadamente las distintas secciones de esta entrada, se recomienda lo siguiente:

  • Experiencia manejando la consola, ya sea cmd, bash o PowerShell. Muchas de las instrucciones dadas pueden aplicarse en casi cualquier plataforma.
  • La utilidad de línea de comandos wget (sólo si quieres crear tus propios archivos ZIM). Puede emplearse desde Windows con MSYS2 o WSL, o en Linux. Se encuentra como paquete en la mayoría de distribuciones, y también podría estar disponible para Windows de forma independiente.
  • Si utilizas lector de pantalla, se recomienda destreza con la navegación por objetos, uso del cursor de revisión, o mecanismos equivalentes.

Introducción al formato ZIM

El proyecto OpenZIM define el formato ZIM como “un formato de archivo perfectamente adecuado para guardar la Wikipedia en un pen drive USB”. Pero parece que no sólo se aplica a la Wikipedia, sino a cualquier contenido en la web que pueda almacenarse sin conexión. Un archivo ZIM contiene en su interior ficheros HTML codificados en UTF-8, enlazados adecuadamente entre sí y con todos los recursos asociados: hojas de estilo, imágenes, contenido multimedia, ficheros descargables y scripts. Una web alojada en uno de estos archivos debe ser autosuficiente, eliminando por completo o reduciendo al máximo la interactividad, los comportamientos dinámicos y la dependencia del exterior. Los archivos ZIM contienen metadatos sobre el nombre de la web, su creador, su idioma y una descripción del contenido, entre otros, y facilitan al software que los interpreta la posibilidad de realizar búsquedas de texto completo.

Cómo leer un archivo ZIM existente

Aunque es un formato poco común, la biblioteca de Kiwix contiene montones de archivos ZIM que se pueden visualizar y descargar. La Wikipedia, por su parte, vuelca periódicamente todos sus contenidos en esta dirección. Y efectivamente, en un pen drive de 128 GB cabrían las versiones en inglés y español juntas con todos sus recursos. Pero en este tutorial trabajaremos con algo más manejable: un pequeño archivo ZIM preparado para la ocasión. En la última sección aprenderemos a crearlo, pero ahora veamos cómo acceder a su contenido. Existen varios programas que pueden abrir archivos ZIM. Se pueden descargar en el catálogo de aplicaciones de Kiwix. En general son fáciles de usar, y cada uno tiene sus ventajas y desventajas.

Kiwix desktop

Kiwix Desktop es un cliente de escritorio compatible con Windows y Linux. Permite cargar archivos ZIM individuales y gestionar una biblioteca completa. En Windows, su proceso de instalación es tan sencillo como descargar la versión más reciente, descomprimirla en la carpeta donde queramos alojar el programa, y abrir el archivo ejecutable. En las distribuciones de Linux más populares, se puede instalar con pacman, dnf o apt. Y si eso no nos convence, también hay una versión para instalar con flatpack. La interfaz de Kiwix Desktop está basada en el framework QT5. Al manejarla con teclado, el tabulador no llega a todos los elementos disponibles, pero tiene algunos atajos que podemos usar. Por ejemplo, control+o para abrir un archivo. La mayoría de los controles están etiquetados, y con navegador de objetos se pueden alcanzar las zonas a las que el foco no llega por sí solo. A pesar de que se diseñó para ser intuitivo y amigable, la lectura de contenido con Kiwix Desktop dista mucho de ser cómoda con lectores de pantalla. Los documentos no se muestran en un búfer virtual que se pueda recorrer en modo exploración, y sólo se escucha parte del texto al tabular y pasar por encima de un enlace. Además, Kiwix Desktop no soporta scripts en los archivos ZIM. De todos los lectores, es sin duda el más restrictivo.

Kiwix JS y extensiones de navegador

Esta alternativa puede ser la más equilibrada en términos de accesibilidad y facilidad de uso. Kiwix JS es una aplicación que se entrega de múltiples formas. Elige la que más te guste, el resultado en todos los casos será muy similar:

En los casos donde el navegador esté involucrado, puede que ciertas características de seguridad limiten partes del contenido, lo que no impedirá leer la mayoría de los archivos. Kiwix JS se puede usar sin problema en modo exploración. Algunos de sus controles, dependiendo de la versión que elijas, pueden estar no etiquetados. Sin embargo, el botón para seleccionar un archivo ZIM está claramente identificado. La primera vez que carguemos un archivo, Kiwix indicará que no procede de un lugar seguro, y permitirá elegir si nos fiamos del contenido o si, por el contrario, compensa más abrirlo en modo restringido. Una vez se abra el archivo, el contenido aparecerá en un marco. La accesibilidad a la hora de leer y navegar, llegados a este punto, ya sólo dependerá del contenido.

Kiwix-tools

Esta es la alternativa más accesible, pero también la más avanzada, ya que implica usar la consola. La principal ventaja es que, una vez en marcha, podemos compartir la URL de acceso con otros usuarios de la red local, o de Internet en general si se configura adecuadamente. En este tutorial no se explica cómo asegurar las conexiones del exterior ni cómo crear un proxy inverso, aunque es el procedimiento recomendado. Nunca expongas el servidor Kiwix directamente en Internet. Las herramientas de consola de Kiwix (kiwix-tools) permiten realizar búsquedas, gestionar bibliotecas con varios archivos ZIM y levantar servidores accesibles desde otro equipo. En algunas distribuciones de Linux, como Debian, se encuentran en los repositorios oficiales (paquete kiwix-tools). Sin embargo, la versión ofrecida no suele ser la más reciente. Por lo tanto, a continuación se proporcionan los enlaces de descarga directa de la versión actual a fecha de redacción de esta entrada, la 3.7.0-2:

De nuevo, no hace falta instalación. Tan sólo basta con descomprimir las herramientas en la carpeta deseada y ejecutar desde consola las que queramos. Por ejemplo, podemos usar kiwix-serve para servir por red el archivo ZIM descargado anteriormente con un comando como este:

./kiwix-serve nvda-addons.zim

El contenido estará disponible en localhost por el puerto 80, o en la dirección ip del servidor, si es un equipo remoto. El servidor kiwix-serve dispone de algunos parámetros extra que se pueden pasar al ejecutarlo:

  • --library archivo.xml: sirve para cargar bibliotecas con varios archivos ZIM. Por ejemplo: kiwix-serve --library biblioteca.xml
  • -i dirección_ip: limita las direcciones ip en las que escucha el servidor. Por ejemplo: kiwix-serve -i 127.0.0.1 archivo.zim
  • -M: vigila los cambios de una biblioteca y reacciona actualizándose si la modificamos. Útil para añadir o eliminar archivos ZIM sin reiniciar el servidor. Por ejemplo: kiwix-serve -M --library biblioteca.xml
  • -p puerto: si el puerto 80 está en uso por otra aplicación, este argumento permite elegir uno distinto. Por ejemplo: kiwix-serve -p 8080 archivo.zim
  • -r prefijo: cambia el prefijo de URL. Útil si ejecutamos kiwix-serve tras un proxy inverso en un servidor con alojamiento compartido. Ejemplo: kiwix-serve -r /biblioteca/ archivo.zim. El contenido estaría disponible en http://localhost/biblioteca.

Por defecto, el servidor retendrá el control de la consola hasta que lo cerremos. Para ello, se puede pulsar control+c. En Linux, se puede cargar como servicio y dejarlo permanentemente en funcionamiento, algo que se sale del ámbito de este tutorial.

Gestión de bibliotecas con kiwix-manage

Imaginemos que hemos descargado la Wikipedia en español, la Wikipedia en inglés, el archivo ZIM de ejemplo de este tutorial y algunos más que nos resulten de interés. En vez de ejecutar un número indefinido de instancias de kiwix-serve para mostrarlos, podemos añadirlos a una biblioteca. Para ello, usaremos kiwix-manage:

kiwix-manage biblioteca.xml add archivo1.zim archivo2.zim archivo3.zim

Para agregar el archivo con la web de complementos de NVDA: kiwix-manage biblioteca.xml add nvda-addons.zim Ahora, podemos ejecutar el servidor con la biblioteca recién creada: kiwix-serve -M --library biblioteca.xml Para visualizar todos los archivos de la biblioteca, se puede usar un comando como este: kiwix-manage biblioteca.xml show Cada archivo, entre sus metadatos, tiene un identificador (id) formado por números y letras. Dicho identificador se puede usar para eliminar uno de los archivos: kiwix-manage biblioteca.xml remove identificador

Lectores para Android y dispositivos Apple

Si tienes iPhone, iPad o Mac, puedes descargar Kiwix en la AppStore. En Android, se puede descargar Kiwix en la Play Store, pero está limitada y no permite abrir archivos ajenos a la biblioteca de Kiwix. Si necesitas esto último, descarga el archivo APK directamente.

Cómo crear un archivo ZIM

En la sección anterior se proporcionó un archivo ZIM de ejemplo con la web de complementos de NVDA en español alojada por la comunidad internacional, así como herramientas para procesarlo y acceder a su contenido. Ahora, crearemos ese mismo archivo. Para ello es necesario un sistema con Linux y Wget instalado. A diferencia de la sección anterior, esta parte la haremos más guiada.

Descarga de zimwriterfs

Zimwriterfs es la herramienta que usaremos para crear archivos ZIM. Forma parte de las zim-tools, que no son tan comunes en los repositorios de las distribuciones como las kiwix-tools vistas antes. En primer lugar, descargamos la versión más reciente, actualmente la 3.4.2:

Asumiendo un sistema x86_64, descomprimimos el archivo descargado y navegamos a la carpeta extraída. Por ejemplo, en nuestra carpeta de usuario, se puede ejecutar este comando: tar -zxf zim-tools_linux-x86_64-3.4.2.tar.gz && cd zim-tools_linux-x86_64-3.4.2

Descarga del sitio web

El siguiente paso es hacernos con todos los ficheros de la web que queremos. En la medida de lo posible, estos ficheros deben ser autosuficientes, sin dependencias del exterior. Si una web utiliza PHP para devolver contenido con demasiado dinamismo, o Ajax, es una Single Page Application o se apoya en Angular/VUE/React, probablemente no se pueda descargar por completo usando wget. Por suerte, la web de complementos de NVDA es estática y cumple todos los requisitos para funcionar fuera de línea. Con este comando, se descargará en una carpeta nueva en la ubicación donde nos encontramos: wget -k -p -r -D addons.nvda-project.org https://addons.nvda-project.org/index.es.html

La descarga tardará unos minutos. Mientras tanto, veamos qué significa cada argumento del comando anterior:

  • -r: descargar de forma recursiva. Si no lo usamos, se descargaría sólo una página.
  • -p: descargar todos los requisitos necesarios para que la página funcione: imágenes, scripts, hojas de estilo, etc.
  • -k: cuando se complete la descarga, procesar los enlaces de todos los archivos para conectarlos entre sí.
  • -D addons.nvda-project.org: restringir las descargas al dominio addons.nvda-project.org. De lo contrario, ¡wget seguiría recursivamente todos los enlaces que encuentre y se descargaría medio Internet!

Preparación de otros recursos necesarios

Zimwriterfs necesita que se le pasen varios argumentos obligatorios para funcionar. Uno de ellos corresponde a una ilustración de 48x48 en formato png, que no tenemos. Por tanto, debemos diseñarla o buscarla. Para este tutorial, se ha elegido el icono de NVDA, se ha modificado su tamaño y se ha convertido en png. Hay muchos programas que facilitan esta tarea, como Irfanview. No profundizaremos en los pasos necesarios. Al finalizar la conversión, dejaremos el archivo nvda.png dentro de la carpeta addons.nvda-project.org que contiene la web descargada en el paso anterior.

Creación del archivo ZIM

Ya sólo faltan un par de comandos para completar la creación de nuestro archivo. Sin embargo, para prepararlos, debemos tener claros los metadatos. Esto es lo que zimwriterfs espera recibir obligatoriamente:

  • Un breve nombre interno.
  • El archivo html principal. En nuestro caso, index.es.html
  • La ruta a la ilustración del paso anterior.
  • Idioma: código de idioma en formato ISO639-3. Por ejemplo eng para inglés, fra para francés, o spa para español.
  • Título: un breve título de 30 caracteres o menos.
  • Descripción: una breve descripción del contenido.
  • El nombre del creador o creadores del contenido.
  • El nombre de la persona o entidad que publica el archivo ZIM.

Y estos metadatos se pueden añadir de manera opcional:

  • Descripción extendida del contenido.
  • Etiquetas, separadas por el signo punto y coma.
  • URL de origen del contenido.
  • Variante. Por ejemplo, Wikipedia tiene las variantes maxi y mini, entre otras. Si sólo queremos un archivo por sitio web, no es necesario indicar este parámetro.

Por supuesto, aquí opcional no hay nada. Vamos a crear un archivo con todos los metadatos. Primero, ejecutamos este comando para fijar una variable de entorno necesaria: export MAGIC=/usr/lib/file/magic.mgc Y ahora, llamamos a zimwriterfs: ./zimwriterfs --name="nvdaaddons" --welcome=index.es.html --illustration=nvda.png --language=spa --title="Complementos para NVDA" --description="Sitio web en español de complementos de la comunidad de NVDA" --creator="Equipo de complementos de NVDA" --publisher="José Manuel Delicado" --source="https://addons.nvda-project.org" --tags="NVDA;complementos;lector de pantalla;accesibilidad" --longDescription="Sitio web de complementos de la comunidad internacional de NVDA, sólo contenidos en español e inglés" --flavour=NVDA ./addons.nvda-project.org nvda-addons.zim Tras unos segundos, obtendremos un archivo ZIM muy similar al que se proporcionó al principio de este tutorial.

Conclusiones

Tras leer las secciones anteriores, deberías saber leer y crear tus propios archivos ZIM. Nos hemos dejado por el camino algunos conceptos, como la creación de un proxy inverso, la ejecución de kiwix-serve como servicio, y el resto de herramientas disponibles en las kiwix-tools y las zim-tools. ¿Te animas a explorarlas? Si la respuesta es sí, ¡asómate por Mastodon y comparte lo que has descubierto! ¡Hasta la próxima!

2024-06-03

De Docker al fediverso (Página de inicio on Un sitio solicitado por la comunidad, para la comunidad)

En este tutorial aprenderemos conceptos básicos de Docker. Después levantaremos una instancia de Mastodon, una red social descentralizada, y tomaremos medidas para que sea lo más segura posible. Dicha instancia estará formada por contenedores que operan de forma sincronizada, y que ofrecerán sus servicios al público mediante el servidor web Apache.

Requisitos

  • Un servidor con Debian 12 o Ubuntu. Se recomienda que esté protegido, sólo con los puertos ssh, http y https abiertos.
  • Acceso por SSH y conocimientos del manejo de la consola.

Introducción a Docker

Docker es una tecnología que nos permite desplegar aplicaciones y simular ciertas condiciones para que funcionen correctamente. Estas aplicaciones se ejecutan dentro de “contenedores”. Un contenedor se queda a medio camino entre el equipo anfitrión y una máquina virtual:

  • Engaña a la aplicación contenida.
  • Simula redes que en el equipo anfitrión no están.
  • Simula un sistema de archivos propio.
  • Le da a la aplicación las versiones de las librerías que necesita, que a lo mejor no se corresponden con las del equipo anfitrión. Eso ofrece más garantías de que siempre funcionará igual, esté donde esté.

Sin embargo, un contenedor no se ejecuta sobre un núcleo separado. Una aplicación preparada para tal fin puede escalar y acceder al equipo anfitrión sin nuestro permiso.

Los contenedores tienden a ser efímeros: cuando terminan de ejecutarse, lo normal es destruirlos. Se crean a partir de imágenes, que podemos construir por nuestra cuenta o descargar de algún registro. El registro por defecto, si no configuramos ninguno, es el Docker Hub, y allí es donde suelen subirse las imágenes con las que vamos a trabajar. De hecho, si nos hacemos una cuenta, podemos subir nuestras propias imágenes.

Instalación de Docker

Una vez instalado, los comandos para interactuar con Docker son los mismos en cualquier plataforma, también en Windows. Ya que en todos los tutoriales de este sitio hemos trabajado con Debian, vamos a usar Debian aquí también:

  1. Instalamos paquetes que nos permitirán agregar repositorios https: apt update && apt install apt-transport-https ca-certificates curl gnupg lsb-release
  2. Agregamos la clave GPG del repositorio de Docker: mkdir -m 0755 -p /etc/apt/keyrings && curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  3. Agregamos el repositorio: echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
  4. Instalamos el motor de Docker: apt update && apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Se puede cambiar la palabra debian por ubuntu en la URL de los repositorios si queremos hacer la instalación en ese sistema.

En la consola, hemos encadenado dos comandos para que se ejecuten seguidos. Esto se hace con el operador &&, que no habíamos visto hasta ahora.

Nuestro primer contenedor: Fedora

Comprar un servidor VPS sólo para probar una nueva distribución de Linux cuesta dinero, y virtualizarla puede ser imposible cuando no hay accesibilidad. Antes de lanzarnos a cambiar de distribución, puede ser una buena idea hacer algunas pruebas y ver si entendemos sus comandos.

En primer lugar, vamos a bajarnos la imagen más reciente de Fedora: docker pull fedora:latest

En Docker, es habitual que la etiqueta latest apunte a la versión estable más reciente de la imagen deseada. De hecho, la palabra latest se asume si no indicamos otra etiqueta.

Una vez descargada, podemos verla con el siguiente comando: docker images

La imagen, además de su nombre, lleva un identificador asociado. Gracias a él, podremos eliminarla cuando ya no la queramos: docker rmi identificador

Pero es un poco pronto para eliminarla, teniendo en cuenta que no la hemos usado. Creemos un contenedor:

docker run --rm -t -i fedora:latest /bin/bash

En este comando, hemos indicado que el contenedor será destruido al apagarse. Se acoplará una terminal para él, así como la entrada estándar de teclado, usará la imagen de Fedora con el tag latest, y dentro ejecutará el comando /bin/bash. El resultado es una consola dentro del contenedor. Podemos experimentar con ella, llamar a dnf update para actualizar los paquetes, y salir con control+d o el comando exit. Al abandonarla, el contenedor será destruido.

Si queremos hacer un contenedor que no se destruya, el comando varía ligeramente:

docker run --name micontenedor -t -i fedora:latest /bin/bash

En este caso, el contenedor guardará y recordará los cambios que hagamos en su interior. Al salir se detendrá, pero no se destruirá. Podremos volver a él con este comando:

docker start -i -a micontenedor

Si queremos eliminarlo: docker rm micontenedor

Es muy importante eliminar todos los contenedores creados a partir de una imagen antes de eliminar la imagen. Se puede hacer al revés con el modificador --force, pero puede tener efectos no deseados.

Segundo contenedor: un servidor de NVDA Remote

Tener la consola en pantalla es útil para experimentar, pero no es lo habitual. Lo ideal es que cada contenedor ofrezca sus servicios en segundo plano. Para ello, durante su creación, prescindiremos de los modificadores -t y -i.

El contenedor que vamos a crear ahora ofrece un servicio de red. Por defecto, Docker no abre los puertos del contenedor al exterior, sino que es algo que debemos pedirle nosotros. Para ello, usaremos el argumento -p, seguido del puerto exterior, y finalmente del interior. Sabemos que la imagen de NVDA Remote Server abre el puerto 6837. Sin embargo, desde la red del trabajo sólo nos dan libertad para acceder a los puertos 80 y 443, así que configuraremos el 443 como puerto de entrada. Con el argumento -d, además, le diremos al contenedor que se ejecute en segundo plano y nos devuelva el control de la consola en cuanto se inicie:

docker run -d -p 443:6837 --name micontenedor jmdaweb/nvda-remote-server:latest

Como se puede observar, esta imagen no estaba descargada, pero se descarga en cuanto la solicitamos.

Ahora, con el comando docker ps, podemos ver que el contenedor está activo. El comando docker logs micontenedor mostrará por pantalla la salida de la aplicación. Y si con start iniciábamos, docker stop micontenedor detendrá el contenedor indicado.

Con el contenedor activado, podremos conectarnos a un servidor de remote totalmente operativo en ipDelServidor:443.

Comunicación entre contenedores

Docker permite crear y gestionar redes. No profundizaremos demasiado en ello, ya que sólo necesitaremos unos conocimientos básicos.

El comando docker network --help nos dará más información. Cuando conectamos varios contenedores a una misma red, estos pueden interactuar entre sí sin que sus puertos estén abiertos al exterior. Por ejemplo, si tenemos una arquitectura en la que PHP se ejecuta con Wordpress en un contenedor, Apache en otro y MySQL en otro, nos interesará que todos se conecten entre sí, pero sólo Apache aceptará conexiones entrantes del exterior. Al crear un contenedor con docker create o docker run, se puede especificar su red con el argumento --network, seguido del nombre de la misma. Si escribimos --network host, el contenedor se comportará como cualquier aplicación del equipo anfitrión, ofreciendo sus puertos sin ninguna clase de traducción de red. Por tanto, el modificador -p dejaría de ser necesario.

Compartir archivos con volúmenes

Y si lo normal es destruir un contenedor al acabar de usarlo, ¿qué sucede con los datos que se generan en su interior? ¿De qué vale la base de datos que me he montado en MySQL? Cuando queremos preservar información, se emplean volúmenes. Dichos volúmenes pueden ser carpetas del sistema montadas en el contenedor, o almacenes gestionados por el propio Docker. Quizá la primera opción nos interese más, ya que así tendremos en todo momento los datos a mano. Hagamos un experimento sencillo con la imagen de Fedora que ya tenemos:

  1. Creamos una carpeta dentro de /root que actuará como volumen: mkdir /root/contenedores-pruebas
  2. Arrancamos un nuevo contenedor con Fedora: docker run --rm -v ./contenedores-pruebas:/root/contenedores-pruebas -t -i fedora:latest /bin/bash
  3. Desde la consola de Fedora, escribimos información en un fichero de texto dentro del volumen: echo hola > /root/contenedores-pruebas/prueba.txt
  4. Salimos de la consola, lo que provoca la destrucción del contenedor. Sin embargo, en la carpeta asociada al volumen, permanece el archivo txt con lo que escribimos.

¡Importante! Para que Docker monte volúmenes a partir de carpetas existentes, se debe indicar la ruta absoluta. De lo contrario, pensará que se trata de un volumen administrado, y fallará si el volumen no existe.

Ejecución de comandos dentro de un contenedor

Normalmente, cada contenedor ejecuta un único proceso, pero viene equipado de tal forma que podemos ejecutar más. Si queremos modificar el fichero de configuración del servidor de NVDA Remote, debemos usar Nano dentro del contenedor. De hecho, se ha incluido a propósito en la imagen original para poder hacerlo. Mientras el contenedor está activado, podemos llamar al comando docker exec, indicando el nombre y el comando que se ejecutará. Por ejemplo:

docker exec -t -i my_nvda_remote nano /etc/NVDARemoteServer.conf

Esto se aplicará más adelante en Mastodon para hacer copias de seguridad de la base de datos o gestionar aspectos de la instancia, por ejemplo.

Los ficheros docker-compose.yml

Cuando queremos desplegar un servicio que necesita usar varios contenedores, redes y volúmenes, poner en marcha cada elemento puede convertirse en una tarea repetitiva y no exenta de fallos. Docker-compose viene a solucionar el problema. Podemos crear un archivo docker-compose.yml con una serie de instrucciones en su interior que siguen un formato concreto en lenguaje Yaml, y esta herramienta se encargará de levantar o destruir el servicio a petición, creando y eliminando contenedores en el camino. Tiempo atrás, docker-compose se distribuía como un ejecutable independiente. Había que prestar atención para actualizarlo cada vez que salía una nueva versión. Ahora, viene en forma de plugin de Docker, y ya lo hemos instalado al principio de este capítulo. El gestor de paquetes de nuestra distribución ayudará a mantenerlo al día junto con todo lo demás.

Para utilizar un archivo docker-compose.yml, navegamos al directorio donde se encuentra. A continuación, podemos ejecutar algunos de estos comandos:

  • docker compose up -d: pone en marcha todos los servicios del archivo. Descarga imágenes si es necesario, y luego crea redes, volúmenes y contenedores.
  • docker compose down: apaga el servicio. Elimina redes, contenedores y volúmenes, pero no imágenes.
  • docker compose run --rm servicio comando: crea sólo un contenedor con el servicio indicado, cuyo nombre está en el archivo docker-compose.yml, y ejecuta en su interior el comando solicitado.
  • docker compose pull: actualiza todas las imágenes relacionadas con el servicio a sus versiones más recientes.

Archivo docker-compose.yml de ejemplo para Libre Translate

Libre Translate es un traductor gratuito, de código abierto y autoalojado. Con poco más de 20 GB libres, cualquier persona puede montarlo en su servidor con todos los modelos de idioma disponibles. A continuación hay un archivo docker-compose.yml que lo pone en marcha.

version: "3" services: libretranslate: container_name: libretranslate image: libretranslate/libretranslate:latest restart: unless-stopped command: --req-limit 30 --char-limit 5000 --api-keys --disable-files-translation --req-limit-storage redis://127.0.0.1:6379 --update-models environment: - LT_API_KEYS_DB_PATH=/app/db/api_keys.db volumes: - /root/libretranslate/api_keys:/app/db - /mnt/resource/libretranslate:/home/libretranslate network_mode: host

Instalación y configuración de la instancia de Mastodon

Obtención del código

En primer lugar, instalaremos Git en Debian: apt update && apt install git

Vamos a asumir que tenemos la sesión iniciada como root. Clonaremos el repositorio de Mastodon en nuestra carpeta de perfil de usuario, que se encuentra en /root:

git clone https://github.com/mastodon/mastodon.git

Ahora, accedemos a su interior: cd mastodon

Y usamos Git para situarnos en el tag de la versión más reciente. En el momento de redactar este tutorial, la versión más reciente es la 4.2.9: git checkout v4.2.9

Preparación de volúmenes

Mastodon no es una aplicación simple. Está formada por un conjunto de aplicaciones que se coordinan entre sí. En Docker, esto se traduce en varios contenedores, uno por aplicación. Vamos a verlos en detalle:

  • Web: ofrece la interfaz web y casi toda la API de Mastodon.
  • Streaming: es el encargado de ofrecer notificaciones y publicaciones en tiempo real, así como la API de streaming.
  • Sidekiq: ejecuta tareas en segundo plano. Es el corazón de esta red social, el nexo de unión entre todos los demás componentes. Si Sideqkiq falla o va lento, los usuarios lo notarán.
  • PostgreSQL: gestor de la base de datos principal. Almacena publicaciones, cuentas de usuario y algunos aspectos de la configuración de la instancia.
  • Redis: base de datos de rápido acceso cuyo objetivo es alojar una caché para que las líneas temporales carguen más deprisa, entre otras cosas.
  • Elasticsearch: componente opcional que añade capacidades de búsqueda a la instancia. Por supuesto, en este tutorial no es opcional. Ya que está, vamos a usarlo.
  • Tor y Privoxy: permiten que la instancia federe con otras instancias de la red Tor, y que los usuarios puedan visitarla de forma anónima. No lo documentaremos aquí. No es seguro ofrecer este tipo de acceso en una instancia de Mastodon.

Muchos de estos contenedores necesitan volúmenes. Como queremos que sus datos persistan entre reinicios y tenerlos a mano, vamos a crearlos como carpetas en el sistema anfitrión dentro del repositorio de Mastodon. Se podrían crear sin problema en cualquier otro sitio, siempre que luego ajustemos las rutas.

mkdir elasticsearch mkdir redis mkdir postgres16 mkdir system

Nota: la carpeta system contendrá elementos multimedia descargados de otras instancias y subidos por nuestros usuarios, por lo que se recomienda que esté en una partición con suficiente espacio libre.

Las carpetas están creadas, pero los contenedores intentarán escribir en ellas utilizando cuentas de usuario con menos privilegios que root por motivos de seguridad. Conociendo los identificadores de usuario y grupo, podemos asignarlos a cada carpeta:

chown -R 991:991 system chown -R 70:70 postgres16 chown -R 1000:0 elasticsearch chown -R 999:1000 redis

Preparación del núcleo para ElasticSearch

Ya tenemos los volúmenes listos. Antes de continuar poniendo en marcha la instancia, debemos modificar en el núcleo del sistema un parámetro que ElasticSearch necesita, y que por defecto tiene un valor muy bajo.

Para ello, podemos ejecutar el siguiente comando: echo vm.max_map_count=262144 > /etc/sysctl.d/elastic.conf

O crear el archivo /etc/sysctl.d/elastic.conf y escribir en su interior vm.max_map_count=262144, que al final se traduce en lo mismo. Después, mediante el comando reboot, reiniciamos el servidor.

El archivo docker-compose.yml de Mastodon

En el repositorio de Mastodon podemos encontrar un archivo docker-compose.yml en el que se definen varios contenedores y redes. Está preparado para compilar las imágenes desde el principio, algo que no nos interesa pudiendo descargarlas. También tiene muchas líneas comentadas, ya que el buscador ElasticSearch viene deshabilitado. Vamos a modificarlo para adaptarlo a nuestras necesidades. Este sería un posible fichero resultante:

version: '3' services: db: restart: always image: postgres:16-alpine shm_size: 256mb networks: - internal_network healthcheck: test: ['CMD', 'pg_isready', '-U', 'postgres'] volumes: - ./postgres14:/var/lib/postgresql/data environment: - 'POSTGRES_HOST_AUTH_METHOD=trust' redis: restart: always image: redis:7-alpine networks: - internal_network healthcheck: test: ['CMD', 'redis-cli', 'ping'] volumes: - ./redis:/data es: restart: always image: docker.elastic.co/elasticsearch/elasticsearch:7.17.4 environment: - "ES_JAVA_OPTS=-Xms512m -Xmx512m -Des.enforce.bootstrap.checks=true" - "xpack.license.self_generated.type=basic" - "xpack.security.enabled=false" - "xpack.watcher.enabled=false" - "xpack.graph.enabled=false" - "xpack.ml.enabled=false" - "bootstrap.memory_lock=true" - "cluster.name=es-mastodon" - "discovery.type=single-node" - "thread_pool.write.queue_size=1000" networks: - external_network - internal_network healthcheck: test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"] volumes: - ./elasticsearch:/usr/share/elasticsearch/data ulimits: memlock: soft: -1 hard: -1 nofile: soft: 65536 hard: 65536 ports: - '127.0.0.1:9200:9200' web: image: ghcr.io/mastodon/mastodon:v4.2.9 restart: always env_file: .env.production command: bash -c "rm -f /mastodon/tmp/pids/server.pid; bundle exec rails s -p 3000" networks: - external_network - internal_network healthcheck: # prettier-ignore test: ['CMD-SHELL', 'wget -q --spider --proxy=off localhost:3000/health || exit 1'] ports: - '127.0.0.1:3000:3000' depends_on: - db - redis - es volumes: - ./system:/mastodon/public/system streaming: image: ghcr.io/mastodon/mastodon:v4.2.9 restart: always env_file: .env.production command: node ./streaming networks: - external_network - internal_network healthcheck: # prettier-ignore test: ['CMD-SHELL', 'wget -q --spider --proxy=off localhost:4000/api/v1/streaming/health || exit 1'] ports: - '127.0.0.1:4000:4000' depends_on: - db - redis sidekiq: image: ghcr.io/mastodon/mastodon:v4.2.9 restart: always env_file: .env.production command: bundle exec sidekiq depends_on: - db - redis networks: - external_network - internal_network volumes: - ./system:/mastodon/public/system healthcheck: test: ['CMD-SHELL', "ps aux | grep '[s]idekiq\ 6' || false"] networks: external_network: internal_network: internal: true

Como vemos, se hace referencia a un archivo .env.production que no existe. Ya mencionamos que parte de la configuración de la instancia se almacena en la base de datos. Otra parte se almacena en este archivo.

El archivo .env.production

En la misma carpeta donde está el archivo docker-compose.yml (en este caso, la raíz del repositorio) debe haber un archivo llamado .env.production con las siguientes variables, como mínimo. La documentación de Mastodon proporciona otras variables que podemos añadir. Este es sólo un archivo de ejemplo:

# El contenido estático se deja en manos de Ruby y Docker RAILS_SERVE_STATIC_FILES=true # El nivel de registro se configura en advertencias RAILS_LOG_LEVEL=warn # Ajustes de Redis REDIS_HOST=redis REDIS_PORT=6379 # Ajustes de la base de datos DB_HOST=db DB_USER=postgres DB_NAME=postgres DB_PASS= DB_PORT=5432 # Buscador ES_ENABLED=true ES_HOST=es ES_PORT=9200 # Comienza a modificar a partir de aquí # Dominio de la instancia. LOCAL_DOMAIN=miinstancia.com # Valores secretos SECRET_KEY_BASE=secreto1 OTP_SECRET=secreto2 VAPID_PRIVATE_KEY=secreto3 VAPID_PUBLIC_KEY=secreto4 # Ajustes para enviar correos SMTP_SERVER=smtp.gmail.com SMTP_PORT=587 SMTP_LOGIN=miinstancia@gmail.com SMTP_PASSWORD=clave_de_gmail SMTP_FROM_ADDRESS=miinstancia@gmail.com SMTP_OPENSSL_VERIFY_MODE=peer SMTP_AUTH_METHOD=plain # Cambiar a true si la instancia sólo contendrá un usuario (instancia unipersonal) SINGLE_USER_MODE=false # Ajustes del traductor con DeepL # DEEPL_API_KEY=clave-api-de-DeepL # DEEPL_PLAN=free # Ajustes del traductor con Libre Translate #LIBRE_TRANSLATE_ENDPOINT=http://URL-del-traductor #LIBRE_TRANSLATE_API_KEY=clave-de-api-opcional

Como se puede observar, hay varios ajustes que debemos configurar:

  • Datos del servidor de correo: necesitamos una cuenta en un proveedor de correo. Gmail suele ser el más utilizado, especialmente con Google Workspace (de pago), por lo que decidimos dejar los ajustes del servidor. Esto no significa que no puedan usarse otros servidores, incluido un postfix local.
  • Nombre de dominio o subdominio: una vez que lo elijamos y pongamos en marcha la instancia, ya no podrá cambiarse, así que es una decisión que debe tomarse con calma.
  • Datos del traductor: el traductor es un componente opcional. Se pueden usar Libre Translate o DeepL. Descomenta las líneas del que prefieras, o no descomentes nada si no quieres traductor en tu instancia.
  • Valores secretos: los generaremos más adelante.
  • ¿La instancia es unipersonal? Si la respuesta es sí, esta variable debe estar a true.

Generación de los 4 valores secretos

Es hora de iniciar uno de los contenedores y responder una serie de preguntas. El siguiente comando ejecutará un asistente interactivo y realizará los primeros preparativos. Al finalizar, imprimirá por pantalla el resultado. Copia los 4 valores secretos, y sustitúyelos en el archivo .env.production del apartado anterior: docker compose run --rm web bundle exec rake mastodon:setup

Puesta en marcha y creación de la cuenta de administrador

La instancia está lista para arrancar. Y como ya vimos en una sección anterior, basta ejecutar un único comando para que todo se ponga en marcha: docker compose up -d

Cuando recuperamos el control de la consola, podemos ver el estado de los contenedores con docker ps. Tras un par de minutos, todos ellos deberían aparecer como ‘healthy’, que significa sano. Si alguno de ellos se reinicia continuamente o no se encuentra en buen estado, comprueba que no te has equivocado al seguir los pasos anteriores, y pregunta, no vaya a ser que yo me haya equivocado con el tutorial.

Los contenedores perdurarán y se activarán por sí solos cada vez que se reinicie el sistema. Para detener la instancia, ejecutaremos docker compose down

Ahora, desplegamos los índices del buscador, un paso indispensable para que funcione: docker exec mastodon-web-1 tootctl search deploy

Para finalizar la configuración, crearemos una cuenta de administrador. Tras ejecutar el siguiente comando, aparecerá en pantalla la contraseña de la cuenta, compuesta por 32 caracteres. Se puede cambiar más adelante desde la interfaz de administración:

docker exec mastodon-web-1 tootctl accounts create usuario --email usuario@miinstancia.com --confirmed --role owner

¡Todo listo! Mastodon ya está en funcionamiento. Pero aún no se puede entrar, falta mucho por hacer.

Obtención de un certificado para nuestro dominio

No puede haber instancia de Mastodon sin un dominio, o al menos un subdominio dentro del dominio. Vamos a asumir que ya tenemos un dominio que apunta a la dirección ip de nuestro servidor, y que los puertos 80 y 443 se encuentran abiertos. Esto último es importante, ya que son necesarios para obtener el certificado.

Con el certificado, garantizaremos que la conexión a la instancia se hace por https, y por tanto que el tráfico va cifrado entre cliente y servidor. Para comenzar, instalaremos Certbot:

apt update && apt install certbot

Antes de realizar la solicitud, tal vez sea conveniente reforzar la seguridad. Sabéis que a mí me gusta mucho dejar atrás RSA, aunque rompa compatibilidad con navegadores antiguos, y cambiarlo por algo más reciente. Para hacerlo, editaremos el archivo /etc/letsencrypt/cli.ini:

nano /etc/letsencrypt/cli.ini

No vamos a cambiar nada de lo que se encuentra en él, pero sí agregaremos lo siguiente:

key-type = ecdsa elliptic-curve = secp384r1

Ahora, pulsamos control+x para salir, la s o la y (según el idioma) para confirmar que queremos guardar, e intro para guardar el fichero sin cambiar su nombre.

Finalmente, solicitamos un certificado. En este ejemplo, se usa el dominio miinstancia.com: certbot certonly --standalone -d miinstancia.com

Si es la primera vez que usamos Let’s Encrypt, tendremos que aceptar los términos del servicio, y proporcionar un correo electrónico. Los certificados caducan cada 3 meses. Cuando falten pocos días para alcanzar la fecha de caducidad, recibiremos un correo que informará de ello. Para renovar todos los certificados solicitados, basta con apagar el servidor web, ejecutar certbot renew, y ponerlo en marcha de nuevo.

Ahora que ya tenemos un certificado, podemos continuar con el servidor web, Apache.

Instalación y configuración de Apache

Apache es un servidor web modular cuyo comportamiento se programa en uno o varios archivos de configuración. En cada distribución de Linux se presenta de una manera distinta. En Centos, todos los módulos vienen habilitados. En Debian y Ubuntu hay que habilitar a mano algunos para casos concretos, e incluso los hosts virtuales pueden encenderse o apagarse.

Para instalar Apache, ejecutaremos el siguiente comando:

apt update && apt install apache2

A continuación, habilitamos los módulos necesarios para usar SSL, redirigir a https y conectarse a los contenedores de Mastodon que funcionarán en el equipo: a2enmod ssl proxy_wstunnel rewrite headers

A pesar de que Apache nos lo solicite, aún no es momento de reiniciarlo. Debemos añadir y habilitar el fichero de configuración de la instancia. Por ejemplo, podemos situarlo en /etc/apache2/sites-available/miinstancia.conf. En su interior, se debe forzar el uso de https, y redirigir todas las solicitudes seguras hacia la instancia. Este podría ser un fichero de ejemplo:

<VirtualHost *:80> ServerName miinstancia.com:80 <IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^ - [E=protossl] RewriteCond %{HTTPS} on RewriteRule ^ - [E=protossl:s] RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] RewriteRule ^ http%{ENV:protossl}://%1%{REQUEST_URI} [L,R=301] </IfModule> </VirtualHost> <VirtualHost *:443> ServerAdmin correo@miinstancia.com ServerName miinstancia.com:443 SSLEngine on DocumentRoot /root/mastodon/public <LocationMatch "^/(assets|avatars|emoji|headers|packs|sounds|system)"> Header always set Cache-Control "public, max-age=31536000, immutable" Require all granted </LocationMatch> <Location "/"> Require all granted </Location> ProxyPreserveHost On RequestHeader set X-Forwarded-Proto "https" ProxyAddHeaders On ProxyPass /api/v1/streaming ws://localhost:4000/api/v1/streaming ProxyPass / http://localhost:3000/ ProxyPassReverse / http://localhost:3000/ ErrorDocument 500 /500.html ErrorDocument 501 /500.html ErrorDocument 502 /500.html ErrorDocument 503 /500.html ErrorDocument 504 /500.html CustomLog logs/ssl_request_log \ "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" BrowserMatch "MSIE [2-5]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 SSLProxyEngine on <IfModule mod_headers.c> Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" </IfModule> SSLHonorCipherOrder off SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 SSLProxyCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 SSLCertificateFile /etc/letsencrypt/live/miinstancia.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/miinstancia.com/privkey.pem SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 SSLProxyProtocol all -SSLv3 -TLSv1 -TLSv1.1 SSLSessionTickets on SSLUseStapling on SSLStrictSNIVHostCheck on </VirtualHost>

Para completar la configuración de Apache, habilitamos el nuevo fichero y reiniciamos:

a2ensite miinstancia systemctl restart apache2

¡Servidor listo! Si intentamos entrar desde el exterior, observaremos que la conexión es segura, y podremos acceder a la instancia. La cuenta de administrador creada al principio permitirá personalizar un montón de aspectos desde la web. Pero eso es algo que dejamos para otro día. ¡Feliz federación!

Algo de protección extra: inclusión del dominio en la lista de precarga

Al conectar a una web que fuerza conexiones seguras, como la que acabamos de construir, la mayoría de los usuarios escribirán su nombre en la barra de direcciones, sin anteponer el prefijo https. El navegador primero accederá por http estándar, y acabará siendo redirigido. Si bien esto no supone un fallo muy serio de seguridad, le puede dar una pista a un potencial espía de la URL exacta a la que queremos ir. Para evitarlo, los navegadores incluyen listas de precarga con dominios conocidos. Cuando un dominio está en la lista de precarga, el navegador inicia directamente una conexión segura con él.

Si quieres que tu dominio esté en esa lista, sigue estos pasos:

  1. Accede a la web https://hstspreload.org
  2. En el primer cuadro de edición, que automáticamente recibe el foco, escribe el nombre de tu dominio. No se admiten subdominios.
  3. Si se superan todos los requisitos, marca la casilla de aceptación y envía el formulario.
  4. Sigue los pasos 1 y 2 para comprobar el estado de precarga del dominio cada pocos días. Tardará varias semanas en estar listo, pero no dejes que esto te impida usar tu instancia con normalidad y anunciarla. Como se menciona en el título de la sección, es un extra que no interfiere.

Esto es todo por ahora. ¡Gracias por leer! Espero ver nuevas instancias pronto!

Syncthing, mi programa favorito para compartir archivos en grupo (Página de inicio on Un sitio solicitado por la comunidad, para la comunidad)

Imagina que quieres compartir una carpeta enorme con otra persona. Dejas la carpeta en tu nube favorita, y esperas pacientemente a que se sincronice con el servidor, un proceso que va a tardar horas. La otra persona comenzará a descargarla en cuanto se haya terminado de subir. Seguramente tardará menos horas que tú, porque su velocidad de descarga es algo mayor, pero le llevará también mucho tiempo. Para colmo, te has quedado sin espacio en tu cuenta y uno de los archivos no cabe. ¿Y si la transferencia se hiciera por P2P, directamente al ordenador de la otra persona, y el único límite estuviera en el espacio del disco duro?

Empecé a usar Syncthing allá por el 2016, cuando se puso de moda la sincronización P2P con BitTorrent Sync. A mí no me gustaba porque era algo muy centralizado, había que pagar por funciones extra y ocurrían cosas que no recuerdo con la privacidad. Así que me fui por la alternativa más libre, como siempre. Y desde entonces no la he soltado, ¡será por algo!

Syncthing permite sincronizar carpetas entre dispositivos de una manera casi descentralizada. Las transferencias son de un ordenador a otro, cifrando los datos y aplicando SSL a la conexión con certificados y claves privadas en ambos extremos. Pero dejemos la parte técnica para más adelante, y empecemos por lo fácil.

Instalación

Por defecto, el ejecutable de Syncthing para Windows funciona desde consola, almacena todos sus datos en appdata\local y deja una ventana abierta permanentemente, y eso queda feo. Además, no arranca solo al iniciar sesión. Hay que complementarlo con algo, y ese algo se llama Sync Trayzor.

Sync Trayzor se encarga de arrancar Syncthing, vigilar su actividad y enviar notificaciones cuando tienen lugar una serie de eventos, como cambios en las carpetas locales o dispositivos que se conectan y se desconectan. Se minimiza a la bandeja del sistema, y no deja ventanas molestas en medio. Una vez instalado y configurado, nos podemos olvidar de él.

La versión más reciente, compatible con sistemas ARM y de 64 bits, está aquí. Incluye instaladores y portables, y requiere .net Framework para funcionar: https://github.com/germancoding/SyncTrayzor/releases/latest

Al instalarlo y ejecutarlo, abrirá una ventana con una barra de menú. Desde Archivo > Preferencias se puede configurar todo lo necesario. Las únicas cosas que yo suelo cambiar están en la primera pestaña. Me interesa que Sync Trayzor arranque con Windows, que se minimice y se cierre a la bandeja del sistema, que arranque minimizado y que no envíe notificaciones cuando se conecta o desconecta alguien (de verdad, pueden ser muy molestas).

En Mac no existe Sync Trayzor, hay que instalar Syncthing como una aplicación normal y corriente: https://github.com/syncthing/syncthing-macos/releases/latest

En Linux, para no variar, depende de la distribución. El equipo de Syncthing tiene un repositorio propio para Debian y derivados, y en Centos, Fedora y compañía Syncthing está como paquete en el repositorio EPEL. Una vez instalado, se puede activar del siguiente modo: systemctl enable syncthing@usuario systemctl start syncthing@usuario

Aunque es jugar con fuego y no lo recomiendo, no tiene por qué pasar nada si ese usuario es root, sólo manejamos nosotros el sistema y está bien asegurado.

En Android, Syncthing se puede descargar desde la Play Store.

Ahora que ya hemos instalado Syncthing y está en funcionamiento, podemos empezar a jugar con él. No hay que preocuparse por las actualizaciones, llegarán de forma totalmente transparente y sin que nos enteremos (Windows), o se instalarán de la forma habitual, como cualquier otro paquete o aplicación (Mac, Linux y Android).

Primeros pasos

Syncthing se maneja desde la web. Concretamente, desde esta dirección. Su interfaz es plenamente accesible y muy intuitiva. Necesita alguna mejora, como todo, pero son detalles insignificantes. Se puede dividir la ventana en las siguientes regiones:

  • Menú principal.
  • Notificaciones (si las hay).
  • Carpetas.
  • Este dispositivo.
  • Otros dispositivos.
  • Enlaces a webs externas.
  • Diálogos varios (siempre se irán abajo del todo). Sólo aparecerán cuando los abramos nosotros.

Cómo obtener nuestro ID de dispositivo

Por defecto, nuestro dispositivo tiene un identificador único. No va asociado a la máquina, sino a los datos empleados en la generación de nuestro certificado y clave. Por lo tanto, una copia de Syncthing podría migrarse con todos sus datos de un ordenador a otro mientras no se ejecute varias veces simultáneamente. El nombre legible del dispositivo se copia del nombre del equipo, pero podemos editarlo. Para ello, haz lo siguiente:

  • En el menú principal, pulsa Acciones.
  • Pulsa Ajustes.
  • En el primer cuadro de edición que encontrarás, cambia el nombre de tu dispositivo.
  • Pulsa Guardar.

Los cambios de nombre no se reflejarán en el resto de la red, salvo al vincular nuevos dispositivos. Para no causar confusión, se recomienda un nombre único, tan único y duradero como el identificador.

Para conectar con otras personas, tendremos que pasarles (siempre en privado) nuestro identificador, o pedirles el suyo. Para conocer tu identificador de dispositivo, haz lo siguiente:

  • Pulsa Acciones.
  • Pulsa Mostrar ID.
  • Aparecerá el identificador, junto con un código QR. Copia el texto del identificador y dáselo a la otra persona.
  • Pulsa Cerrar.

Conexión con otro dispositivo

Si recibes un identificador de otra persona, busca y activa el botón “Añadir un dispositivo”. En el formulario que se muestra, introduce el identificador en el primer campo. En el segundo, introduce el nombre que quieres darle, o déjalo vacío para tomar el nombre remoto elegido por la otra persona. Finalmente, pulsa Guardar. ¿Esperabas más? Hay más cosas que se pueden configurar de cada dispositivo, pero no las veremos todavía.

Por otro lado, si eres tú quien comparte su identificador, recibirás una notificación en la parte superior de la ventana cuando un dispositivo nuevo quiera conectar contigo. Confirma que quieres agregarlo, y se desplegará un diálogo idéntico al anterior. Los campos de identificador y nombre estarán rellenos, con todo listo para que pulses el botón Guardar.

Creación de nuestra primera carpeta compartida

Hemos conectado con éxito con el otro dispositivo. En este momento, aparece como conectado, pero sin uso. Al pulsar intro sobre su encabezado, se desplegará una tabla debajo con la información del dispositivo. Se pueden ver ciertos datos sensibles, como la dirección ip del dispositivo, su versión de Syncthing y su sistema operativo. Por este motivo, lo ideal es conectar sólo con gente de mucha confianza. Ten en cuenta que tus “contactos” también podrán saber cuándo te conectas y te desconectas, y crear un perfil con tus hábitos frente al ordenador.

Ahora, vamos a compartir una carpeta. Para ello, busca y activa el botón “Agregar carpeta”. Se desplegará un diálogo en la parte inferior.

De nuevo, vamos a rellenar dos campos:

  • Etiqueta de la carpeta: el nombre que se verá en los otros dispositivos.
  • Ruta de la carpeta: la ruta absoluta a la carpeta, tal y como aparece en la barra de direcciones del explorador de Windows. Por ejemplo, D:\Carpeta compartida.

Pero esta vez no pulsaremos el botón Guardar. Mientras agregabas dispositivos, seguramente viste una lista con varios enlaces antes del formulario. Es una lista con “pestañas” que muestran otras partes del diálogo. En el diálogo de agregar carpeta, esa lista también está presente. Pulsamos sobre un enlace llamado “Compartiendo”.

Desde aquí, podremos seleccionar el dispositivo o dispositivos con los que se compartirá la carpeta. Marcamos los que queramos y esta vez sí, podemos pulsar Guardar.

¡Todo listo! Ahora, la carpeta se comportará como cualquier carpeta en la nube. Cuando dejemos un archivo, le llegará a la otra persona, y cuando lo borremos, desaparecerá. El navegador puede estar cerrado mientras hacemos un uso cotidiano de Syncthing.

Podemos añadir más dispositivos a la carpeta, pero hay un problema: si nuestro ordenador se apaga, no podrán comunicarse entre sí. De hecho, cualquier dato que llegue a la carpeta deberá pasar por nuestro equipo antes de propagarse. Somos el centro de comunicación entre dispositivos, y de transferencia de datos. No parece muy práctico, así que vamos a solucionarlo.

Creación de un clúster radial

Si has llegado hasta aquí, has completado los primeros pasos con Syncthing, así que ¡enhorabuena! Vamos a desatar toda la potencia del P2P.

En los apartados anteriores hemos conectado dos dispositivos, que podríamos llamar A y B. Ahora, queremos agregar a la misma carpeta un dispositivo C. Repetimos todos los pasos anteriores y lo conectamos, pero sólo queda vinculado al dispositivo que lo enlazó, por ejemplo al dispositivo A. El dispositivo A puede comunicarse con B y con C, pero B no puede comunicarse con C directamente. Para que esto sea posible, el dispositivo A debe convertirse en un “presentador”. Nos lo podemos imaginar en el centro de un círculo, presentando al resto de dispositivos entre sí, y estando estos en el exterior de la circunferencia. Si quieres indicar que uno de tus dispositivos enlazados es un presentador, haz lo siguiente:

  • Busca el dispositivo que quieres modificar y despliégalo pulsando intro sobre su encabezado.
  • Busca y activa el botón “Editar”.
  • En el diálogo que se muestra, pulsa intro sobre el enlace “Compartiendo” para activar la pestaña correspondiente.
  • Busca la casilla “Presentador” y márcala.
  • Explora esta parte del diálogo. Observa que se muestran todas tus carpetas, y están marcadas las que compartes con ese dispositivo.
  • Pulsa Guardar.

A partir de ahora, cuando ese dispositivo agregue más dispositivos a la carpeta, aparecerán automáticamente en tu lista de dispositivos, y cuando los elimine desaparecerán. Esto trae múltiples ventajas:

  • Si el presentador apaga su dispositivo, el resto de dispositivos seguirán comunicándose y sincronizando datos entre ellos.
  • Las transferencias hacia un dispositivo se repartirán entre todos, consiguiendo que cada uno tenga que enviar menos información y consumir menos ancho de banda para completar la sincronización de la carpeta.

Creación de un clúster en malla

Esta es una práctica posible, pero no recomendada. Consiste en marcar todos los dispositivos como presentadores en ambos extremos. Es decir, tanto el que invita como el invitado indican que el otro es un presentador. De esa forma, cualquiera puede vincular dispositivos a una carpeta existente y propagar por toda la red la información del nuevo dispositivo. Cuando un dispositivo se da de baja de la red y alguien lo elimina, la información sobre el mismo vuelve a propagarse, por lo que es imposible hacerlo desaparecer y nuestra lista puede acabar llena de dispositivos fantasma. Si Syncthing detecta que la casilla de presentador se marca en ambos lados, emitirá un mensaje de advertencia.

Carpetas sólo enviar o sólo recibir

Por defecto, las carpetas que creamos son de tipo “Enviar y recibir”. Esto significa que cualquiera puede modificar su contenido y propagar los cambios por toda la red. Pero a veces, nos puede interesar otro enfoque donde un dispositivo envíe algo y todos los demás lo reciban. Por ejemplo, imaginemos que tenemos los archivos de una web en nuestro disco duro, y todo preparado para sincronizar una carpeta con el servidor web. El servidor puede generar archivos temporales que no nos interesa recibir, pero queremos modificar la web y que los cambios queden reflejados allí casi al instante.

Al igual que con los dispositivos, las carpetas deben modificarse desde ambos extremos. Uno o más dispositivos pueden elegir que la carpeta sea de tipo “Sólo enviar”, mientras otros que sea “sólo recibir”. Esto no afecta a la hora de sincronizar el contenido, que se propagará por toda la red según corresponda. Para cambiar el tipo de una carpeta, haz lo siguiente:

  • Pulsa intro en el encabezado de la carpeta para expandirla.
  • Busca y activa el botón Editar.
  • Activa el enlace “Avanzado” para desplegar la parte correspondiente del diálogo.
  • Modifica el tipo de carpeta en el cuadro combinado correspondiente.
  • Finalmente, pulsa Guardar.

Se pueden modificar los archivos en una carpeta de tipo sólo recibir, pero no se propagarán por la red. Syncthing detectará que hay contenido que no debería estar ahí, y ofrecerá desde la web la posibilidad de eliminar las diferencias. El resto de dispositivos también verán que la carpeta no está totalmente sincronizada.

Syncthing y la privacidad

Como ya se ha mencionado anteriormente, las transferencias en Syncthing son seguras y van cifradas de extremo a extremo. Se realizan por conexiones SSL, y cada dispositivo dispone de su propio certificado y clave privada, generados la primera vez que arranca el programa. No obstante, hay algunas consideraciones de privacidad que se deben tener en cuenta:

  • Cada dispositivo puede ver la dirección ip y el estado (conectado, desconectado, sincronizando) de todos los que tiene agregados. Usa Syncthing para compartir contenido sólo con personas de confianza.
  • Ciertos datos pasan por los servidores del proyecto. Enseguida hablaremos más de ellos.

Componentes de Syncthing

Si bien es cierto que las transferencias en Syncthing suelen ser de equipo a equipo, este programa sólo es totalmente descentralizado en redes de área local. Sin embargo, a diferencia de otras soluciones de la competencia, todos los actores involucrados en el funcionamiento de Syncthing se pueden replicar y modificar desde la configuración. Veamos cuáles son:

  • Servidor de descubrimiento global: es el servidor que Syncthing usa para descubrir otros dispositivos por su identificador y conectar con ellos.
  • Repetidor: aunque Syncthing soporta UPNP y gestiona de forma transparente la apertura de puertos, a veces se encuentra con algún router que no tiene activada esta tecnología o un firewall muy estricto. En esos casos, recurre a un repetidor para sincronizar las carpetas. Los repetidores suelen reducir notablemente la velocidad de transferencia.
  • Servidor de lista de repetidores: un servidor al que Syncthing acude para buscar los repetidores disponibles, por si tuviera que usarlos.
  • Servidor de actualizaciones: el lugar donde el programa busca nuevas versiones.
  • Servidor de recopilación de datos y estadísticas: el lugar donde Syncthing envía datos de carácter anónimo para mejorar el producto, si se lo consentimos. La primera vez que abramos la web nos pedirá consentimiento mediante una notificación. Este consentimiento se puede modificar desde las opciones.

Se recomienda no modificar ninguno de estos servidores, a menos que sepas lo que estás haciendo y quieras montar una red completa y privada.

Conclusiones

Existen muchas más cosas que se pueden cambiar en Syncthing. Se pueden limitar las velocidades de descarga y subida por dispositivo, configurar la interfaz web para que sea accesible desde el exterior, asignar un nombre de usuario y contraseña, cifrar carpetas sólo en algunos dispositivos, comprimir los datos antes de transferirlos, y mucho más. Sin embargo, son aspectos muy avanzados que no afectarán a la experiencia general de uso, y por lo tanto no hablaremos de ellos en este tutorial.

Muchas gracias por leer hasta aquí. Ahora, ¡a sincronizar carpetas!

Cómo actualizar nuestros drivers con Driver Pack Solution evitando un montón de problemas (Página de inicio on Un sitio solicitado por la comunidad, para la comunidad)

A pesar de ser el sistema de escritorio más usado, Windows siempre ha tenido un gran problema con la gestión de sus actualizaciones. Hoy en día, mediante Windows Update recibimos actualizaciones del sistema, como siempre. Gracias a Winget y la Microsoft Store, podemos mantener nuestras aplicaciones actualizadas de un modo muy similar. Pero ¿qué pasa con los drivers? Los drivers, o controladores, son una parte esencial de nuestro sistema que no debemos descuidar. Son los encargados de gestionar la relación entre el sistema y todos los componentes físicos del equipo y dispositivos periféricos. A veces, por Windows Update nos puede llegar alguna actualización de controladores. Otras, el fabricante de un componente incluye su propio software para actualizar su controlador. Pero en la mayoría de casos, tan pronto como se instala el controlador para un dispositivo y funciona, queda olvidado y ya no volvemos a saber de sus actualizaciones. Los fabricantes del equipo, interesados en que quede obsoleto tan pronto como sea posible para que te compres otro, ofrecen actualizaciones a cuentagotas y durante muy poco tiempo. Sin embargo, está demostrado que unos controladores actualizados solucionan problemas, alargan la vida del equipo, e incorporan mejoras que nunca imaginaríamos que vienen de ahí. Existen muchas herramientas que permiten descargar e instalar los controladores más recientes para nuestros dispositivos. En este tutorial hablaremos de Driver Pack Solution, una de ellas. Lo que la diferencia de otras es algo que a mí me gusta mucho: puedes descargar todos los packs de controladores y no depender de Internet para configurar casi cualquier ordenador.

Descarga

Para descargar la versión más reciente de Driver Pack Solution, acudiremos a esta página. Si no es la primera vez que lo descargamos, puede ser útil comprobar el número de versión. En el momento de escribir este tutorial, la versión actual es la 17.10.14-24060. A continuación, asumiendo que queremos todos los packs, podemos descargar este torrent con nuestro cliente torrent favorito. La descarga ocupa unos 42 GB. Se recomienda añadir como excepción al antivirus la carpeta donde descarguemos Driver Pack Solution, ya que puede decidir borrar algunos de los ejecutables incluidos.

Se puede prescindir del torrent descargando el ejecutable en línea y los packs que se muestran más abajo, pero no se recomienda. Entre otras cosas, porque la velocidad de descarga directa es tan baja que nos devuelve a aquellos felices años donde había módems de 56K.

Ejecución de DriverPack

Teniendo a mano un buen descompresor, como WinRar o 7-Zip, y el torrent descargado por completo, es momento de descomprimir ficheros. Concretamente, empezaremos por el único comprimido que hay en la raíz: DriverPack_17.10.14-24060.7z. Es muy importante elegir la opción “Extraer aquí” o similares, ya que los archivos extraídos servirán para completar la estructura de carpetas existente.

A continuación, pulsamos intro sobre el archivo DriverPack.exe. Nos pedirá privilegios de administrador, y comenzará a realizar una serie de comprobaciones del sistema que pueden tardar varios minutos. Si detecta una conexión activa a Internet y nos invita a usarla, pulsaremos Cancelar para quedarnos sólo con el contenido fuera de línea.

Después del arranque, la interfaz de DriverPack está lista para su uso. Con NVDA, se puede manejar como si de una página web se tratara, empleando los modos foco y exploración cuando sea necesario.

Actualización de controladores

He aquí la parte complicada. Driver Pack Solution viene muy bien como herramienta de diagnóstico, pero si la dejamos hacer decidirá por nosotros, y esas decisiones puede que no nos gusten. Concretamente:

  • Puede instalar software publicitario y otros programas que a lo mejor no son deseados.
  • Puede forzar la instalación de controladores que hagan que el equipo se vuelva inestable.

Así que parece mejor idea hacer las actualizaciones a mano. Para ello, activamos un enlace llamado “Modo experto”. Se mostrará una tabla con controladores que se pueden actualizar, y posiblemente otra con controladores que se pueden instalar. Debemos quedarnos con el contenido de esas tablas. Una vez copiado, podemos cerrar Driver Pack Solution.

A continuación, extraeremos las partes que nos interesen de cada pack a una carpeta común, por ejemplo C:\drivers. Cada pack tiene una estructura similar en su interior: nombre del fabricante y sistemas para los que se ha hecho el controlador.

Imaginemos que queremos actualizar una tarjeta de red Realtek en un Windows 10 u 11 de 64 bits. Abrimos el archivo DP_LAN_Realtek-NT_24060.7z, y extraemos el contenido de realtek\matchver\FORCED\10x64 a la carpeta común. Por si acaso, podemos incluir ntx64 y 88110x64. Debemos hacer esto con todos los packs. Si surgen dudas sobre qué extraer, siempre es mejor pasarse que quedarse corto, aunque sin extraer los packs enteros, que ocupan muchísimo descomprimidos. Por ejemplo, para actualizar una placa base Intel, es más sencillo extraer toda la carpeta intel del pack de chipset.

Concluida la extracción, le llega el turno al administrador de dispositivos de Windows. Podemos abrirlo pulsando windows+r y escribiendo devmgmt.msc, o desde el menú que aparece al pulsar windows+x. Una vez abierto, comienza un proceso algo repetitivo:

  1. Abrimos el menú contextual del controlador que necesita actualizaciones, y elegimos “Actualizar controlador”.
  2. Pulsamos el botón “Examinar mi PC en busca de controladores”.
  3. Elegimos la carpeta donde están extraídos todos los drivers. Por ejemplo, C:\drivers. Nos aseguramos de que la casilla “Incluir subcarpetas” esté marcada. Si no es la primera vez que hacemos esto, todos los valores ya vendrán configurados y sólo tendremos que pulsar en Siguiente.
  4. Esperamos a que el controlador se actualice. Si es necesario reiniciar el equipo, lo reiniciamos antes de continuar con el siguiente controlador.

Algunos consejos útiles

  • Windows sabe lo que es mejor para él. Si el administrador de dispositivos se niega a actualizar un controlador, y hemos comprobado que está extraído en la carpeta, no hay que forzarlo. De lo contrario, pueden producirse problemas. Es normal que Driver Pack sugiera controladores que no debe, y que la tabla de actualizaciones nunca se quede vacía.
  • En otras ocasiones, Windows puede indicar que no hay nada que actualizar, simplemente porque no hemos extraído el controlador adecuado del pack correcto. Las tarjetas de sonido Realtek son un buen ejemplo de controladores repartidos entre varios packs, más aún si incluimos los componentes software de sus efectos de sonido.
  • Hay controladores cuyo nombre cuesta identificar al buscar su correspondencia en la tabla. Generalmente, si llevan la palabra ’estándar’ o ‘genérico’ en el nombre, pueden necesitar una actualización. Por ejemplo, un “Controlador Sata AHCI estándar” puede sustituirse por un “Intel Sata Ahci Controller” del paquete Mass Storage.
  • A veces los fabricantes pueden tener razón y Windows no ser tan infalible. Si algún dispositivo falla tras actualizar, revierte al controlador anterior.

2024-06-02

Creación de redes seguras con OpenVPN (Página de inicio on Un sitio solicitado por la comunidad, para la comunidad)

OpenVPN es un software que nos permite construir redes vpn seguras, aprovechando los estándares de cifrado TLS y los diversos algoritmos ofrecidos por OpenSSL y bibliotecas similares. En este tutorial veremos cómo configurar un servidor, y añadir algunos clientes. Además, a diferencia de otros tutoriales disponibles en la red, intentaremos mejorar la seguridad y nos centraremos en construir una subred a la que varios equipos puedan conectarse para interactuar entre sí.

1. Requisitos

  • Un servidor con Debian instalado y acceso como root. Asumiremos que estamos usando Debian 12.
  • Conocimientos suficientes para entender lo que aparece escrito por consola, ejecutar comandos básicos y editar ficheros.
  • Leves nociones sobre arquitectura de redes: direcciones ip, máscara de subred, etc.
  • Saber cuál es la dirección ip pública del servidor o, si la tiene, su ip dentro de la red local. En este tutorial asumimos que la ip del servidor es 192.168.1.2. Puedes conocer tu dirección ip con la utilidad ifconfig.
  • Saber cuál es el nombre del adaptador de red que tiene acceso a Internet. Puede ser eth0, o tener un nombre más complejo si el servidor es físico. Asumimos enp5s0f0. Puedes conocer los nombres de tus adaptadores con la utilidad ifconfig.

2. Instalación de OpenVPN en el servidor

Para instalar la versión estable más reciente, se recomienda acudir a los repositorios de OpenVPN, en vez de descargar el paquete ofrecido por nuestra distribución. Ejecutaremos los siguientes comandos en orden:

  • Agregamos la clave gpg de los repositorios: curl -fsSL https://swupdate.openvpn.net/repos/openvpn-repo-pkg-key.pub | gpg --dearmor > /etc/apt/trusted.gpg.d/openvpn-repo-pkg-keyring.gpg
  • Agregamos las URLs de los repositorios al sistema: echo "deb [arch=amd64 signed-by=/etc/apt/trusted.gpg.d/openvpn-repo-public.gpg] http://build.openvpn.net/debian/openvpn/stable bookworm main" > /etc/apt/sources.list.d/openvpn-aptrepo.list
  • Refrescamos el índice de paquetes: apt update
  • Y finalmente, instalamos los paquetes que nos interesan: apt install openvpn openvpn-dco-dkms
  • Podemos instalar una serie de paquetes que nos vendrán bien más adelante, especialmente si queremos saber los nombres de adaptadores de red y las direcciones ip: apt install net-tools iptables iptables-persistent
  • El paquete net-tools contiene la utilidad ifconfig, y el resto de paquetes permiten gestionar el cortafuegos del sistema incluido en el kernel.

3. Configuración de OpenVPN como servidor

OpenVPN es un software que se ha diseñado para ejecutarse tantas veces como sea necesario. Podemos tener uno o varios clientes conectados a una o varias redes de terceros, y uno o varios servidores ofreciendo redes de distintos tipos a nuestros clientes. En este tutorial, sólo montaremos un servidor dentro del sistema Debian. Más adelante, haremos una ampliación para que haya dos servidores. El resto de clientes irán en equipos independientes.

3.1. Creación de una autoridad de certificación propia

Para cifrar el tráfico entre todos los componentes de la red y verificar la autenticidad de la misma, trabajaremos con certificados de cliente y servidor. Dichos certificados irán firmados por una autoridad de certificación propia. Podríamos recurrir a una de terceros, pero no nos va a dar tanta flexibilidad, y el resultado va a ser el mismo. OpenVPN viene con easy-rsa, un conjunto de scripts que facilitan la creación y gestión de autoridades y certificados. Usaremos easy-rsa para generar la autoridad, un certificado para el servidor, y tantos certificados extra como clientes vayan a conectarse. En este caso, se entiende por cliente el dispositivo, no la persona. Ya entraremos más adelante en el terreno de la autentificación con usuario y contraseña. Nuestra autoridad de certificación se aloja dentro de una carpeta, por ejemplo /etc/openvpn/certs. La generaremos con el siguiente comando: make-cadir /etc/openvpn/certs Los scripts de easy-rsa se copiarán dentro de la carpeta recién creada. Por defecto, generarán certificados y claves RSA. Si bien es cierto que a día de hoy son suficientemente seguros, nos interesa cambiarlos por ecdsa por diversas razones: en el futuro escalarán mejor, y requieren menos potencia de procesamiento para ofrecer un cifrado igual de fuerte. Por lo tanto, vamos a editar el archivo /etc/openvpn/certs/vars y añadir lo siguiente al final (o seguir los consejos del propio archivo y quitar los comentarios en las líneas apropiadas):

set_var EASYRSA_ALGO ec set_var EASYRSA_CURVE secp384r1 set_var EASYRSA_DIGEST "sha512"

De paso, hemos aprovechado para indicar que se use sha512 en vez de sha256 al calcular la suma de verificación de los certificados. Ahora, navegamos al directorio en cuestión, si no lo habíamos hecho ya: cd /etc/openvpn/certs El siguiente paso consiste en inicializar la infraestructura de clave pública, utilizando nuestro fichero de variables previamente editado: ./easyrsa --vars=/etc/openvpn/certs/vars init-pki Generamos nuestra autoridad de certificados raíz: ./easyrsa --vars=/etc/openvpn/certs/vars build-ca nopass La opción nopass hará que la clave privada no se cifre con una contraseña, lo que aporta cierta comodidad al generar certificados más adelante. Si queremos cifrarla e introducir la contraseña cada vez que usemos la autoridad, basta con quitar la opción. Para completar la generación de la autoridad, rellenamos los datos solicitados por el asistente interactivo. Generamos el fichero de parámetros de cifrado, siempre indicando qué variables usar: ./easyrsa --vars=/etc/openvpn/certs/vars gen-dh Ya tenemos nuestra autoridad lista para generar certificados de servidor y clientes. El certificado de la autoridad, necesario más adelante, está en el archivo ca.crt dentro de la carpeta pki.

3.2. Generación de un certificado de servidor

El certificado de la autoridad de certificación sólo se usará para firmar otros certificados, pero no cifrará las conexiones entre los clientes y el servidor. Aprovechando nuestra autoridad, vamos a generar uno específico. En esta ocasión, no es recomendable cifrar la clave privada con contraseña: ./easyrsa --vars=/etc/openvpn/certs/vars build-server-full midominio.com nopass Si aparece un asistente interactivo, lo rellenamos con la información solicitada. Todos los certificados se almacenan en la subcarpeta issued dentro de la carpeta pki, y todas las claves privadas en la subcarpeta private.

3.3. Listas de revocación y clave extra de cifrado

A veces, el certificado de un cliente puede verse comprometido, por lo que puede hacerse necesario revocar su validez. Nuestra infraestructura de clave pública debe mantener una lista actualizada con aquellos certificados que se han revocado. Debemos ejecutar el siguiente comando después de generar, renovar y revocar cualquier certificado, ya sea de servidor o de cliente: ./easyrsa --vars=/etc/openvpn/certs/vars gen-crl Ahora, vamos a hacer algo que le va a dar más cifrado al cifrado. Si bien es cierto que un atacante que interceptara nuestras comunicaciones lo tendría ya muy complicado para saber lo que hacemos, puede deducir que nuestro tráfico va cifrado mediante TLS. Con la clave que generaremos a continuación, ofuscaremos el tráfico TLS para que no parezca tráfico TLS: openvpn --genkey tls-crypt-v2-server tls-server-key.key Con todo esto, estamos preparados para elaborar un fichero de configuración de OpenVPN.

3.4. El fichero de configuración de OpenVPN

Como hemos mencionado anteriormente, OpenVPN puede ejecutar tantas instancias de cliente y servidor como sea necesario. Cada instancia usa su propio fichero de configuración. Para facilitar la diferenciación entre clientes y servidores, los ficheros de cliente se almacenan en /etc/openvpn/client, y los ficheros de servidor en /etc/openvpn/server. Los ficheros que se usan para configurar OpenVPN en modo conexión punto a punto pueden ir fuera de estas carpetas. Sin embargo, todos deben tener la extensión .conf. A continuación, vamos a crear un fichero en /etc/openvpn/server. Lo llamaremos servidor.conf. Encima de cada línea, hay comentarios explicando su propósito.

# Indicamos cuál es la ip del servidor, ya sea pública o dentro de una red de área local local 192.168.1.2 # Puerto en el que escucha el servidor. Debe estar abierto en el router o firewall de la NAT, si lo hay, así como en el firewall del sistema port 1194 # Dispositivo que se utilizará. El más sencillo es tun. Por su parte, tap proporciona una integración con la lan a más bajo nivel, pero su configuración es mucho más compleja dev tun # Parámetros del servidor: formato de la subred y máscara de subred. Los clientes que se conecten recibirán una ip en este rango. Cuidado, la subred de la VPN no debe coincidir con la subred del servidor. De lo contrario, podemos perder el contacto con la máquina. server 10.0.0.0 255.255.255.0 # Protocolo de conexión. Se pueden usar TCP o UDP. Parecería que TCP es más estable, pero UDP ya tiene mecanismos equivalentes para evitar errores. Por tanto, TCP es más lento y sólo debería emplearse cuando no se pueda recurrir a UDP. proto udp # Modo rápido de entrada y salida de datos, puede acelerar las comunicaciones. Sólo en UDP fast-io # Las claves persisten en memoria y no se vuelven a leer al recibir señales del sistema persist-key # El túnel permanece abierto aunque se reciban ciertas señales del sistema persist-tun # cantidad de información que se almacena en el registro verb 3 # Ruta al archivo de registro de esta instancia log /var/log/openvpn/openvpn.log # Reforzamos el algoritmo de autentificación auth SHA512 # Si la instancia se desconecta, notifica a las partes conectadas para que actúen en consecuencia. Muy eficiente en UDP explicit-exit-notify 1 # Cuando se complete la autentificación, se guardará un token en memoria para no tener que repetirla tras una caída auth-gen-token # Los clientes conectados podrán verse unos a otros. Útil, por ejemplo, para jugar a juegos en línea client-to-client # Las direcciones ip de los clientes se almacenarán en este fichero para no recibir una nueva dirección en cada conexión ifconfig-pool-persist /var/log/openvpn/ip.txt # Cantidad máxima de clientes que se conectarán a la red. No debería haber más de 250 max-clients 100 # Ruta al certificado de la autoridad que generamos al principio ca /etc/openvpn/certs/pki/ca.crt # Ruta al certificado del servidor cert /etc/openvpn/certs/pki/issued/midominio.com.crt # Ruta a la clave privada del servidor key /etc/openvpn/certs/pki/private/midominio.com.key # Ruta al fichero de lista de revocación de la autoridad crl-verify /etc/openvpn/certs/pki/crl.pem # Ruta a los parámetros dh generados dh /etc/openvpn/certs/pki/dh.pem # Los certificados remotos enviados por los clientes que se conecten deben ser de tipo cliente remote-cert-tls client # Reforzamos los algoritmos de cifrado de la conexión. Sólo se admitirán los más recomendados, descartando los que se consideran más débiles tls-cert-profile preferred # Ruta a la clave de ofuscación del tráfico tls-crypt-v2 /etc/openvpn/certs/tls-server-key.key # Indicamos explícitamente que actuaremos como servidor TLS tls-server # La versión mínima del protocolo TLS será la 1.2 tls-version-min 1.2 # Tiempo que permanecerán abiertas las conexiones keepalive 10 120 # Forzamos explícitamente que esta instancia actúe como servidor mode server # Indicamos que su topología es de subred topology subnet # Transmitimos a los clientes directivas de configuración. Todo el tráfico irá dirigido por la VPN push "redirect-gateway" # Nuestro router, que incluye un servidor DNS, actuará como DNS push "dhcp-option DNS 192.168.1.1" # Algoritmos de cifrado de transmisión de datos data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305 # Además de la autentificación de cliente con certificado, también se debe introducir un usuario y una contraseña plugin /usr/lib/openvpn/openvpn-plugin-auth-pam.so "login login USERNAME password PASSWORD"

3.5. Cambios de configuración en el kernel y retoques finales

Ahora que ya tenemos un fichero de configuración completo, estamos listos para iniciar el servidor VPN. Podemos hacerlo con este comando: systemctl start openvpn-server@servidor Lo que va después del símbolo arroba es, como se puede deducir, el nombre del fichero de configuración, sin la extensión .conf. Con este otro comando, configuraremos el servidor para que arranque al iniciar el sistema: systemctl enable openvpn-server@servidor Pero ahora nos enfrentamos a un problema: esta red va a dejar a los clientes sin acceso a Internet. Podrán verse unos a otros e interactuar entre sí, pero no podrán usar el servidor para comunicarse con el exterior. Para resolverlo, editaremos el fichero /etc/sysctl.conf o, si es posible, crearemos un fichero .conf nuevo en /etc/sysctl.d con el nombre que queramos. Lo único que se debe hacer, independientemente de la opción elegida, es descomentar o escribir la siguiente línea y guardar los cambios:

net.ipv4.ip_forward=1

Podemos reiniciar el servidor para que los cambios surtan efecto, o ejecutar el comando sysctl -p para aplicarlos de inmediato. Esto, sin embargo, no es suficiente. Hay que indicar a iptables que el tráfico recibido de la red interna se dirija a la red externa. Si prefieres usar UFW, puedes hacerlo. El comando con iptables sería el siguiente:

# Recuerda ajustar tu subred y tu adaptador con los valores que correspondan iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o enp5s0f0 -j MASQUERADE

Perfecto, nuestros clientes ya podrán acceder a Internet usando la VPN, pero sólo hasta que el servidor se reinicie! Después, habrá que ejecutar el comando iptables otra vez. UFW se encarga de guardar la configuración para evitar esta situación. Sin UFW, se puede usar un comando como este para guardar las reglas actuales en disco y configurarlas para que carguen al arrancar: netfilter-persistent save

4. Configuración de los clientes

¿De qué serviría un servidor si los clientes no pueden conectarse a él? Es exactamente lo que sucede con la instancia de OpenVPN que acabamos de poner en marcha. En esta sección, vamos a preparar dos clientes para una misma persona. Uno de ellos será un ordenador con Windows, y otro un iPhone.

4.1. Generación de los certificados de cliente

Supongamos que el propietario de los dos dispositivos se llama Pedro. Vamos a generar dos certificados, dos claves privadas, y dos claves de ofuscación de tipo cliente para él. En la consola, debemos navegar al directorio /etc/openvpn/certs, si es que nos habíamos salido de él. Una vez allí, ejecutamos los siguientes comandos: ./easyrsa --vars=/etc/openvpn/certs/vars build-client-full pedro-windows nopass inline ./easyrsa --vars=/etc/openvpn/certs/vars build-client-full pedro-iphone nopass inline Si aparecen asistentes interactivos solicitando información, debemos rellenarla. La opción nopass indica que las claves privadas no deben ir cifradas con contraseña. La opción inline genera un fichero de credenciales con el certificado y la clave, que podremos usar como punto de partida para construir el fichero que recibirá el cliente. En este caso, nuestros ficheros de credenciales son /etc/openvpn/certs/pki/pedro-windows.creds y pedro-iphone.creds en la misma ruta. Importante refrescar la lista de revocación en cuanto hayamos terminado esta parte. Para generar las claves de ofuscación de los clientes, necesitaremos hacer referencia a la clave de ofuscación del servidor. Los comandos quedarían de una forma similar a esta: openvpn --tls-crypt-v2 /etc/openvpn/certs/tls-server-key.key --genkey tls-crypt-v2-client tls-client-pedro-windows.key openvpn --tls-crypt-v2 /etc/openvpn/certs/tls-server-key.key --genkey tls-crypt-v2-client tls-client-pedro-iphone.key

4.2. Generación de una cuenta para el cliente

Además de un certificado único, una clave privada única y una clave de ofuscación única, podemos reforzar la seguridad obligando a los clientes a que introduzcan un nombre de usuario y una contraseña. Esto, normalmente, se consigue mediante plugins. OpenVPN viene con un plugin que nos permite usar las cuentas del sistema, y que ya agregamos mientras preparábamos el servidor. Existen algunos plugins más, pero suelen ser de pago y quedan fuera de este tutorial. Agreguemos una cuenta de usuario para Pedro: useradd pedro Y ahora, démosle una contraseña: passwd pedro Ya está todo preparado para que Pedro se conecte, salvo una cosa: Pedro necesita dos archivos de configuración que no tiene.

4.3. Generación de los archivos de configuración

A pesar de que OpenVPN se puede configurar con un archivo conf y certificados en diferentes rutas, como hemos hecho en el servidor, es más cómodo para los clientes tener un único fichero con toda la información necesaria para conectarse. Como dijimos antes, los ficheros de credenciales son un buen punto de partida. En este apartado veremos un archivo de configuración de ejemplo con todo lo necesario. Deberemos crear un archivo por cada dispositivo, y deben tener la extensión .ovpn.

# Utilizaremos el protocolo UDP proto udp # Con entrada y salida de datos rápida fast-io # Al igual que en el servidor, la clave y el túnel persisten a pesar de las señales del sistema que se reciban persist-key persist-tun # Servidor y puerto al que nos conectaremos remote midominio.com 1194 # Asumimos el rol de cliente en la VPN client # Y lo mismo al cifrar las comunicaciones con TLS tls-client # Reforzamos el algoritmo de autentificación auth SHA512 # Antes de desconectarnos, notificaremos al servidor para que libere recursos de forma eficiente explicit-exit-notify 1 # Sólo se acepta el certificado TLS si este es de tipo servidor remote-cert-tls server # La versión mínima soportada de TLS será la 1.2 tls-version-min 1.2 # El servidor necesita autentificación con usuario y contraseña auth-user-pass # El usuario y la contraseña, por seguridad, no se almacenan en memoria una vez se han usado auth-nocache # Tipo de dispositivo de red dev tun # Autoridad certificadora <ca> Contenidos del fichero /etc/openvpn/certs/pki/ca.crt. Viene en el fichero de credenciales. </ca> # Certificado del cliente <cert> Contenidos del archivo /etc/openvpn/certs/pki/issued/pedro-windows.crt o pedro-iphone.crt, según corresponda. Viene en el fichero de credenciales. </cert> # Clave privada del cliente <key> Contenidos del fichero /etc/openvpn/certs/pki/private/pedro-windows.key o pedro-iphone.key, según corresponda. Viene en el fichero de credenciales. </key> # Clave de ofuscación <tls-crypt-v2> Contenidos del archivo de clave de ofuscación del cliente, según corresponda. No viene en el fichero de credenciales. </tls-crypt-v2>

Ahora ya tenemos todo lo necesario para que el cliente se conecte: un archivo de configuración, un usuario y una contraseña. Podrá entrar en la VPN, interactuar con los demás clientes a través de ella, y visitar sitios web dificultando que los atacantes espíen su tráfico. Sin embargo, no podríamos finalizar este tutorial sin mencionar los principales clientes.

5. OpenVPN y OpenVPN Connect

OpenVPN, aunque es software libre y acepta colaboraciones de la comunidad, dispone de una versión de pago con opciones avanzadas para empresas. Una de sus soluciones, OpenVPN Access Server, facilita la gestión de certificados, cuentas de usuario y distribución de configuraciones de cliente, y admite dos usuarios totalmente gratis. Por otro lado, si no disponemos de servidor propio, se puede usar la nube de OpenVPN, y establecer una conexión a través de sus propias redes. Ofrece tres conexiones gratuitas. En cuanto a clientes, en la web se hace una diferenciación: por un lado están los de la comunidad, y por otro OpenVPN Connect, más orientado al mundo empresarial. En realidad, tienen características muy parecidas y funcionan de manera similar. En Windows, OpenVPN Connect está creado con una interfaz Electron que, por algún motivo desconocido, resulta casi imposible de manejar con lectores de pantalla. Por tanto, es mejor el cliente libre: https://openvpn.net/community-downloads/ La interfaz de este segundo cliente está en español y utiliza controles clásicos. Desde su icono en la bandeja del sistema y su ventana podremos hacer las principales operaciones: importar archivos de configuración, conectarnos e introducir el nombre de usuario y la contraseña. Por si fuera poco, también facilita la gestión de archivos .ovpn en el explorador de Windows. Dispone de opciones más avanzadas, y se puede usar para levantar un servidor en Windows, pero eso queda fuera de este tutorial. En las plataformas móviles, OpenVPN Connect se vuelve más manejable, y es la única alternativa que tenemos. Se puede descargar para iPhone y Android. Puede importar archivos de configuración desde una URL, y puede aceptar archivos compartidos desde otras aplicaciones. Por el momento, no es capaz de importar archivos almacenados en el teléfono desde la propia app, al menos en iPhone.

6. Anexo: creación de una red de puente

Este apartado está pensado sólo para servidores Linux caseros (tipo Raspberry Pi) y clientes Windows. Al profundizar como vamos a hacer, las diferencias entre plataformas ya comienzan a notarse y hacen que todo se vuelva más complejo. A lo largo de este tutorial hemos creado una VPN que nos permite redirigir nuestro tráfico de Internet, conectarnos con otros dispositivos e intercambiar información de manera segura como si todos estuvieran en la misma red. Sin embargo, hay paquetes de red a bajo nivel que no pasan por la VPN, y nos pueden servir para tareas tales como buscar y conectarnos a dispositivos que se encuentran en la red de casa, o simplemente desviar esos paquetes también por nuestra red. Con las mejoras que aplicaremos a continuación, los dispositivos que tenemos en casa podrán vernos y conectarse como si nuestro equipo estuviera ahí, y será el router el encargado de asignarnos una dirección IP. Para conservar la implementación hecha hasta aquí, trabajaremos sobre un nuevo archivo de configuración creado a partir del que ya tenemos. Lo llamaremos servidor-tap: cp /etc/openvpn/server/servidor.conf /etc/openvpn/server/servidor-tap.conf Ahora, editamos el fichero servidor-tap.conf y realizamos los siguientes cambios:

  • Cambiamos el puerto 1194 por otro, por ejemplo el 1195: port 1195
  • Eliminamos la línea dev tun, ya que usaremos otro dispositivo. En su lugar, escribiremos dev tap0
  • Eliminamos la línea que comienza por server, ya que no definiremos una subred propia. En su lugar, escribimos esto: server-bridge
  • Podemos tener un registro independiente para esta nueva instancia: log /var/log/openvpn/openvpn-tap.log
  • Eliminamos la línea que comienza por ifconfig-pool-persist. Ahora el encargado de asignarnos dirección IP no es OpenVPN.
  • Eliminamos la línea que comienza por push “dhcp-option DNS…, ya que será el router quien nos indique los servidores DNS.

Podemos reutilizar un fichero de cliente en Windows. Los cambios son bastante más simples en este caso. Basta con sustituir la línea dev tun por dev tap.

Para acabar, generaremos y ejecutaremos un script en el servidor. Dicho script permitirá iniciar y detener el puente de red que usará el servidor VPN en modo tap. Se debe configurar con mucho cuidado, especialmente si trabajamos por ssh. Cualquier descuido nos puede dejar sin red hasta el reinicio del dispositivo. El script que se proporciona a continuación construye el puente, modifica iptables para que la VPN de apartados anteriores siga funcionando, y pone en marcha la nueva si se llama con el argumento start. Si se llama con el argumento stop, deshace todos los cambios que ha hecho. Podemos alojarlo en el archivo /usr/local/bin/openvpn-bridge. Antes de probarlo, se deben modificar las primeras líneas y adaptarlas a nuestras necesidades:

#!/bin/sh # Interfaz de puente. Se puede dejar la que viene por defecto br="br0" # Lista de interfaces tap que participan en el puente, # por ejemplo tap="tap0 tap1 tap2". # Se puede dejar la que viene tap="tap0" # Interfaz de red real del sistema # Mismo nombre de adaptador que en el tutorial eth="enp5s0f0" # Ip local del servidor y máscara de subred en formato abreviado eth_ip_netmask="192.168.1.2/24" # Ip de broadcast. Suele ser la 255 de la subred eth_broadcast="192.168.1.255" # Puerta de enlace. Suele coincidir con la IP del router eth_gateway="192.168.1.1" # MAC del adaptador de red del servidor. Se la asignaremos al adaptador de puente para que el router no note la diferencia eth_mac="1a:2b:3c:4d:5e:6f" case "$1" in start) for t in $tap; do openvpn --mktun --dev $t done brctl addbr $br brctl addif $br $eth for t in $tap; do brctl addif $br $t done for t in $tap; do ip addr flush dev $t ip link set $t promisc on up done ip addr flush dev $eth ip link set $eth promisc on up ip addr add $eth_ip_netmask broadcast $eth_broadcast dev $br ip link set $br address $eth_mac ip link set $br up ip route add default via $eth_gateway systemctl start openvpn-server@servidor-tap # Adaptar subred si es necesario iptables -t nat -D POSTROUTING -s 10.0.0.0/8 -o $eth -j MASQUERADE iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o $br -j MASQUERADE ;; stop) systemctl stop openvpn-server@servidor-tap # Adaptar subred si es necesario iptables -t nat -D POSTROUTING -s 10.0.0.0/8 -o $br -j MASQUERADE iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o $eth -j MASQUERADE ip link set $br down brctl delbr $br for t in $tap; do openvpn --rmtun --dev $t done ip link set $eth promisc off up ip addr add $eth_ip_netmask broadcast $eth_broadcast dev $eth ip route add default via $eth_gateway ;; *) echo "Usage: openvpn-bridge {start|stop}" exit 1 ;; esac exit 0

Ahora que toda la información está en el script, lo convertimos en ejecutable: chmod +x /usr/local/bin/openvpn-bridge Y para terminar, ponemos en marcha nuestra nueva VPN basada en puente de red: openvpn-bridge start Para detener el puente y devolver la red a su estado anterior: openvpn-bridge stop De momento, no se dan instrucciones para que el puente se ponga en marcha al iniciar el sistema. Tal vez lo hagamos en una próxima revisión de este tutorial. Tras completar este apartado, tenemos no uno, sino dos servidores VPN. El primero podemos compartirlo con invitados de confianza que dispongan de una amplia variedad de dispositivos. El segundo creará una relación más profunda y cercana con nuestra red y sus dispositivos, y funcionará sólo con clientes que tengan Windows.

7. Referencias

He tenido que leer diversos tutoriales en la red para hacerme una idea de la configuración que más se ajustaba a lo que quería. Y como siempre, me olvido de quién los ha escrito y de su dirección. Sin embargo, no me baso en ellos para escribir los míos propios, sino en las fuentes de información que acompañan al producto:

  • Página de manual de OpenVPN, disponible en /usr/share/doc/openvpn/openvpn.8.html. Existen versiones equivalentes en línea, pero ninguna tan actualizada como la que acompaña al paquete.
  • Por qué deberías usar certificados ECC en vez de RSA: https://www.thesslstore.com/blog/you-should-be-using-ecc-for-your-ssl-tls-certificates/
  • La ayuda de easy-rsa, que se puede obtener con el comando ./easyrsa help.
  • Las páginas de documentación de OpenVPN, en las que se explica, entre otras cosas, cómo agregar el repositorio para Debian y ciertos conceptos de red que pueden no quedar claros al principio.
  • Y mucha, mucha paciencia y pruebas, en las que ha habido no pocos errores.

¡Muchas gracias por leer hasta aquí! Si tienes un servidor VPS, ahora te toca a ti.

Tutorial: Instalación de Arch Linux de forma accesible (Página de inicio on Un sitio solicitado por la comunidad, para la comunidad)

Hola a todos. En esta entrada vengo con un tutorial muy especial, un tutorial que lleva años en un archivo en mi disco duro y que ha evolucionado muchísimo a lo largo del tiempo. Empecé haciéndolo para publicarlo en una web de cuyo nombre no quiero acordarme, después lo conservé y lo actualicé para mí, para no olvidar lo que en él se cuenta, y ahora he vuelto a adaptarlo para publicar una vez más. Esta vez no hablaremos de un programa, servicio o protocolo, sino de un sistema operativo completo. Un sistema que tal vez no esté preparado para sustituir a Windows todavía, o tal vez sí. Eso dejaremos que lo decida cada uno después de leer y probar por sí mismo. Antes de entrar en faena, pido perdón a los que saben más de Linux que yo y lo usan diariamente, pues estoy seguro de que este documento no está exento de errores y suposiciones que a lo mejor en realidad resultan de otra manera. Lo he hecho lo mejor que he podido, esforzándome para que los usuarios con menos conocimientos entiendan cuál es el propósito de cada comando, paquete o ajuste realizado. Dicho todo esto, ¡empezamos!

Introducción

En este tutorial vamos a instalar Arch Linux, una distribución ligera, simple y flexible de Linux, y lo vamos a hacer de forma accesible en una máquina virtual, con instrucciones para hacerlo también en un equipo físico o preparar un pen drive que se pueda conectar a cualquier ordenador. Al acabar, y si se siguen bien todos los pasos del tutorial, Arch Linux debería estar ejecutándose en español, con varios escritorios y lector de pantalla .

¿Qué caracteriza a esta distribución?

Arch Linux se caracteriza por ser una distribución pequeña, potente, simple y flexible. No se suele usar en entornos de producción, ya que actualiza los paquetes en cuanto son publicados por sus respectivos desarrolladores, y esto puede generar cierta inestabilidad aunque hayan sido calificados como estables. Viene muy bien para desarrollar y hacer pruebas de todo tipo, y para conocer Linux en toda su extensión. Arch no tiene herramientas que automaticen cosas tales como la instalación del sistema o la configuración de ciertos paquetes, y por tanto hay que operar a bajo nivel. Otra característica por la que Arch destaca es el Arch User Repository (aur), que contiene software en forma de código fuente, así como archivos de configuración para poder compilarlo sin errores, de forma automatizada y con las dependencias necesarias. Visitar el sitio web de Arch Linux

Requisitos de software

Para poder hacer todos los pasos descritos en este tutorial, se ha utilizado el siguiente software. Hay programas alternativos que hacen las mismas funciones, pero no se han probado a la hora de hacer este proceso y podrían dar malos resultados:

Conocimientos necesarios

Para no tener problemas durante la instalación de Arch, hay que disponer de los siguientes conocimientos:

  • Manejo del OCR, la navegación por objetos y los comandos de revisión de NVDA (sólo en máquina virtual y con acceso SSH).
  • Experiencia a la hora de crear y configurar máquinas virtuales, ya que en este tutorial no se explicará nada sobre ello.
  • Tener experiencia manejando algún intérprete de línea de comandos, ya sea cmd o bash, y comprender los resultados devueltos por la ejecución de un comando.

Preparación del equipo y el medio de instalación

Bien, teniendo todas las herramientas citadas en el apartado anterior, podemos comenzar.

Creación de la máquina virtual

Para este tutorial se ha utilizado una máquina virtual con las siguientes características:

  • Memoria ram: 4 GB, aunque se puede reducir bastante, incluso hasta 512 MB
  • Procesador: Se han utilizado 6 procesadores con 2 cores y virtualización de IOMU, pero la máquina puede ejecutarse sin problema con mucha menos potencia.
  • Disco duro: 32 GB NVMe, dividido en varios archivos y con expansión dinámica
  • red: Para poder trabajar con la máquina independientemente del lugar en el que nos encontremos, se ha usado nat. Se puede poner en bridged para situar la máquina en la misma subred que el resto de equipos físicos, o añadir un adaptador bridged más adelante.
  • Tipo de bus: paravirtualized SCSI. Se puede elegir sin problema cualquiera de los otros.
  • Compatibilidad del hardware: Workstation 17.5.x, aunque las anteriores tampoco deberían dar problemas.
  • Teclado mejorado.
  • Controlador USB 3.1.
  • Aceleración de gráficos.
  • Resto de parámetros: Se pueden dejar por defecto. En el asistente de creación diremos que instalaremos el sistema más tarde, y que es un Linux de tipo Other Linux kernel 6.x 64-bit. No olvidemos apuntar la unidad de cd al archivo iso del sistema operativo.

A continuación, en las opciones avanzadas de la máquina virtual, pestaña Options, categoría Advanced, podremos elegir el tipo de firmware. Elige BIOS si quieres emular un pc tradicional, o Uefi si deseas un firmware más moderno. La forma de particionar e instalar el gestor de arranque varían.

Preparación del medio de instalación

Al arrancar la máquina virtual por primera vez, se escucharán dos tonos ascendentes. Dichos tonos indican que el menú de arranque de Isolinux está en pantalla, listo para elegir una opción. Entraremos en la máquina, pulsaremos flecha abajo y a continuación enter. Si tomamos instantáneas con el OCR, veremos que el sistema se va cargando, se montan los sistemas de archivos, se inicia la red, etc. Por último, escucharemos a Speakup hablando, veremos que root ha iniciado sesión automáticamente, y que la consola está lista para escribir comandos. Es en este momento cuando entraremos dentro de la máquina. Lo primero que se debe hacer es poner el teclado en español. Esto se hace llamando a loadkeys, que recibe como parámetro un archivo de mapa de teclado. En nuestro caso: loadkeys es Y ya estamos listos para escribir comandos.

Personalización de la voz de Speakup

Speakup comenzará hablando en inglés, algo que puede ser muy incómodo si no somos angloparlantes. Para cambiar el idioma de la voz, deberemos editar el archivo que carga el servicio del lector de pantalla. Usaremos un comando como este para hacerlo: nano /lib/systemd/system/espeakup.service La consola cambiará radicalmente al ejecutar este comando, mostrando el editor de textos nano. Podemos usar las flechas para movernos por el texto, NVDA y Speakup anunciarán correctamente nuestra posición. Usando las flechas, buscaremos una línea con el siguiente contenido: environment="default_voice=" Y la completaremos del siguiente modo: environment="default_voice=es" Para guardar los cambios, pulsamos control+x, la y para confirmar, y enter. Después, ejecutamos estos dos comandos para recargar la unidad de servicio modificada y reiniciarlo: systemctl daemon-reload systemctl restart espeakup Speakup ya debería hablar con una voz española. Si queremos subir el volumen, este comando puede servir: amixer set Master 100%

Conexión a Internet

Arch Linux necesita descargar sus paquetes desde la red. Se puede preparar un medio de instalación con paquetes ya descargados, pero el método para hacerlo se sale del propósito de esta guía. Al trabajar con una máquina virtual, esta ya estará conectada, por lo que puedes saltar a la siguiente sección. Antes de hacerlo, no obstante, sincroniza el reloj con el comando que aparece al final. Si instalas Arch en un equipo real, lo mejor que puedes hacer es conectarlo por cable a la red. Si dispones de un router con dhcp, todo lo demás sucederá automáticamente. Para conectarte a una red wi-fi, desbloquea los adaptadores disponibles, que podrían estar bloqueados por software: rfkill unblock all Después, abre la consola de iwd: iwctl En ella, se pueden enumerar los dispositivos disponibles: device list A continuación, buscar redes: station dispositivo scan. Sustituye dispositivo por el identificador de tu dispositivo. Y verlas: station dispositivo get-networks Finalmente, para conectar: station dispositivo connect nombre_red Si el nombre de la red contiene espacios, debe ir entre comillas. El programa preguntará la contraseña, si la red está cifrada. Para salir de la utilidad iwctl, se debe pulsar ctrl+d. Ahora que está conectada, podemos acceder mediante SSH a la máquina. Pero antes, sincronicemos el reloj con este comando: timedatectl set-ntp true

Acceso mediante SSH

El acceso mediante SSH nos permitirá instalar Arch desde una consola tradicional de Windows, con un lector de pantalla conocido y sin necesidad de acceder a la máquina virtual. Para habilitarlo, haremos lo siguiente:

  • Cambiamos la contraseña de root: passwd. Se debe escribir la contraseña dos veces. No aparecerá ningún carácter en la ventana al teclear.
  • Nos conectamos desde el menú VM > SSH > Connect to SSH. En un equipo real, deberemos conocer su dirección ip. El comando ip a proporcionará la información necesaria.

La primera vez, el cliente SSH nos preguntará si confiamos en la huella identificativa de la máquina. Escribimos yes y pulsamos enter. Después, nos preguntará la contraseña asignada a root. Al escribirla y pulsar enter, estaremos dentro. Nota: con cada arranque del medio de instalación, la huella del sistema cambia. Para evitar errores, edita el archivo .ssh/known_hosts que se encuentra en tu carpeta de usuario y elimina la línea correspondiente a la máquina virtual.

Creación y formateo de particiones

Como ya se ha dicho antes, Arch Linux no tiene un instalador como tal, y todo debe hacerse a mano. El primer paso consiste en particionar el disco duro y formatear las particiones creadas. Existen multitud de esquemas de particionado, como por ejemplo:

  • Una partición ext4 para el sistema operativo y, opcionalmente, una partición swap (ideal en entornos BIOS).
  • Una partición de arranque, que se montaría en /boot, otra partición para el sistema y, opcionalmente, una partición swap (ideal en entornos UEFI).
  • Una partición de arranque, otra partición para el sistema base, otra partición para los usuarios montada en /home y otra partición montada en /usr.

Hay muchas más combinaciones, así como métodos para hacer que Linux coexista con otros sistemas operativos. Por defecto, en la máquina virtual anterior el firmware es de tipo BIOS, pero el modo UEFI es más moderno y se encuentra en todos los equipos físicos nuevos. Elige una de las dos siguientes secciones para particionar tu disco, según corresponda. Para saber si tu sistema utiliza UEFI, usa este comando: ls /sys/firmware/efi/efivars Si el comando falla, entonces estamos en un sistema que usa BIOS, o arranca en modo de compatibilidad con BIOS (CSM). De lo contrario, se trata de un sistema UEFI. En las siguientes secciones, se asume que el disco está en /dev/nvme0n1. Sin embargo, en otras configuraciones de controlador y disco, podría estar en /dev/sda, /dev/vda, /dev/mmcblk0, etc. Utiliza el comando lsblk para descubrir cuál es tu disco de destino.

En sistemas BIOS

Para particionar el disco usaremos la herramienta fdisk, y trabajaremos con el disco duro que creamos cuando hicimos la máquina virtual, y que se encuentra en /dev/nvme0n1: fdisk /dev/nvme0n1 Al ejecutar este comando se cargará la consola de fdisk, y se creará automáticamente una tabla de particiones mbr, ya que el disco no tiene ninguna. Si el disco tuviera alguna, pulsa la o para reemplazarla. Ten en cuenta que los cambios no se escribirán hasta completar todos los pasos, así que no hay nada que temer. A continuación pulsamos la tecla n y enter para crear una nueva partición. Fdisk nos preguntará de qué tipo debe ser la partición. Como el tipo está puesto por defecto en primaria, no tenemos que pulsar la letra p, tan sólo pulsar enter de nuevo. A continuación nos preguntará el número de partición primaria que utilizaremos de las 4 disponibles. Una vez más pulsamos enter, ya que el 1 está seleccionado por defecto. Lo siguiente que nos pide es el tamaño de la partición, especificando el desplazamiento inicial. El valor por defecto que se nos ofrece para el sector inicial es el 2048, situado más o menos al principio del disco, así que podemos pulsar enter de nuevo sin modificar nada. La primera partición se usará para extender la memoria RAM y será de tipo Swap. Vamos a hacer que ocupe 2 GB. Escribimos +2G y pulsamos enter. Ahora, pulsamos la t para cambiar su tipo. Fdisk preguntará el código hexadecimal correspondiente. Escribimos 82 y pulsamos enter. Repetimos los pasos anteriores para crear una partición para el sistema. Como queremos que la partición ocupe el resto del disco, pulsamos enter sin introducir nada cuando fdisk nos pregunta por el sector final. Finalmente, veremos un mensaje como este: Created a new partition 2 of type 'Linux' and of size 30 GiB. El tipo es Linux, así que no hay que modificarlo. Lo que sí se debe hacer es marcar la partición creada como autoarrancable, o de lo contrario el sistema no podrá iniciarse. Para ello pulsamos la a, y enter nuevamente. Tras pulsar el 2 para indicar la segunda partición, veremos el siguiente mensaje: The bootable flag on partition 2 is enabled now. Pulsando la p podemos ver un esquema general de lo que hemos creado. Si todo es correcto, se puede pulsar la w para escribir los cambios en el disco. De lo contrario, se puede pulsar la q para salir sin guardar nada. Ya tenemos las particiones creadas y asociadas a los dispositivos /dev/nvme0n1p1 y /dev/nvme0n1p2. Lo siguiente que hay que hacer es formatearlas. El siguiente comando preparará la partición swap: mkswap /dev/nvme0n1p1 Y con la utilidad mkfs.ext4, formatearemos la principal: mkfs.ext4 /dev/nvme0n1p2

En sistemas UEFI

Para particionar el disco usaremos la herramienta gdisk, y trabajaremos con el disco duro que creamos cuando hicimos la máquina virtual, y que se encuentra en /dev/nvme0n1: gdisk /dev/nvme0n1 Al ejecutar este comando se cargará la consola de gdisk, y se creará automáticamente una tabla de particiones gpt, ya que el disco no tiene ninguna. Si el disco tuviera alguna, pulsa la o para reemplazarla. Ten en cuenta que los cambios no se escribirán hasta completar todos los pasos, así que no hay nada que temer. Lo primero que haremos será crear la partición de arranque, a la que asignaremos 512 MB, o hasta 4 veces más si pretendemos instalar varios núcleos. Para ello, pulsamos la n, seguida de enter. En todos los casos, se puede dejar el número de partición como está y pulsar enter. El primer sector comienza en 2048. Por defecto, gdisk siempre nos ofrecerá un primer sector recomendado en función del final de la partición anterior, o en este caso, el más adecuado al principio del disco. Después, nos preguntará por el sector final. Escribimos +512M y pulsamos enter. Para completar la partición, gdisk necesita conocer su tipo. El tipo de las particiones EFI es ef00. Ahora, repetiremos los pasos y crearemos una partición swap de 2 GB, y una partición Linux con el espacio restante. El tipo correspondiente a la partición swap es 8200, mientras que para una partición Linux estándar es 8300. En este último caso, no hace falta escribirlo. Ya tenemos la tabla de particiones lista. Pulsando la w seguida de enter, y tras responder afirmativamente a la pregunta de seguridad, se grabará en disco. Las particiones están creadas y asociadas a los dispositivos /dev/nvme0n1p1, /dev/nvme0n1p2 y /dev/nvme0n1p3. Lo siguiente que hay que hacer es formatearlas. Formateamos la partición EFI en FAT32: mkfs.fat -F 32 /dev/nvme0n1p1 El siguiente comando preparará la partición swap: mkswap /dev/nvme0n1p2 Y con la utilidad mkfs.ext4, formatearemos la principal: mkfs.ext4 /dev/nvme0n1p3

Si todo sale bien, el disco está correctamente formateado y listo para que podamos instalar el sistema operativo.

Instalación de Arch Linux

El primer paso para poder instalar Arch Linux es montar las particiones creadas con anterioridad. Deberemos montar tanto la partición swap como la ext4, y la partición EFI en sistemas UEFI. Se puede hacer con los siguientes comandos.

BIOS

Montamos la partición swap: swapon /dev/nvme0n1p1 Montamos la partición ext4 en la carpeta /mnt: mount -t ext4 /dev/nvme0n1p2 /mnt

UEFI

Montamos la partición swap: swapon /dev/nvme0n1p2 Montamos la partición ext4 en la carpeta /mnt: mount -t ext4 /dev/nvme0n1p3 /mnt Y montamos la partición EFI, creando una subcarpeta para ella: mount --mkdir -t vfat /dev/nvme0n1p1 /mnt/boot

Teniendo montadas las particiones, le llega el turno a pacstrap. Pacstrap es un script que se encarga de instalar paquetes. Recibe como primer parámetro la ruta donde se instalarán. El resto de argumentos son nombres de paquetes o grupos de paquetes, como base, base-devel, gnome, gnome-extra, etc. En este tutorial vamos a instalar los grupos base y base-devel, no queremos todavía entornos de escritorio. También instalaremos un kernel, el firmware, controladores para tarjetas de sonido, el lector de pantalla speakup, las utilidades para controlar la tarjeta de sonido y un editor de texto: pacstrap /mnt base base-devel linux linux-firmware sof-firmware espeakup alsa-utils nano Al ejecutar este comando se iniciará la descarga e instalación de paquetes. Obtendremos los paquetes básicos, el kernel, y el compilador gcc. Más adelante este último será indispensable para instalar paquetes desde el Arch User Repository. Terminada la instalación, generamos un archivo fstab para que el sistema instalado pueda montar los sistemas de archivos adecuadamente al arrancar: genfstab -U -p /mnt >> /mnt/etc/fstab Lo siguiente que debemos hacer es simular que estamos trabajando desde la copia que acabamos de instalar. Para ello tenemos el comando arch-chroot. Recibe como argumento la ruta a la que queremos cambiarnos. Podemos escribir algo como esto: arch-chroot /mnt Se cargará la consola bash de la copia instalada, y la raíz del sistema de archivos estará en /mnt. No podremos manipular el sistema de archivos que se cargó inicialmente en el live cd hasta que salgamos de aquí. Vamos a seguir modificando aspectos de la instalación. Lo primero que haremos será establecer un nombre de equipo. Este nombre hay que grabarlo en el archivo /etc/hostname, y en nuestro tutorial será arch-vmware: echo arch-vmware > /etc/hostname Importante: en este tutorial se emplea mucho el comando echo para escribir información en archivos de texto. Ten en cuenta que este comando escribe líneas en esos archivos, por lo que sólo debe usarse una vez. Si quieres deshacer algún cambio, utiliza un editor para cambiar el archivo, como por ejemplo nano. Ahora vamos a establecer el idioma y la zona horaria, ya que nuestra copia instalada no está aún en español. Para ello debemos editar el archivo /etc/locale.gen: nano /etc/locale.gen Se deben eliminar los comentarios de los idiomas que queramos habilitar, borrando el signo de número que hay delante de cada uno. En nuestro caso, vamos a habilitar el inglés de Estados Unidos y el español de España, ambos en UTF-8. Corresponden a las líneas que empiezan por en_US.UTF-8 y es_ES.UTF-8. Siempre se recomienda habilitar el inglés de Estados Unidos, ya que muchos programas lo buscarán cuando alguna cadena de texto no esté traducida. Para guardar los cambios, pulsamos ctrl+x, respondemos que sí pulsando la y, y finalmente pulsamos enter. Volveremos nuevamente a la consola bash. Ahora, generamos los idiomas: locale-gen Y finalmente, establecemos el español como idioma del sistema: echo LANG=es_ES.UTF-8 > /etc/locale.conf El método para establecer la zona horaria es distinto al de cambiar el idioma. En este caso tenemos que crear un vínculo simbólico. La sintaxis sería: ln -sf /usr/share/zoneinfo/zone/subzone /etc/localtime En este ejemplo vamos a establecer la hora de Madrid: ln -sf /usr/share/zoneinfo/Europe/Madrid /etc/localtime A continuación, configuramos el ajuste horario con este comando: hwclock --systohc Y habilitamos un servicio para que sincronice el reloj con Internet: systemctl enable systemd-timesyncd Para terminar, debemos hacer que el teclado virtual también esté en español: echo KEYMAP=es > /etc/vconsole.conf Ya hemos terminado de establecer las preferencias de idioma, zona horaria y teclado. Es hora de ocuparnos de otras cosas, como la red. Por defecto, la iso de Arch Linux está configurada para usar una red cableada, buscar un servidor dhcp, y obtener la dirección ip dinámicamente. En la copia instalada necesitamos instalar un gestor de red y habilitarlo: pacman -S --noconfirm networkmanager systemctl enable NetworkManager systemctl enable systemd-resolved Otro pequeño problema que nos vamos a encontrar es que el nombre del host no se anuncia en la red local. Para resolverlo, vamos a instalar samba: pacman -S --noconfirm samba El servicio que nos interesa habilitar es el nmb, encargado de anunciar el nombre de la máquina. Para ello hacemos: systemctl enable nmb Pero cuidado, aquí debemos hacer algo más, ya que los servicios de Samba necesitan leer de un archivo de configuración, y no tienen ninguno: touch /etc/samba/smb.conf Ya tenemos todo listo para que el servicio nmb funcione. Vamos a instalar el preciado servidor ssh, para poder conectarnos desde fuera de la máquina si fuera necesario: pacman -S --noconfirm openssh systemctl enable sshd Permitimos que root inicie sesión con contraseña: echo permitRootLogin yes >> /etc/ssh/sshd_config Con la ayuda del editor nano, podemos cambiar la voz de Speakup, tal y como hicimos en el medio de instalación. Consulta las primeras secciones de este tutorial para encontrar las instrucciones. Recuerda habilitar el servicio: systemctl enable espeakup Para acabar de instalar nuestra copia de Arch, nos falta cambiar la contraseña de root e instalar un cargador de arranque. Lo primero se puede hacer ejecutando simplemente el comando passwd, tal y como hicimos anteriormente: passwd Para lo segundo debemos instalar otro paquete y ejecutar un par de comandos. Instalamos el gestor de arranque grub: pacman -S --noconfirm grub

En sistemas BIOS

Instalamos el gestor de arranque en el sector mbr, y en el sector de arranque de la partición: grub-install --recheck /dev/nvme0n1

En sistemas UEFI

Instalamos el paquete efibootmgr: pacman -S --noconfirm efibootmgr Instalamos el gestor de arranque en la partición EFI: grub-install --target=x86_64-efi --efi-directory=boot --bootloader-id=GRUB Si se añade al comando anterior el argumento --removable, Grub no modificará las variables EFI alojadas en la NVRAM y quedará preparado para arrancar desde un disco extraíble. Útil si, por ejemplo, estamos creando un pen drive con un sistema operativo para llevar y usar en cualquier ordenador con Uefi. Se puede añadir al disco extraíble soporte para sistemas BIOS con capacidad de arrancar discos GPT. Para ello, usa gdisk y crea una cuarta partición entre los sectores 34 y 2067. Deberás indicar que su tipo es ef02. No importa su orden en la tabla, puedes crearla incluso con el sistema ya instalado. Después, instala GRUB una segunda vez. Por ejemplo: grub-install --target=i386-pc /dev/nvme0n1 Importante: tal y como se ha configurado, Arch no iniciará si el arranque seguro está activado. Deberás desactivarlo en la configuración de tu firmware.

Opcionalmente, se pueden instalar las imágenes que actualizan el microcódigo del procesador: pacman -S --noconfirm intel-ucode amd-ucode También se puede (y se recomienda) configurar Grub para que emita un pitido al arrancar. Así sabremos en qué momento podemos manipular el gestor de arranque, llegado el caso. Se puede configurar un pitido simple: echo GRUB_INIT_TUNE=\"480 440 1\" >> /etc/default/grub O uno más complejo y entretenido: echo GRUB_INIT_TUNE=\"1750 523 1 392 1 523 1 659 1 784 1 1047 1 784 1 415 1 523 1 622 1 831 1 622 1 831 1 1046 1 1244 1 1661 1 1244 1 466 1 587 1 698 1 932 1 1195 1 1397 1 1865 1 1397 1\" >> /etc/default/grub A continuación, generamos el archivo de configuración: grub-mkconfig -o /boot/grub/grub.cfg Todo listo, es hora de salir del entorno simulado, desmontar las particiones y reiniciar el sistema. Para salir del entorno simulado, podemos escribir exit o simplemente pulsar ctrl+d. Para desmontar las particiones, usaremos los siguientes comandos.

En sistemas BIOS

umount /mnt swapoff /dev/nvme0n1p1

En sistemas UEFI

umount /mnt/boot umount /mnt swapoff /dev/nvme0n1p2

Y, finalmente, para reiniciar: reboot Si todo ha ido bien, nuestro sistema Arch está instalado, y accesible por ssh si se encuentra conectado por cable a la red. Podemos entrar con el siguiente comando: ssh root@arch-vmware Sigamos, ¡falta mucho por hacer!

Cómo subir el volumen para Speakup

La primera vez que iniciemos la copia instalada de Arch, el lector de pantalla se escuchará con un volumen muy bajo o directamente no se escuchará. Esto depende del equipo. La solución pasa por subir el volumen de los canales Master y PCM (si existe) al 100%, quitar sus silencios y guardar los ajustes. Ejecuta estos comandos: amixer set Master unmute amixer set Master 100% amixer set PCM unmute amixer set PCM 100% alsactl store ¡Importante! Este comando no se debe usar si estamos preparando una instalación en un disco extraíble. En su lugar, se debe copiar desde una instalación local el archivo /var/lib/alsa/asound.state ¡Todo listo! Hemos instalado Arch Linux, le hemos dado sonido y un lector de pantalla. Ahora ya no necesitamos un servidor ssh para trabajar desde el exterior, podemos manipular la propia máquina desde sus interfaces locales.

Siguientes pasos.

Actualizar el sistema

Lo primero que se debe hacer antes de instalar paquetes adicionales es tener completamente actualizado nuestro sistema. Vamos a actualizarlo, y a reiniciarlo: pacman -Syu reboot

Instalación de Reflector

Por defecto, Pacman descarga los paquetes desde una lista de sitios que lleva incorporada. Estos sitios, o réplicas, cambian con el tiempo y conviene actualizarlos. De esa forma, obtendremos los paquetes más deprisa, y probablemente desde una ubicación más cercana geográficamente. Para conseguirlo, instalaremos Reflector: pacman -S --noconfirm reflector Ahora, lo configuramos para que arranque con el sistema y lo iniciamos. systemctl enable reflector systemctl start reflector

Instalación de páginas de manual

El comando man puede ser muy útil a la hora de buscar la ayuda de un programa concreto y leer sus páginas de manual. Usa este comando para instalarlo: pacman -S --noconfirm man-pages man-db

Instalación de VMWare Tools (sólo en máquinas virtuales)

Las herramientas de VMWare, o VMWare Tools, permiten a la máquina virtual integrarse mucho mejor con el equipo físico. Podemos utilizar desde carpetas compartidas, hasta arrastrar y soltar para transferir archivos. Instalar las herramientas que VMWare Workstation trae por defecto ya no se recomienda. Todas las distribuciones de Linux incorporan sus propias herramientas. En este caso: pacman -S --noconfirm open-vm-tools Con este paquete se instala un servicio que notifica a VMWare que ya tenemos las herramientas instaladas. Vamos a activarlo y a establecerlo al arranque del sistema: systemctl start vmtoolsd systemctl enable vmtoolsd Tras hacer esto, podemos ir al menú vm en VMWare, ¡y ver que indica que las herramientas están instaladas! Pero... ¿Funciona todo? Todavía no, ya que no tenemos funciones de arrastrar y soltar o copiar y pegar, por ejemplo. Para resolver el problema de arrastrar y soltar, habilitamos e iniciamos un servicio: systemctl enable vmware-vmblock-fuse systemctl start vmware-vmblock-fuse Todo listo. Cuando tengamos un entorno de escritorio, podremos arrastrar y soltar o copiar y pegar archivos desde el equipo físico hacia la máquina, y viceversa.

Instalación de Yay

Como ya se dijo más arriba, una de las características de Arch es la capacidad de compilar e instalar paquetes directamente desde el código fuente. Aunque los paquetes se pueden descargar y compilar manualmente desde el Arch User Repository, el proceso es largo y complicado, así que conviene automatizarlo. Yay es una herramienta muy similar a Pacman y admite sus mismos comandos, pero también trabaja sobre el Arch User Repository además de los repositorios oficiales. Además, no se debería ejecutar con el usuario root, necesita una cuenta estándar con privilegios de superusuario. Con yay podemos descargar, compilar e instalar paquetes, todo en un solo comando. Desgraciadamente, esta herramienta no se puede instalar desde pacman, y por eso le dedicamos un apartado entero en este tutorial. Como a Arch no le gusta compilar paquetes siendo root, lo primero que haremos será crear un usuario administrador, pero sin tantos privilegios: useradd -m usuario En el comando hemos indicado que el usuario se llamará usuario y tendrá un directorio personal para él. Ahora vamos a darle una contraseña: passwd usuario Escribimos la contraseña 2 veces, y la cuenta de usuario ya está lista para su uso. Ahora, escribiremos el siguiente comando para que se puedan obtener más privilegios al ejecutar comandos con sudo: echo "usuario ALL=(ALL:ALL) ALL" >> /etc/sudoers Ahora vamos a instalar el paquete wget para poder descargar los archivos de yay: pacman -S --noconfirm wget Hecho esto, iniciamos sesión con la cuenta usuario. Esto se puede hacer de muchas maneras, por ejemplo con este comando: su -l usuario Si trabajamos con la consola de la máquina virtual, también podemos salir e iniciar sesión desde allí. Lo mismo si trabajamos con ssh: ssh usuario@arch-vmware Teniendo la sesión iniciada y estando en nuestro directorio personal, comenzamos a descargar y compilar paquetes. Descargamos Yay: wget https://aur.archlinux.org/cgit/aur.git/snapshot/yay.tar.gz Tras descargarlo, el primer paso es extraerlo: tar -zxf yay.tar.gz A continuación, navegamos al directorio que se ha extraído: cd yay Construimos el paquete y lo instalamos una vez compilado: makepkg -si Yay ya está listo para la acción. Podemos instalar cualquier paquete desde el Arch User Repository con facilidad, siempre desde la cuenta estándar y sin llamar a sudo. Por ejemplo, el paquete needrestart, que ayuda a reiniciar sólo los servicios necesarios tras una actualización, en vez del equipo entero: yay -S --noconfirm needrestart En procesadores Intel, Needrestart se puede complementar con la herramienta iucode-tool: yay -S --asdeps --noconfirm iucode-tool Observa que el primer paquete se descarga desde el Arch User Repository, mientras que el segundo procede de los repositorios oficiales. El segundo se ha instalado como una dependencia opcional. Más adelante veremos qué significa eso.

Activación del repositorio multilib

El repositorio multilib, desactivado por defecto, contiene bibliotecas y aplicaciones de 32 bits, así como software que funciona sobre varias arquitecturas, como Wine o Steam. Para activarlo, hay que editar el archivo /etc/pacman.conf con cualquier editor, como nano. En él, las líneas de los repositorios multilib y multilib-testing vienen comentadas. Es decir, llevan un signo de número delante. Bastará con eliminarlo y guardar los cambios para activar el repositorio. Ten en cuenta que sólo se deben quitar los comentarios de dos líneas, y que no se recomienda habilitar los repositorios testing. Si ya de por sí el software suele ser inestable en Arch, los paquetes que proceden de los repositorios testing lo son aún más.

Búsqueda de paquetes con Pacman

Para buscar paquetes con Pacman, ejecuta un comando similar a este: pacman -Ss palabra

Limpieza de la caché de paquetes

Después de instalar nuevos paquetes o actualizar el sistema, los paquetes comprimidos que se han descargado permanecen en el disco ocupando espacio. Para limpiar la caché y borrarlos, usa este comando: pacman -Scc O, incluso mejor, hazlo con Yay: yay -Scc

Eliminación de paquetes huérfanos

A veces, un paquete se actualiza y deja de necesitar otro del que antes dependía. Esa dependencia permanece en el sistema y no se desinstala por sí sola. Con el tiempo, esto puede llegar a ser un problema. Ejecuta el comando pacman -Qtdq | pacman -Rns - para buscar y eliminar paquetes huérfanos.

Instalación del escritorio gnome

Gnome es uno de los entornos de escritorio más populares para Linux, y uno de los que mejor integra la accesibilidad. En el caso de Arch, en los repositorios hay 2 grupos de paquetes que podemos instalar: gnome y gnome-extra. Instalamos ambos grupos con este comando: pacman -S --noconfirm --needed gnome gnome-extra Para completar Gnome con todas las aplicaciones que no se encuentran en dichos grupos, podemos ejecutar un comando como este, que instalará todos los paquetes con la palabra gnome en su nombre: pacman -S --needed $(pacman -Ssq gnome) Se instalarán todos los paquetes necesarios, incluyendo orca, el lector de pantalla de escritorio de Linux, y aplicaciones gráficas con diversas funciones (gestión de discos, correo electrónico, chat, e incluso algún juego). El proceso es largo, así que hay que tener paciencia. Si tienes una línea Braille, añade tu usuario al grupo brlapi: usermod -a -G brlapi usuario E instala el paquete que permite el inicio automático al detectar líneas conectadas por USB: pacman -S --asdeps --noconfirm brltty-udev-generic Ponemos el teclado en español para las aplicaciones gráficas: localectl set-x11-keymap es,es ¡Importante! Este comando no funcionará en imágenes fuera de línea, por ejemplo al crear una unidad extraíble. En su lugar, copia desde una instalación local de Arch el archivo /etc/X11/xorg.conf.d/00-keyboard.conf Por último, ponemos al arranque el servicio gdm, que se encarga de gestionar el escritorio, mostrar la pantalla de inicio de sesión y otras tareas de vital importancia: systemctl set-default graphical systemctl enable gdm También activamos un servicio que montará automáticamente dispositivos extraíbles: systemctl enable udisks2 Y reiniciamos el equipo a modo de precaución: reboot Al arrancar el servicio gdm, desaparece la consola de la máquina virtual. Espeakup deja de hablar, y se muestra ante nosotros la pantalla de inicio de sesión. Ahora, si queremos un lector de pantalla, se debe activar orca pulsando windows+alt+s. Pulsando ctrl+alt+tab, podemos navegar entre los distintos paneles que componen el escritorio. En este caso tenemos el de bloqueo, la barra superior y el de iniciar sesión. Iremos a este último, y entraremos con la cuenta de usuario estándar que creamos al principio. Los paneles cambiarán, pero la forma de navegar es la misma. Al escribir la contraseña y pulsar enter, Orca dejará de hablar. Lo activamos nuevamente pulsando windows+alt+s. El entorno de escritorio gnome estará listo para su uso. ¡Disfruta!

Instalación del escritorio Mate

Mate es un escritorio basado en el antiguo Gnome 2.x. Destaca por su ligereza y poco consumo de recursos, su accesibilidad con Orca y la familiaridad del entorno, que puede recordar más a Windows. Al contrario que Gnome, Mate sí tiene un escritorio donde se pueden depositar accesos directos y archivos. El acceso a las aplicaciones se realiza mediante la barra de menú superior, a la que se llega con alt+f1. Mate comparte muchos paquetes con Gnome, y algunas de sus funciones sólo se activan cuando se usa GDM como el administrador gráfico. Podemos instalarlo con estos comandos. Si Gnome ya está instalado, el espacio en disco no aumentará mucho: pacman --noconfirm --needed -S mate mate-extra pacman --needed --noconfirm -S $(pacman -Ssq mate-) En la ventana de inicio de sesión, si navegamos con el tabulador justo después de escribir la contraseña, encontraremos un menú para elegir el escritorio predeterminado. Aparecerán todos los escritorios que se encuentren instalados, incluyendo diversas variantes de Gnome y Mate.

Dependencias opcionales

En Arch, muchos paquetes tienen dependencias opcionales. Esto significa que funcionan sin ellas, pero al instalarlas se obtiene una funcionalidad extra. Aquí hay algunas que puedes usar con Gnome para extenderlo aún más. Para instalar una dependencia opcional, se recomienda indicar a Pacman que se trata de una dependencia, y no de una instalación explícita. De esa forma, al desinstalar el paquete que la necesita, también se borrará. Usa un comando como este para conseguirlo: pacman -S --asdeps --noconfirm paquete1 paquete2 paquete3 El paquete Harfbuzz ofrece esta dependencia con utilidades: harfbuzz-utils Para la app Juegos, se pueden instalar todos estos emuladores de consolas antiguas: libretro-beetle-pce-fast libretro-beetle-psx libretro-blastem libretro-citra libretro-flycast libretro-gambatte libretro-mgba libretro-nestopia libretro-parallel-n64 libretro-picodrive gamemode Estos paquetes extenderán la app Herramientas de red: nmap bind net-tools Con este otro, se puede jugar al ajedrez contra el ordenador: gnuchess Este paquete aparece como opcional al instalar Code assistance: jedi-language-server Si usas el programa de correo Evolution, estos son sus paquetes opcionales, empleados para filtrar spam: highlight evolution-spamassassin evolution-bogofilter Este paquete permite al escritorio gestionar perfiles de energía: power-profiles-daemon. Habilita el servicio power-profiles-daemon para que funcione. Y este otro, configurar las impresoras: system-config-printer La aplicación Cajas usa el emulador Qemu para ejecutar máquinas virtuales. Estos paquetes contienen todas sus arquitecturas: qemu-user-static qemu-user qemu-tests qemu-system-xtensa qemu-system-tricore qemu-system-sparc qemu-system-sh4 qemu-system-s390x qemu-system-rx qemu-system-riscv qemu-system-ppc qemu-system-or1k qemu-system-nios2 qemu-system-mips qemu-system-microblaze qemu-system-m68k qemu-system-hppa qemu-system-cris qemu-system-avr qemu-system-arm qemu-system-alpha qemu-system-aarch64 qemu-docs qemu-chardev-baum qemu-block-iscsi qemu-block-gluster qemu-emulators-full qemu-user-static-binfmt qemu-full Si usas el gestor de archivadores, estos paquetes le darán compatibilidad con todos los formatos soportados: squashfs-tools lrzip unace unrar p7zip Brasero permite grabar contenido en cd y dvd. Con estos paquetes opcionales, además, puede personalizar más aspectos de la grabación y procesar contenido multimedia: dvdauthor vcdimager libisofs libburn Esta extensión añade el menú “Enviar a” al explorador de archivos Nautilus: nautilus-sendto Gedit es más que un bloc de notas, pero con sus plugins ofrece todavía más funcionalidades: gedit-plugins Este applet mostrará información de la red: network-manager-applet El soporte NTFS viene integrado en el kernel de Linux desde la versión 5.15, pero algunas aplicaciones siguen necesitando el paquete antiguo para usar sus utilidades: ntfs-3g Con este paquete, el applet de sensores mostrará la temperatura del disco duro: hddtemp Dejando de lado el escritorio, la consola bash puede beneficiarse mucho del autocompletado en ciertas situaciones, incluida la búsqueda e instalación de paquetes. Instala bash-completion para conseguirlo. El motor de sonido Pipewire puede extenderse con este paquete: pipewire-audio Y la herramienta Reflector dispondrá de más mecanismos para descargar la lista de réplicas si se instala el paquete rsync. Con el paquete python-pyudev, la librería libwacom soportará más tipos de hardware. Los paquetes udftools, exfatprogs, dosfstools y xfsprogs extienden la capacidad del servicio udisks2 para montar automáticamente sistemas de archivos.

Ejecución de aplicaciones de Windows

Los archivos .exe y .dll que usamos en Windows no tienen nada que hacer en Linux, a menos que instalemos algo que permita ejecutarlos. Wine, del que ya hablamos al explicar cómo habilitar multilib, es un emulador que permite que los programas de Windows funcionen, siempre que no sean demasiado avanzados. Ten en cuenta que las aplicaciones que se ejecutan dentro de Wine no son accesibles, incluso si logras instalar NVDA: pacman -S --noconfirm wine Por defecto, las aplicaciones para Windows no tendrán sonido, y más si son de 32 bits. Es importante habilitarlo si vamos a trabajar a ciegas. Para ello, instala todas las dependencias opcionales: pacman -S --noconfirm --needed --asdeps lib32-giflib lib32-mpg123 lib32-openal lib32-v4l-utils lib32-libpulse lib32-alsa-plugins lib32-alsa-lib lib32-libxcomposite lib32-libxinerama lib32-opencl-icd-loader lib32-libxslt lib32-gst-plugins-base-libs vkd3d lib32-vkd3d dosbox lib32-gst-plugins-base lib32-gst-plugins-good lib32-libcups lib32-pcsclite pcsclite unixodbc wine-gecko wine-mono

Otras aplicaciones conocidas

A continuación se enumeran algunas aplicaciones de ofimática e Internet que pueden resultar conocidas en Windows y que, de hecho, llevan toda la vida en Linux.

  • LibreOffice: se puede obtener mediante el paquete libreoffice-fresh, o libreoffice-still para la versión de soporte extendido, más antigua. Para que su interfaz esté en español, instala libreoffice-fresh-es o libreoffice-still-es, según corresponda.
  • Firefox y Thunderbird: se pueden instalar escribiendo sus nombres en Pacman, directamente. Para traducir su interfaz, no obstante, también se deben instalar firefox-i18n-es-es y thunderbird-i18n-es-es. El grupo firefox-addons contiene algunas extensiones populares.
  • Chrome: Google Chrome se encuentra disponible en el Arch User Repository con el nombre google-chrome. Para instalar un paquete más libre y procedente de los repositorios oficiales, se puede descargar chromium desde Pacman. Por defecto, el motor Chromium no se comunica con las tecnologías de asistencia. Para cambiar ese comportamiento, se debe agregar la variable de entorno ACCESSIBILITY_ENABLED y darle el valor 1. Ejecuta este comando en la cuenta de usuario estándar (no root) y reinicia el equipo: echo export ACCESSIBILITY_ENABLED=1 >> ~/.xprofile. Ten en cuenta que Chromium utiliza su propia clave API para acceder a los servicios de Google y podría sufrir restricciones puntuales. Ante la duda, usa Chrome.
  • VLC: este reproductor multimedia también se encuentra disponible en los repositorios oficiales de Arch. El paquete opcional lua-socket se puede instalar para activar su servidor http.

Controladores

Arch incluye controladores para una amplia gama de dispositivos. El paquete linux-firmware contiene los más comunes y de código abierto. Ya lo instalamos al principio, junto con sof-firmware, que contiene controladores para tarjetas de sonido. Si te aventuras a instalarlo en un equipo real y algún dispositivo no funciona como debería, prueba estos paquetes:

  • linux-firmware-marvell
  • linux-firmware-qcom
  • linux-firmware-bnx2x
  • linux-firmware-mellanox
  • linux-firmware-qlogic
  • linux-firmware-liquidio
  • linux-firmware-nfp
  • b43-fwcutter
  • alsa-firmware
  • mkinitcpio-firmware (se instala con yay, no forma parte de los repositorios oficiales). Instala todos los módulos firmware, lo que evita errores y advertencias al reconstruir el kernel.

Una vez instalados estos paquetes, conviene recompilar los kernels disponibles con un comando como este, y reiniciar el equipo: mkinitcpio -P Por su parte, el servidor xorg puede funcionar mejor si se instalan controladores para tarjetas gráficas específicas. El grupo xorg-drivers contiene casi todos, con algunas excepciones. Las tarjetas gráficas NVidia necesitan instalar módulos en el kernel. Se puede descargar el controlador propietario más reciente instalando el paquete nvidia para el kernel nativo de Arch, el paquete nvidia-lts para el kernel lts, o el paquete nvidia-dkms para todos en general. En este último caso, deben estar instaladas las cabeceras del kernel o kernels para el que se compilará el módulo. Por ejemplo, linux-zen-headers. El paquete nvidia-settings ofrece una aplicación de configuración para la tarjeta. Se deben habilitar con systemd los servicios nvidia-persistenced, nvidia-powerd, nvidia-hibernate, nvidia-resume y nvidia-suspend para gestionarla de forma óptima. Las tarjetas gráficas AMD pueden funcionar mejor con el paquete amdvlk. Tiene una versión para aplicaciones de 32 bits, llamada lib32-amdvlk. Las tarjetas gráficas Intel ya están soportadas al instalar xorg-drivers, pero otras aplicaciones pueden beneficiarse si se instalan estos paquetes: libva-intel-driver intel-media-driver vulkan-intel lib32-libva-mesa-driver libva-mesa-driver libvdpau-va-gl mesa-vdpau lib32-libva-intel-driver lib32-vulkan-intel Los escáneres pueden verse complementados con el paquete sane-gt68xx-firmware, que incluye controladores para más modelos, y el paquete sane-airscan, que permite usar un escáner inalámbrico que no necesita controladores.

Otros núcleos

Hasta ahora, hemos trabajado con un único kernel, disponible en el paquete linux. Este kernel es genérico, adecuado para cualquier tarea que queramos hacer con el sistema operativo. Sin embargo, en los repositorios oficiales hay otros con distintas características. Puedes instalar varios a la vez, pero es posible que necesites otro esquema de particiones distinto al propuesto en este tutorial para que te quepan todos:

  • linux-lts: el paquete linux-lts ofrece un núcleo con soporte extendido. Va un poco retrasado respecto al kernel normal, pero da más garantías de estabilidad.
  • linux-zen: el kernel zen viene optimizado para equipos de escritorio. Mejora el desempeño de los gráficos y reduce la latencia del audio.
  • linux-hardened: instala este núcleo si lo que quieres es seguridad. Viene optimizado para mitigar vulnerabilidades. En consecuencia, puede hacer que el sistema vaya algo más despacio, y algunas aplicaciones no funcionan con él.
  • linux-rt: núcleo optimizado para trabajar con eventos en tiempo real.
  • linux-rt-lts: versión de soporte extendido del núcleo anterior.

Tras instalar cualquiera de estos núcleos, regenera el archivo de configuración de Grub: grub-mkconfig -o /boot/grub/grub.cfg Por defecto, el kernel zen se situará arriba del todo, convirtiéndose en el primero en arrancar.

Gestión de impresoras

En Linux, el paquete cups es el responsable de comunicarse con las impresoras conectadas. Con la ayuda de cups-browsed, podrá buscar impresoras de red. Instalará unos servicios, que deberemos activar: systemctl enable cups cups-browsed systemctl start cups cups-browsed Cups acepta conexiones desde el navegador en http://localhost:631. Desde allí se pueden gestionar las impresoras existentes, pero Gnome y Mate también ofrecen sus propias aplicaciones para ello. Con el paquete cups-pdf, se instala una impresora virtual capaz de imprimir en archivos PDF. Tan pronto como lo instales, usa tu interfaz preferida de configuración de impresoras para agregarla, ya que no aparecerá por sí sola. En ordenadores reales, se pueden instalar controladores que actuarán de intermediarios entre Cups y diversos modelos de impresoras. Vienen en estos paquetes: foomatic-db foomatic-db-engine foomatic-db-ppds foomatic-db-nonfree-ppds foomatic-db-gutenprint-ppds gutenprint Aunque se cubre una amplia gama de fabricantes y modelos, no funcionarán todos. Pueden hacer falta paquetes adicionales, tanto de los repositorios oficiales como del AUR. Visita esta página en la wiki de Arch Linux para encontrar el tuyo.

Bluetooth

Teniendo instalados todos los paquetes que se han visto a lo largo de este tutorial, el bluetooth se puede usar activando e iniciando este servicio: systemctl enable bluetooth systemctl start bluetooth Para agregar impresoras Bluetooth, además, se debe instalar el paquete bluez-cups.

Redes wi-fi

¿Has instalado Arch en un equipo físico conectado por cable, pero lo tuyo son las redes inalámbricas? Habilita e inicia este servicio: systemctl enable wpa_supplicant systemctl start wpa_supplicant Deberías poder configurar tu red wi-fi desde la barra superior de Gnome. Instala el paquete wireless-regdb para cumplir con la legislación vigente de tu país relativa a canales y potencia de transmisión. Se reconstruirán todos los núcleos instalados, por lo que tendrás que reiniciar el equipo.

Otros administradores gráficos

Existen varios escritorios más que no hemos mencionado en este tutorial porque carecen de accesibilidad con lector de pantalla, o la que tienen es tan pobre que degrada demasiado la experiencia. Con los administradores gráficos sucede lo mismo. Hemos hablado de gdm, el que usan Gnome y Mate, pero no es el único. Lightdm puede ser una buena alternativa en sistemas con bajos recursos. Para instalarlo: pacman -S --noconfirm lightdm lightdm-gtk-greeter Antes de habilitarlo, se debe deshabilitar gdm, ya que sólo puede haber un administrador gráfico en ejecución: systemctl disable gdm systemctl enable lightdm Para indicar a LightDM que use Orca, añadiremos una línea al archivo de configuración de la interfaz: echo reader=orca >> /etc/lightdm/lightdm-gtk-greeter.conf Al reiniciar el sistema, LightDM aparecerá en pantalla. Se puede activar el lector de pantalla Orca pulsando la tecla f4. Pulsando f10 se accede a la barra de menú, desde donde se puede seleccionar qué escritorio arrancará. La tecla f10 accederá a la barra de menú en todas las aplicaciones que la tengan.

Descubrimiento de dispositivos en la red local

Algunos dispositivos y programas, como impresoras, televisores o servidores de archivos, facilitan información a la red local sobre cómo conectarse e interactuar con ellos. Para ello, se apoyan en protocolos como zeroconf y mdns. A pesar de que ya se han instalado utilidades que permiten explorar la red en busca de estos dispositivos, se debe habilitar e iniciar un servicio: systemctl enable avahi-daemon systemctl start avahi-daemon A continuación, para resolver direcciones que acaben en .local, se puede instalar este paquete: pacman -S --noconfirm nss-mdns Y finalmente, usamos nano para editar el archivo /etc/nsswitch.conf. La línea que empieza por “hosts” debe quedar así: hosts: mymachines mdns_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] files myhostname dns Otro servicio que mejora la compatibilidad y el descubrimiento con equipos con Windows es wsdd. Se puede instalar con el siguiente paquete: yay -S wsdd2 Después, es suficiente con habilitar este servicio. Seguirá los mismos ajustes de configuración de Samba, si los hay: systemctl enable wsdd2

Conclusiones

En este tutorial hemos instalado Arch Linux, una distribución pequeña, simple y ligera, donde cada usuario elige lo que quiere y obtiene únicamente lo necesario para conseguir su objetivo. Hemos conocido Linux mejor por dentro, evitando la presencia de automatizaciones y herramientas que nos abstraen del proceso en otras distribuciones. Conociendo el funcionamiento de los programas en Arch Linux, se puede saber cómo funcionan por debajo ciertos aspectos en distribuciones como Ubuntu, Debian y Fedora, y también echar un vistazo a lo que está por llegar, ya que siempre se reciben las últimas versiones estables de los programas poco después de publicarse. Hemos aprendido a construir un sistema con una base de consola que no tiene uno, sino tantos escritorios como queramos instalarle, unos más accesibles que otros, y varios lectores de pantalla que coexisten en un mismo sistema. A pesar de todos los temas abarcados, este tutorial sólo araña la superficie. Los paquetes que se han instalado, así como sus dependencias, tienen montones de funciones extra que se pueden explorar, y existen muchos más paquetes y programas que no se han documentado aquí. Arch evoluciona rápidamente, por lo que no sería de extrañar que este texto se quede obsoleto pronto. Lo que acabas de leer no se parece nada a la primera versión de este tutorial, escrita en el año 2015. En aquella época, la instalación era más compleja que ahora, y el resultado menos accesible. Deshabilitar el servicio espeakup era obligatorio para usar Orca, ya que entraban en conflicto compitiendo por el dispositivo de audio, por ejemplo. Ahora ya sabes cómo instalar Arch en una máquina virtual, pero a lo largo de las distintas secciones se han dado trucos para crear un pen drive con un sistema para llevar, o realizar la instalación en un ordenador real. ¿Te animas a hacerlo? ¿Ya lo has hecho? No dudes en compartir tu experiencia, y contarnos qué ventajas y desventajas observas respecto a otros sistemas. ¡Gracias por leer!

Fuentes de información

Este tutorial no habría sido posible sin consultar las siguientes fuentes:

  1. La guía de instalación de Arch Linux.
  2. La wiki de Arch, en la que he leído tantas páginas distintas que no sabría enlazar todas.
  3. Tono de Grub de Mario Bross.
  4. Diferencias entre Chromium y Google Chrome.
  5. Uso de Orca con Chromium.
  6. Páginas de manual, la información que devuelven muchos comandos al pasar –help como argumento, y los comentarios que se encuentran en los archivos de configuración.
  7. Varios años experimentando de forma ininterrumpida.

Anexo: creación de una imagen lista para grabar y arrancar

A lo largo de este tutorial se han dado consejos útiles para preparar una unidad extraíble. El procedimiento es muy similar al de instalación en local, pero teniendo en cuenta que systemd y algunos comandos no funcionan, y que no se debe iniciar ningún servicio. En este capítulo explicaremos todo aquello que no se ha contado antes relacionado con la creación de imágenes listas para grabar, llevar a cualquier parte y arrancar.

Creación del archivo de imagen

Para crear un archivo de imagen totalmente vacío, se puede hacer uso de la utilidad dd. Con ella, creamos un archivo del tamaño que queramos y lo llenamos de ceros. Por ejemplo, este comando preparará un archivo cuyo tamaño es muy similar al de un pen drive de 32 GB: dd if=/dev/zero of=archlinux.img bs=4M count=7629 status=progress Tan pronto como dd termine, podremos particionarlo como se vio más arriba. Podemos omitir la partición swap. Si el sistema llegara a necesitarla, el rendimiento se reduciría drásticamente: gdisk archlinux.img Una vez escribimos la tabla de particiones, podemos montar la imagen como si fuera un disco real: losetup -P /dev/loop0 archlinux.img En este caso, loop0 es el dispositivo donde irá montada la imagen. Si loop0 no está disponible, podemos recurrir a loop1, y así sucesivamente. Las particiones se montarán como loop0p1, loop0p2, etc. Para desmontar la imagen, se debe ejecutar un comando como este después de desmontar todos los sistemas de archivos: losetup -d /dev/loop0

Preparación para la nube

Nunca sabemos dónde puede acabar la imagen que hemos creado. Prepararla para que se ejecute en cualquier parte puede ser buena idea, incluso si se configura para su uso en un proveedor de nube. Para ello, instalaremos el paquete cloud-init con alguna de sus dependencias extra: pacman -S --noconfirm --needed cloud-init python-passlib Y habilitaremos los dos servicios que ofrece, sin iniciarlos: systemctl enable cloud-init cloud-init-local El paquete cloud-init tiene una dependencia opcional, cloud-guest-utils: pacman -S --noconfirm --asdeps --needed cloud-guest-utils Esta dependencia es de especial relevancia, ya que una de sus utilidades permite aumentar el tamaño de la partición indicada hasta llenar todo el espacio que pueda en el disco. Si grabamos la imagen en una unidad cuyo tamaño es superior al disco grabado, podremos disponer del espacio sobrante con un par de comandos. El primero es growpart, que aplicaremos a la partición formateada en ext4. Imaginemos que es la segunda del disco: growpart /dev/nvme0n1 2 Y luego, resize2fs adapta el sistema de archivos al nuevo tamaño: resize2fs /dev/nvme0n1p2 Ten en cuenta que cloud-init generará una nueva clave para OpenSSH en el servidor la primera vez que se inicie, por lo que será necesario borrar la anterior del archivo known_hosts en los clientes. Si vas a distribuir tu imagen personalizada, instala y activa cloud-init.

Instalación de Arch Linux desde una copia en ejecución

En este tutorial hemos usado pacstrap, arch-chroot y mkfstab, entre otras utilidades. Todas ellas se pueden obtener instalando el paquete arch-install-scripts. De hecho, es indispensable para realizar la instalación en la imagen: pacman -S --noconfirm --needed arch-install-scripts Si usas una copia instalada de Arch para preparar otro disco y no arrancas desde la imagen iso, recuerda desmontar tu propia partición swap antes de ejecutar el comando genfstab.

Actualización de la caché de PackageKit

Al instalar paquetes, podemos ver que uno de los hooks falla porque systemd no se encuentra en ejecución en el entorno al que hemos entrado con chroot. Se puede ejecutar el siguiente comando para mantener la caché al día: /usr/lib/pk-offline-update

Preparación de la imagen para su distribución

A pesar de las velocidades actuales de conexión, 32 GB son muchos GB, y la mitad, también. Debemos preparar nuestra imagen para que ocupe el mínimo espacio posible al comprimirla, y por supuesto, comprimirla al acabar. Para ello, podemos hacer uso de las utilidades e4defrag y sfill. Los sistemas de archivos deben estar montados. En modo chroot, limpia las cachés de pacman y yay de todas las cuentas de usuario. El comando yay -scc desde la cuenta “usuario” debería ser suficiente si has seguido los pasos de este tutorial. La utilidad e4defrag ya viene instalada en el sistema. Podemos aplicarla sobre la partición ext4 de la imagen y, regularmente, sobre nuestro propio disco duro: e4defrag /dev/loop0p2 En cuanto a sfill, se instala con el paquete secure-delete, disponible únicamente en el AUR. Este paquete contiene utilidades para borrar archivos sin dejar rastro, grabando encima información aleatoria. Lo que nos interesa no es grabar datos aleatorios, sino ceros. De esa forma, se eliminarán los restos de ficheros ya borrados y quedará algo que ocupará mucho menos espacio al comprimirse. Para instalar secure-delete, desde una cuenta que no sea root, hacemos: yay -S --noconfirm secure-delete Ahora, le diremos a sfill que grabe ceros, haciendo una única pasada: sfill -f -z -l -l /mnt Y también en la partición de arranque: sfill -f -z -l -l /mnt/boot Teniendo la imagen completamente desmontada, ya podemos comprimirla: xz -9 --extreme -T 0 archlinux.img El archivo resultante, aunque es grande, resulta mucho más manejable. Y el ratio de compresión no dejará indiferente a nadie.

Tutorial: firma digital de correos electrónicos (Página de inicio on Un sitio solicitado por la comunidad, para la comunidad)

¡Hola a todos! Como todo el mundo sabe, existen muchos mecanismos para proteger nuestra cuenta de correo frente a invitados no deseados: una contraseña fuerte, métodos de autenticación de doble factor, preguntas de seguridad, etc. También existen mecanismos a nivel de servidor que previenen la suplantación de identidad: registros SPF, DKIM y DMARC. Estos últimos sólo nos interesan a los que tenemos dominios y servidores, y logran que un atacante malintencionado que desee suplantar la identidad de un usuario legítimo acabe en el buzón de correo no deseado de la víctima. Y todo ello de forma transparente, sin que el usuario tenga que hacer nada. Pero ¿cómo podemos proteger nuestros correos de la manipulación? ¿Podemos hacer algo para que un intermediario no vea lo que contienen? Ya nos conectamos usando conexiones https, indicando que los servidores imap y smtp van con conexión segura, pero a veces el intermediario malintencionado puede ser el propio servicio de correo. Como anécdota, hace unos 15 años una vecina de Cuba vino a casa porque quería enviarle a su hermana unas fotos de sus niños. La cuenta de correo de la hermana era de un dominio cubano. Las fotos salieron bien de aquí en PDF, pero llegaron distorsionadas. No fue ninguna sorpresa, ya que nos avisaron de que el régimen tenía por costumbre intervenir y manipular correos a conveniencia. La solución del momento fue cifrar el PDF con contraseña, y transmitir la contraseña por una vía alternativa. Misteriosamente, al hacerlo así, llegaron bien. Si eso sucediera hoy, podríamos aplicar una solución mucho mejor: una firma digital. Las firmas digitales en los correos no tienen nada que ver con las firmas que a veces vemos al pie de los mismos. Las primeras garantizan la autenticidad del origen y la integridad del contenido, y las segundas contienen lo que el remitente quiere que veamos. Existen dos métodos para firmar digitalmente un correo:

  • S/MIME: es compatible con casi todos los programas de correo existentes. Consiste en una clave privada generada en local, y un certificado expedido por una autoridad de certificación. Los certificados más comunes, que incluyen la identidad del remitente, cuestan dinero. Sin embargo, los que veremos aquí son gratis y cambian el método de generación un poco.
  • OpenPGP: se trata de un sistema descentralizado donde tú generas tus propias claves privada y pública. En vez de disponer de una autoridad de certificación que nos avale, son los propios destinatarios los que deciden cuánto confían en nuestra clave. La mayoría de programas de correo suelen necesitar algún tipo de complemento para trabajar con esta tecnología. Thunderbird, desde su versión 78, lleva ya el soporte integrado. Hablaremos de ello otro día si os interesa.

Hecha esta breve introducción, vamos a ver cómo obtener un certificado de firma de correo con Actalis y cómo instalarlo en Thunderbird. Actalis es una de las pocas entidades certificadoras que nos ofrece certificados gratuitos durante un año para todas las cuentas que queramos. Está reconocida por todos los navegadores y sistemas operativos. Yo llevo varios años con ellos, y gracias a la ayuda de un buen amigo y un poco de ruido, conseguimos que cambiasen su captcha inaccesible por Recaptcha.

Obtención del certificado

  1. Accede al formulario de solicitud. Está en inglés, pero eso no será un problema.
  2. Introduce tu correo electrónico en el único cuadro de edición que hay en la página, resuelve el captcha y envía el formulario.
  3. Recibirás un correo electrónico en italiano y en inglés con un código de verificación. Copia el código y pégalo en el cuadro de edición destinado a tal efecto.
  4. Marca las casillas indicando que aceptas los términos del servicio y pulsa el botón que envía este nuevo formulario.
  5. En la página de confirmación hay una contraseña. Cópiala y consérvala en un lugar seguro, la necesitarás más adelante.
  6. Recibirás otro correo, en italiano y en inglés, con un archivo adjunto. En ese archivo van tanto la clave privada como el certificado, cifrados en formato pfx. La contraseña que lo descifra es la que copiaste en el paso anterior.
  7. Descomprime el archivo zip en una carpeta de tu disco duro. Quedará el archivo con extensión .pfx.

Instalación del certificado en Mozilla Thunderbird

El certificado que acabamos de recibir se puede abrir directamente e instalar en Windows con un asistente muy sencillo. Al hacerlo, quedará disponible en aplicaciones tales como Outlook, el correo de Windows y también Thunderbird. Sin embargo, en este dará algunos problemas. Por lo tanto, lo importaremos en el almacén de Mozilla, donde todo funciona bien. Así, además, al copiar el perfil a otros equipos o usarlo en modo portable, el certificado se vendrá con nosotros estemos donde estemos.

  1. En Thunderbird, ve al menú Herramientas, y pulsa enter sobre Ajustes.
  2. En el cuadro de búsqueda, escribe Certificados y pulsa enter de nuevo.
  3. Tabula hasta el botón “Administrar certificados” y actívalo.
  4. Asegúrate de que está seleccionada la pestaña “Sus certificados”. Si no lo está, puedes activar el modo exploración de NVDA y seleccionarla con flechas y enter.
  5. Pulsa el botón Importar. En el diálogo que se carga, busca el archivo .pfx extraído en la sección anterior.
  6. Introduce la contraseña que descifra el archivo pfx. El certificado aparecerá en el árbol, listo para usar durante un año. Si es necesario, Thunderbird permite salvarlo junto con la clave privada, y cifrarlo con otra contraseña distinta.
  7. Pulsa Aceptar para cerrar el diálogo de certificados, y control+w para cerrar las preferencias y regresar a la bandeja de entrada.

Vinculación de la cuenta con el certificado

Ahora, debemos indicar a Thunderbird que nuestra cuenta de correo tiene asociado ese certificado. De lo contrario, no sabrá que puede usarlo.

  1. Ve al menú Herramientas, y pulsa Intro sobre Configuración de la cuenta.
  2. Selecciona tu cuenta en el árbol, si no lo estaba ya. Después, tabula hasta el botón Administrar identidades y actívalo.
  3. En la lista, selecciona la identidad cuyo correo va asociado al certificado. Normalmente debería haber una sola identidad. Después, pulsa el botón Editar.
  4. En el nuevo diálogo que se muestra, selecciona la pestaña “Cifrado de extremo a extremo”. Puedes activar el modo exploración, navegar con las flechas y pulsar enter.
  5. Al tabular hasta el grupo “S/MIME”, verás un botón Seleccionar. Púlsalo para elegir tu certificado de firma.
  6. En el cuadro combinado se mostrarán sólo los certificados que puedes usar para firmar correos con tu dirección. Es raro que haya más de uno, pero puede suceder. Elige el que más te convenga y acepta.
  7. Thunderbird preguntará si quieres usar el mismo certificado para cifrar correos. Si es así, responde que sí.
  8. El resto de casillas del diálogo se pueden configurar según tus gustos. A mí me gusta mantener los correos sin cifrar, pero que vayan firmados por defecto. Para ello, se puede marcar la casilla “Firmar mensajes sin cifrar” y marcar el botón de opción “Desactivar cifrado para mensajes nuevos”. Si tenemos tanto S/MIME como OpenPGP disponibles, puede ser buena idea elegir la opción “Preferir S/MIME”.
  9. Pulsa los botones Cerrar o Aceptar en todos los diálogos, y control+w para cerrar la configuración de la cuenta.

Creación de un correo firmado

Me encantaría extenderme en esta sección y llenarla de complicados pasos que justifiquen por qué casi nadie firma sus correos, pero es que no se puede. Marcando la casilla del paso 8 de la sección anterior termina todo. Todos los correos que enviemos irán firmados de serie. Cuando pase un año y el certificado caduque, Thunderbird fallará y dirá que el certificado ya no es válido. En ese momento, habrá que eliminarlo y repetir este tutorial paso a paso. Ahora bien, ¿qué pasa si la firma no está activada por defecto, o queremos desactivarla para que un correo se envíe sin firmar? En ocasiones, sabemos que un correo va a ser manipulado sí o sí. Por ejemplo, cuando lo enviamos a una lista de correo. Los destinatarios recibirán una alerta indicando que el mensaje ha sido manipulado y pueden asustarse, por lo que nos interesa quitar la firma. En la ventana de redacción del mensaje, aparecerá un nuevo menú en la barra de menú llamado “Seguridad”. En él, la opción que nos interesa se llama “Firmar digitalmente”, y puede estar marcada o desmarcada. Si está desmarcada, el mensaje no se firmará.

Verificación de la firma de un correo recibido

Al recibir un correo firmado, Thunderbird almacenará el certificado del remitente en su propio almacén, dentro de la sección “Otras personas”. Esto nos vendrá bien más adelante para cifrar. Si recorremos la ventana del mensaje con el tabulador, llegaremos a sus cabeceras. En ellas, un botón llamado S/MIME nos informará del estado de la firma y el cifrado, si lo hay. Si el mensaje ha sufrido alguna manipulación mientras viajaba por la red, lo sabremos al instante.

Creación de un mensaje cifrado

Hasta ahora hemos visto cómo garantizar la integridad de un mensaje. Sin embargo, ¿qué pasa si también queremos que nadie, salvo el destinatario, pueda verlo? En ese caso, debemos cifrarlo. En la ventana de creación de mensajes, en el menú Seguridad, también hay una opción para cifrar, pero tiene truco: aunque esté marcada, sólo funcionará si el certificado del destinatario está en la sección “Otras personas” del almacén y sigue siendo válido. De lo contrario, Thunderbird avisará con un error. El cifrado de mensajes es asimétrico: ciframos el contenido con la clave pública del destinatario (su certificado). El destinatario, por su parte, descifrará el mensaje con la clave privada correspondiente, que sólo tiene él. Nadie más podrá saber qué contiene. Del mismo modo, si quiere respondernos cifrando el mensaje, deberá tener nuestro certificado.

Conclusiones

En este tutorial hemos visto una de las tecnologías más usadas a nivel empresarial para firmar y cifrar mensajes de correo electrónico: S/MIME. Hemos visto cómo obtener un certificado que durará un año, y que después puede seguir renovándose por otro año totalmente gratis. Sin embargo, la cosa no acaba aquí: no hemos hablado de OpenPGP, y sólo se ha explicado la configuración en Thunderbird. ¿Qué tal si lo ampliamos para hablar de OpenPGP y otros clientes de correo? Tal vez, próximamente, haya una segunda parte.