Manuals

warning: Creating default object from empty value in /home/ivan/vc/git/elvil-drupal/drupal/sites/all/modules/i18n/i18ntaxonomy/i18ntaxonomy.pages.inc on line 34.

IPv6 local router with privacy-preserving addresses

In IPv6 everywhere with tinc we saw how to use a tinc VPN to let a host with its own public IPv6 network provide entire subnetworks to remote devices like home computers.

The setup allows each device to have its own public IPv6 addresses to access or provide services to the IPv6 Internet. However, with such a setup the device always uses the same address for outgoing traffic, which may be awful for end-user devices from the privacy perspective, since they are very easy to be uniquely identified worldwide.

Also, the network topology diagram in that post showed that each device may serve its /64 public IPv6 network locally, thus allowing other hosts in the local network to also have full public IPv6. A very simple setup using IPv6 stateless address autoconfiguration (SLAAC) for such hosts, based on the IPv6 router advertisement daemon (radvd) is explained here. However, autoconfigured addresses have the very nasty effect of revealing the host's MAC address, which is even worse privacy-wise since hosts become uniquely identifiable regardless of the network they are in (see this post for a deeper discussion).

This article explains how to easily configure a Debian IPv6 router and its hosts to use temporary IPv6 addresses (privacy extensions for SLAAC) that avoid the problems mentioned above.

Remote automatic desktop session with Debian and VNC/X2Go

This post briefly describes a setup used for performing UI-based testing of Bitsquare. It consists of a headless Debian server (physical, though it may perfectly be some virtual machine or even a container) which, on boot, automatically starts an X session and makes it available via VNC and X2Go (since there is no monitor to access the session on).

This setup allows to automatically start UI tests on boot and later connect to the graphical session if needed.

How to dump an encrypted DVD with "dd"

I'm trying to get the ISO image of a DVD but Brasero without GNOME behaves oddly and, frankly, I'm fed up with such complex programs for such a simple task. All around I see you can use dd if=/dev/dvd of=fitxer.iso to dump the DVD (I'd swear this didn't work some time ago), but my disc is encrypted with CSS and there's always an input/output error after reading part of the disc.

To my suprise, I open the DVD in VLC (which uses the libdvdcss library to decrypt it) and, after playing it for some seconds and closing VLC… dumping with dd works flawlessly! I've tried several times with several DVDs and it seems to be sistematic. Maybe there's some peculiar interaction with my DVD unit (I didn't check others), but… ain't it cool?

Com bolcar un DVD xifrat amb "dd"

Vull obtenir la imatge ISO d’un DVD però Brasero sense GNOME fa coses estranyes i, francament, ja estic un poc fart de programes tan complexos per a una tasca tan simple. Veig per tot arreu que es pot fer servir dd if=/dev/dvd of=fitxer.iso per a bolcar el DVD (juraria que açò no funcionava abans), però el disc està xifrat amb CSS i sempre es produeix un error d’entrada/sortida després d’haver llegit part del disc.

Per a la meua sorpresa, òbric el DVD amb VLC (que fa servir la biblioteca libdvdcss per a poder desxifrar‐lo) i, després de reproduir‐lo uns segons i tancar VLC… ¡el bolcat amb dd funciona a la perfecció! Ho he provat més d’una volta i amb diversos DVD i sembla que és sistemàtic. Potser siga alguna interacció peculiar amb el meu lector de DVD (no ho he provat en cap altre), però… ¿a que mola?

IPv6 en cualquier lugar con tinc

Ya hace tiempo describí cómo usar 6to4 para proporcionar una conexión IPv6 estable a una máquina dotada de una dirección pública IPv4 fija, un procedimiento realmente simple (al menos en su configuración básica) que nos permite acceder a una nueva Internet donde hay abundancia de direcciones y todos pueden ofrecer sus propios servicios.

No obstante, el procedimiento es prácticamente una entelequia porque si la máquina dispone de una dirección pública IPv4 fija ya es capaz de ofrecer servicios en Internet. En cambio, ¿qué hay de los ordenadores que tenemos en casa tras un dispositivo que hace NAT (y por lo tanto tienen direcciones privadas), o de aquellos que llevamos con nosotros (y por lo tanto tienen direcciones variables)?

En este artículo describo cómo usar tinc para extender la conectividad IPv6 de una máquina con una red IPv6 propia (nativa o 6to4) a ordenadores domésticos y móviles, de forma que éstos tengan direcciones públicamente accesibles de esta red con independencia de su ubicación.

IPv6 everywhere with tinc

Some time ago I described how to use 6to4 to provide a stable IPv6 connection for a host having a fixed, public IPv4 address, a really simple procedure (at least in its basic configuration) which allows us to access a new Internet with abundance of addresses where everyone can offer their own services.

However, the procedure is something of an entelechy since a host which has a fixed, public IPv4 address is already capable of offering services to the Internet. However, what about our home computers sitting behind a NAT device (thus with private addresses), or those we carry with ourselves (thus with dynamic addresses)?

In this article I describe how to use tinc to extend IPv6 connectivity from a host with its own (native or 6to4) IPv6 network into home and mobile devices, so that they have publicly accessible addresses in this network regardless of their location.

IPv6 a qualsevol lloc amb tinc

Ja fa temps vaig descriure com fer servir 6to4 per a proporcionar una connexió IPv6 estable a una màquina dotada d’una adreça pública IPv4 fixa, un procediment realment simple (almenys en la seua configuració bàsica) que ens permet accedir a una nova Internet on hi ha abundància d’adreces i tothom pot oferir els seus propis serveis.

Tanmateix el procediment és gairebé una entelèquia perquè si la màquina disposa d’una adreça pública IPv4 fixa ja és capaç d’oferir serveis a Internet. En canvi, què hi ha dels ordinadors que tenim a casa darrere d’un dispositiu que fa NAT (i per tant tenen adreces privades), o d’aquells que portem amb nosaltres (i per tant tenen adreces variables)?

En aquest article descric com fer servir tinc per a estendre la connectivitat IPv6 d’una màquina amb una xarxa IPv6 pròpia (nativa o 6to4) a ordinadors domèstics i mòbils, de forma que aquests tinguen adreces públicament accessibles d’aquesta xarxa amb independència de la seua ubicació.

IPv6 fácil con 6to4

¿Sabéis? Creo que uno de los obstáculos que impiden el desarrollo de Internet como una auténtica red distribuida son las trabas que ponen los proveedores de acceso a ofrecer direcciones IP públicas estáticas a sus clientes domésticos, que se tienen que apañar con direcciones dinámicas, redes privadas y NAT. Una lástima, porque hacer las máquinas de todos accesibles vía Internet permitiría a cualquiera ofrecer sus propios servicios, empoderando a los individuos y nivelando su posición frente a los grandes proveedores de contenidos, como ocurre en redes libres y neutrales como guifi.net. Y es que, a diferencia de los medios de masas, Internet no distingue entre emisores y receptores.

La escasez de direcciones IPv4 es un (muy debatible) motivo argüido por los proveedores para mantener el actual statu quo. IPv6, en cambio, ofrece una auténtica abundancia de direcciones para todo el mundo y, aunque no lo parezca, ya es posible usarlo sea cual sea nuestra forma de acceso a Internet. Además, es divertido eso de conectarse a la Internet del futuro, ¡así que ya es hora de dar el salto!

Para empezar poco a poco, este artículo describe cómo dotar de conexión IPv6 estable a una máquina Debian con dirección IPv4 fija, usando 6to4, sin necesidad de suscribirse a un servidor de túneles y con una configuración realmente mínima.

How to split the screen of a web browser

I've always missed the possibility of splitting Firefox's screen horizontally in order to view two parts of the same document stacked one over the other, e.g. for following internal references and footnotes, comparing passages or simultaneously seeing two different rows far apart in a very long table. A feature present long ago in editors like Emacs, spreadsheets and some other programs like Mac OS X's terminal emulators.

The other day, after trying some interesting but overkill solutions like Tile Tabs for Firefox or Split Screen for Greasemonkey I found this tip for splitting any browser's screen in two frames using a little Javascript. My version of it is even simpler since it always loads the current address. Just use the bookmark management window to create a new one (the quick method of clicking the star won't work), call it “Divide horizontally” (or whatever) and enter the following location:

javascript:with(document){write('<frameset%20rows="*,*">\n<frame%20src="'+location.href+'"/>\n<frame%20src="'+location.href+'"/>\n</frameset>');close()}

If you want a vertical division instead of horizontal, just change rows by cols. When you select the new bookmark while having a page open, the screen will split into two frames with the same page. Voilà!

Caveat: this code doesn't really split the current document's view, instead it reloads its address both in the upper and lower frame. Since two independent documents are created I don't expect this to work too well with dynamic pages and form results. In fact, I doubt that the same document can actually be shown in two simultaneous views while respecting the CSS standard (where should an element fixed to the top right of the view be shown?).

Nonetheless, it's a really simple approach which works most of the time. :)

Cómo dividir la pantalla del navegador web

Siempre he echado en falta en Firefox la posibilidad de dividir la pantalla horizontalmente para poder ver dos partes del mismo documento una sobre la otra, p.ej. para seguir referencias internas y notas al pie, comparar pasajes o ver simultáneamente dos filas separadas en una tabla muy larga. Una función presente desde hace tiempo en editores como Emacs, las hojas de cálculo y en algunos otros programas como el emulador de terminal de Mac OS X.

El otro día, después de probar soluciones interesantes pero excesivas como Tile Tabs para Firefox o Split Screen para Greasemonkey me encontré con este truco para dividir la pantalla de cualquier navegador en dos marcos usando un poco de Javascript. Mi adaptación es aún más sencilla porque siempre carga la dirección actual. Simplemente usad la ventana de gestión de marcadores para crear uno nuevo (el método rápido de hacer clic en la estrellita no funcionará), ponedle el nombre «Divide horizontalmente» (o lo que sea) y escribid en la dirección:

javascript:with(document){write('<frameset%20rows="*,*">\n<frame%20src="'+location.href+'"/>\n<frame%20src="'+location.href+'"/>\n</frameset>');close()}

Si queréis una división vertical en lugar de horizontal, cambiad rows por cols. Cuando escojáis el nuevo marcador teniendo abierta una página, la pantalla se dividirá en dos marcos con la misma página. ¡Voilà!

Cuidado, este código no divide realmente la vista del documento actual, sino que vuelve a cargar su dirección tanto en el marco de arriba como en el de abajo. Como se crean dos documentos independientes no creo que funcione muy bien con páginas dinámicas o resultados de formularios. De hecho, dudo que se pueda representar el mismo documento en dos vistas respetando el estándar CSS (¿dónde iría un elemento fijado a la esquina superior derecha de la vista?).

Aún así es una aproximación supersimple que funciona en un buen montón de casos. :)

Com dividir la pantalla del navegador web

Sempre he trobat a faltar en Firefox la possibilitat de dividir la pantalla horitzontalment per a poder veure dues parts del mateix document l’una sobre l’altra, p.ex. per a seguir referències internes i notes al peu, comparar passatges o veure simultàniament dues files separades en una taula molt llarga. Una funció present des de fa temps a editors com Emacs, als fulls de càlcul i a alguns altres programes com l’emulador de terminal de Mac OS X.

L’altre dia, després de provar solucions interessants però excessives com Tile Tabs per a Firefox o Split Screen per a Greasemonkey vaig trobar‐me amb aquest truc per a dividir la pantalla de qualsevol navegador en dos marcs fent servir un poc de Javascript. La meua adaptació és encara més senzilla perquè sempre carrega l’adreça actual. Simplement feu servir la finestra de gestió d’adreces d’interès per a crear‐ne una de nova (el mètode ràpid de fer clic a l’estreleta no funcionarà), poseu‐li de nom «Divideix horitzontalment» (o el que siga) i entreu a la ubicació:

javascript:with(document){write('<frameset%20rows="*,*">\n<frame%20src="'+location.href+'"/>\n<frame%20src="'+location.href+'"/>\n</frameset>');close()}

Si voleu una divisió vertical en lloc d’horitzontal, canvieu rows per cols. Quan escolliu la nova adreça d’interès tenint oberta una pàgina, la pantalla es dividirà en dos marcs amb la mateixa pàgina. Voilà!

Compte, aquest codi no divideix realment la vista del document actual, sinó que torna a carregar la seua adreça tant al marc de dalt com al de baix. Com que es creen dos documents independents no crec que funcione molt bé amb pàgines dinàmiques o resultats de formularis. De fet, dubte que es puga representar el mateix document en dues vistes respectant l’estàndard CSS (on aniria un element fixat al cantó superior dret de la vista?).

Tanmateix és una aproximació supersimple que funciona en un bon grapat de casos. :)

Automated Screen session with meinscreen

On my usual computer I always have an open Screen session with a few fixed windows, each permanently running a frequently used program (Mutt with e-mail, Gnus with news channels…). Thus, when I happen to switch to another computer, I can connect to the first one via SSH, attach the previous Screen session there and then go on using those programs where I left them (with no need for web services or synchronization between hosts). I've even set up some trick to allow me to edit files and browse web pages from the Screen session on the local X display or Firefox session, but that's another story that I'll tell in another occasion. ;)

The problem is that each time I started a new session on my usual computer I had to launch a new Screen session, create windows, name them (I sometimes have up to seven open windows) and start each program on the proper window. It wasn't a frequent operation but it made me lazy about rebooting my computer to test something, and I was sure that Screen would allow to automate the process. In fact it could and it was very easy on top of that, so here's how I made it.

Sesión automatizada de Screen con meinscreen

En mi ordenador habitual siempre tengo abierta una sesión de Screen con unas pocas ventanas fijas, cada una con un programa de uso frecuente corriendo de forma permanente (Mutt con el correo, Gnus con los canales de noticias…). Así, cuando cambio puntualmente de equipo, puedo conectarme al primero vía SSH, adjuntar allí la anterior sesión de Screen y continuar usando los programas donde me había quedado (sin tener que recurrir a servicios web o sincronización entre equipos). Incluso he montado algún truco para poder editar ficheros y visualizar páginas web desde la sesión de Screen sobre la pantalla X o sesión de Firefox locales, pero eso es otra historia que contaré en su momento. ;)

El tema es que cada vez que iniciaba una sesión nueva en el ordenador habitual tenía que lanzar una nueva sesión de Screen, crear las ventanas, ponerles nombre (a veces tengo hasta siete ventanas abiertas) y lanzar cada programa en la ventana adecuada. No era una operación frecuente pero hacía que me diese pereza reiniciar el ordenador para probar algo, y estaba seguro de que Screen permitiría automatizar el proceso. Efectivamente podía y además era muy sencillo, aquí tenéis cómo lo hice.

Sessió automatitzada d’Screen amb meinscreen

Al meu ordinador habitual sempre tinc oberta una sessió d’Screen amb unes poques finestres fixes, cadascuna amb un programa d’ús freqüent corrent de forma permanent (Mutt amb el correu, Gnus amb els canals de notícies…). Així, quan canvie puntualment d’equip, puc connectar‐me al primer via SSH, adjuntar‐hi l’anterior sessió d’Screen i continuar usant els programes on m’havia quedat (sense haver de recórrer a serveis web o sincronització entre equips). Fins i tot he muntat algun truc per a poder editar fitxers i visualitzar pàgines web des de la sessió d’Screen sobre la pantalla X o sessió de Firefox locals, però això és una altra història que contaré en el seu moment. ;)

L’assumpte és que cada volta que iniciava una sessió nova a l’ordinador habitual havia de llançar una nova sessió d’Screen, crear les finestres, posar‐los nom (a voltes tinc fins a set finestres obertes) i llançar cada programa en la finestra adequada. No era una operació freqüent però feia que em donara peresa reiniciar l’ordinador per a provar alguna cosa, i estava segur de que Screen permetria automatitzar el procés. Efectivament podia i damunt era molt senzill, ací teniu com ho vaig fer.

Vos imagineu…

¿Vos imagineu una peŀlícula de David Cronenberg amb disseny de producció d’H.R. Giger? Sielos!

Com usar una clau GPG per a SSH

L’agent de GnuPG permet ser emprat com a agent SSH, és a dir, permet que fem servir les nostres claus GPG per a autenticar‐nos amb sistemes remots mitjançant SSH, evitant‐nos així haver de gestionar un altre parell de claus amb la respectiva contrasenya. Vaig a explicar breument com aconseguir açò.

Easy IPv6 with 6to4

Do you know? It seems to me that one of the obstacles which bar the development of the Internet as a real distributed network are the objections that access providers pose to offering public, static IP addresses to their home clients, who must deal with dynamic addresses, private networks and NAT. A pity, since making everyone's machines reachable via the Internet would allow anyone to offer their own services, empowering individuals and levelling their position against big content providers, as it happens right now in free (as in freedom), neutral networks like guifi.net. In contrast with mass media, the Internet doesn't tell emitters apart from receivers.

IPv4 address scarcity is a (very debatable) reason wielded by providers for keeping the current statu quo. IPv6, for a change, offers real address abundance for everyone and, though it may seem, it's already usable whatever our way of accessing the Internet is. Moreover, connecting to the Internet of the future is quite fun, so let's jump in!

To move one step at a time, this article describes how to provide a stable IPv6 connection to a Debian machine having a fixed IPv4 address, using 6to4, with no need for a tunnel broker subscription and performing a really minimal configuration.

IPv6 fàcil amb 6to4

Sabeu? Em sembla que un dels obstacles que impedeixen el desenvolupament d’Internet com a una autèntica xarxa distribuïda són les traves que posen els proveïdors d’accés a oferir adreces IP públiques estàtiques als seus clients domèstics, que han d’apanyar‐se amb adreces dinàmiques, xarxes privades i NAT. Una llàstima, perquè fer les màquines de tothom accessibles via Internet permetria a qualsevol oferir els seus propis serveis, empoderant els individus i anivellant la seua posició front als grans proveïdors de continguts, com ocorre en xarxes lliures i neutrals com guifi.net. I és que, a diferència dels mitjans de masses, Internet no fa distinció entre emissors i receptors.

L’escassesa d’adreces IPv4 és un (molt debatible) motiu argüit pels proveïdors per a mantenir l’actual statu quo. IPv6, en canvi, ofereix una autèntica abundància d’adreces per a tothom i, pel que puga semblar, ja és possible usar‐lo siga quina siga la nostra forma d’accés a Internet. A banda, és divertit això de connectar‐se a la Internet del futur, així que ja és hora de fer el salt!

Per a començar a poc a poc, aquest article descriu com dotar de connexió IPv6 estable a una màquina Debian amb adreça IPv4 fixa, fent servir 6to4, sense haver de subscriure’s a un servidor de túnels i amb una configuració realment mínima.

Afegir un canal RSS de comentaris als nodes de Drupal

Ahir vaig poder configurar la meua instaŀlació de Drupal per a proporcionar a cada node un canal RSS per als comentaris. Tot i que no va ser una feina particularment difícil, vaig haver de fer unes quantes proves i llegir uns quants documents, però el procediment és bastant fàcil de reproduir, gràcies a l’esforç que els desenvolupadors de Drupal solen posar a l’hora de desenvolupar el seu codi. Aquests són els passos necessaris:

Adding a comment RSS feed to Drupal nodes

Yesterday I was able to configure my Drupal installation to provide each node with an RSS feed for its comments. Though it wasn't a particularly difficult task, it required some testing and reading of docs, but the procedure is quite easy to reproduce, thanks to the effort that Drupal developers use to place in the development of their code. These are the necessary steps:

XWrits to Workrave and back again

Portava molt de temps usant XWrits per a obligar‐me a fer pauses per a eviar la síndrome del túnel carpià. És un d’eixos programes senzills i que fan la seua feina bé: quan dus massa temps escrivint, mostra una finestra amb una imatge parpellejant que no deixa de fer la punyeta fins que descanses.

Al poc de temps vaig començar a usar el gestor de finestres Ion, que agrupa les finestres en marcs de forma que tries quina és visible mitjançant unes pestanyes. XWrits deixà de ser efectiu perquè quan la finestra punyetera apareixia, en seleccionava una altra i XWrits deixava de ser visible, així que passava olímpicament d’ell.

Aleshores vaig vore en una MaratOO.o el Workrave a l’ordinador de Jordi. Tenia bona pinta perquè, a banda de ser més pesat a l’hora de mostrar els avisos (quadre sense finestra directament sobre la pantalla) i proposar exercicis per al descans, també suggeria fer micropauses (descansos curts cada poc de temps). Així que em vaig passar a Workrave.

La veritat és que Workrave no està malament, però és un mamotret que ocupa prou de memòria, té estranyes interaccions amb altres aplicacions GTK+ i està contínuament alterant multitud de fitxers d’estat, cosa que em destorba a l’hora d’emprar Unison per a les còpies de seguretat.

Casualment l’altre dia vaig fer una ullada al manual d’XWrits a la web i em va sorprendre que, per a fer alhora micropauses i descansos es podia simplement llançar el programa dues voltes amb diferents arguments. «Vaja», vaig pensar, «què em deté ara de tornar al vell XWrits?». Els exercicis ja me’ls sabia de memòria però, i el problema de les finestres? Com faig per a no passar una altra volta d’XWrits?

Aleshores vaig recordar quelcom que he aprés després de tants anys d’usar Ion:

No hi ha res més incòmode en una interfície gràfica que les pròpies finestres flotants.

Doncs pareu l’orella que resulta que Ion és capaç de fer flotar finestres per sobre dels marcs. Quin usuari d’Ion voldria una finestra flotant, si són tan molestes? DONCS JO, per a que XWrits done bé la brasa quan toca! Ací va la configuració per a cfg_kludges.lua:

defwinprop {
    class = "XWrits",
    instance = "xwrits",
    float = true,
    switchto = false,
}

Amb això, i llançant XWrits tal que així a ~/.xsession:

# Per a les micropauses.
xwrits title=micropausa \
       typetime=5 breaktime=:30 canceltime=2 &
# Per als descansos.
xwrits title=descans \
       typetime=50 breaktime=10 canceltime=3 &

aconseguim una funcionalitat equivalent a Workrave, amb un programa molt més senzill! KISS!

Actualització (2007-09-12)

Que les finestres flotants d’XWrits siguen pesades passa, però que siguen escollides com a actives només apareixen és quasi, quasi perillós. Per això he afegit l’opció switchto = false, que evita aquest comportament. Així, quan apareix una finestra d’XWrits, la finestra en ús continua seleccionada.

fonts.conf

ivan[X]tardis:~$ cat ~/.fonts.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
        <match target="font">
                <edit name="antialias" mode="assign">
                        <bool>false</bool>
                </edit>
        </match>
</fontconfig>

:,-))))

Ortotipografia

Després de la genial FOSDEM 2006 (vegeu un resum en la web de Jordi Mallach), i de veure allà al Daniel Stone escriure una ela geminada prement AltGr+L, em vaig quedar amb les ganes de tenir-ho JA en el meu ordinador. Jordi i jo ho duiem rumiant un temps, i sembla que encara caldrà esperar un poc per a que l’X.org de Debian porte de casa aquesta funció (vegeu aquest altre text de Jordi).

D’altra banda, vaig veure l’altre dia una notícia a Barrapunto on es parlava de la distribució de teclat Colemak. Diu la gent de Colemak que s’inclouen caràcters per a diversos idiomes, incloent el català, i que funciona sota X. «Com ho hauran fet?», vaig pensar. I tafanejant un poc, vaig trobar que xmodmap admet noms de caràcter Unicode directament! Tios, vaig veure la llum! S’acabà el Control+Shift i l’ucs-insert!

Després d’instruïr‐me un poc sobre la forma correcta d’usar les cometes, apòstrof i guions, em vaig llançar a calçar els caràcters següents en el teclat via xmodmap:

  • L’ela geminada minúscula (ŀ, U+0140) i majúscula (Ŀ, U+013f).
  • Els punts suspensius (…, U+2026).
  • El guionet normal (‐, U+2010, sempre visible i separable), el dur (‑, U+2011, sempre visible i no separable) i el tou (­, U+00AD, visible a voltes i separable). Els dos últims més que res per completesa, ja que no s’usen massa.
  • El guió (—, U+2014).
  • La cometa simple esquerra (‘, U+2018) i la dreta (’, U+2019). Aquesta última resulta ser també la forma correcta de l’apòstrof.
  • L'espai dur ( , U+00A0, no separable).

Les ordres que vaig usar van ser:

# Per tal d’escriure fàcilment en català com 0xA mana…

# … l’ela geminada.  A la tecla de l’ela, naturalment.
# Substitueixen l’ela barrada polaca, que encara mantenim nacionalment
# en la tecla de la ve doble.
xmodmap -e "keycode 46 = l L U140 U13f U140 U13f"

# … els punts suspensius, on la resta dels punts,
# substituint el punt volat, que ja està en la tecla 3
# (i que esperem no tornar a usar, veritat? ;) ).
xmodmap -e "keycode 60 = period colon U2026 division U2026 division"

# … el guionet normal i el guió, on el menys i el guió baix,
# substituint els punts inferior i superior morts. (???)
xmodmap -e "keycode 61 = minus underscore U2010 U2014 U2010 U2014"

# … la cometa simple esquerra, en la ve, on és la cometa doble esquerra,
# substituint l’accent obert que encara està en la seua tecla.
xmodmap -e "keycode 55 = v V leftdoublequotemark U2018 leftdoublequotemark U2018"

# … la cometa simple dreta, en la be, on és la cometa doble esquerra,
# substituint l’apòstrof ASCII que encara està en la seua tecla.
xmodmap -e "keycode 56 = b B rightdoublequotemark U2019 rightdoublequotemark U2019"

# … l’apòstrof i l’espai dur, en la tecla de l’apòstrof ASCII,
# substituint la barra i interrogant invertits, que estan en altres llocs.
# He provat a posar l’espai dur en la tecla d’espai,
# però no sembla reaccionar.  Suggeriments?
xmodmap -e "keycode 20 = apostrophe question U2019 nobreakspace U2019 nobreakspace"

# … el guionet dur i el guionet tou, en la tecla de l'exclamació invertida,
# substituint la titlla ASCII que està en el 4 i en la ñ.
xmodmap -e "keycode 21 = exclamdown questiondown U2011 hyphen U2011 hyphen"

Amb això em sembla que es poden escriure texts en català ortotipogràficament correctes sense haver de perdre temps amb els símbols especials. També és cert que cal acostumar‐se a usar els nous símbols (guionets i apòstrofs són els que més rellisquen), però això és un altre tema! ;)

Actualització (2006-03-05)

Jordi Mallach m’avisa que «completitud» no és una paraula catalana. Com cantava Serrat, ai qui ho diriaaa! Acceptem completesa, doncs.

Actualització (2008-10-06)

Greg Baker ha penjat una plana molt completa on descriu els caràcters freqüentment confosos i com obtenir‐los en diferents sistemes.