a3nm's blog

Managing disk image files, and compression with lrzip

— updated

Here is a random collection of tricks I figured out when trying to manage disk image files and compressing them (and other stuff) with lrzip.

Getting disk image files

When I stop to use a machine and think I have migrated all important things, or when a hard drive seems about to die, or when a machine dies and I salvage its hard drive, the easy solution is to just take an image of the drive to keep as a file on some other medium.

The standard tool for this is dd. It is very powerful, though its syntax is arcane and entirely different from any other command I know of, for historical reasons probably. Interesting things about it:

  • Its default operation is quite slow, but it can be made faster by specifying a different block size. However, if you make the size too large, it may become slower again. Apparently the only way to figure out the fastest size is by testing different possibilities, which I think is also what gparted does, but from experience it is often around 1M. Beware that all parameters like count=, seek=, skip= are always given in blocks (not as an absolute size). The size of input and output blocks may be different.

  • While dd does not display any progress information, it can be made to display some by sending it SIGUSR1, as in pkill -USR1 dd. I often use watch to issue this command periodically to see how the operation progresses. [For simpler tasks, an alternative way to get nice progress information is to just use pv, e.g., pv /dev/sda > sda.img. Thanks Mc for the suggestion.]

When you are copying information from a faulty or failing drive, a better tool is GNU ddrescue. It will attempt to copy the data, but it will skip the sectors that cannot be accessed, to get as much data as possible; it will then progressively refine the missing sectors. Don't miss the possibility of using a logfile as a third argument, to save the progress information and be able to resume the operation later (see manpage).

When taking disk images, you can either retrieve a partition (e.g., /dev/sda1), or the entire drive (e.g., /dev/sda). Partition image files can be mounted, e.g., with sudo mount -o loop sda1.img /mnt/sda, you can also use -o ro for readonly. Whole device files can be examined with, e.g., fdisk -l sda.img, to see the partitions. You can also mount each partition manually:

LOOP=$(losetup -f)
fdisk -l sda.img
losetup --offset N "$LOOP" sda.img
mount "$LOOP" /mnt/mountpoint

where N is the offset of the partition in blocks indicated by fdisk, multiplied by the block size (also indicated by fdisk, usually 512 bytes).

Shrinking disk image files

When you are keeping image files for archival purposes, you want to make them as small as possible. For instance, if the file has free space, you want to resize it to the smallest possible size. Note that if you do not do this, the free space will be filled with random garbage, so you cannot even hope that it compresses well. (Of course, before doing this, you must be OK with modifying the image file, and you must be sure that you wouldn't want to recover anything from this space, e.g., a deleted file on the partition.)

For ext2, ext3, and ext4 filesystems, the standard filesystems on GNU/Linux, it turns out that resize2fs works just fine on image files, and has a convenient option to resize to the smallest size: -M. It can also show progress with -p. It requires e2fsck to be run first, which you should run with -C 0 to see progress on stdout, -tt if you want more timing information, -f to force checking even when it seems unnecessary, and -p to automatically fix errors when it is safe to do so.

For FAT filesystems, you should first run fsck.vfat -p, and you can then use fatresize, with -p, and with -s giving the size (to be obtained with fatresize -i IMAGE | grep '^Min'). Afterwards, you need to truncate the file (which fatresize does not do) with truncate -s SIZE, with the SIZE obtained from fatresize -i IMAGE | grep '^Size'.

All of the above applies to image files for single partitions; to perform them on full device images you can do it on a loop device created as explained above, though of course the image file will not be shrunk then.

In some cases it is not safe to resize partitions. For instance, if you took an image of a full device of an embedded system, it would be possible that resizing partitions and moving them around would confuse the bootloader. In this case, an alternative is to zero out the unneeded space, so that the file is not smaller but at least it will compress better. For extN systems, you can use zerofree to do this.

I wrote a script, shrinkimg, to automate such tasks (also compression and decompression). I do not guarantee that it will work for you, but you can always adapt it.

Compressing files

Another important thing to do when archiving files is to compress them. First, using tar without any compression option, you can always reduce your files to a single .tar file to be compressed. There is a tradeoff between compressing each file individually, which makes it easier to access each of them, and tar-ing multiple files together to compress them together, which will yield a smaller result (redundancies across files can be used). My heuristic is to tar together files that are related (e.g., different versions of the same codebase).

Not all compression algorithms are alike. The common ones I have used are the following (from fastest, oldest, and least efficient, to slowest, most recent, and most efficient):

  • gzip, using DEFLATE, so essentially like most ZIP files
  • bzip2, similar but with some improvements, e.g., the BWT
  • xz, using LZMA, essentially the same as 7-zip
  • lrzip, the most recent, which I will describe in more detail.

Unfortunately lrzip used to have a bug where it will crash if you do not have enough memory, yielding a bogus file, not printing any error, and not yielding a non-zero exit code. This bug is presumably fixed in later lrzip versions. There is also now a fork of the original lrzip (I did not test it). In any case, if you plan on using lrzip, I'd strongly recommend testing that the compressed file can be decompressed and correctly returns the original file, and possibly making an independent note of a checksum and of the precise version of the software that you used.

lrzip is packaged for Debian, and performs two independent steps. First, it uses a large sliding window to find and eliminate redundancies in the file even when the occurrences are far apart. Second, it compresses the result using a configurable algorithm, the default one being LZMA, the most efficient but slowest being ZPAQ. It is multithreaded by default at the expense of a small loss of compression efficiency.

lrzip provides its own benchmarks see also here but I wanted to test it on my own data. I used a 19 GiB image file. I tried xz and lrzip with the default compression level or the increased one -L 9, with the default LZMA algorithm or with ZPAQ -z. Take these timings with a grain of salt, the machine was often busy doing other things: they are wall clock timings (so in particular lrzip can take advantage of parallelization).

Command   Time (s)    Filesize (bytes)
xz -9 10588.75 7300161660
lrzip 4871.58s 5734885539
lrzip -L9 5980.53s 5693722686
lrzip -z 17852.32s   5544631223
lrzip -z -L9 39809.40s   5332451600

The default lrzip version took around 20 minutes to decompress, the version obtained with lrzip -L9 -z took around 12 hours (!). I checked that the file decompressed fine, and with the same SHA1 image, to verify that no corruption had occurred.

So, in brief, lrzip is noticeably more efficient than xz, at the expense of being slower if you use the advanced settings. So I think it is worth it to use it on very large images where one can expect long-distance redundancy.

The main drawbacks of lrzip are that it is RAM-hungry. It tries to allocate a sensible amount only, but you definitely shouldn't run multiple copies in parallel unless you know what you are doing: it may get killed by the OOM killer, starve the machine, or fail to allocate with a message like Failed to malloc ckbuf in hash_search2.

I should also point out an impressive feat of lrzip, where it did amazingly well when compressing a tar archive of a bunch of database backups (each of them being mostly a prefix of the latest one). The .tar was 1.6 GiB, gzip compressed it to 518 MiB, xz to 112 MiB, and lrzip with advanced settings to just 2.5 MiB. In this case lrzip was much faster than the others, because the redundancy elimination went fast, and the size of the relevant data to be compressed was very small indeed!

Thanks to Pablo Rauzy for proofreading this.

La consultation République Numérique : mes réponses et mes scripts

Une consultation République numérique sur le projet de loi pour une République numérique a été lancée et se déroulera jusqu'au 18 octobre.

Je partage à cet égard les mêmes réserves que Stéphane Bortzmeyer ou La Quadrature Du Net : cette consultation arrive bien tard, et difficile de croire que l'expression des citoyens sera véritablement prise en compte. Ceci dit, je me dis qu'il vaut mieux donner son avis quand on le peut, plutôt que de se plaindre après coup de ne pas avoir été écouté...

J'encourage donc ceux qui le peuvent à voter. Si vous pensez que vous n'avez pas le temps, mais que vous avez quelques compétences techniques, j'ai fait un script Python pour vous permettre de voter rapidement de la même façon que moi, allez directement à la section correspondante.

Votes et soutiens

Vous pouvez voir mes votes sur le site de la consultation. Dans de nombreux cas, j'ai dû me résigner à voter pour des amendements dont la rédaction précise n'est pas satisfaisante, ou le champ d'application pas assez large, ou le rapport avec le texte assez peu clairement établi, faute de mieux et dans l'espoir de susciter un débat intéressant... J'ai aussi souvent lu en diagonale, car il y a beaucoup de matériel et je n'ai pas une quantité illimitée de temps...

C'est assez décourageant (mais pas si surprenant) de voir que la plupart des propositions sont de bien piètre qualité. En fait, quelque chose qui m'a davantage surpris, c'est que les propositions initiales du gouvernement (clairement identifiées), ou celles du Conseil national du numérique, sont parfois assez judicieuses, même si ça se limite trop souvent à de bonnes intentions, sans sanctions, sans garanties, sans recours, et sans conséquences réelles. J'ai tout de même voté pour certaines d'entre elles...

Une bonne façon de trouver des propositions que l'on a envie de soutenir, c'est de regarder celles d'associations ou d'individus qui font du bon travail. En particulier, j'ai voté pour toutes les propositions de La Quadrature Du Net, de l'April, de Wikimédia France (pour l'importante question de la liberté de panorama). Pour les questions de libre accès des travaux de recherche (voir ici pour une excellente introduction documentée sur ce problème), j'ai soutenu le CNRS, INRIA, le Consortium Couperin, Roberto di Cosmo et SavoirsCom1, entre autres.

Autres idées

Il y a trois points que j'aurais bien ajoutés à la consultation, mais je ne le fais pas faute de temps, et parce que je n'ai guère espoir que ce soit utile :

  • Personne ne s'est spécifiquement plaint de la pénibilité, dans les textes législatifs, des modifications qui sont décrites en langue naturelle, du genre « à l'alinéa (ii.) de l'article L-42, au point (b.), le mot "est" est remplacé par "n'est pas" ». En termes d'open data, ce serait bien de faire quelque chose pour que le jeu de données de Légifrance et autres sources soit plus utile, en demandant que des diffs exploitables par un ordinateur soient fournis en plus de (ou à la place de) la version actuelle (qui est illisible pour les ordinateurs, plus encore que pour les humains).

  • Une proposition de l'April indique que le code source des logiciels publics sont susceptibles de faire l'objet d'une communication aux citoyens. Ceci fait suite à un avis de la CADA commenté par exemple par Next INpact. Je suis tout à fait d'accord, mais j'irais même plus loin. En effet, l'avis en question indique que des "droits de propriété intellectuelle détenus par des tiers à l’administration" seraient susceptibles, s'il y en avait, de limiter le droit du demandeur (Monsieur X) à réutiliser le code concerné. Je pense qu'en pratique cette restriction pourrait être très problématique, vu que les administrations ont tendance à faire appel à des prestataires pour développer leurs logiciels. À mon avis, il devrait être entendu que tout prestataire développant ou hébergeant du logiciel pour l'administration doit être prêt à le fournir, sous licence libre, sur demande des citoyens, sans pouvoir s'opposer à sa réutilisation ultérieure.

  • Ce serait utile d'avoir un portail pour demander l'ouverture d'un jeu de données dont on estime qu'une administration (sans devoir chercher laquelle) doit bien le détenir. En particulier, j'avais un jour cherché à trouver la base de données des valeurs locatives cadastrales utilisées pour le calcul de la taxe d'habitation, sans rien trouver, et j'aurais bien aimé pouvoir demander quelque part ce jeu de données (apparemment fixe depuis 40 ans).

Scripts

Je partage l'insatisfaction de Bortzmeyer sur la plateforme elle-même, et l'absence de moyen de remonter des problèmes avec celles-ci. En particulier, le diff mot par mot est parfois fautif, souvent illisible. Cependant, à mon avis, le plus grave problème est de ne pas pouvoir simplement déléguer son vote à d'autres institutions. Suivant le principe de la démocratie liquide, je voudrais pouvoir confier ma voix à ceux en qui j'ai confiance, sans avoir besoin de me documenter sur le détail de chacune de leurs propositions. Cependant, la plateforme ne propose rien de mieux que d'aller voir leurs propositions et voter pour elles une par une. Cette délégation manuelle ne sera pas mise à jour si le mandataire change ses votes, et, même si on oublie cet inconvénient, elle est évidemment beaucoup trop pénible à faire en pratique.

C'est pour cette raison que j'ai écrit un jeu de scripts pour pouvoir facilement voter en soutien à un autre utilisateur, de façon automatique. L'objectif n'est pas de faire du bourrage d'urnes, simplement de permettre à qui le souhaite de voter de la même manière que quelqu'un en qui il a confiance, ou de voter pour toutes les propositions d'autres utilisateurs, sans devoir le faire vote par vote.

S'il vous plaît, utilisez ces scripts de façon raisonnable, et en particulier ne créez pas d'utilisateurs factices. Je n'ai écrit ce code que parce que la plateforme de consultation ne permet pas facilement de soutenir toutes les propositions d'un utilisateur, ou de reprendre à son compte tous les votes d'un autre utilisateur. J'estime que ces fonctionnalités devraient en principe être proposées par le site lui-même. À ma connaissance, l'utilisation de tels scripts à de telles fins n'est pas contraire à la charte. Cependant, je n'accepte aucune responsabilité pour ce que vous en ferez.

TL;DR: comment voter

Commencez par créer un créer un compte (n'utilisez pas Facebook ou Google+, c'est mal, et ça ne fonctionnera pas). Renseignez les informations, recevez le mail de vérification, et validez votre compte. Mettons que votre email soit toto@example.com et votre mot de passe "4242".

Ensuite, installez mes scripts (j'indique les prérequis pour Debian, mais vous pouvez adapter pour votre distribution) :

sudo apt-get install git python3-lxml python3-bs4 python3-requests
git clone https://a3nm.net/git/republique
cd republique

Pour voter pour les propositions des associations que je soutiens en utilisant le compte que vous avez créé :

./get_propositions.py april laquadraturedunet wikimediafrance inria \
    cnrsdistrenaudfabre consortiumcouperin robertodicosmo savoircom1 \
    > propositions
./vote.py toto@example.com "4242" < propositions

C'est normal que ces commandes prennent quelques minutes, vu qu'elles doivent faire deux requêtes par proposition. En cas d'échec, assurez-vous bien d'avoir créé et validé le compte au préalable.

Pour reprendre à votre compte tous les votes que j'ai faits :

./get_votes.py antoineamarilli > votes
./vote.py toto@example.com "4242" < votes

Si vous vous appelez Jean Dupond et que vous n'avez pas d'homonymes, vous pouvez vérifier que vos votes sont bien en ligne à l'URL https://www.republique-numerique.fr/profile/user/jeandupond.

N'hésitez pas à utiliser mes scripts puis à réajuster vos votes, car vous pouvez toujours les modifier ou les effacer individuellement sur le site de la consultation. Si vous votez plusieurs fois (avec l'outil ou en ligne) sur un sujet, seul le vote le plus récent est pris en compte. En particulier, si plusieurs de vos sources de propositions ou de votes sont en désaccord, c'est la dernière mentionnée qui prévaut.

J'ai corrigé un bug qui faisait que des votes favorables à un argument portant sur une proposition ou une modification pouvaient être interprétés à tort comme un vote sur la proposition ou modification elle-même. Si vous avez utilisé la vieille version de get_votes.py, vous avez peut-être voté à tort pour certaines propositions ou modifications. Si vous avez utilisé les commandes que je suggérais, vérifiez en particulier votre vote sur l'article 9, la modification du CNRS, et la commercialisation des données publiques.

Pendant la consultation, je produisais des tables (moches et faites très rapidement) pour pouvoir suivre de façon commode les propositions, modifications et arguments ayant reçu le plus de votes favorables et le plus de votes au total. Le code qui les génère est dans le dépôt git.

An activist's riddle

English version

This riddle is sometimes used by activists:

A father and his son have a car accident. The father dies, and the son survives but is badly hurt. He is brought to the emergency room, but the surgeon says: "It's too hard for me to operate on this boy, he is my son."

How is this possible?

If you don't know the answer, before I give it away, I encourage you to look at the following version instead:

A father and his daughter are hit by a reckless driver in an empty street. The father is killed instantly, the daughter survives but is badly hurt. A few minutes later, someone passes by, notices the girl and shouts: "Help! It's my daughter!"

How is this possible?

If you still haven't found the answer, I invite you to think it over, and continue when you got it or gave up. See this footnote for the answer: 1.

When they work as they should, I think such riddles are a great way to make people notice that their view of the world is influenced by gender stereotypes. That said, to be fair, the original riddle relies on at least two additional cues:

  • A contextual bias, namely, a priming effect: all characters but the last one are male, which makes it harder to think about a woman. This can be eliminated by adding female characters, for instance replacing the son by a daughter3 as I did. This "priming" effect is not specific to gender, and it is also used, e.g., in the following riddle (source) answer7:

    A black man dressed all in black, wearing a black mask, stands at a crossroads in a totally black-painted town. All of the streetlights in town are broken. There is no moon. A black-painted car without headlights drives straight toward him, but turns in time and doesn't hit him.

    How did the driver know to swerve?

  • A sociological bias: surgeons are mostly males (around 75% in France according to Insee), which makes it harder to think of a woman. I eliminated this by using the neutral term "someone" to refer to the person instead. (This is much harder to do in French.)
  • (The French version of the riddle uses the fact that the word "surgeon", in French, reflects the gender of the person involved, in a misleading way.)

I obviously can't tell, as I know the answer already, but I hope that my modified riddle above, while it is probably easier, is still non-trivial, even though it does not rely on these two effects: there is no contextual or social reason to think that the passerby is a man.

By contrast, it's hard to produce a convincing "reverse" riddle, even when using all available effects. Here's an attempt:

An impulsive young lady has a particularly violent argument with her mother, and jumps out of a window. The house cleaner in a nearby building notices the scene and shouts: "Help, help, it's my daughter!" How is this possible?

If, like me, you find my modified "passerby" riddle harder than the reverse riddle above, then your gender prejudices are making it easier for you to imagine people as men rather than women.

Of course, to reach definite conclusions about this, one would need to undertake a statistical study where different groups of people (of both genders) would be told the different riddles, and where the average time needed to answer them would be compared. This would be interesting to do, but way more complicated than just coming up with the variants.

Version française

On m'a raconté la devinette suivante :

Un père et son fils ont un accident de voiture. Le père meurt, le fils est entre la vie et la mort. On le conduit aux urgences et le chirurgien qui le voit dit : "C'est trop difficile pour moi de l'opérer car c'est mon fils."

Comment est-ce possible ?

Ma dissection de cette devinette va rendre la solution évidente, donc si vous ne la connaissez pas, essayez peut-être d'abord cette variante plus facile de mon invention, que je vais comparer à l'originale :

Dans un pays lointain, un père et sa fille tombent dans une rivière. Le père se noie immédiatement, mais sa fille est emportée par le courant. La rivière passe dans un village en aval, et l'autochtone qui voit arriver l'enfant s'exclame : "Au secours, c'est ma fille !".

Comment est-ce possible ?

Si vous n'avez toujours pas trouvé, je vous invite à interrompre votre lecture et à la reprendre quand vous aurez trouvé la réponse ou donné votre langue au chat. Pour la réponse, voir la note de bas de page: 2.

Je trouve que des devinettes de ce genre, quand elles fonctionnent, sont une façon particulièrement frappante d'interpeller ceux qui ne se sentent pas concernées par les questions de genre, en leur permettant de découvrir qu'ils ont tendance, spontanément, à se représenter des personnages comme des hommes plutôt que des femmes. Cependant, la devinette originale repose sur trois astuces pour nous y encourager :

  • Un biais contextuel, à savoir, un effet psychologique d'amorçage : si tous les personnages sont masculins, il est plus difficile de penser spontanément à un personnage féminin. Pour éviter ça, j'ai remplacé le fils par une fille4. Ce phénomène d'amorçage n'est pas spécifique au genre, et il est aussi utilisé¸ par exemple, dans la devinette suivante réponse8 :

    Un homme noir vêtu de noir traverse une route noire dans une rue sans le moindre réverbère où tous les bâtiments sont noirs. Une voiture noire arrive tous feux éteints, mais freine soudainement pour laisser passer le piéton.

    Comment a-t-elle fait ?

  • Un biais lexical : l'emploi de la forme non-marquée "le chirurgien" pour désigner une femme, et la confusion possible avec le masculin5. On peut donc remplacer par un nom de fonction épicène (et qui doit en plus commencer par une voyelle pour permettre l'élision), par exemple "urgentiste", ou "autochtone" pour la raison que je vais expliquer.
  • Un biais social, à savoir, l'utilisation d'un nom de métier majoritairement exercé par des hommes : seulement un chirgurgien sur quatre est une femme en France (source : Insee). On pourrait remplacer par un nom de fonction épicène et statistiquement paritaire aujourd'hui, par exemple "énarque", mais un tel choix illustre surtout, je trouve, que nos statistiques mentales sur les énarques ne sont pas à jour. D'où mon choix d'"autochtone", qui ne devrait pas avoir la moindre implication statistique.

Ma version modifiée de la devinette plus haut élimine donc le recours à ces trois astuces. Difficile pour moi d'en juger, vu que je connais la réponse, mais j'espère que cette version, si elle est plus facile, n'est pas triviale non plus. Pourtant, contrairement à la devinette originale, il n'y a plus aucune raison, ni lexicale, ni contextuelle, ni sociale, de penser que "l'autochtone" est un homme.

Si on essaie de faire la devinette dans le sens inverse, en revanche, ça ne semble pas vraiment marcher :

Une jeune fille extrêmement impulsive se dispute violemment avec sa mère, et, désespérée, se jette par la fenêtre. L'aide à domicile d'une des familles de la tour voisine, qui nettoyait les vitres, aperçoit la scène et s'exclame "au secours, c'est ma fille !".

Comment est-ce possible ?

On ne peut plus utiliser de ressort lexical, parce qu'on ne pourrait pas vraiment parler (par exemple) de "caissière" pour désigner un homme individuellement, même si "caissière" est communément utilisé au féminin par défaut (par exemple, "grève des caissières" ; je trouve d'ailleurs ça extrêmement problématique, le "féminin par défaut" employé de la sorte pour certains métiers spécifiques). En revanche, les deux autres astuces sont utilisées à plein régime : à part l'aide à domicile, tous les personnages (et même tous les noms utilisés) sont féminins, et les aides à domicile en France sont des femmes par une majorité extrêmement large (Source: Dares). Pourtant, je ne trouve pas que ça marche aussi bien, ce qui tendrait à illustrer que la situation n'est pas symétrique ; mais là encore, j'ai du mal à me rendre compte. Maxime me fait remarquer qu'on pourrait aussi utiliser un autre terme vraiment grammaticalement féminin pour faire référence à l'homme, comme "personne", dont je vais parler jutse après pour la direction inverse, ou bien "victime"...

Cependant, une version de la devinette originale qui semble la rendre vraiment trop facile, c'est d'utiliser le terme de "personne", ce qui donne par exemple :

Dans un pays lointain, un père et sa fille tombent dans une rivière. Le père se noie immédiatement, mais sa fille est emportée par le courant. La rivière passe dans un village en aval, et la personne qui voit arriver l'enfant s'exclame "au secours, c'est ma fille !".

Comment est-ce possible ?

Je trouve que "personne" rend plus facile d'imaginer une femme, juste parce que le terme est féminin. Dans le même genre, d'autres tentatives de ne pas divulguer le sexe du locuteur ("Un cri s'élève...") ne fonctionneraient probablement pas non plus6. Il est aussi possible d'utiliser "quelqu'un", qui peut-être marcherait mieux que "personne". Ainsi, je crois que le ressort principal reste grammatical : un lecteur invité à annoter une phrase par des informations de genre purement grammatical, indépendamment du sens, verrait sans doute "l'autochtone" comme un masculin, sauf preuve grammaticale indiscutable du contraire : par exemple, dans la phrase "L'autochtone était hermaphrodite."

Ainsi, une fois éliminés l'amorçage et le biais social, je dirais que la devinette illustre surtout les principes suivants :

  • Désigner une personne par un terme grammaticalement masculin fait qu'on se la représente comme un homme.
  • Une forme grammaticalement épicène a tendance à être perçue comme grammaticalement masculine par défaut.

À ce titre, la version anglaise de telles devinettes, où on peut utiliser "someone" pour ne donner aucune indication grammaticale, me semblent peut-être plus intéressantes parce que j'ai l'impression qu'elles fonctionnent encore, sans recours nécessaire à des termes épicènes.

Bien sûr, la seule manière d'aboutir à des conclusions fiables à ce propos serait de mener une étude statistique sérieuse comparant le temps moyen nécessaire à des groupes de sujets expérimentaux (des deux sexes) pour trouver la réponse à chacune de ces diverses variantes. Malheureusement, c'est quelque chose de plus difficile à faire que de juste écrire un billet de blog pour comparer quelques variantes.

Une jeune fille tombe inconsciente dans une rue déserte. Peu après, deux touristes passent par là, la voient, et se rendent compte en même temps : "Ciel ! C'est ma fille !". Les deux ont raison.

Comment est-ce possible ?


Des touristes visitent un pont ; quelqu'un tombe du pont et se noie. La police intervient et recueille séparément les dépositions. Un premier touriste a déclaré : "Je suis son père." Quelqu'un d'autre a affirmé ensuite : "C'était mon enfant." Pourtant, la police les croit tous les deux.

Comment est-ce possible ?


  1. The surgeon and the passerby are women. 

  2. Le chirurgien et l'autochtone sont des femmes. 

  3. Of course, the father must still be a man. By the way, it would be better if one could somehow insist on the fact that we are talking about biological parenthood, but this would probably be hard to do without drawing attention to the answer. I don't know if people can be tempted to answer the riddle in the following interesting way: the father and surgeon are a gay couple, and this is their adopted son. 

  4. Évidemment, le père doit rester un homme. À ce titre, il serait d'ailleurs préférable de préciser, pour éviter toute confusion, que c'est la relation de filiation biologique qui nous intéresse, mais ça semble difficile de le faire sans vendre la mèche. Je trouve d'ailleurs assez intéressante la réponse alternative suivante, dont je ne sais pas si elle peut venir à l'esprit des gens : le père et le chirurgien sont un couple de gays et c'est leur fils adoptif

  5. En fait, on m'a déjà présenté la devinette comme une critique de la solution, pour le genre des noms de métier, qui consiste à utiliser la forme non-marquée de cette façon en lui donnant un sens neutre. Pourtant, je pense que la devinette marche très bien aussi avec un nom de profession épicène comme "urgentiste", qu'il n'y aurait, en théorie, pas lieu de féminiser. 

  6. Une technique qui pourrait marcher serait d'utiliser le pluriel. Par exemple, voici deux possibilités : 

  7. This happened during the day. 

  8. Il fait jour. 

Mots d'un genre rare pour une terminaison donnée

Ce billet est motivé par l'énigme suivante, que vous avez peut-être déjà entendue :

Quel est le seul mot masculin en français qui se finit par "ette" ?

Je ne donnerai pas la réponse de cette énigme (enfin, pas directement, mais en un sens je l'ai déjà donnée), qui en admet d'ailleurs plusieurs. Ma question est de générer automatiquement de telles énigmes : des mots dont le genre est exceptionnel au vu de leur terminaison. En gros, des cas anormaux pour des tentatives de classification du genre suivant la terminaison, comme j'en ai déjà entrepris.

Une liste de telles énigmes calculée automatiquement est ci-dessous ; pour que ce soit plus amusant, j'ai également fait une version interactive qui permet de jouer en ligne (avec du HTML statique crade).

trouver un mot masculin en -lée
trouver un mot féminin en -lis
trouver un mot masculin en -tive
trouver un mot féminin en -heur
trouver un mot féminin en -et
trouver un mot féminin en -ou
trouver un mot masculin en -ise
trouver un mot masculin en -uille
trouver un mot masculin en -tière
trouver un mot féminin en -el
trouver un mot féminin en -ir
trouver un mot féminin en -sseur
trouver un mot féminin en -geur
trouver un mot masculin en -aine
trouver un mot féminin en -teur
trouver un mot féminin en -sson
trouver un mot masculin en -tion
trouver un mot féminin en -ment
trouver un mot féminin en -lon
trouver un mot féminin en -ré
trouver un mot masculin en -cité
trouver un mot masculin en -ente
trouver un mot féminin en -tère
trouver un mot féminin en -ux
trouver un mot féminin en -at
trouver un mot féminin en -ar
trouver un mot masculin en -isse
trouver un mot féminin en -cle
trouver un mot féminin en -raphe
trouver un mot masculin en -ude
trouver un mot masculin en -tte
trouver un mot féminin en -if
trouver un mot masculin en -uche
trouver un mot masculin en -nce
trouver un mot féminin en -it
trouver un mot masculin en -nie
trouver un mot masculin en -vité
trouver un mot féminin en -ant
trouver un mot féminin en -no
trouver un mot féminin en -stre
trouver un mot masculin en -rde
trouver un mot féminin en -ome

Observez que l'énigme classique sur -ette est également trouvée dans cette liste (mais avec le suffixe -tte). Le code source est disponible. Dans la suite, j'explique comment ces énigmes ont été calculées.

J'utilise la base de données Lexique dont j'extrais les données d'intérêt de la façon suivante :

  • Considérer les noms (dans lexique, valeur de "NOM" pour "4_cgram").
  • Ne considérer que des noms qui sont des mots de base, notamment, qui ne sont pas au pluriel ; j'utilise pour cela le champ "14_islem" de lexique.
  • Éliminer les mots contenant des espaces (locutions), des apostrophes, des points, ou des traits d'union.
  • Éliminer les mots vraiment rares (ceux dont l'usage est de 0 suivant le champ "8_freqlemlivres").
  • Considérer les mots épicènes (i.e., qui existent dans les deux genres) comme existant à la fois dans un genre et dans l'autre, avec la même fréquence d'usage (ce qui est bien entendu une approximation).

On obtient ainsi le fichier de données que l'on va utiliser pour générer les énigmes. Une énigme va être un suffixe (par exemple "ette") et un genre (par exemple "féminin"), de sorte qu'il existe des mots des deux genres se terminant par le suffixe, mais que le genre indiqué soit exceptionnel.

Par paresse, j'adopte une approche simple me permettant de réutiliser le code de mon travail précédent. Je calcule les suffixes maximaux tels qu'il existe un mot de chaque genre terminant par ce suffixe, dont j'extrais tous les sous-suffixes. Le résultat est la liste de tous les suffixes français où il y a un mot de chaque genre (ou un mot épicène) qui se finit par ce suffixe, et c'est tous les suffixes qu'on peut potentiellement vouloir poser comme une énigme.

J'évalue ensuite, pour chaque tel suffixe, si c'est une énigme intéressante ou non. Pour ce faire, il y a plusieurs critères à prendre en compte :

  • Le genre rare (l'objet de l'énigme) doit être beaucoup plus rare que le genre fréquent.
  • Le genre rare doit quand même être courant en soi : les exceptions dont le score est vraiment très faible sont au mieux des mots que personne ne connaît, au pire des cas limites ou des erreurs de Lexique.
  • Le genre rare doit être concentré en un ou plusieurs mots : une partie de l'intérêt (et de la difficulté !) de l'énigme ci-dessus vient du fait que, même si plusieurs réponses sont possibles, un seul mot concentre la majeure partie des usages.
  • Les mots du genre rare doivent être longs, en tout cas plus longs que le suffixe. Si on demande, par exemple, un mot féminin se terminant par "ot", une énumération exhaustive suggérera rapidement "dot", et des essais sur des utilisateurs m'ont confirmé que ce genre d'énigmes était trop facile.

Les énigmes générées, en revanche, ne respectent pas un critère que l'énigme "ette" respecte : que la prononciation des mots rares soient conformes à ce qu'on attendrait à partir du suffixe. Par exemple, les réponses à l'énigme "ette" sont des mots où "ette" se prononce, comme on s'y attend, /ɛt/, alors que "dot" ne se prononce pas comme on l'attendrait (le 't' final n'est pas muet). De la même façon, pour le suffixe "ir", des réponses pourraient se finir en "air", "oir"... Ce critère semble plus complexe à imposer de façon automatique. Ceci dit, j'impose tout de même que le suffixe contienne au moins une voyelle, pour être vaguement prononçable (même si les 'e' muets peuvent poser problème).

Je me limite aux suffixes qui couvrent une fréquence et un nombre de mots supérieurs à un certain seuil, et je donne un score aux suffixes calculé (de façon assez arbitraire) comme le produit des choses suivantes :

  • la proportion de la fréquence du genre rare couvert par les trois mots les plus fréquents du genre rare
  • le rapport entre la fréquence du genre fréquent et la fréquence totale du suffixe
  • le nombre de caractères à ajouter au suffixe pour atteindre le plus court mot du genre rare

Je limite aux 42 énigmes jugées meilleures suivant ce critère.

Pour améliorer la qualité des énigmes, une possibilité serait de chercher des solutions dont la prononciation corresponde également à celle du suffixe (la plus commune parmi les mots de ce suffixe), mais ceci est laissé en exercice au lecteur. :)

Sandboxing Skype

Skype now has a rather functional web interface, at least in Chromium-based browsers. If you need to use Skype, I think this is a preferable solution to the sandboxing approach presented in this blogpost (which I no longer use).

More of the same. After sandboxing Dropbox, I also wanted to run Skype as its own user. Again, this is not an endorsement of Skype, which is proprietary and quite creepy software.

Once again, I chose to use a lightweight solution where Skype is run as a separate user and where I implement access control with various mechanisms, as opposed to more ambitious approaches using containers, virtual machines, etc. The main difficulty is that, unlike Dropbox, Skype is not headless, so it needs to access the X server, whose security model is far from perfect. If Skype could directly access the X server, it could log all keystrokes (even those directed to different applications), take screenshots, etc. I use the approach of running Skype in Xpra, following an idea found here. Xpra acts as an X server to which Skype will connect, and it will display as a client in my real X server, but it will not relay X events of my server to its client unless they are addressed to the client.

However, one should keep in mind the possibility that Skype could access desktop notifications, and possibly (and more annoyingly) that it could be accessing clipboard data.

User setup

Start by setting up the Skype user as in my sandboxing Dropbox guide, following steps from 1 to 5. You can probably be stringent with the disk limit (I used 500MB), but you should be generous with the RAM limit, as Xpra may fail to start otherwise (I used 1024000000 bytes). Step 5 can be followed as-is because the ports used by Skype are the same as those used by Dropbox.

You should also add yourself to the skype group, to be able to access later files created by the skype user.

If you want Skype to be able to access the webcam, on Debian, the skype user should be put in the video group. However, I am not sure about the security implications of this choice.

Pulseaudio configuration

A problematic issue is that Skype will need access to the speakers and microphone. I use PulseAudio with a user-level daemon for my user, and we need to arrange things so that the skype user will be able to connect to the daemon. Of course, however, we will not make the pulseaudio open to all local connections, and only allow them from the skype user.

To do this, we need to change the Pulseaudio configuration to create its socket at a place where the skype user can access it, and instruct Pulseaudio clients to look for the socket at its new place. The following assumes that you do not have a configuration file already:

mkdir -p ~/.pulse
cd ~/.pulse
cp -n /etc/pulse/default.pa .
echo "load-module module-native-protocol-unix socket=/tmp/pulse-socket" >> default.pa
cp -n /etc/pulse/client.conf .
echo "default-server = unix:/tmp/pulse-socket" >> client.conf

Once this is done, restart Pulseaudio. When running Skype (using the script that I will talk about later), the credentials to access the main Pulseaudio server will be passed from the main user using pax11publish.

Mind the security implications: this means that you may consider all sound input and output compromised while Skype is running. This is hardly avoidable, however, as Skype communications themselves cannot be considered secure.

Skype installation

First, apt-get install the dependencies of Skype.

Then, download the Evil Skype Binaries from skype.com, put them in the home of the Skype user and chown them so that the skype user owns them. Of course, retrieve the "Dynamic" version, as the point is that we want to be able to install them without root privileges. As the skype user (sudo su -s /bin/bash skype), extract them. I recommend symlinking the created folder to "skype" so you can have a path that does not change even when you update to newer versions.

Setting up Xpra

Install xpra (it is packaged for Debian).

Then do the following as the skype user, which we will use to host the Xpra socket:

cd ~skype
mkdir xpra
chmod g+rwx xpra

Running Skype

The task of running Skype is a bit complex, so I wrote a script that does it for me. It also does similar sanity checks to the one done by my dropbox wrapper, to make sure that the access restrictions don't suddenly stop working.

The way it works is that starts an Xpra display without Pulseaudio (as we will be connecting to the Pulseaudio server started by our true user) and with --mmap-group and the right socketdir to make the socket accessible to members of the skype group (that is, your true user); also using a specific local encoding to avoid JPEG artifacts. It waits for the server to be ready, and then uses pax11publish to send Pulseaudio credentials to the server. Then it runs Skype in the Xpra display and attaches it from your real session. It also includes what is needed to kill all Skype processes when you are done using Skype.

The script will not work out of the box for you, but you should be able to adapt it to your needs.

One problem that you will have to fix is that sound notifications will not play because Skype will be unable to find them. This can be fixed by going in Skype's parameters, and selecting manually the sound files in the ~skype/skype/sounds folder.