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 (9)

2025-08-11

#lazyweb WordPress y microblogs (otro blog más)

Por pedir (por soñar, de hecho, me da la impresión), que no quede… Estaba yo pensando que estaría muy bien tener una categoría en WordPress para microposts… Idealmente los microposts

  • no tendrían título y me impondrían un límite de caracteres,
  • aparecerían en la portada del blog, pero no contarían contra el total de posts que aparecen en la portada: habría siempre cinco (o las que sean) entradas convencionales en portada, más los microposts que tocasen, sin límite,
  • podríamos configurar si queremos que aparezcan en el RSS del blog o no (o, directamente, no aparecerían),
  • tendríamos CSS para que el aspecto en la portada del blog pareciese el incrustado de un tuit de Mastodon o Bluesky (o el sitio aquel que tanto nos gustaba),
  • y (aquí está la parte que más me llama) el contenido se republicaría automáticamente a Mastodon y/o Bluesky y/o Threads (y/o LinkedIn, incluso) y/o la red de microblogging que alguien se invente mañana (no hace falta que me soporte hilos, y si me imponen el límite duro de caracteres del microblog más ‘agarrao’ en cuanto a este aspecto, me parece perfecto, pero si me ofrece más en este aspecto, pues todo eso que ganamos).

He estado buscando por ahí y hay cosas que ya se pueden hacer con un cóctel de plug-ins importante, pero no he encontrado nada que resuelva las cinco cosas a la vez. Si alguien tiene una solución medianamente cómoda, aquí abajo están los comentarios 😇.

2025-08-08

De Spotify a Tidal (otro blog más)

Pues eso. Creo que era cliente de pago de Spotify desde el primer día que ofrecieron sus suscripciones de pago en España. Buceando en el correo, me di de alta cuando el acceso era por invitación, el 12 de enero de 2009, y el primer recibo que tengo del servicio de pago es de septiembre de ese mismo año, o sea que va a ser por poco que mi relación de pago con ellos no alcance los dieciséis años, pero hacía tiempo que consideraba el cambio…

Mis requisitos eran, por una vez, simples: tener un catálogo y precio equivalentes a los de Spotify, primero, y que la aplicación escroblease, que ya son más de veinte años (lo early adopter que era yo, oiga) de mi cuenta en last.fm.

Y después de estudiármelo con calma (el primer requisito es fácil de cumplir, pero el segundo no tanto, o al menos no me lo ha parecido) estos días he dado el salto, a Tidal.

Debe decirse que me ha gustado la playlist de despedida de Spotify 😅

Lo que me gusta

Me gusta, primero, que no es Spotify, claro.

El precio (once euros al mes) no solo es razonable, sino un poco más barato que el de Spotify, que ahora mismo está a doce. También hay una cuenta familiar con hasta seis miembros, y parece que no exigen que vivan en el mismo domicilio, por diecisiete al mes (la de Spotify está a veintiuno), y una cuenta estudiante a cinco euros y medio (la de Spotify sale a seis y medio).

Creo que uno de los factores de venta más importantes de Tidal es la calidad de sonido, que puede llegar hasta los 24 bits a 192 kHz (en mi experiencia, la mayoría de canciones que he escuchado están en FLAC de 16 bits a 44.1 kHz). No fue factor para mí, porque uno tiene unos oídos de bastante baja resolución, pero diría que cuando me siento en el ordenador, con unos altavoces no muy allá… creo que sí se nota una cierta diferencia. Your mileage may vary, que dicen los anglosajones.

Si uno se dedica a DJ (no es el caso, afortundamente para todos), Tidal se conecta con las aplicaciones de Serato, djay pro o Denon, entre otras (pagando nueve euros al mes, a sumar a los oncedel servicio básico)

Lo que no me gusta

Pues no son cosas lo suficientemente graves como para volver a Spotify, pero…

Hay una primera cosa que es que el catálogo no es el mismo que el de Spotify. Migrando listas de reproducción (consejo: Soundiiz (yo he tenido suficiente con la versión gratuita del servicio)) he encontrado cosas que están en Spotify y no en Tidal. Husmeando un poco, también diría que hay cosas que estén en Tidal y no en Spotify, o sea que hay un cierto dolor inicial, pero nada especialmente grave.

Me molestan bastante más algunas cosillas de la interfaz… La primera de ellas, el cómo organizan las discografías de artista. Esta es la vista general:

Y, como puedes imaginar, puedes hacer clic en cada disco de los que te muestra, o mostrar todos los álbums o todos los «EPs & singles»… pero no puedes combinar álbums con EPs en una sola vista (y tampoco hay una vista en que veas cada álbum con sus canciones: puedes ver las canciones de un disco, pero solo uno). Y no os podéis imaginar lo que me toca las narices esto. Tanto, que estoy pensando en pelearme con su API para hacerme un gestor de playlists que sí me ofrezca esa vista.

Pero una cosa es que no me ofrezcan la interfaz que yo quiero, y otra que tengan bugs. Y en una semana me he encontrado con dos…

Por un lado:

¿En serio la versión Windows de un reproductor puede no dejarme eliminar dos pistas de una lista? ¿En serio? (De una en una tampoco me deja: cierto es que la playlist es larguilla (1200 canciones), pero…).

Y parece que lo de eliminar es algo que no llevan bien, porque en Android…

¿Habéis visto cómo se pisa el botón de eliminar con la interfaz de Android? 😡

Saltar entre dispositivos no es tan sencillo como en Spotify, donce puedes hacer saltar la reproducción de un dispositivo a otro automáticamente, a media canción si te apetece. Aquí le das a reproducir la canción en el segundo dispositivo. Funcionalidad menor, sí, pero la echaré de menos. Y también me ha pasado unas cuantas veces que las listas de reproducción tardaban un buen rato en actualizarse desde el lanzamiento de la aplicación, tanto en el móvil como en el ordenador, con la consiguiente desorientación al saltar entre dispositivos.

Escroblea, sí. Pero no desde la app de Android, ni cuando usas la reproducción en Chromecast. El primer problema lo tengo solucionado gracias a Pano Scrobbler (maravillosa aplicación, de código abierto, además). El segundo, al menos de momento, no.

Pero de momento, me quedo en Tidal

No sé yo si van a correr mucho a arreglar los bugs, y menos confianza aún tengo en que añadan las funcionalidades que echo en falta, pero ninguno de esos problemas es definitivo, o sea que, al menos de momento, me quedo en Tidal.

Y si sabes de algún servicio que vaya mejor (pero que escroblee, ¿eh), o de maneras de saltarse los problemillas, aquí abajo están los comentarios, claro.

¡Hasta la próxima!

2025-08-07

La facilidad o dificultad de vivir (Adrián Perales)

Soy un señor que vive en España, considerado país del primer mundo. Y a veces me sorprendo de lo complicado que es un acto que debería ser tan sencillo como vivir tranquilo.

Vivir podría ser muy fácil...

Tener una casa y comida; un trabajo, vocacional o no, que no robe más tiempo y más energía de lo debidamente necesario; aficiones, tiempo para dedicar a esas aficiones y, lo más importante, personas cercanas con las que pasar buenos ratos.

...pero es terriblemente difícil

La generación de nuestros padres pudo hipotecarse muy joven. Nosotros, no. Y el alquiler se ha convertido en un negocio especulativo que consiste en darle dinero a una persona que tuvo la suerte de llegar antes que nosotros. Tanto se paga en alquiler que incluso ciertos alimentos resultan inaccesibles.

Los trabajos suelen ser precarios o mal pagados. La empresa privada ofrece muy pocas garantías y mucha gente oposita buscando algo de tranquilidad y estabilidad. Estos trabajos suelen estar lejos de casa, si se tiene, lo cual requiere dedicar un tiempo en ir y volver que, al final, es tiempo que no se dedica a otros asuntos.

Tanto tiempo y energía se dedica a esos trabajos que muchas personas ni siquiera son capaces de enunciar rápidamente cuáles son sus aficiones, muchas veces porque no las tienen o porque no les da el tiempo para cultivarlas.

Mientras todo esto ocurre, hay personas de nuestro entorno que dedican sus energías a ponernos la zancadilla.

Unos mínimos

Mi situación actual es de absoluto privilegio. Tengo casa propia, mi trabajo estará a diez minutos el curso que viene y esto (espero) me proporcionará el tiempo suficiente para dedicarle algo más a mis aficiones.

Digo que es de privilegiado pero me da mucha rabia que sea así. Es lo menos que se debería ofrecer a cualquier persona.

El objetivo

Pensar en todo esto puede provocar frustración. A nivel global podemos hacer poco por cambiar muchas de estas situaciones. No podemos influir en el estado de la vivienda ni eliminar los trabajos precarios.

Lo que deberíamos hacer es, por lo menos menos, no poner zancadillas a los demás. La vida es demasiado fastidiada de por sí como para ser la piedra en el zapato de otra persona.

Si entre todos fuéramos capaces de cuidarnos más, ofrecer una sonrisa a las personas que nos importan, apoyarlas y hacer nuestro día a día un poco menos horrible, ya sería mucho.

No es tan difícil.

2025-08-01

Erre ese ese (otro blog más)

Últimamente me encuentro con una cierta frecuencia artículos sobre RSS y lectores de RSS, como Curate your own newspaper with RSS. Me los encuentro menos frecuentemente en español, o sea que…

Erre ese ¿qué?

Un lector de RSS es una aplicación que se conecta a unas cuantas webs y te presenta los últimos contenidos que se han publicado en ellas en un único sitio:

Como podéis ver en la captura, de un vistazo tenemos lo que se ha publicado en las últimas horas en un montón de sitios web, desde las páginas dedicadas al fútbol americano de ESPN.com a la sección de cultura de El País pasando por las noticias de tecnología de The Verge, presentadas de manera compacta, lo que resulta «un pelín» más efectivo que pasearse por las webs de todos esos medios para enterarse de lo que han publicado.

Un lector RSS: Feedly

Servidor usa Feedly desde hace más de diez años…

Tiene una versión gratis que permite suscribirse a hasta 100 canales (un canal, o «feed» en inglés, es una página web o una sección de una página web; yo ando por 170 canales suscritos, pero 100 son bastantes para la inmensa mayoría de gente, diría) que puedes organizar en hasta tres carpetas.

(Actualización: me dice uno de los tres lectores habituales de este blog que son más de 100 feeds los que aguanta la versión gratuita, a pesar de lo que dice Feedly en su web. ¿Serán 150? ¿200? ¿250?)

Por 84 euros al año te puedes pasar a la versión Pro, que soporta hasta 2500 «feeds» con la capacidad de guardar anotaciones sobre las entradas (una entrada, o «post», es una pieza de contenido), conexión con OneNote y EverNote, LinkedIn, Buffer, IFTTT y Zapier, y sustituye la publicidad por un único espónsor semanal. También hay una Pro+ que llega hasta los 5000 feeds, características de IA (silenciado de temas y resúmenes de contenidos, básicamente) soporte para suscribirse a newsletters desde dentro de Feedly, en vez de usar el buzón de correo, y también para Google News. Y luego hay una «enterprise» que sube a 7500 feeds y añade funciones de trabajo en equipo.

Servidor, por una vez en su vida, tuvo vista, y cuando se lanzaron en 2013, se animó a adelantarles noventa y nueve dólares por la versión Pro de por vida, y de adelantarles otros noventa y nueve cuando sacaron la Pro+ , para pasarme a ella también de por vida. Un cierto riesgo en su momento (especialmente en 2013, cuando no se sabía si iban a durar más de dos telediarios), amortizado de sobras hace mucho, muchísimo tiempo ya :-).

Históricamente, por cierto, los dominadores del mercado habían sido Google Reader (lanzado en octubre de 2005, lo cerraron en julio de 2013, en lo que seguramente fue la primera gran señal de que Google no era ya aquella compañía simpática del Don’t be evil; podéis leer mi réquiem por Reader, escrito a lagrimones cuando anunciaron el cierre) y, antes de eso, Bloglines (que nació en 2003 y murió —a manos de Google Reader— en noviembre de 2010).

Hay más, sí

¿Alternativas actuales a Feedly? Buscando un poco, tenemos listas de mejores lectores de RSS en LifeHacker, de febrero del año pasado, pero actualizada (al menos en el título) posteriormente, y en Wired, de 2023 y también actualizada en algún momento de 2024 (si preferís leer en español, tenéis la de Genbeta, de finales de 2023). Los que cuentan con más recomendaciones, aparte de Feedly, son Inoreader y NewsBlur, pero aquí os dejo la lista completa:

  • Inoreader: soporta hasta 150 feeds en la versión gratuita, versión pro por 80 euros anuales que sube hasta 2500 y permite seguir webs sin RSS, páginas de Facebook, canales de Bluesky y Telegram, entre otras cosas.
  • NewsBlur: hasta 64 canales en la gratuita, con una pro de precio muy razonable (36 dólares al año) que sube a 1000, y una plus de 100 al año que quita el límite de feeds y conserva el histórico de los contenidos de cada canal.
  • Feeder: hasta 200 feeds en la versión gratuita, con 2500 en la pro (a 8 dólares mensuales), más otras características.
  • Feedbin: con versión de prueba gratuita el primer mes, después del cual hay que pasarse a la suscripción de cinco dólares al mes.
  • Selfoss (no confundir con Selfoss, Islandia): de código abierto, con lo que vas a necesitar un servidor para autoalojarla, y te va a tocar jugar a administrador de sistemas (esto es: si no sabes lo que es un administrador de sistemas, mejor ni lo pruebes), pero a cambio te da todas las funcionalidades, claro.
  • El lector que incluye el navegador Vivaldi. También hay extensiones para Firefox y para Chrome y derivados. Yo recomendaría una de las opciones anteriores antes que un lector en el navegador, pero supongo que es cuestión de gustos.

Hermanito, por su parte, recomienda Miniflux, también de código abierto para autoalojar, pero que tiene una opción de «hosting pagado» por unos muy razonables quince dólares al año.

La mayoría de servicios, por cierto, añade más características en las versiones de pago, además del límite ampliado de feeds. Prácticamente todos los servicios, por ejemplo, actualizan contenidos un determinado número de veces al día (una o dos veces por hora, habitualmente) en la versión gratuita y algo más rápido (casi continuamente, en la práctica) en las versiones de pago.

Y buena parte de ellas, además de la web, tiene apps tanto para Android como para iOS.

Me he dejado comentar… Existe un formato llamado OPML que sirve para exportar e importar nuestros listados de canales a los que nos hemos suscrito, y diría que el soporte es bastante amplio, con lo que pasarse de un servicio a otro es bastante simple.

¿Por qué me gusta Feedly?

En primer lugar, porque gracias a mi vista, tengo las características de pago más que amortizadas :-), y si me pasara a otra alternativa, me tocaría pasar por caja (o administrar mi propia instalación de Selfoss o Miniflux, o usar el navegador, que ya he dicho que no me parece una buena idea) para poder acceder al nivel de servicio que tengo en Feedly.

Pero también estoy muy habituado a los «tableros» en los que puedo guardar entradas que me interesan, la priorización de noticias o el «noticias relacionadas» que tiene Feedly. Como todas las aplicaciones, podría mejorar, pero estoy bastante contento con el servicio que dan :-).

¿Y si no me gusta ninguna?

En el ecosistema Apple hay unas cuantas aplicaciones, sobre todo para iPhone y iPad, aunque alguna hay con versión para macOS también (véanse Reeder, NetNewsWire, Unread o ReadKit, por ejemplo) que en general actúan como clientes para algunos de los servicios mencionados arriba y que tienen interfaces bastante curradas.

Para Android también hay cosillas, pero diría (me las he mirado entre poco y nada) que no están tan curradas. Buscad RSS en la tienda de aplicaciones y veréis lo que hay disponible.

Fuentes RSS… y el descuido de la prensa

Una cosa que no he dicho es que, en general, para poder suscribirse a una web, esta debe soportar el estándar RSS. Hoy en día el RSS no está de moda, y hace tiempo que la inmensa mayoría de medios decidieron que era más fácil anunciar sus publicaciones en redes sociales (ahora se quejan (con razón, sí, pero ya les vale) de que entre los algoritmos de esas redes sociales y los resúmenes por IA, se están quedando apenas sin tráfico…) y dejaron de promocionar sus RSS y, en muchos casos, de mantenerlos «comme il faut«.

(Los lectores de RSS de pago también suelen ofrecer la posibilidad de suscribirse a páginas sin RSS, digo yo que a través de bots que hacen un poco de scraping. Mi experiencia con el tema es nula, o sea que ni idea de lo bien o mal que funcionarán.)

Aun así, la mayoría de gestores de contenidos que usan esos medios soportan RSS por defecto, con lo cual, aunque no veamos ninguna referencia a ello en la web, siempre vale la pena ir a nuestro lector y buscar el nombre del medio que sea, a ver si hay suerte. Como veréis si aguzáis la vista en la captura de pantalla que abría esta entrada, servidor está suscrito a diferentes canales de El País, La Vanguardia, El Periódico de Barcelona, El Periódico de España, betevé o el New York Times, por ejemplo (disclaimer: que esté suscrito a sus RSS no quiere decir que me gusten sus líneas editoriales), y prácticamente no hay medio grande que no tenga sus canales.

Desafortunadamente, como decía antes, diferentes medios tienen niveles de mimo diferentes. El País, por ejemplo, tiene un listado de canales bastante bien organizado y que nunca me ha dado problemas. La Vanguardia también tiene el suyo… pero llama «Portada» a «absolutamente todo lo que publicamos, incluido el contenido ‘por la pasta’ que nos mataría de vergüenza si apareciese en la verdadera portada de un medio serio como el nuestro», incluyendo publirreportajes encubiertos y noticias de famoseo: mientras que El País publica unas 170 o 180 noticias a la semana en su portada RSS… La Vanguardia publica más de 1000. Que a mí me parece bien que publiques contenido «alimenticio» y de poca o nula calidad, que la cosa está mu’mala… pero no me lo enchufes en la presunta portada, hombre de dios. Y finalmente, El Periódico… El Periódico también tiene su propio listado, bien organizado y enlazadito desde la portada… pero ha sido al buscarlo para ponerlo aquí que he podido comprobar que su canal de portada vuelve a funcionar, porque lo eliminé de mi lector hace meses… después de que dejase de funcionar durante semanas.

Y también están los blogs, claro

Que los que teníamos blogs también nos dejamos encantar por el canto de sirena de las redes sociales, ciertamente, pero todavía quedan un montón de blogs guays a los que vale la pena suscribirse (cof, cof, obm), como el de hermanito, McMansion Hell, Abject, bavatuesdays, Grumpy Gamer, ICTlogy, ongoing by Tim Bray, el de Stéphanie Walter, el de Eric Meyer o el linkblog (¿qué fue de los linkblogs?) de Waxy.org

Si tienes algún blog que recomendarme, aquí abajo tienes los comentarios, por cierto 😇.

«One more thing» para cerrar

Una última recomendación antes de irnos: después de hacer vuestros pinitos con un lector de RSS y, posiblemente, seguir a más fuentes de las que deberíais, igual os interesa leer mi ¿estrategia? para gestionar la información (que no es que no me tenga comodísimo bajo el alud de información, pero sobrevivo, que no es poco).

Más de mil setecientas palabras de entrada… Quién me ha visto y quién me ve. Espero que haya sido de interés. ¡Hasta la próxima!

2025-07-31

Misa y tranquilidad (Adrián Perales)

Una idea tonta que lleva años pasándome por la cabeza y que nunca había expresado en público (quizá por ser consciente de lo tonta que es).

Hace unas décadas era costumbre (u obligación, según el caso) ir a misa. Hoy esa costumbre se ha perdido casi por completo, más allá de alguna celebración.

Cada vez que entro en alguna iglesia, me sorprendo de la paz y tranquilidad que se respira en esos lugares. Y hay una parte de mí que se pregunta: ¿estará relacionada este aumento de ansiedad y estrés por haber perdido ese rato de paz y tranquilidad? ¿De estar un rato a la semana centrado en otro tema que no sean los problemas cotidianos?

Esto es una simplificación brutal. Las exigencias respecto a la religión, los ritmos de vida, los trabajos, las preocupaciones del día a día han cambiado muchísimo desde que era habitual ir a misa. Pero quédate con la idea más simple y sigamos.

Llevamos unos años en los que vemos el auge de la meditación, el yoga, la vuelta a la escritura manual. En definitiva, encontrar un rato cada tanto para centrarnos un poco en nosotros mismos y dejar de lado, aunque sea un poco, los problemas. Parar.

Justo lo que se hacía en misa.

No seré yo quien abogue por rescatar una costumbre asociada a una religión, en la mayoría de casos impuesta por una sociedad y unas tradiciones. Pero no tengo pruebas ni tampoco dudas de que no contar con ese ratito de recogimiento ha tenido sus consecuencias.

Y oye, quizá ir a misa no sea la recomendación más adecuada a estas alturas de la película. Pero sí deberíamos buscar ese momento de tranquilidad como el que propiciaba la iglesia en otras generaciones.

O algo. Yo qué sé.

2025-07-29

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

Más cornás da el hambre.

2025-07-26

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

Seguimos con nuestro proyecto de hojear, con un delay de cuarenta años, la revista Byte. Este mes el tema de portada es el espacio y la informática y no vamos a encontrar joyas especialmente interesantes… (El número de agosto será mucho más interesante, puedo prometerlo.)

En las noticias tenemos que comienzan a llegar los sistemas con procesadores 286 (en el número de mayo habían comentado la llegada del IBM PC AT):

Mientras quede «contenido Commodore», lo seguiremos recogiendo por aquí, esto es un hecho:

¿No os recuerda un poco al dichoso anuncio de hace unos meses de Apple en que aplastaban todo tipo de herramientas creativas? Igual es que Apple estaba recuperando el trauma de este anuncio anti-Apple de hace apenas cuatro décadas…

En la sección de libros nos encontramos otro tema recurrente: la accesibilidad.

El comentario de siempre: hace más de cuarenta años que unos cuantos se interesan por el potencial de las tecnologías digitales para ponerlo todo al alcance de las personas con discapacidad… y el resto que no le presta ni la más mínima atención al tema. El libro, (Personal Computers and Special Needs) por cierto, está disponible en archive.org.

En el número de marzo habíamos hablado de pantallas planas que usaban paneles de plasma y pantallas electroluminiscentes, las tecnologías que hoy sabemos que no iban a tener éxito. Ahora llegamos a los LCDs:

(Por cierto, si os atrevéis a seguir el enlace (cada escaneado está enlazado a la página correspondiente de la revista en Archive), sabed que os vais a encontrar una discusión bastante técnica de la tecnología LCD.)

Y llegamos al tema de portada:

Imagino que no sorprenderá a ningún lector habitual de obm encontrarse a un ingeniero de la NASA describiendo un programa en FORTRAN IV (yo hice mis pinitos con FORTRAN 77 unos pocos años más tarde) para trazar órbitas de asteroides y cometas. Lo mismito que ahora.

FORTRAN 77, por cierto, se lanzó en 1978, el IV es de 1961, y no me tiréis de la lengua con lo de la evolución del software y el uso de un lenguaje de más de veinte años de edad en el artículo. (Rascando un poco por la Wikipedia, compruebo que Fortran (perdió las mayúsculas en la versión 90 que, como adivinaréis, es de 1991) está ahora mismo el 12 en el TIOBE, un ranquin de uso de lenguajes de programación.)

Unas páginas más allá encontraréis un programa de seguimiento de satélites, y a continuación otro artículo sobre el control de telescopios. Y en la página 265, la crítica de una aplicación para seguir el cometa Halley, que pasaría por el sistema solar en 1986 (se le espera de nuevo a principios de 2061).

Y aprovecho que el número tenía poca «chicha» para detenerme en una de las columnas más míticas del periodismo sobre informática, el Computing at Chaos Manor de Jerry Pournelle.

Pournelle, fallecido en 2017, se dedicaba a la investigación operativa (con finalidades militares, parece ser), a escribir ciencia ficción (con un par de best sellers escritos a cuatro manos con Larry Niven), y a ser el power user de los power users con su columna, que apareció en la revista desde 1980 hasta 2006. Y en la columna narraba sus aventuras y desventuras con su extensa colección doméstica de ordenadores, que yo me leía (debía entender la cuarta parte, con suerte) con fascinación.

Quien dice «columna» dice «minirevista»: la de este número arrancaba en la página 309 y se iba hasta la 338 (con mucha publicidad de por medio, sí, pero vaya, que es un atracón), seguida de una página de correo de los lectores específica de la sección.

¿El contenido? Comenzamos con una visita a una feria informática que incluyó comer con Niklaus Wirth (ojo a la broma que se le atribuye sobre la pronunciación de su nombre que incluye la pieza). Seguimos con una discusión sobre si el futuro era de Intel y sus 286 y familia o de Motorola y sus 680×0, que se enlaza con una batallita sobre compiladores de Modula-2 (lenguaje creado por… Niklaus Wirth). Y si Wirth no fuese suficiente, luego tenemos una feria sobre el Mac en la que cenó con Frank Herbert. Sí. Ese Frank Herbert (que fallecería en 1986, por cierto). Pournelle iba a comprar un segundo Mac con la intención de ampliarlo a un mega de RAM (la mitad de la cual, dedicada a disco en memoria, que el Mac no podía direccionar más de 512 KBs), por apenas 1500 dólares.No descartamos que en el futuro se cuele alguna batallita «Chaos Manor» más.

En fin. Lo dejamos aquí (ya decía que no fue un número especialmente interesante, el de julio del 85) y recuperamos el mes que viene, mucho más interesante, al menos para mí.

Si alguien quiere entrar más a fondo, aquí está el número de julio entero, y aquí el archivo completo de la revista en Archive.

2025-07-24

Hablemos de alopecia (Adrián Perales)

Me estoy quedando calvo. Es un proceso lento pero sin remisión.

Cada vez el flequillo está más arriba, cada vez la frente es mayor, cada vez se clarean más ciertas partes de mi cuero cabelludo.

Y todavía tengo suerte. Varios hombres de mi familia se quedaron calvos mucho antes que yo. Pero mucho. Yo tengo casi treinta y seis y aún aguanto.

¿Por qué el cuerpo humano está hecho de tal forma que uno pierde pelo en la cabeza, lugar público y visible, mientras le crece más en la barba, la espalda, la nariz o las orejas?

Yo soy un hombre bastante peludo, y ver que el pelo se vacía mientras todo lo demás sigue igual, o incluso aparecen pelos en lugares donde antes no había, provoca cierta frustración.

El pelo es parte de nuestra imagen personal. Es algo que vemos a diario al despertar y en fotografías. Y ver cómo poco a poco uno va de un pelo bien nutrido a esa frente cada vez más amplia tiene su punto de resignación y tristeza.

Cuando comento esto con ciertas personas, me dicen rápidamente que me someta a un tratamiento capilar. Y a pesar de que supone un golpe en el autoestima ver cómo la cosa clarea, no tengo la necesidad de solucionarlo con implantes.

Ni yo soy tan presumido (no tengo peine en mi casa, prefiero cortarme el pelo bien corto cuando toca) ni mi trabajo depende de la imagen que proyecto. Al final, un tratamiento es un tratamiento, por sencillo que sea, y no me someteré a uno por mantener mi imagen personal. Respeto y apoyo muchísimo a quien lo haga, pero no me lo planteo.

No soy yo una persona que reniegue del paso del tiempo. Al revés. Cuando todo el mundo pide que no le recuerden o le pregunten la edad que tienen, a mí no me importa e incluso me enorgullece decirlo. Señal de que se ha vivido. Los años solo traen consigo experiencia. Pero qué rabia da que esa experiencia se manifieste en pérdida de pelo.

Pero como no puedo hacer nada por evitarlo y no me voy a someter a ningún tratamiento, solo me queda lamentarme.

Tengo claro que llegará un momento en el que no me gustará mi reflejo y tomaré la maquinilla eléctrica para pelarme lo más corto que pueda (o afeitarme, directamente). No sé cuándo ocurrirá, pero sé que ocurrirá.

Y echaré de menos mi pelazo, que nunca fue pelazo pero era mío.

PD: Sobra decir que esto son lágrimas de señoro. Cualquier mujer que me lea se reirá muy fuerte en mi cara con todas las exigencias sociales a las que se ven sometidas a diario.

2025-07-21

Quedarse en X no significa nada (Adrián Perales)

Siempre he relativizado la importancia de estar en redes sociales. Soy plenamente consciente de que muchos perfiles se han creado un nombre y una carrera por estar en ellas, pero siempre pensé que sería algo temporal, que en algún momento la burbuja explotaría.

Con Facebook ya pasó. Aunque tiene muchos usuarios, mediáticamente es irrelevante. Los jóvenes usan Instagram y TikTok. Pero una red que aún resiste, a pesar de los numerosos problemas que presenta, es la anteriormente conocida como Twitter, X.

Esta red social fue adquirida por Elon Musk en 2022 y ante los ojos de cualquiera que haya querido mirar se ha sucedido un despropósito tras otro. Renunciar a una imagen corporativa reconocida a nivel mundial, despedir a todo el equipo de moderación, devolver cuentas a perfiles de extrema derecha (incluido el actual presidente de los Estados Unidos, para quien fue clave en su campaña), modificar el algoritmo para dar más visibilidad a sus propios mensajes de apoyo a dicha ideología o los líos con la verificación son solo algunos ejemplos.

Sin embargo, aún hay muchos perfiles que ven no solo necesario sino imprescindible quedarse en X. «Hay que dar la batalla cultural», dicen. Y aunque hago un esfuerzo por entender sus razones, es una decisión que me parece del todo inadecuada. Al menos, que dicha red sea el lugar de actividad principal.

X no es ninguna plaza pública. Nunca lo fue, pero antes de Elon Musk se encargaron muy bien de que diera esa impresión. Ahora solo puedes navegar la plataforma si tienes cuenta y te expones a un algoritmo evidentemente escorado a la derecha. Y el argumento de «a mí no me pasa» no es válido. Entrar a un mensaje medianamente polémico y no ver odio en las reacciones por tener bloqueada a media plataforma no es la experiencia de muchos usuarios.

X es eso. Puro odio.

Si la situación es esta, ¿de verdad es imprescindible estar en esta red? ¿Es necesario en 2025 aguantar insultos y «cancelaciones» por la promesa de llegar a alguien menos radical?

Yo creo que no. No merece la pena jugar un juego con las cartas marcadas. Si Twitter nunca fue un lugar adecuado para los debates tan importantes que se tuvieron allí, ahora lo es aún menos.

Pero está bien. Si esos perfiles quieren quedarse allí, perfecto. No soy yo quién para decirle a nadie lo que puede o no puede hacer.

Pero que no lo disfracen de heroísmo.

Si se quedan en X porque ya tienen el algoritmo bien configurado, porque tienen ahí muchos contactos o seguidores que tienen esta red como fuente de información, por miedo a romper el estatu quo... Perfecto.

Pero que no lo disfracen de heroísmo.

Hace poco leí un artículo en el que se decía que tal entidad pública había dejado X y eso impedía a las personas de dicha red acceder a sus investigaciones. Como si no estar en X fuera en contra del servicio que ofrece dicha entidad.

Estar en X no es un servicio público.

Servicio público es tener una página web en abierto, idealmente con un feed RSS para que quien quiera se entere de las novedades. Servicio público no es quedarse en el juguete de un multimillonario que solo se puede leer si tienes cuenta.

«Es que todas las redes funcionan igual». Falso. Todas las redes mayoritarias funcionan igual. Pero hay espacios donde las reglas son otras.

«Es que todo el mundo está ahí». El efecto red se puede crear exactamente igual con otros espacios. Solo hace falta voluntad.

Hacer la batalla cultural, según yo la entiendo, es educar a la gente para que no dependa tanto de redes centralizadas controladas por intereses particulares. Enseñarles que hay espacios en abierto, que no requieren identificarse, que la gente conozca el RSS y no dependa de algoritmos manipulados.

No es necesario abandonar las redes sociales mayoritarias, aunque dada la situación actual me parece lo más sensato e incluso ético. Se puede seguir usando X y complementar ese uso con presencia y fomento de otros espacios (al menos) no tan controlado por intereses espurios.

Como conclusión, repito la idea por última vez. No disfracemos el hecho de quedarse en X como un acto heroico o de servicio público porque no lo es.

2025-07-20

Lecturas (2025.I) (otro blog más)

Llevaba yo desde octubre sin hacer un «lecturas» :-S.

El primer libro leído a caballo de 2024 y 2025 es un clásico de la literatura española del siglo XX, Nada, de Carmen Laforet. Uno no tenía ni idea del libro, pero salió un día en las ofertas de Amazon, y cayó. Duele de adolescencia, hambre de posguerra y claustrofobia, y huele a rancio, a naftalina y humedad de la Barcelona de los años 40. Igual soy yo, pero tengo la impresión de que la prosa de la autora va evolucionando a medida que avanzan las trescientas páginas del libro: muy bien ya desde el inicio, brillantísima hacia el final. Extremadamente recomendable, pero para momentos en los que no esté uno bajo de ánimo.

El segundo libro en caer fue A view from the stars, de Cixin Liu, y el que menos me ha gustado de los que he leído suyos, más que nada porque es una colección de más ensayos que relatos, y los ensayos me han aportado bastante poco…

A continuación cayó Adulthood Rites, la segunda parte de Dawn, del que hablamos en marzo del año pasado. La saga sigue con Imago, que ya está listo para ser leído. Sigue sin ser tan brillante como Kindred (cómo serlo, por otro lado), pero esta saga de una ¿invasión? extraterrestre de un planeta Tierra en que la humanidad parecía dispuesta al sucidio como especie sigue siendo muy interesante y un buen «girapáginas».

A continuación cayó Unnatural Causes, de P.D. James, la autora del fantástico The Children of Men del que hablamos en octubre. Personalmente, opino que todos habríamos ganado mucho si P.D. James se hubiese dedicado a la ciencia ficción en vez de a la novela negra… pero sus ventas y los múltiples premios que ganó con el noir me hacen pensar que es posible que me equivoque.

Y el último libro de esta tanda es SPQR, de la historiadora británica Mary Beard. Uno no se leía «una de romanos» desde la de Montanelli, y de eso hace… ¿35 años? Sería interesante recuperar la del italiano y comparar con esta de la británica, porque algo me hace pensar que la historia habrá cambiado lo suyo en los casi sesenta años que separan ambas obras. La de Beard, en cualquier caso, muy recomendable :-).

En fin, espero que haya un 2025.II y que no tarde tanto en llegar como este I…

2025-06-28

El final de una etapa (Adrián Perales)

Ayer día 27 de junio fue la barbacoa de final de curso de mi instituto. Y se sintió como el final de una etapa.

Un poco de historia previa

Empecé a trabajar en el curso 2014-2015. Tanto este como otros cursos posteriores fueron difíciles por diferentes circunstancias. En el 2018 me dieron mi primer destino definitivo, pero no lo pisé hasta el curso 20-21 porque estaba en una localidad bastante alejada de la mía. Y si acabé allí fue por equivocación propia al echar los papeles.

Una etapa de cuatro cursos

En el curso 21-22 me incorporé al que yo consideré mi destino definitivo real. Por entonces había pasado ya por cuatro institutos (había podido repetir en el primero) y estaba marcado por un gran cansancio (en 2021 había pedido una reducción de jornada que cancelé porque la Junta de Andalucía las hizo virtualmente inútiles).

Este instituto es muy parecido al primero en el que trabajé y que más me gustó. Muy grande, marcado por cierto caos organizativo, un alumnado con el que me he sentido muy cómodo y un claustro de profesores con el que rápidamente conecté.

El curso 21-22 estuvo marcado aún por el covid, y fue en la barbacoa de fin de curso donde descubrí a muchos de mis compañeros. Esta barbacoa es, sin duda, una seña de identidad.

Durante el curso 22-23 tuve que ir al psicólogo porque era incapaz de disfrutar nada. Ni mi ocio, ni mi trabajo. La situación mejoró pero el curso pasado, 23-24, me di de baja. Ese cansancio acumulado al que me referí antes hizo acto de presencia, tomó forma de un leve ataque de ansiedad y no pude dar más de mí. Fueron seis meses en los que podéis encontrar varias entradas en este blog que reflejan, prácticamente, una crisis de identidad. A nivel personal me sirvió para terminar una mudanza a la que espero será mi casa definitiva, o al menos durante mucho tiempo; una mudanza que llevaba postergando desde 2021. De 2021 a 2024 ya es bastante.

Aunque es un centro situado en una localidad cercana, debo acudir en tren. Este hecho en sí no me molesta e incluso lo agradezco: no puedo trabajar de camino al trabajo. Pero, por la configuración del centro, por más que pedía salir pronto solo me lo concedieron el primer curso. Los otros tres (o dos y cuarto) salía tres días tarde. Eso supone volver en un tren que rara vez llega a su hora y que con el abono gratuito siempre estaba lleno. Luego llega a casa, almuerza, descansa un poco y la tarde ya estaba hecha, con el runrún de tener que trabajar aún más.

Hora de un cambio

Soy consciente de que muchas personas, incluso profesores, quisieran mi situación. Trabajar cerca de casa, aunque sea en otra localidad, poder ir en tren, buen alumnado, buenos compañeros... Es una situación fantástica.

Pero, para mí, no ideal. Y el caso es que podía mejorarse.

Durante este curso eché el concurso de traslados. Un único centro, el primero en el que trabajé. A diez minutos de mi casa actual.

Ante mi sorpresa, me lo concedieron.

Para el próximo curso tan solo tengo un objetivo. Trabajar en el instituto. Echar en el centro las mismas horas que el alumnado para aprovechar allí todo el tiempo que pueda, llegar a casa, almorzar y tener toda la tarde para mí.

Evidentemente, en diciembre, marzo y junio tendré que echar horas en casa, pero la intención es minimizar el tiempo por las tardes.

Otro efecto colateral beneficioso es que podré regular la hora de acostarme y de levantarme, lo cual es bueno para la salud.

Por supuesto, hay miedos. El centro ya no es el mismo que yo dejé (me consta) y deberé afrontar nuevos retos. Pero en cualquier caso tendré mi casa a diez minutos para despejarme.

Ni siquiera me preocupa que me encuentre a los padres en el supermercado. Tengo problemas de vista, no los veré.

Una mirada al curso

El curso que termina me ha permitido reaprender mucho sobre mí mismo como docente y como persona. Mis compañeros de departamento, a quienes jamás estaré lo suficientemente agradecido, me permitieron quedarme con unos grupos muy poco numerosos.

Salvo uno, los otros han sido muy fáciles de llevar y un verdadero gustazo de estar en clase. Pero, ay, ese uno... Es increíble lo mucho que se puede centrar uno en lo negativo.

Ha sido un grupo, de tutoría para más inri, con el que apenas he tenido conexión. De mil maneras he intentado comunicarme con ellos y mejorar la situación, sin éxito. Y lo peor es que esta situación me ha generado más estrés del necesario. Lección aprendida: por mi bien, no tengo que chocarme contra una pared tantas veces.

Lo dejo por aquí porque podría estar mi buen rato analizando factores, tanto propios como ajenos, de por qué no he ido bien con este grupo. O analizar la situación que siempre se da a final de curso con respecto a las promociones y titulaciones y las visiones de la docencia que tienen diferentes profesores. Pero son temas para otro momento o para otros foros.

La barbacoa de ayer

Como decía, la barbacoa de ayer se sentía como el final de una etapa. No solo me voy yo, sino también muchos compañeros con los que he compartido todos estos cursos, o al menos dos de ellos. Incluso la jefatura de estudios cambia, una jefatura que, con todos los problemas del centro, ha funcionado genial.

Estuve todo el día preguntando «¿a ti te veo en septiembre?­­­» Como he dado clase en primero de bachillerato, tengo que ir a la evaluación extraordinaria de una alumna que no asistirá (lo sabemos con certeza), pero me ha servido como excusa perfecta para no terminar con una llorera de las que hacen época.

Ayer fue día de bailar (lo poco que bailo yo), de despedidas, de comer mucho y de abrazos. Pero también de pensar «esta despedida es problema del Adrián de septiembre», y menos mal. Por supuesto, ya he dejado dicho que cuenten conmigo para estas barbacoas y para cualquier reunión. Mientras haya gente que yo conozca, ahí estaré.

En conclusión

Estos cuatro años no han sido sencillos. Tampoco difíciles, pero desde luego ha habido retos.

Por una parte, el instituto, aunque me he sentido tremendamente a gusto, tiene sus retos. Pero fundamentalmente han sido cuatro cursos de retos personales, desde la mudanza que parecía interminable hasta la baja, pasando por esa época de apatía absoluta.

Sé perfectamente que cambiar de instituto no será la solución para todo. A nivel profesional tengo que adaptarme de nuevo a otra realidad y afrontar todos los retos que eso conlleva, tanto por sí mismo como después de haber pasado por una baja por estrés. A nivel personal espero sacar el tiempo suficiente para disfrutar aún más de mi ocio y seguir con asuntos de la casa, que aún quedan porque no llego a todo.

De momento afronto el verano con ganas. Puedo decir sin miedo que tengo más ánimo que otras veces. Tengo varias salidas ya planeadas, quiero leer, quiero ir a la playa, y los ánimos acompañan para hacerlo. Septiembre está muy lejos aún pero, aunque terminar una etapa siempre es motivo de vértigo, lo miro con ilusión y ánimo. Eso, para mí, ya es mucho.

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

Pues nada, seguimos con nuestro proyecto de leernos cada mes la revista Byte… de hace cuarenta años. Y le toca el turno al número de junio de 1985. Encontraréis todos los números en esta colección de archive.org, y el que leemos hoy, en concreto, dedicado a las técnicas de programación.

Tampoco es que sea el número de mi vida, pero tiene sus cosillas. La primera en que me paro tiene que ver con accesibilidad:

Que sí. Que hace décadas que hay gente que piensa en usar la informática para ayudar a las personas con discapacidad (en este caso visual). Lástima que tanta otra gente se olvide del tema.

Siguiente parada, anuncio de ordenador de esos que te hace añorar el diseño industrial ochentero:

¿Me vais a decir que no es precioso? Bueno. Me vais a decir que no se ve. Hagamos un enhance it:

¿Es o no precioso el Apricot Portable? Había salido a la venta en octubre del 84 y, recomonozcámoslo, le daba sopas con honda a los portátiles de la época (incluido mi adorado SX-64). Ni siete kilos, pesaba. Y las piezas separadas se comunicaban ¡por infrarrojos! ¡El futuro! ¡En 1984! Hasta tenía reconocimiento de voz (aunque habría que poner «reconocimiento» entre toneladas de comillas: dice la Wikipedia que se le podían entrar 4096 palabras, 64 de las cuales simultáneamente en memoria). Y su MS-DOS pasaba de los famosos 640 Ks (para llegar a 768, tampoco nos emocionemos más de la cuenta). En cualquier caso, una preciosidad.

Seguimos avanzando y nos encontramos con otro anuncio:

¿Qué es eso de GEM? Aquí, otra versión del anuncio:

GEM era el entorno gráfico que desarrolló Digital Research (la compañía de CP/M, fundada en 1974 y que sería adquirida por Novell en 1991 ) principalmente para los Atari ST, pero también para PCs con MS-DOS, entre otros. Y es ver una captura de GEM y que se me caiga la lagrimita. Esnif.

Volviendo a nuestro clásico «¿créias que esto era nuevo?», hoy toca…

Sí, queridas, podríais pensar que TPUs y NPUs y demás son una cosa acabada de inventar, pero cada vez que la IA se pone de moda, alguien piensa en hardware para acelerarla…

Siguiente cosa que me ha interesado: ¿cómo elegir lenguaje de programación?

La cosa comienza dando preferencia a compilados sobre interpretados por temas de velocidad (cosa más importante hace cuarenta años que ahora, que les pregunten a JavaScript y Python). Sigue proponiendo que el tipo de programa es muy importante (y dando COBOL como ejemplo de lenguaje para aplicaciones de negocios), y a continuación proponiendo si lenguajes de alto o bajo nivel… Comencé a leer el artículo pensando que lo que dijese sería siendo bastante actual. Curiosamente, donde uno esperaba más estabilidad… va a ser que no. Pero claro, entonces llega este artículo sobre componentes reutilizables:

Ojo a los dos primeros párrafos:

El mundo del software ha chocado con la Crisis del Software: los proyectos ambiciosos son difíciles de gestionar, demasiado caros, de calidad mediocre y difíciles de programar con fiabilidad. Además, con demasiada frecuencia, el software ofrece una solución que no satisface las necesidades de los clientes. Tras la entrega, o incluso antes, los cambios en los requisitos obligan a modificar los sistemas.

Debemos construir sistemas de una forma radicalmente diferente si queremos satisfacer las demandas futuras de cantidad y calidad. Debemos aprender a construir sistemas que resistan el cambio.

¿Escritos en 1985? ¿1995? ¿2025? ¿Nos jugamos algo a que los podremos reutilizar sin tocar una coma en 2065?

En fin… Si queréis saltar de este mes de junio del 85 a nuestra relectura del número de mayo, aquí lo teneís. y el mes que viene, más (espero).

2025-06-24

22 (otro blog más)

El año pasado no celebramos el vigésimo primer cumpleaños de obm porque no estaba obm como para tirar cohetes. Tampoco es que el vigésimo segundo año haya sido fantástico, pero algo menos malo sí, o sea que minientrada para celebrar los 22 (seguro que hay millones de webs que tienen más de 22 años, pero debemos estar ya en un percentil apañadete, ¿no?).

En el año 21 decidimos que una manera de darle algo de vida al blog sería recoger mis lecturas por aquí… pero en los últimos doce meses solo hemos hecho una entrada sobre el tema, el pasado octubre.

Sí hemos tenido algo más de constancia leyéndonos los números de la revista Byte de hace cuarenta años. Aquí tenéis los repasos a los números de mayo del 85, abril, marzo, febrero, enero, diciembre del 84, noviembre, octubre, septiembre, agosto, y julio. Y tengo por aquí a medio preparar la entrada de junio del 85.

Pero, para mi sorpresa, en los últimos doce meses sí he encontrado motivos para escribir entradas sobre (en orden casi cronológico inverso) cómo evitar el contenido sugerido en instagram, Powertoys, la accesibilidad y las Meta Ray-ban, la accesibilidad y Daredevil, un rant sobre las gafas rosas que nos ponemos a veces para mirar al pasado cuando queremos criticar (con razón) el presente (cualquier tiempo pasado fue mejor, o no), Wonderblocks y la programación en la caja tonta, adtech, la amenaza de separar Chrome de Google, más adtech, el misterio de Amazon y los incrustados de WordPress, el clásico repaso a mi 2024 musical, un buceo por los archivos de Metrópolis, los precios de los Mac Mini (o, mejor, del disco y la RAM de los Mac Mini), herramientas «plataformágnosticas» para compartir música y podcasts en la web, y hasta una de cacharritos.

En fin. Quién sabe qué traerán los próximos doce meses. En cualquier caso, felices 22, obm :-).

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-06-08

De Firefox y Librewolf (Adrián Perales)

Me he pasado de Firefox a Librewolf, y el tema tiene más chicha de la que pueda parecer en un principio. Se viene una entrada de estas en las que divago fuerte sobre tecnología.

Mozilla y la polémica

El navegador Firefox siempre ha estado rodeado de polémicas. Recuerdo decisiones muy cuestionadas como introducir el soporte para DRM, tema del que hablé en este blog en su momento.

Pero en los últimos tiempos las decisiones de Mozilla han hecho que Firefox esté en el centro de muchos titulares, y no para bien. Pienso por ejemplo en el acceso a modelos de lenguaje dentro del propio navegador, o la creciente telemetría.

Sin embargo, por más criticable que sean las decisiones de Mozilla con su navegador, estamos en una encrucijada bastante complicada.

Firefox es el único navegador multiplataforma que no se basa en el motor de Google.

Alternativas

Brave o Vivaldi (un navegador europeo muy bien considerado) se basan en Chrome, y usarlos sería darle un poquito más del pastel a un motor ya mayoritario. Bien es cierto que Vivaldi toca mucho las tripas.

Está WebKit, pero prácticamente se limita a aparatos de Apple con Safari y navegadores derivados (en iOS, todos) como Orion, navegador del que también hablé y que recientemente ha anunciado su lanzamiento para Linux pero aún tardaremos en verlo.

En GNU/Linux hay otros navegadores minoritarios basados en Webkit u otros motores (no sé cómo está el asunto), pero no están tan maduros como los Firefox o Chrome. Por ejemplo, Gnome Web.

Luego están Ladybird, un navegador independiente, o Servo, un motor de navegación. Pero ambos están en desarrollo y aún no hay nada usable.

Por lo tanto, en el momento de escribir estas líneas, las opciones multiplataforma maduras son navegadores basadas en Chrome, o Firefox.

Pero hay un camino de en medio. Navegadores basados en Firefox.

Están Floorp o Zen, pero si aparece un nombre en los mentideros de la privacidad, ese es Librewolf.

¿Y por qué usar un navegador derivado en lugar de usar el propio Firefox? La razón que me convenció a mí me la comentó Ángeles en una de mis publicaciones en el fediverso.

Para mostrar nuestro desacuerdo con las decisiones de Mozilla. Para protestar de alguna forma por la deriva de Firefox.

Entra Librewolf

Librewolf es un navegador para paranoicos de la privacidad. Trae activas por defectos muchísimas opciones para garantizar algo más de seguridad, la mayoría invisibles para el usuario. Por ejemplo, se identifica como Windows aunque usemos otro sistema, por ser el más usado.

Algunos de los ajustes más visibles y llamativos:

  • Todo viene en inglés, por aquello de que es el idioma mayoritario de la web y, por tanto, el que menos nos identifica.
  • El navegador se inicia con un tamaño de ventana predefinido porque nuestra resolución también nos delata.
  • Tiene un botón para que el navegador recuerde las cookies en los sitios que le indiquemos. En Firefox hay que entrar en los ajustes de la web y es más engorroso.
  • La única extensión que trae es uBlock Origin, y nos indican que no instalemos más porque nos identifica y porque muchas otras opciones de privacidad las trae activas por debajo. En su documentación nos invita a activar el modo avanzado en uBlock Origin para desactivar los scripts de terceros.

Con Librewolf he descubierto que Firefox ya trae por defecto los contenedores, y lo que hace la extensión Firefox Multi-account containers es dar una interfaz para configurarlos más fácilmente.

Los contenedores son una opción que me parece fundamental a estas alturas y una razón poderosa para seguir con un navegador así en lugar de optar por algo como Gnome Web. Por ejemplo, tengo un contenedor para el trabajo con su cuenta Google asociada, y otro para Al compás gaditano. También separo las cuentas de las tiendas web y el banco. Librewolf (y Firefox por defecto) permite abrir una pestaña nueva en un contenedor, y con eso me es más que suficiente.

Por otro lado, antes usaba una extensión para borrar el historial después de una semana. Desde que instalé LibreWolf decidí navegar sin historial (para algo hay marcadores) y no me parece un gran sacrificio.

Viendo todo esto, y como yo soy así, una de las primeras acciones que realicé fue entrar en WhatsApp web y desactivar la protección contra rastreo de canvas para poder mandar imágenes.

Entrar en WhatsApp web usando un navegador para paranoicos de la privacidad. Sí soy.

Conclusión

Ya sabéis cómo funciono. Voy por arranques. A lo mejor mañana os digo que he puesto Chrome con sincronización activada. No me hagáis demasiado caso.

Pero, de momento, estoy contento con Librewolf y todo esto que cuento no me supone ningún esfuerzo respecto a lo que ya hacía. Apenas cambio al Firefox normal para algún escenario puntual.

Sobra decir que es increíble la cantidad de historias que le han metido a los navegadores para identificarnos y lo necesarios que son sitios webs sencillitos que prescindan de todo eso, donde lo más importante sea compartir, como siempre fue. Aguante la small web (y Gemini para los frikazos).

2025-05-29

Sentir que aporto (Adrián Perales)

De un tiempo a esta parte siento que «he vuelto al redil». Después de unos años bastante convulsos en unos temas, desde hace un tiempo siento que vuelvo a ser yo, que vuelvo a estar más en sintonía con valores con los que me identifico y me siento más cómodo. Y esto se manifiesta en varios aspectos de mi vida.

En temas tecnológicos

Volver al P2P. Me he quitado prácticamente todos los servicios de streaming que alguna vez tuve y he vuelto a compartir la cultura que me gusta. Con esto, además de no contribuir a un modelo que no me gusta, logro que otras personas puedan acceder a esas obras. No tengo el programa compartiendo por siempre, pero sí me aseguro de tener un buen ratio.

Eliminar redes sociales mayoritarias. Están controladas por grandes magnates tecnológicos que ahora mismo representan justo lo contrario a lo que creo. Decirles a ciertas personas que no tengo Facebook, Twitter o TikTok, hace que alguna me pregunte y se replantee su uso.

Volver a GNU/Linux. No contribuyo al modelo de grandes tecnológicas, y me consta que alguna persona ha descubierto software por mis comentarios. Si ese software es libre, mejor que mejor.

En temas sociales

Estar al tanto de la actualidad política. Me permite discrepar y explicar a la gente dispuesta a escuchar el punto de vista que tengo yo de la actualidad para hacer que se replantee algún tema.

Abrir los ojos al feminismo y a otros temas sociales. No se trata de odio, no se trata de buscar enemigos, se trata de aceptación y respeto. Conocer estos temas más en profundidad me permiten, también, explicarlo y confrontar cuando corresponda.

Formar parte de Somos conexión. Una compañía de telecomunicaciones cooperativa y transparente que permite participar en sus asambleas internas. Tan contento estoy con la experiencia que, en algún futuro, quiero irme a Fiare Banca ética.

Colaborar con varias ONG. No me cuesta ningún trabajo y otras personas se benefician de los eurillos que pueda aportar.

Temas pendientes

Sin entrar en mucho detalle:

  • Tecnología. Reducir aún más mi dependencia a grandes tecnológicas. Aún uso productos de Apple y un Kindle, entre otros.
  • Ecologismo. Reducción de plásticos y uso de productos más respetuosos con el medio ambiente.
  • Veganismo. Reducción o eliminación de la carne por cuestiones éticas.
  • Vestimenta. Reducción o renuncia de la moda rápida y apuesta por productos más cercanos (bien es cierto que no renuevo la ropa muy a menudo).

Contradicciones

No busco en ningún momento estar alineado al 100% con mis ideales. La sociedad empuja en otro sentido. Buscar la pureza ideológica es muy complicado, si no imposible. Pero con estos pequeños gestos, continuados en el tiempo y siempre procurando que no me provoquen una gran fricción en mi día a día, me acercan a esas ideas y me hacen sentir un poquito más feliz.

2025-05-28

Cómo evitar el contenido sugerido en Instagram (otro blog más)

Nota para los ¿tres? ¿cuatro? lectores habituales de obm. Creo que nunca he escrito un post tan poco adecuado para vosotros. Mis disculpas 🙏. Mi única excusa es la voluntad de servicio público. Lo juro. En breve retomamos la actividad habitual (otro dichoso post con la Byte de hace cuarenta años, sí).

¿Por qué esta entrada? Uno tiene la teoría de que, de hecho, usar las redes sociales, aunque sean de Meta, tampoco es malo… mientras no se deje uno llevar por el algoritmo de recomendación, que está ahí para maximizar esa cosa perversa del engagement. Y el convencimiento de que somos pocos, muy pocos, los que somos conscientes de que a la que te descuides Meta va a volver a activarte el algoritmo aunque tú le hayas dicho explícitamente cien veces que no lo quieres (No tengo excesivos problemas con que las redes sociales me muestren publicidad dentro de unos límites. Debe ser genético). Pero me da la impresión de que soy de los poquísimos locos que se obstina, cada treinta días, cuando Instagram (con la misma obstinación, debe decirse) decide ignorar mis preferencias, se lanza a decirle que deje de dar por saco otros treinta días más. El algoritmo no se rendirá, pero yo tampoco. Llamadme Sísifo. De hecho, el día, hace ya unos cuantos años, en que la actualización de la app de Facebook me escondió de más la opción de limitar las sugerencias algorítmicas… me la desinstalé (y desde entonces debo entrar una vez cada dos o tres meses, y aunque hay gente que echo de menos, parece que no ha habido grandes daños por ello).

En cualquier caso. Para evitar el contenido sugerido en Instagram…

En primer lugar abrimos la app y, en la parte inferior hacemos clic en nuestro avatar:

Esto os llevará a vuestro perfil. Ahí toca hacer clic en las tres líneas, el dichoso «menú hamburguesa»:

…con lo que llegaréis a la configuración:

…y haciendo clic en «Tu actividad» llegaréis a

Aprovechando que ya estáis aquí, igual es conveniente que le deis a «Tiempo invertido» y os escandalicéis un poco (o no) con vuestros números. Aquí los míos:

(Sí, podéis establecer un límite diario de uso. Y hasta puede que ayude. Pero es tan fácil saltárselo…)

Volviendo atrás, podéis ir bajando hasta que os aparezca «Lo que tú ves»:

Y si hacéis clic en «Preferencias de contenido», llegaréis a

… y aquí es donde, dándole a «Pausar publicaciones sugeridas en el feed» os libraréis de los contenidos que solo están ahí para engancharos (hasta que pasen los treinta días de gracia, claro).

De nada.

2025-05-26

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

Vuelve nuestro terrorista favorito.

2025-05-22

Algo más sobre sistemas de mensajería (Adrián Perales)

Hace unos meses escribí sobre cómo veo yo el estado de la mensajería instantánea y, por diversas razones, llegué a diversos textos sobre el tema a partir de divagaciones en el fediverso.

Recojo aquí algunas lecturas interesantes y luego unas pequeñas conclusiones.

Las lecturas

Encrypted Messaging Apps – Dhole Moments
Un experto en criptografía analiza diferentes sistemas de mensajería (XMPP+OMEMO, Matrix, Session y Threema, por el momento). Por razones de seguridad, él recomienda Signal.

The Revolution Will Not Be Signaled – CounterPunch.org
Un artículo que menciona muchos problemas de Signal, desde sus turbios orígenes hasta los servidores que usa.

RCS texts on the iPhone aren’t encrypted now, but that could change | The Verge
Un protocolo que depende de varias organizaciones y de Google en el que ni siquiera Apple pudo conseguir el cifrado desde el principio. Muy confiable no parece.

Las conclusiones

Al final, Signal es el más seguro de los sistemas de mensajería, ya sean centralizados o descentralizados. Y de largo, a pesar de sus muchos problemas.

RCS me parecía otra opción interesante, pero he comprobado, de nuevo, que su implementación depende demasiado de grandes compañías y es muy difícil verlo fuera de las aplicaciones propias de grandes marcas (Google, Samsung o Apple).

Por otro lado, XMPP + OMEMO me sigue pareciendo muy buena opción por su mezcla de descentralización con algo de privacidad añadida, aunque no llegue a los estándares de Signal. Es la opción con la que yo me sentiría más cómodo, pero ya hemos hablado muchas veces de sus problemas de adopción.

Hay otras opciones muy interesantes como SimpleX o DeltaChat pero, la verdad, si ya es difícil mover gente a sistemas más amigables, con estos ni me lo planteo.

Después de estas lecturas y reflexionar un poco, me quedo con la idea que ya lancé: tiraré por lo práctico y usaré los sistemas en los que tengo más contactos.

Ahora mismo mi decisión es seguir con XMPP (por grupos de charla y algún contacto del fedi), iMessage (hasta que deje de usar Apple) y WhatsApp que, aunque tenga todos los problemas del mundo, me sigue pareciendo una renuncia demasiado grande. Ahora mismo tengo Signal pero no garantizo que lo aguante mucho tiempo.

Estoy en un momento en el que me gustaría apostar por tecnologías más sanas. Soy consciente de la contradicción pero la mensajería, para mí, es un terreno sensible. Me encantaría dejar WhatsApp, es un tema al que vuelvo cada poco, pero no me apetece asumir el sacrificio que supone.

Estas son mis circunstancias y mis conclusiones. Al menos, hasta que vuelva a plantearme el tema.

2025-05-17

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

Seguimos leyendo la revista Byte, pero cuarenta años tarde (todas las entradas disponibles en la etiqueta Byte). Si queréis pasar de mis extractos y acudir a la fuente, tenéis todo el histórico en archive.org y el número del mes aquí.

Este mes la cosa sera (relativamente breve). La portada, no especialmente destacable:

De las noticias, me quedo con un breve. ¿Sabíais que este mes se cumplen cuarenta años del anuncio de Excel? ¿Sabíais que Microsoft lo lanzó inicialmente para el Mac? Pues sí…

¿Se fiaba mucho Microsoft del éxito de Excel? Pues no sé, pero unas páginas más adelante la empresa anunciaba su solución de hoja de cálculo para el Mac:

¿Créiais que lo del caos de productos de las grandes tecnológicas era cosa de ahora? Pues hace cuarenta años Microsoft hacía publicidad de su hoja de cáculo Multiplan para Mac mientras anunciaba el lanzamiento de Excel para la misma plataforma…

Y en la lista de productos tenemos nada más y nada menos que el PC AT de IBM, con su 80286 y sus 256 KBs de RAM en el modelo básico (apenas cuatro mil dólares de la época):

Por cierto… ¿lo de la compatibilidad de los PCs? El AT venía con un teclado nuevo, y el software para los PCs anteriores de IBM que accedía directamente a sus teclados (juegos, por ejemplo)… no funcionaba en el AT. El paso del 8086 al 286, para sorpresa de nadie, también daba sus propios problemas.

El AT, por cierto, era el primero en poder usar los novísimos discos de alta densidad, con sus casi infinitos 1,2 megabytes (hablamos de discos de 51⁄4 pulgadas, claro), a 500 kilobits por segundo. Sorpresa: las unidades de disco también suponían un problema de compatibilidad: si escribías a un disco de doble densidad, este no necesariamente sería legible en otros PCs. ¿Sistemas operativos? PC DOS 3.0 (no, no MS DOS) o el Concurrent DOS de Digital Research.

Y de los anuncios, me quedo con el SORD IS-11C. ¿No os provoca una cierta ansiedad la bisagra de la pantalla?

Dice la Wikipedia que llevaba un Z80 y que la resolución de la pantalla era de 256 × 64. No habla del peso ni de la batería (algo me dice que solo funcionaba enchufado a la corriente).

Y con esto me paso a la sección de programación, donde encontramos, primero…

Si hoy en día incluimos en una revista un programa para convertir números decimales a fracciones con la capacidad de reconocer al menos unas cuantas raíces cuadradas (el programa reconocía las raíces de 2 , 3 y 5, y π y π2), explotan cráneos (el autor, por más inri, era un estudiante de medicina de Estocolmo). Y por si esto no fuese suficiente…

(El programa usa la serie de Taylor de la arcotangente y da quince cifras de π, más que suficientes para básicamente cualquier cálculo práctico.)

En fin. Volvemos, con un poco de suerte, el mes que viene. Si queréis anticipar el «futuro», podéis hacer trampa aquí.

2025-05-14

Prueba Syncthing ahora mismo (Adrián Perales)

Conozco Syncthing desde hace un montón de años. Sin embargo, nunca me había lanzado a probarlo y siempre confié en alguna nube personal de terceros.

Cuando he tenido algún problema con alguna (Dropbox, iCloud, OwnCloud o Nextcloud son las que más suelo usar, pero también he pasado por OneDrive y he probado Google Drive), siempre hay algún contacto, en especial del fediverso, que me suelta el comentario:

No necesitas una nube para eso, prueba Syncthing.

Yo me agarraba a cualquier excusa. Es que me viene bien tener los datos siempre accesibles, no tengo por qué tenerlos todos siempre descargados, es que debe ser difícil de configurar…

A ver. Syncthing tampoco es para todo el mundo. Usarlo no es difícil, pero tampoco trivial. Requiere su ratito. Sin embargo, nada inaccesible a poco que se tenga algo de experiencia en temas informáticos.

Se puede sincronizar lo que uno necesite. Puedes tener una carpeta con los documentos más importantes, que ocupen pocos megas, siempre sincronizado entre tu ordenador y tu móvil. Puedes tener los archivos del trabajo sincronizados con tu tableta, o solo descargar algunos. Como Syncthing permite configurar varias carpetas, se puede adaptar perfectamente a cualquier necesidad.

Lo único que se debe tener en cuenta es que, de normal, funciona en local a través de Wifi. A no ser que tengas un NAS o algún sistema que se salga de mis conocimientos, los archivos se sincronizan en casa y los cambios se envían cuando estés de vuelta. El hecho de que no hay un servidor central está ahí, y puede tener sus inconvenientes.

En mi caso, sincronizo la carpeta del trabajo entre mi PC con GNU/Linux y mi tableta iPad. Para ello hago uso de la aplicación Synctrain. Por limitaciones de iOS, debo acordarme de lanzar la aplicación antes de salir de casa para que se descarguen los cambios. Un segundo tarda, es rapidísimo.

Si usas un sistema operativo más de verdad como Android, en F-droid hay un cliente que se queda andando en segundo plano. Y si usas dos equipos con GNU/Linux ya es la repanocha.

En el ordenador basta con poner la aplicación en el arranque y acceder puntualmente a la interfaz web de configuración. Hace meses que no toco nada.

Hazme caso. Prueba Syncthing. Al menos un ratito. A lo mejor te cambia el paradigma y te estás perdiendo justo la herramienta que necesitas y tú ahí, complicándote la vida buscando una nube.

ACTUALIZACIÓN: Hay quien comenta que Syncthing también funciona sin estar en red local. No sé cómo será el asunto. Yo en lo personal no he podido conectarme fuera de casa.

2025-05-12

Radios online (Adrián Perales)

Cuando aún usaba de forma activa servicios de streaming musical estuve bastante tiempo disgustado por el hecho de que el algoritmo aprendiera de las canciones que me ponía de fondo mientras trabajaba. Esas canciones no representaban mis gustos y no quería recomendaciones de música parecida.

Más tarde dejé de usarlos, pero aún tenía cierto problema. La música que tengo en local es música que me gusta y, al final, acababa fijando mi atención en algunos detalles de la melodía.

Yo solo necesitaba música nueva, desconocida, para tener de fondo.

Una solución eran vídeos de mezclas musicales en YouTube o listas de reproducción, pero hay otra solución.

Las radios online.

Hay una cantidad sorprendente de emisoras llevadas por personas o pequeños colectivos que se suman a las más comerciales, lugares que se dedican a poner música o que tienen una programación propia muy interesante.

Es un mundillo, cuanto menos, curioso de descubrir.

Debo dar las gracias a Aboolute Beginner y a Manu Mateos por ponerme sobre la pista de este mundillo y de muchas emisoras. Manu ha tocado el tema en algunas ocasiones en su blog:

Las que yo más suelo escuchar son El Salto Radio, Radio Almaina, KEXP, Mountain Town Radio, 0nline Radio Lo-fi y Radio Paradise. Las dos primeras tienen programas hablados, las otras solo música.

2025-04-18

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

Continuamos con el proyecto de leer mensualmente la revista Byte… de hace cuarenta años (tenéis las entradas anteriores en la etiqueta Byte del blog, aunque a ver si encuentro el momento de currarme un índice un poco más currado (que muy probablemente solo usaría yo, ciertamente)).

Decía el mes pasado que este número venía cargadito, y así es:

…pero no cargado de las cosas que suelo destacar, sino de una buena cantidad de artículos sobre IA. Pongo yo unos cuantos «plus ça change» en estas entradas, pero en esta ocasión todo el bloque central de la revista es un «plus ça change». Tanto que, del resto, solo me voy a quedar con la inocentada:

Aquí la entrada correspondiente de hoaxes.org: https://hoaxes.org/af_database/permalink/the_macknifer, por si a alguien le hiciese falta.

(Por cierto, he decidido cambiar de «proveedor» para las revistas, a esta página de archive.org, y en la medida de lo posible (léase, cuando me acuerde) intentaré enlazar los artículos y piezas que comente.)

Entrando en materia, la cosa comienza con nada más y nada menos que Marvin Minsky:

Minsky fue cofundador del laboratorio de IA del MIT, había recibido el premio Turing en 1969, inventó el primer «head mounted display», codiseñó con Seymour Papert la tortuga de Logo, y para su tesis doctoral construyó a principios de los años cincuenta SNARC, uno de los primeros intentos de construir una máquina que imitara el comportamiento del cerebro humano, diseñada para simular una red neuronal, específicamente un conjunto de neuronas artificiales interconectadas, que emulaba el comportamiento de ratas recorriendo laberintos, y aprendía gradualmente a encontrar el camino correcto basándose en recompensas (lo que ahora llamamos aprendizaje por refuerzo). Ojo: Minsky (fallecido en 2016) estuvo asociado con Jeffrey Epstein y estuvo en su isla privada, aunque la mujer de Minsky, que estuvo allí con él, defiende que nunca hizo nada moralmente cuestionable allí.

Minsky, que estaba muy interesado en SETI, el proyecto para buscar vida extraterrestre, plantea en el artículo su hipótesis de que toda inteligencia, alienígena o no, debe ser similar y que, por tanto, no debería ser muy difícil la comunicación, a no ser que la otra inteligencia haya ido más allá del estado de preocuparse por su supervivencia, la comunicación y expandir su control del mundo físico. Para ello se apoya en un experimento mental de exploración de máquinas de Turing, y en la universalidad de la aritmética, para acabar llegando a la inevitabilidad, a su vez, de muchos aspectos del lenguaje (el razonamiento me suena a Chomsky, por algún motivo). No me atrevo para nada a resumir ni a juzgar el artículo, pero es curioso combinar la IA de la inteligencia artificial con la IA de la inteligencia alienígena, cuando menos…

El siguiente artículo también tiene autores «wikipediables»: Roger Schank se doctoró en lingüística después de graduarse en matemáticas, fue profesor de informática y psicología en Yale , donde en 1981 fundó el Yale Artificial Intelligence Project y en 1989 haría lo mismo con el Institute for the Learning Sciences de Northwestern. Investigaba sobre comprensión del lenguaje natural y razonamiento basado en casos. Y, me temo, no solo conocía también a Epstein (ayuda que este se dedicase de vez en cuando a financiar investigación en IA), como Minsky, sino que le mostró su apoyo cuando comenzó a destaparse el pastel :-S. Lawrence Hunter, por su parte, se dedica hoy en día a la biología computacional, campo al que llegó a través del razonamiento basado en casos para el diagnóstico del cáncer de pulmón.

¿Y el artículo? El artículo toca, primero, un tema que se me antoja vital y, a la vez, absolutamente ausente del debate actual: cómo la inteligencia artificial podría ser una muy buena herramienta para ayudar a entender qué es y cómo funciona la inteligencia «natural», y luego se centra en algunos de los problemas de procesar el lenguaje natural, como la ambigüedad, el contexto o la memoria (la de recordar, no necesariamente la RAM).

Me estoy pasando con la cuenta de palabras, o sea que solo citaré The LISP tutor y PROUST, An automatic debugger for Pascal programs, que como podrá imaginar el lector, se centran en los usos , que ahora parecen más cercanos, pero ya veremos, de la IA para enseñar a programar y ayudarnos a programar.

Y cerramos con…

… nada más y nada menos que un Nobel de física (y premio Turing, y premio Príncipe de Asturias, y no sé cuántos premios más), Geoffrey Hinton. Lo de darle un Nobel en física a un graduado en física y doctor e investigador en IA es algo en lo que no entraré ahora, pero marcarse el punto de publicarle cuando era un mero profesor ayudante en Carnegie Mellon, junto a figuras al menos aparentemente de mucho más relumbrón que él, me lo vais a tener que reconocer, no está nada mal. Más si lo que está explicando es, si no lo he entendido mal, el trabajo en entrenamiento de redes neuronales que es uno de los pilares por los que ha acabado ganando todo el reconocimiento y los premios con los que cuenta.

Y no me alargo más, pero toda la tabla de contenidos del especial merece como mínimo una ojeada rápida…

Y, en cualquier caso, que cuarenta años no son nada.

Si queréis seguir leyendo, aquí tenéis mis notas sobre el número de marzo. Y el mes que viene, con un poco de suerte, más.

2025-03-17

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

Feel Good Futbol Club

2025-02-14

25 años de LPD (La Página Definitiva)

De dónde venimos Todos somos hijos de nuestro tiempo. Ustedes, nosotros, y también esta su página web que hacemos entre […]

2025-01-25

365 días de Chino con Duolingo (Adrianistán)

El pasado 22 de abril hice 365 días de Duolingo. Todos los días del año he entrado a la app y he hecho al menos uno de los ejercios que propone la app, en mi caso en idioma chino. Voy a aprovechar este récord personal para hablar un poco sobre Duolingo y sobre este idioma

Sobre Duolingo

En un principio me descargué la app y empecé a estudiar chino

Duolingo es una app para smartphone que te propone aprender idiomas (y ahora matemáticas y música). Se puede usar de forma gratuita aunque tiene anuncios y tenemos vidas, si perdemos todas las vidas no podremos avanzar. Las vidas se pierden cometiendo fallos en los ejercicios. Para evitar esto existe un plan de pago, aunque en mi caso no lo he pagado.

La app en sí está muy cuidada, tiene un aspecto algo infantil pero divertido y no he visto apenas fallos técnicos. Además tiene en característico marketing agresivo que te manipula de forma burda pero efectiva para que continúes tu racha (Duo va a venir a tu casa a "castigarte" si no haces la lección)

Para hacer el curso de chino deberemos cambiarnos al inglés, ya que solo está disponible ahí. Es decir, no podemos hacer el curso Español-Chino. Pero la propia app maneja esta situación bastante bien.

Sobre el contenido: pues está bien pero es claramente insuficiente, aunque como repaso puede venirte bien. No explica demasiado, te deja que deduzcas las reglas en muchos casos.

En octubre empecé clases presenciales y aunque he mantenido el Duolingo, lo cierto es que aprendo más en una clase tradicional, aunque es más caro y no puedes tener todos los días

¿Quién habla chino? ¿Cómo van los caracteres?

Antes de empezar un idioma es interesante saber algo sobre él, quién lo habla, qué es eso del mandarín y del chino simplificado, es verdad que escriben con dibujitos y cuántos hay son preguntas que todos podemos hacernos

El chino, en realidad más que un idioma es una familia de idiomas. Igual que el latín en parte de Europa fue divergiendo, el chino pasó lo mismo. Ahora bien, por diferentes motivos todas estas variaciones del chino se han querido agrupar como dialectos aunque no sean inteligibles. Una cosa curiosa es que aunque se hable diferente en cantonés y en mandarín, se usan los mismos caracteres, lo que le da bastante legibilidad a los dialectos entre sí a nivel escrito.

El mandarín es el idioma de la zona de Pekín, y es la variante usada en el sistema educativo principalmente. El llamado chino estándar, que es lo que uno aprende siendo extranjero, también se basa en el mandarín de Pekín. Este idioma se habla no solo en China, sino también en Taiwan, Hong Kong, Macao, Singapur y Malasia, aunque hay diferencias.

La principal diferencia tiene que ver con los caracteres al escribir. La cultura china inventó la escritura de forma independiente hace 3000 años y no está emparentada con la escritura occidental que heredamos de los sumerios, con la innovación del alfabeto de los fenicios. Los caracteres chinos o hanzi, originalmente eran ideogramas, representaciones esquemáticas de lo que se quería escribir aunque hoy en día muchos hanzi no tienen ese enfoque. Los hanzi se expandieron por Asia y de hecho gran parte del japonés actual usa kanjis, que son los hanzis adaptados por los japoneses, aunque el idioma no tenga nada que ver. A día tanto chinos como japoneses son capaces de leer alguna cosa suelta del otro idioma aunque a nivel hablado no tenga nada que ver.

La diferencia principal entre China, Singapur, Malasia y Hong Kong, Macao y Taiwan, es que en los años 50 del siglo XX se introdujo la simplificación de los caracteres, para que fuesen más sencillos y con la esperanza de aumentar la alfabetización en China. Aunque proyectos de este estilo llevaban gestándose muchos años, el hecho de que finalmente lo llevaran a cabo los comunistas hizo que aquellas zonas de China opuestas al régimen siguieran usando los caracteres tradicionales. Y aunque Macao y Hong Kong pasaron a manos chinas, se ha mantenido su uso. Tampoco es que los caracteres tradicionales estén prohibidos en China pero no se suelen usar en el día a día.

Los caracteres como hemos dicho eran originalmente ideas pero ahora hay de todo. Eso sí, todo caracter se pronuncia en una sílaba. Eso no quiere decir que una sílaba concreta se escriba siempre igual. Eso sería un silabario. Pero el chino no tiene silabario. Aunque la sílaba sea la misma, el caracter depende del significado concreto. Por ejemplo, ta, se puede escribir como 他, 她 o 它。Se pronuncian igual, pero uno es el pronombre él, otro es ella y el otro es eso.

Los caracteres son muchos, unos 3000 para uso común. Pero no son 100% aleatorios, hay patrones: los radicales. Son componentes de un caracter, y suelen significado semántico aunque a veces también fonético. Por ejemplo entre 他 y 她, cambia el radical de persona por el de mujer.

Ahora bien, lo importante no son los caracteres. Como en cualquier otro idioma, lo importante son las palabras. Y aunque hay muchas palabrar monosílabas, de un caracter, la mayoría son de 2 o 3 sílabas (2 o 3 caracteres), y allí encontraremos caracteres que se empiezan a repetir.

Tonos

El chino, al igual que otros idiomas de la zona, es tonal. Realmente todos los idiomas tienen tonos de alguna forma, pero mientras en castellano solo usamos para distinguir la intencionalidad de la frase (vienes a comer, ¿vienes a comer?), en chino todas las sílabas tienen tono y aporta significado semántico. En chino encontraremos cuatro tonos, los cuales se denominan por su orden un una lista como primer tono, segundo tono, etc. Los tonos no son solo como de agudo o grave decimos algo, y su evolución al hacer la sílaba (solo el primer tono no nos pide cambiar la entonación mientras lo hacemos), sino una duración determinada y hasta cierto punto un volumen.

Esto es uno de los principales problemas que la gente que venimos de idiomas indoeuropeos tenemos, ya que nuestro cerebro nunca le ha prestado demasiada atención al tono. Y el chino es muy puñetero, ya que existen multitud de palabras cuya única diferencia es el tono.

Sobre el resto de la pronunciación del chino, lo cierto es que puede resultar confuso ya que los sonidos de consonantes son muy similares entre sí a nuestros oídos mientras sonidos fáciles para nosotros, ellos no tienen. Los chistes de que los chinos hablan como "chinchanchu" tienen algo de verdad.

Gramática

Todo parece súper difícil según lo estoy contando pero hay una cosa sencilla: la gramática. Los verbos en chino no se conjugan, tampoco existe las modificaciones de género y de plural. Y hay muy pocas preposiciones. Es bastante simple construir frases correctas y ya desde el primer año hacer frases en pasado y en futuro. Sé que más adelante veremos cosas más complejas pero de momento me parece una gramática más simple incluso que la del inglés que tiene esa fama de ser sencilla.

Con esto acabo mis comentarios sobre un año aprendiendo chino, tanto en Duolingo como con clases presenciales. Hay muchas más cosas que podría comentar pero se me quedaría muy largo. En otra ocasión. Y como dicen en China: 再见!

2025-01-20

STAR WARS: Skeleton Crew (Disney+, 2024-2025) (La Página Definitiva)

Que el chupete te acompañe

2025-01-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-01-07

Paralelismo para lelos (Adrianistán)

No podía hablar de paralelismo sin hacer el chiste del título. En estos artículos sobre paralelismo hablaremos sobre por qué es algo esencial en la programación en 2025 y las diferentes formas de alcanzarlo: SIMD, multicore, sistemas distribuidos y GPUs.

¿Por qué necesitamos paralelismo?

Históricamente, el funcionamiento de un ordenador, en concreto de la CPU, la parte más importante, ha sido secuencial. La CPU iba leyendo instrucciones e iba ejecutándolas una detrás de otra. El ritmo lo marca la frecuencia del procesador, medido en herzios. Estas operaciones manipulan datos en memoria, una memoria global, sobreescribible y de acceso rápido pero volátil. Muchos lenguajes de programación como C, Java o Python se basan en esa idea de ir haciendo operaciones una detrásde otra (el paradigma imperativo).

Las CPUs de los 80 funcionaban así. Pero queremos más rendimiento. La opción sencilla es elevar la frecuencia de la CPU. Durante un tiempo esto fue fácil, aprovechando la ley de Moore, podíamos tener transistores más pequeños, que gastan menos energía y podemos aumentar la frecuencia sin aumentar el calor generado. Ya en los 90 se llegó prácticamente al límite, se tuvo que empezar a refrigerar las CPUs de forma activa, con ventiladores o con sistemas líquidos.

A este problema se le llama el del muro de potencia, y es que básicamente miniaturizar y bajar voltajes te permite subir frecuencias manteniendo un nivel de potencia energética similar pero hay límites físicos.

Ante esta tesitura hay varias opciones. La primera, que no vamos a ver en detalle ya que la hace la CPU sin que nos demos cuenta es, aprovechando la ley de Moore, hacer CPUs más complejas con pipelines y sistemas de predicción. Es decir, el código ejecuta varias instrucciones a la vez, en diferentes fases. Incluido tomar los saltos antes de que se sepa qué va a salir (hace los ifs antes de saber si se va a ejecutar la parte del true o la del false). Pero todo esto de forma interna sin que el programa note la diferencia con una CPU que no haga esto. Esto funciona bastante bien, aunque en código nativo se nota más la diferencia (la CPU ve mejor los patrones para hacer predicciones).

Otra opción es fijarse en qué otras cosas ralentizan la ejecución. Un tema muy importante es el acceso a memoria, que a las frecuencias actuales es muy lento comparado con hacer cosas en la CPU (varios órdenes de magnitud, piensa 100, 1000 veces más lento). Si una instrucción que necesita datos en memoria la conseguimos acelerar, tendremos mucho impacto. Esto se soluciona con memorias caché en la CPU, cada vez más grandes. Esto tiene grandes beneficios pero los lenguajes que usan estructuras de datos tipo Array son los que más, ya que normalmente las cachés se traen áreas de memoria de golpe y en los arrays, todo esta almacenado junto (a diferencia de las listas enlazadas).

No obstante, ahora vamos a centrarnos en aquellas mejoras que necesitan de que el programador las use. Y para ello vamos a poner un problema práctico.

El fractal de Mandelbrot

El fractal de Mandelbrot es un fractal comúnmente usado para mostrar paralelismo ya que sus cálculos se pueden dividir de forma muy sencilla. En la realidad hay problemas donde es más difícil encontrar la paralelización, si es que se puede (nueve mujeres no dan un bebe en un mes) o incluso puede que haya que usar algoritmos a priori menos eficientes para acceder a ella.

El fractal se define en el plano de los números imaginarios. Por cada punto c, se ejecuta iterativamente la siguiente función.

{z0=0∈C(termino inicial)zn+1=zn2+c(sucesion recursiva)

Consideramos que si tras N iteraciones, el valor se escapa (su valor absoluto es 2 o más) entonces forma parte del conjunto. A más iteraciones obtendremos imágenes más precisas.

Por comodidad podemos acotar el plano imaginario a (-2.5, 1.0) en la dimensión real y a (-1, 1) en la dimensión imaginaria.

Una primera versión que se nos puede ocurrir sin tener en cuenta el rendimiento es esta:

use image::RgbImage; use std::path::Path; use std::time::Instant; const ITERATIONS: u32 = 100; const WIDTH: u32 = 3500; const HEIGHT: u32 = 2000; const BUFFER_SIZE: usize = (WIDTH * HEIGHT * 3) as usize; struct Complex { real: f64, im: f64, } impl Complex { fn square(&mut self) { let prev_real = self.real; self.real = self.real * self.real - self.im * self.im; self.im = 2.0 * prev_real * self.im; } fn plus(&mut self, other: &Complex) { self.real = self.real + other.real; self.im = self.im + other.im; } fn abs(&self) -> f64 { (self.real * self.real + self.im * self.im).sqrt() } } fn main() { // sequential println!("Starting Sequential algorithm"); let mut buffer: Vec<u8> = vec![0; BUFFER_SIZE]; let now = Instant::now(); for x in 0..WIDTH { 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 index = ((y * WIDTH + x) * 3) as usize; buffer[index] = 255; buffer[index+1] = 255; buffer[index+2] = 255; } } } let elapsed = now.elapsed(); println!("Time for Sequential algorithm: {}ms", elapsed.as_millis()); save_fractal(buffer, &Path::new("sequential.png")); } fn save_fractal(buffer: Vec<u8>, path: &Path) { let img = RgbImage::from_raw(WIDTH, HEIGHT, buffer).unwrap(); img.save(path).unwrap(); }

Es un algoritmo que va rellenando un buffer de imagen con el resultado de las iteraciones. La salida es la que se puede ver en la imagen de abajo. En mi ordenador tarda aproximadamente 570ms.

SIMD

La primera solución para mejorar el rendimiento en CPUs modernas es tambiién la menos conocida. Se trata de usar las instrucciones SIMD o vectoriales. Estas instrucciones se añadieron a x86 a finales de los 90 y básicamente nos permite hacer la misma operación, con datos diferentes, a la vez.

Pongamos un ejemplo: en ensamblador, si queremos hacer una suma, tendremos los sumandos en un registro cada uno, de 64 bits. Y el resultado de la suma se almacena en uno de esos registros o en otro. Ya hemos dicho que hay trucos a nivel de CPU para hacer varias cosas a la vez pero tienen limitaciones porque tienen que, de puertas para fuera, seguir siendo secuenciales.

Ahora imaginemos que tenemos que hacer cuatro sumas seguidas, independientes entre sí. Pues podemos poner los cuatro "adds" uno detrás de otro. O podemos decirle a la CPU que haga las 4 sumas a la vez, un una misma instrucción. Para ello, cargamos los sumandos de un lado en registros de 256 bits y los otros en otro registro de 256 bits. Luego hacemos la suma.

Esta forma de trabajar se pensó originalmente para tareas multimedia donde es relativamente fácil encontrarse con datos en vectores que requieren un procesamiento para todos igual y sin dependencias entre sí. Arquitecturas como la de la PS2 también se basaban en CPUs con instrucciones para ir en paralelo así como registros de un tamaño muy grande para poder empaquetar estosdatos, en su caso registros de 128 bits, en CPUs modernas x84-64 tenemos AVX10 con registros de 512 bits. Sin embargo para algunas tareas mucho trabajo se ha movido a las GPUs, similares pero diferentes. Las veremos más adelante.

if is_x86_feature_detected!("avx2") { println!("AVX2 detected"); println!("Starting SIMD AVX2 algorithm"); let mut buffer: Vec = vec![0; BUFFER_SIZE]; let now = Instant::now(); unsafe { let zeros = _mm256_set1_pd(0.0); let two = _mm256_set1_pd(2.0); let four = _mm256_set1_pd(4.0); let ones = _mm256_set1_pd(1.0); for x in 0..WIDTH { let mut y = 0; while y < HEIGHT { let mut xs = _mm256_set1_pd(x as f64); let mut ys = _mm256_set1_pd(y as f64); let mut a = _mm256_set_pd(0.0, 1.0, 2.0, 3.0); ys = _mm256_add_pd(ys, a); a = _mm256_set1_pd(1000.0); xs = _mm256_div_pd(xs, a); ys = _mm256_div_pd(ys, a); a = _mm256_set1_pd(2.5); let cxs = _mm256_sub_pd(xs, a); let cys = _mm256_sub_pd(ys, ones); let mut zxs = zeros; let mut zys = zeros; let mut cmp = ones; for _ in 0..ITERATIONS { let zx_square = _mm256_mul_pd(zxs, zxs); let zy_square = _mm256_mul_pd(zys, zys); let abs = _mm256_add_pd(zx_square, zy_square); cmp = _mm256_cmp_pd(abs, four, 1); if _mm256_testz_pd(cmp, cmp) == 1 { break; } let previous_zxs = zxs; zxs = _mm256_sub_pd(zx_square, zy_square); zxs = _mm256_add_pd(zxs, cxs); zys = _mm256_mul_pd(two, zys); zys = _mm256_mul_pd(zys, previous_zxs); zys = _mm256_sub_pd(zys, cys); } let (cmp3, cmp2, cmp1, cmp0): (f64, f64, f64, f64) = std::mem::transmute(cmp); if cmp3 != 0.0 { let index = (((y + 3) * WIDTH + x) * 3) as usize; buffer[index] = 255; buffer[index+1] = 255; buffer[index+2] = 255; } if cmp2 != 0.0 { let index = (((y + 2) * WIDTH + x) * 3) as usize; buffer[index] = 255; buffer[index+1] = 255; buffer[index+2] = 255; } if cmp1 != 0.0 { let index = (((y + 1) * WIDTH + x) * 3) as usize; buffer[index] = 255; buffer[index+1] = 255; buffer[index+2] = 255; } if cmp0 != 0.0 { let index = ((y * WIDTH + x) * 3) as usize; buffer[index] = 255; buffer[index+1] = 255; buffer[index+2] = 255; } y = y + 4; } } }

La manera de usar estas instrucciones de ensamblador en lenguajes como Rust es mediante intrinsics, que son funciones que por debajo llaman a la instrucción de ensamblador concreta pero añadiendo información útil al compilador.

En este caso concreto uso AVX2, que tiene registros de 256 bits. Los intrinsics como _mm256_set_pd nos permiten cargar 4 double/f64 en uno de estos registros. _mm256_set1_pd replica el número en los 4 huecos. Como veis la idea para acelerar esto es hacer las mismas operaciones pero de 4 en 4, por eso el bucle de y avanza de 4 en 4. En este caso como HEIGHT es múltiplo de 4 no tendremos ningún dato suelto.

Vamos haciendo las sumas, restas, multiplicaciones y divisiones en paralelo para los 4. ¿Pero que pasa cuando uno cumple con la condición de parar? No podemos parar porque entonces pararíamos los 4, cuando solo uno podía parar. Pero si no paramos nunca, vamos a hacer muchas operaciones de más. En este caso el problema tiene solución fácil, ya que podemos seguir haciendo cuentas con uno que ya se ha salido y no va a volver a entrar. Así pues podemos comprobar todos a la vez también (cmp existe en AVX2) y podemos comprobar si todos cumplen. En este caso cuando los 4 se pasen, cortamos el bucle. Si no se sigue hasta el final de las iteraciones.

Finalmente podemos leer el resultado de nuestros registros de 256 bits, con transmute y observando que x86-64 es Little Endian. Podemos sacar los resultados y escribiendo en el buffer de imagen los colores.

El resultado es magnífico, prácticamente reducimos por 4 el tiempo necesario, obteniendo ahora 150ms. A cambio el código se ha vuelto muy ilegible ya que es una especie de pseudo ensamblador. Los lenguajes como C o Rust intentan autovectorizar y usar estas instrucciones sin que nos demos cuenta para evitar tener que escribir este código feo pero no son capaces de hacerlo en código medianamente complejo.

2025-01-06

Entrevista tecnolocuras.com (Adrianistán)

Hace unos días, Henry de tecnolocuras.com, me escribió para una pequeña entrevista sobre mí y sobre este blog en particular. Podéis leer la entrevista aquí: #5 Conversaciones con blogueros: Adrián Arroyo Calle. Fue muy entretenido responder a las preguntas que me hizo.

2025-01-03

¿Qué pasó en 2024? (Adrianistán)

En 2024 hubo muchos cambios. En este post voy a hacer un pequeño resumen y también vamos a ver que nos depara 2025.

Enero

De enero y de interés para el blog solo mencionaré que leí el libro de "Algoritmos + Estructuras de Datos = Programas" de Niklaus Wirth. Se trata de un texto clásico de la enseñanza de la Informática donde Wirth, el creador de Pascal, nos va llevando por las técnicas de la programación imperativa de la época. Es un libro interesante pero creo que el tiene el fallo común de los clásicos: hoy nos parecen evidentes. Es decir, ha influido tanto que hoy en día muchos materiales de texto siguen una estructura similar que no aprendí nada realmente noveodoso. Aprendí algo de Pascal, pero no lo llegué a usar después.

Sobre Pascal se podría hablar mucho. Hoy en día vivimos en un universo donde C ganó. Los sistemas operativos no Unix son minoritarios (Windows, z/OS e IBM i son la excepción y aun así Windows usa C). Pascal tenía ciertas ventajas sobre C y ciertos inconvenientes. Pero en el fondo, y sobre todo en dialectos como Turbo Pascal, no había una diferencia fundamental de expresividad ni de calidad de código generado. Si Pascal ahora apenas tiene uso fue por el avance de Unix, la falta de estandarización de Pascal entre sus dialectos y que siempre estuvo asociado a compiladores comerciales.

Febrero

En febrero, volví a compaginar mi trabajo en Telefónica con clases de laboratorio en la Universidad de Valladolid, donde estuve dando "Fundamentos de Computadoras" (prácticas de ensamblador de MIPS) y "Cálculo distribuido y computación paralela". La primera asignatura es una de las que se dan en primero de Ingeniería Informática. Al repasar los materiales ahora, con más bagaje, realmente me ha parecido una asignatura mucho más bonita que como cuando estuve de estudiante. Creo que el haber tenido más contexto de las máquinas por debajo en estos años me ha dado la perspectiva: "es que esto es la esencia del computador". A pesar de que ya sé que existen otros paradigmas sobre la computación. La aproximación imperativa con una ISA es la única que actualmente tiene respaldo ingenieril. Y de hecho es un mundo lleno de decisiones de diseño con sus ventajas, inconvenientes y los inevitables compromisos que surgen. Mientras en muchas otras disciplinas de la Informática no existen estos compromisos o tradeoffs, en esta disciplina están por todas partes.

Marzo

Con la motivación de trabajar con código de bajo nivel, empecé mi proyecto más ambicioso de software libre. La implementación del JIT de Scryer Prolog. Básicamente compilar código Prolog a código nativo para mejorar la velocidad de ejecución. Proyecto retador e interesante, aunque a veces agotador, que fui poco a poco implementando, luego tuve que reescribirlo. Todavía quedan bastantes detalles y no trabajo en ello tanto como debiera. Espero seguir con ello en 2025, con ganas renovadas y, por fin, que la gente pueda empezar a probarlo.

Abril

En abril, a nivel personal tuve un gran cambio ya que compré un piso, en Valladolid también. Aunque no me mudé directamente, gran parte de mi mente este año estuvo ocupada con temas de la vivienda. Esto junto a los motivos de salud, han hecho que este año no haya cacharreado demasiado.

Mayo

En mayo estuve en Valencia, en esLibre. Di una pequeña charla sobre Scryer Prolog y me reuní con amigos. También conocí gente nueva, gente de KDE España, de OpenStreetMap y del mundo del software libre en España en general.

Junio

En junio fui a Países Bajos, en concreto a Eindhoven. Allí visité a un amigo, que me dejó su casa para dormir. Estuve recorriendo esas tierras llenas de bicis y canales, a veces solo, a veces con mi amigo: Bolduque, Breda, Amsterdam, Maastricht, Amberes, .... En Eindhoven además pude entrar en ASML, la mayor compañía del mundo de fábricas de fotolitografía, necesarias para producir los chips actuales. Originalmente fue un spin-off de Philips, empresa originaria de Eindhoven y que hoy solo fabrica realmente equipos médicos. El resto de productos con marca Philips de Philips solo llevan el nombre. Las bombillas se separaron en Signify, los semiconductores fueron a NXP, ... Este mes también acabé las clases que tenía en la universidad.

Julio

En julio me visitó un amigo cinéfilo y acudí a algunas sesiones del PUFA, un festival de cine fantástico y de terror nuevo que ha empezado en 2024 en Valladolid.

Agosto

En agosto fui con mis padres a Berlín. Mi padre había estado hacía muchos años, cuando todavía existía el muro y aunque los españoles en aquella época podían cruzarlo sin problemas, tenía ganas de verlo y ver como había cambiado todo. Yo no había estado nunca y en Alemania solo había estado unos días en Düsseldorf y Colonia, así que me apunté. Berlín es una ciudad interesante, más si te interesa la historia moderna. Berlín fue la ciudad donde las dos potencias más importantes del momento chocaban, todo ello a través de estados títeres como eran la RFA y la RDA (de EEUU y la URSS respectivamente). Finalmente la RFA "ganó", ya que aunque fue una reunificación, a efectos prácticos la RFA se comió a la RDA. A nivel histórico y a nivel monumental, Berlín no es tan interesante como otras capitales europeas pero sigue mereciendo una visita. Cerca se encuentra Potsdam, ciudad que yo conocía por la famosa conferencia de la Segunda Guerra Mundial pero que en realidad es la ubicación de numerosos palacios de los reyes prusianos de gran belleza, aunque sin un estilo propio, todos se basan en palacios franceses, italianos e ingleses. También visité el Neues Museum, famoso por su colección egipcia y el campo de concentración de Sachsenhausen.

Septiembre

En septiembre fui con amigos a Cádiz. Para aprovechar lo que quedaba de verano. No soy muy fan de las playas para pasar mis vacaciones, pero esto eran pocos días y con amigos. El destino fue elegido para combinar playa con cosas más interesantes. Y Cádiz es una ciudad preciosa en la que nunca había estado. Y llena de historia relacionada con la Constitución de 1812, la que se redactó mientras los franceses invadían el país. Una constitución muy avanzada que, con procuradores a un lado y otro del océano se quería aplicar a todo el imperio. Desgraciadamente nunca estuvo en vigor demasiado tiempo y en muchos sitios de América ni siquiera llegó a aplicarse. También pasé por la iglesia del Palmar de Troya de camino y un día nos acercamos a Gibraltar.

Fue este mes cuando empecé a sentir más molestias físicas en mis hombros y cuello, lo que hizo que parase mucho el ritmo de programar. Hacer ejercicio en el gimnasio llegado a este punto tampoco sé si me iba bien o si estaba forzando ya de más algo que estaba ya demasiado tenso y forzado. Esto me ha impedido cacharrear a gusto en muchos momentos.

Octubre

En octubre empecé mis clases de chino mandarín. Mi historia con los idiomas ha sido de altos y bajos. Como nací en Castilla, solo tengo un idioma materno, el castellano o español. En el colegio desde pequeño siempre hemos tenido inglés, pero eran pocas horas y sin inmersión, sin profesores nativos y avanzando muy lentamente. En esa época el inglés no me gustaba. En el colegio, en mis últimos años empecé francés, porque era parte del programa del colegio. El francés de primeras me gustaba más. En el instituto seguí con esa combinación. En francés notaba que avanzaba mucho más rápido y las clases de inglés no me gustaban mucho (pero nunca tuve problema en aprobar). Con el tiempo y según me iba metiendo más en el mundo de la informática, descubrí que el inglés era más interesante ya que casi todo lo relacionado con la Informática estaba en inglés. En esa época progresé bastante, fue a clases extra por las tardes, me saqué un título y participaba algo más en las clases de inglés. Al final inglés, al nivel que me pedían, era algo fácil y no tenía complicaciones.

En ese mismo periodo dejé el francés. Me había ido de intercambio a Francia una semana y creo que cuando lo dejé tenía más nivel que de inglés. Pero no le veía tanta utilidad y encima me parecía que había que estudiar más, ya que los idiomas romances tienen en general conjugaciones y vocabulario más complejo. Además para selectividad el francés no valía nada si ya sabías que ibas a hacer inglés.

Luego con el inglés me defendía. Viajaba por Europa y conocía gente en la universidad y podía hablar con ellos. Estaba (y estoy) en un nivel en el que aunque tengo fallos de pronunciación y ocasionalmente me puede faltar vocabulario, puedo moverme y aprender más inglés con inglés si hace falta.

¿Por qué el chino? Una conjunción de factores: quería algo que estudiar, ya que no quería quedarme quieto, pero los másteres no me llamaban especialmente. En la empresa de hecho me pedían que eligiese algo en lo que "crecer a nivel personal". También salir de casa ahora que vivía solo. Mi novia estudia alemán y pensé que un idioma no sería tan mala idea. Y chino es el que más me llama la atención. Una gran potencia, relativamente desconocida pero de la que compramos gran cantidad de tecnología. Y a nivel hardware sí que empezaba a ver muchas cosas en chino. Sí, muchas tenían traducción al inglés igualmente. Pero me hizo pensar. Por supuesto hay gente que opina que aprender idiomas ahora es estúpido ya que las herramientras de traducción automáticas avanzan mucho y cada vez son mejores. Pero lo cierto que actualmente me está resultando muy interesante, ver los cambios en la cultura, mucho más diferente que los anglosajones (de los cuáles al final consumimos mucha información y cultura). Sé que es difícil pero de momento seguiré con el chino.

Noviembre

En noviembre pasaron dos cosas: la primera es que en Telefónica me cambié de proyecto. En junio ya había dicho que quería un cambio, aunque no de forma urgente, cuando hubiese algo. Y ese algo llegó en noviembre. Ahora estoy dentro de una de los múltiples proyectos surgidos de la iniciativa Open Gateway. Además, fue el Scryer Prolog Meetup de 2024 en Viena. Allí expuse lo que había avanzado con el compilador JIT y estuve hablando con gente del mundo de Prolog. Muy interesante como siempre.

Diciembre

En diciembre finalmente cambié de teléfono. Llevaba muchos años con un Huawei P30 Pro y en Cádiz empezó a fallar la pantalla, aunque era usable. Previniéndome, fui mirando teléfonos. Estos teléfonos tenían que ser por lo menos igual de buenos que el P30 Pro pero si admitían custom ROMs, mucho mejor. Finalmente me decanté por un Google Pixel 8a. Y le instalé GrapheneOS. Es un teléfono caro para las especificaciones que tiene. Pero a pesar de ser de Google, es totalmente modificable por el usuario sin necesitar cosas raras. Y tiene bastante comunidad.

Hablando de hardware, en mayo también había comprado un teclado ergonómico: el Glove-80. Un teclado dividido en dos mitades, curvo, con las teclas en cuadrícula, con clústers para el pulgar, inclinable, con firmware personalizable basado en ZMK. Un teclado muy top y caro. Y finalmente no conseguí adaptarme a él. He de decir que me gustaba que se pudiese personalizar, estuve probando Colemak-DH y diferentes capas. Pero nada me convencía lo suficiente. Aunque tienen periodos de adaptación, creo que le di bastante tiempo. Al final usaba más un teclado malucho, ya que me frustraba mucho y me seguían doliendo los hombros. Tampoco era capaz de llegar bien a todas las teclas de por ejemplo, el clúster de pulgares. También la personalización extrema tiene partes negativas: puedes entrar en una espiral de adaptar todo lo que quieras hasta que cualquier parecido con otro teclado sea mera coincidencia. Esto puede pasarte con ZMK, con Emacs, con KDE, ... Y aunque me gustan esas herramientas (más que el minimalismo forzado) siempre he intentado mantenerme cerca del camino por defecto. Porque además puede ser un agujero de tiempo y de indecisión.

2024-12-24

“La Marea Humana” – Paul Morland (La Página Definitiva)

Celebramos la Natividad hablando de Natalidad.

2024-12-23

JORNADA XXI: LA OSCURIDAD DEL PETROALMERÍA Y LA LUZ DEL MIRANDÉS (La Página Definitiva)

Final de la primera vuelta en la Liga Hypermotion

2024-12-16

JORNADA XIX: PUTO ZARAGOZA, CÓMO ME HACES SUFRIR (La Página Definitiva)

Siempre perdiendo y haciendo el ridículo, ya está bien

2024-12-11

The Mallorca Files (BBC, 2019-2024) (La Página Definitiva)

Eurovisión se vuelve serie.

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 de 32 y 64 bits, está aquí. Incluye instaladores y portables, y requiere .net Framework para funcionar: https://github.com/canton7/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.