Número 81
24 de xaneiro de 2024

O mínimo común denominador

Unha das miñas actividades do tempo libre é a radioafección. Teño un aparello transmisor e receptor de radio que uso para me poñer en contacto con outros radioafeccionados de todo o mundo. Cando consigo facer un contacto fago un apuntamento para a posteridade e, se o contacto é interesante (por exemplo, se é un país distante) intercambio tarxetas postais. Como estamos no ano 2024 e non en 1974, fago ese apuntamento nun ordenador que está conectado ao meu aparello de radio; desta maneira, o programa xa recibe da radio a frecuencia que teño seleccionada e a potencia de transmisión, e non teño que escribilos eu.

Un home vestido de superheroe arácnido opera un aparello de radio mentres dúas mulleres falan. Unha delas di: “Picouno unha araña radioafeccionada”.

O máis do tempo comunícome por voz, falando polo micrófono, pero ás veces uso “modos dixitais” nos que me comunico por texto. Para acadar isto, uso un programa modulador/demodulador no mesmo ordenador que teño conectado ao aparello. Cando escribo algo, o programa convérteo a sons e transmíteo pola radio; cando recibe a resposta, o programa descodifica o sinal e amosa o texto.

Ás veces hai xente coa que todo o mundo quere facer un contacto. Por exemplo, ás veces hai expedicións a illas remotas; outras veces é un radioafeccionado que reside nun país pouco habitual. Hai servidores de Internet nos que a xente pode avisar de que tal persoa está a falar en tal frecuencia, e cando vexo algún interesante podo seleccionalo e a miña radio sintoniza a súa frecuencia automaticamente.

Algúns radioafeccionados teñen antenas direccionais. Cando queren falar con América apuntan a antena cara a América, e cando queren falar con Xapón diríxena cara a Xapón. Antigamente, era necesario consultar un mapa acimutal equidistante para saber a dirección na que había que virar a antena á man. Hoxe en día o normal é que a antena teña un motor controlado polo ordenador: o usuario só ten que facer clic nun mapa e o programa calcula a dirección e xira a antena automaticamente.

Cada unha destas funcións é levada a cabo por un programa diferente, así que é habitual telos todos andando no mesmo ordenador, interconectados para que funcionen xuntos. Por exemplo: se vexo no servidor que hai alguén falando por PSK31 na Corea do Norte, quero poder seleccionalo para falar con el e que a antena vire automaticamente cara alá, o modulador/demodulador seleccione o modo PSK31, e que a radio mude automaticamente para a súa frecuencia.

Texto manuscrito: “Cal é a linguaxe de programación favorita dos radioafeccionados? A linguaxe CQ”Cando queres facer humor gráfico pero non sabes debuxar.

Existen moitas tecnoloxías para interconectar programas. A maioría dos radioafeccionados usa Windows, así que o normal sería que todos eses programas usaran COM. COM é o sistema de comunicación entre procesos (IPC) estándar de Windows, existe desde Windows 3.1 e, con el, cada programa pode definir interfaces que os outros programas poden usar para se comunicaren con el. Os programas poden detectar se os outros programas están instalados, inicialos de ser necesario e, en xeral, integrarse mutuamente sen que o usuario se decate.

Obviamente, iso sería demasiado bo, así que todos eses programas non usan COM senón TCP/IP. Como TCP/IP é de moi baixo nivel, cada programa tivo que definir o seu propio protocolo de IPC e engadir código para usar o protocolo de todos os programas aos que se quere conectar. Cando o usuario quere interconectar eses programas ten que activar un servidor en cada un, escoller un porto TCP, despois ir á configuración dos outros programas e dicirlles que se conecten a ese porto. Despois, cando o usuario quere empregar a radio, ten que prender os programas na orde correcta para que poidan conectarse.

Un podía preguntarse por que, habendo COM, eses programadores decidiron facer todo o traballo de escribir protocolos de IPC baseados en TCP/IP, e a razón é moi simple: porque Linux non ten COM.

Algúns deses programas son “multiplataforma” e están dispoñibles en Windows, Linux e Mac. Porén, iso non significa que haxa unha versión adaptada para cada sistema operativo senón que, máis ben, o mesmo código funciona (compilación mediante) nos tres sistemas operativos. Como é o mesmo código para os tres, o programa só pode usar cousas que funcionen en todos eles. Polo tanto, nada de COM, que só o hai en Windows: TCP/IP para todos!

TCP/IP tampouco é unha boa opción en Linux. O propio sería usar D-Bus ou, no seu defecto, un “Unix Domain Socket” (UDS). O inconveniente de abrir un porto TCP é que calquera se pode conectar a el, aínda que este porto estea vinculado a localhost. (Hai incluso ataques de “DNS rebinding” nos que un atacante asigna un enderezo propio a 127.0.0.1 para evitar as proteccións contra ataques cross-site.) Pero claro: nin D-Bus nin os UDS existen en Windows, así que hai que usar TCP/IP, que o hai en todos os sistemas.

(Os UDS existen en Windows 10 desde 2018, pero no mundo da radioafección iso é como se os engadiran antonte.)

Un aparello de fax con “COM” escrito embaixo; unha caixa de correos con “UDS” escrito embaixo; un taboleiro de anuncios con “TCP/IP” escrito embaixo.

Hoxe en día é moi habitual escribir programas multiplataforma seguindo esa filosofía de “un só programa para todas as plataformas”. Por exemplo, o VSCode no que escribo isto funciona sobre Electron, que permite “escribir aplicacións de escritorio multiplataforma con JavaScript, HTML e CSS”. Ou sexa: VSCode é unha páxina web que vén co seu propio navegador para simular que é un programa. Non sei que bo é o soporte de COM de Electron, pero supoño que non moito.

Outra cousa é que moitos programadores están especializados nunha plataforma e ven todo desde ese ángulo. Por exemplo, no mundo do software libre é moi habitual tratar Windows como un Linux ao que lle faltan cousas (grazas a ferramentas como msys2 ou Cygwin que crean un ambiente de programación similar a Linux, pero en Windows) e non como un sistema distinto, coa súa propia filosofía e particularidades.

O soporte de multiplataforma non debería ser unha escusa para usar só o mínimo común denominador para todas as plataformas. No seu lugar, o programa debería incluír funcións específicas para as plataformas que teñan maneiras mellores de facer as cousas: unha interface COM que se compile só na versión de Windows, unha interface de D-Bus ou UDS para a versión de Linux, e non sei cal é a mellor opción para Mac, pero seguro que non é TCP/IP.

Facede o mellor que poidades en cada plataforma! Non vos conformedes co mínimo!