# articles

feed_id: http://gordon.re/?p=448
title: Howto pratique : l’installation d’une Gentoo encore plus sécurisée
uri: Howto-pratique-l-installation-d-une-Gentoo-encore-plus-sécuri
url: http://gordon.re/sysadmin/howto-pratique-linstallation-dune-gentoo-encore-plus-securisee.html
content:
<p>Il y a un certain temps, j’avais écrit un billet expliquant étape par étape <a href="/sysadmin/howto-pratique-installation-complete-gentoo-linux.html">l’installation d’une Gentoo Linux</a> avec des partitions intégralement chiffrées. Ma récente aventure avec <a href="http://freebsd.org">FreeBSD</a> sur une de mes machines, et mon retour sous Gentoo me donne l’occasion de pousser un peu plus loin cet objectif.</p>
<p>En effet, le simple fait de chiffrer un disque ne le rend pas totalement sécurisé par miracle. La faiblesse d’un système de chiffrement, en pratique, repose souvent dans la clé et la façon de la gérer par l’utilisateur. Parce qu’un chiffrement <a href="https://secure.wikimedia.org/wikipedia/fr/wiki/Rijndael">Rijndael</a> bien barbu ne vaut rien si sa clé est la date de naissance de l’utilisateur, naturellement. Sans tomber dans cet extrême, la solution retenue précédemment avait quelques faiblesses :</p>
<ul>
<li>Il suffisait d’une passphrase pour déchiffrer toutes les partitions. En cryptographie, on évite d’utiliser la même clé plusieurs fois, pour éviter les recoupements éventuels. Par ailleurs, la taille de la passphrase influait sur la protection apportée, et il fallait donc trouver l’équilibre entre une passphrase suffisamment forte et une qui puisse se retenir. Oublier sa passphrase impliquant une perte définitive des données.</li>
<li>Le noyau et l’initramfs se trouvaient sur le disque dur. Quelqu’un disposant d’un accès physique aurait donc pu altérer les exécutables pour, par exemple, enregistrer la frappe lors de la saisie de la passphrase, compromettant ainsi les données.</li>
</ul>
<p>Il existe donc une solution pas très complexe à cela, mais que je n’avais pas voulu essayer à l’époque (par peur de voir trop gros d’un coup, l’autre raison étant que les explications claires n’étaient pas encore écrites sur le <a href="http://en.gentoo-wiki.com/wiki/DM-Crypt_with_LUKS">guide utilisé</a>) : stocker le noyau et l’initramfs sur un support amovible, qui serait sur moi en permanence, et qui par ailleurs contiendrait la clé de déchiffrement du disque, chiffrée en GPG. La dernière fois, utiliser GPG ne me semblait pas être une bonne idée, mais le fait de stocker la clé sur un support externe apporte une solution convenable à ce problème : on a maintenant une authentification forte (car basée sur 2 méthodes distinctes) pour déverrouiller la machine : il faut à la fois posséder le support externe et connaître la passphrase pour accéder au disque. Par ailleurs, au lieu d’avoir plusieurs partitions que l’on déverrouillera avec la même clé, on peut utiliser LVM pour créer des partitions logiques, stockées sur une seule partition physique, qui, elle, sera chiffrée en premier lieu.</p>
<p>En plus de cela, j’ai choisi de partir sur le projet <a href="http://www.gentoo.org/proj/fr/hardened/primer.xml">Gentoo Hardened</a>, qui est un ensemble de modifications et d’ajouts pensés pour la sécurité, sur la distribution Gentoo. Concrètement, il s’agit de l’ajout de PaX, SElinux, GRsec et autres modules améliorant la sécurité du système en consolidant les accès systèmes, fichiers, etc. Cette « déclinaison » de la Gentoo a la réputation d’être le meilleur choix de sécurité pour du GNU/Linux (les systèmes BSD étant encore un cran au-dessus, pour peu qu’on sache les utiliser comme il faut). Et pour finir, j’ai souhaité garder un système Libre, sans exception. Bien que non référencée dans les <a href="https://www.gnu.org/distros/free-distros.html">distributions GNU-compliant</a> par la <a href="http://fsf.org">Free Software Foundation</a>, deux petites astuces permettent de se prémunir de tout code non-libre dans son beau système. Non seulement parce que je crois qu’utiliser du logiciel libre me permet d’avoir confiance dans mon système, mais également par principe, sachant que j’utilise très peu de logiciels non-libres sur mes autres systèmes. C’est en quelque sorte un défi.</p>
<h3>Disque dur chiffré, le retour</h3>
<p>Pour rappel, les améliorations du système précédent sont donc :</p>
<ul>
<li>L’utilisation de LVM pour n’avoir qu’un volume LUKS à déchiffrer (ce qui est plus pratique <strong>et</strong> plus sécurisé)</li>
<li>L’utilisation d’un keyfile au lieu d’une passphrase, pour avoir une clé nettement plus longue et dont on n’a pas besoin de se souvenir, elle-même chiffrée par une passphrase avec GPG</li>
<li>Le stockage du noyau, de l’image initramfs, et du keyfile sur un support amovible, que je garderai constamment sur moi</li>
<li>Pour finir, on change de méthode de génération de l’initramfs, en optant pour <a href="https://www.kernel.org/pub/linux/utils/boot/dracut/dracut.html">Dracut </a>, qui sait tout faire tout seul</li>
</ul>
<p>Au moment de partitionner le disque, nous allons donc créer une seule partition, puisque c’est LVM qui, à l’intérieur, s’occupera de la segmenter en partitions logiques. Dans cet article, on supposera que le disque dur est /dev/sda. Avec fdisk ou votre outil de partitionnement préféré, supprimez donc tout, puis créez une unique partition qui prendra toute la capacité disponible (ce sera /dev/sda1). Cette partition sera un conteneur LUKS, qui, une fois ouvert, contiendra le <acronym title="Volume Group">VG</acronym> de LVM, dans lequel seront nos 3 partitions : root (/), home (/home) et swap (non monté). Mais pour commencer, on génère la clé. Pour cela, je pioche dans le générateur de pseudo-aléa /dev/random une quantité raisonnable de données, que je découpe proprement pour avoir une chaîne alphanumérique de 255 caractères.</p>
<p><code>head -c 255 /dev/random | uuencode -m - | head -n -1 | tail -n +2 | tr -d '\n' | gpg --symmetric -a > sda1.gpg #puis on agite sauvagement la souris, ou on tape comme un goret sur son clavier, pour générer de l’entropie</code></p>
<p>Nous avons notre clé. Notez que nous avons pris soin de supprimer les retours à la ligne pour éviter une mauvaise surprise avec les pipes, bien qu’il ne devrait pas en avoir. Créons maintenant le conteneur LUKS.</p>
<p><code>gpg --quiet --decrypt sda1.gpg | cryptsetup -d - -v --cipher serpent-cbc-essiv:sha256 --key-size 256 luksFormat /dev/sda1</code></p>
<p>Notez bien le « -d - », il permet d’éviter le genre d’ennuis cité ci-dessus, et surtout, il sera utilisé par défaut par le script d’initialisation, alors il vaut mieux utiliser la même méthode. Ensuite, pour ouvrir le conteneur :</p>
<p><code>gpg --quiet --decrypt sda1.gpg | cryptsetup -d - luksOpen /dev/sda1 vg0</code></p>
<p>Le nom du volume LUKS (ici vg0) importe peu, et je fais confiance à votre imagination fertile pour attribuer un nom qui vous fera briller en société. Notre volume étant ouvert (mais pas formaté, ni monté) dans /dev/mapper/vg0, nous allons pouvoir en faire un VG, justement, et crééer les partitions à l’intérieur.</p>
<p><code>pvcreate /dev/mapper/vg0<br />
vgcreate vg0 /dev/mapper/vg0 #le premier vg0 est le nom du volume, tandis que /dev/mapper/vg0 est la partition LUKS ouverte. Faut suivre hein<br />
#on peut créer nos LV. Mettons que notre disque fait 100Go<br />
lvcreate -n root -L 49g vg0<br />
lvcreate -n home -L 49g vg0<br />
lvcreate -n swap -L 2g vg0</code></p>
<p>Vous aurez compris que l’on a assigné 2Go de swap (l’équivalent de notre mémoire physique, au cas où on voudrait suspendre le système), puis que l’on a bêtement redistribué équitablement à /home et /. N’hésitez pas à personnaliser ces valeurs pour correspondre à vos besoins. Nous avons maintenant nos partitions, prêtes à recevoir un filesystem (XFS dans mon cas). Si jamais vous devez reprendre votre installation (à cause d’une tentative infructueuse de boot, par exemple), vous risquez de vous demander comment retrouver vos volumes LVM, après avoir déchiffré /dev/sda :</p>
<p><code>vgscan &#038;&#038; vgchange -ay</code></p>
<p>Et vos partitions vous attendront sagement dans /dev/vg0/*. Activez le swap avec « mkswap /dev/vg0/swap &#038;&#038; swapon /dev/vg0/swap », puis continuez l’installation classique du système. Après la compilation du noyau, il est inutile de l’installer, car nous n’utiliserons de toutes façons pas le /boot. À la place, installez <em>sys-kernel/dracut</em>, qui se chargera de générer un initramfs tout beau pour vous. Mais avant, spécifiez les modules que vous souhaitez compiler (j’indique mon propre choix, utile pour cette installation) :</p>
<p><code>echo 'DRACUT_MODULES="crypt crypt-gpg lvm"' >> /etc/make.conf<br />
echo 'sys-kernel/dracut device-mapper' >> /etc/portage/package.use<br />
emerge -va dracut</code></p>
<p>Ensuite, il vous faut un support amovible, tel qu’une bête clé USB. Commençons par effacer son MBR : après l’avoir insérée, et vérifié son nom de device (ici, /dev/sdb), installez syslinux, puis tapez :</p>
<p><code>emerge -va syslinux<br />
dd if=/dev/zero of=/dev/sdb bs=1024k count=5 conv=notrunc<br />
mke2fs -m0 /dev/sdb1<br />
mkdir tempdir &#038;&#038; cd tempdir<br />
cp /usr/portage/distfiles/syslinux-*.tar.bz2 .<br />
tar -xvjf syslinux-*.tar.bz2<br />
cd syslinux-*<br />
cat mbr/mbr.bin > /dev/sdb<br />
mkdir /mnt/usb<br />
mount /dev/sdb1 /mnt/usb<br />
cd /mnt/usb<br />
cp /usr/src/linux/arch/<strong>&lt;arch&gt;</strong>/boot/bzImage . #remplacez <strong>&lt;arch&gt;</strong> par votre architecture<br />
cp syslinux-<strong>&lt;version&gt;</strong>/com32/menu/menu.c32 .<br />
cp chemin/vers/sda1.gpg .</code></p>
<p>Il ne reste plus qu’à générer l’initramfs avant de rendre le médium bootable. À ce stade, vous êtes toujours en chroot, avec un système dont il y fort à parier dont le noyau diffère de celui que vous venez de compiler. Dracut va donc logiquement couiner, ne trouvant pas les modules du noyau actuel. Il faut donc d’abord générer les dépendances de modules pour le noyau actuel, puis générer l’initramfs en lui indiquant le bon répertoire pour les modules :</p>
<p><code>depmod `uname -r`</code></p>
<p>Avant d’utiliser dracut, on va le configurer un peu, histoire de s’assurer qu’il chargera les bons modules (ça serait bête de ne pas pouvoir utiliser gpg, par exemple). Tout ce que j’ai eu à faire a été de modifier cette ligne dans <em>/etc/dracut.conf</em> :</p>
<p><code>add_dracutmodules+="crypt crypt-gpg lvm dm selinux"</code></p>
<p>Nous sommes enfin prêts à générer l’image.</p>
<p><code>dracut -k /lib/modules/`uname -r`<br />
mv initramfs-* initramfs-`uname -r`.img</code></p>
<p>Il nous reste cependant à configurer le programme de démarrage, extlinux. Créez un fichier <em>extlinux.conf</em> dans <em>/mnt/usb</em>, et adaptez son contenu selon le mien :</p>
<p><code>DEFAULT menu.c32<br />
TIMEOUT 100<br />
PROMPT 0<br />
LABEL Gentoo<br />
&nbsp;&nbsp;&nbsp;&nbsp;MENU LABEL Gentoo ^Linux<br />
&nbsp;&nbsp;&nbsp;&nbsp;MENU DEFAULT<br />
&nbsp;&nbsp;&nbsp;&nbsp;KERNEL bzImage<br />
&nbsp;&nbsp;&nbsp;&nbsp;APPEND root=/dev/vg0/root rd.luks.key=/sda1.gpg initrd=initramfs-<strong>&lt;version&gt;</strong>.img</code></p>
<p>Vérifiez scrupuleusement les paramètres de boot, dans « APPEND ». Ils sont la principale source de boot foireux. Si vous désirez choisir une keymap précise (par défaut, ce sera en qwerty), ajoutez « vconsole.keymap=<strong>&lt;keymap&gt;</strong> », en insérant le nom de la keymap, <strong>fr-dvorak-bepo</strong> pour moi. On finit donc :</p>
<p><code>extlinux .<br />
cd<br />
umount /mnt/usb<br />
sync</code></p>
<p>Et on tente le reboot. Naturellement, vérifiez que votre BIOS vous permet de booter sur un support amovible. N’oubliez d’ailleurs pas de brancher ledit support, ça évitera un arrachage de cheveux tout à fait inopportun. Si vous avez bien fait les choses, un joli menu s’affichera, vous proposant de booter votre noyal. Après validation, celui-ci se chargera, exécutera l’initramfs, qui analysera alors le disque, et, trouvant le keyfile que vous lui avez indiqué, vous demandera sa passphrase. Méfiez-vous de la keymap, si vous ne l’avez pas fixée manuellement. Ensuite, le système continue paisiblement son boot. Félicitations, vous venez de faire un pas de plus vers la paranoïa sécuritaire.</p>
<h3>Gentoo, GNU/Linux libre ?</h3>
<p>Pour finir, deux mots sur l’astuce évoquée, pour bénéficier d’un système 100% libre selon les termes très stricts de la FSF. Si vous êtes habitué de Portage, vous savez qu’il connaît la licence de chaque paquet, et que, si vous tentez d’installer certains programmes pas trop libres, il vous demandera d’accepter explicitement cette nouvelle licence. Et bien <a href="http://www.gentoo.org/doc/en/handbook/handbook-x86.xml?part=2&#038;chap=1#doc_chap4">Portage permet de définir la politique d’acceptation des licences</a>, et c’est très bien fait, car il possède des « sets » de licences, permettant de les trier facilement. Il suffit de spécifier votre choix dans <em>/etc/make.conf</em>. Par exemple, j’ai opté pour ça :</p>
<p><code>ACCEPT_LICENCE="-* @FREE"</code></p>
<p>Ce qui n’accepte que les programmes sous licence libre agréée par la FSF. Comme vous pouvez le voir, c’est simplissime. Il y a encore une chose à faire : le noyau Linux contient, dans ses sources officielles, des morceaux de code binaire non libre, essentiellement des drivers. Il existe un script permettant d’analyser les sources, de débusquer ces <em>blobs</em> et de les supprimer. Ainsi, les sources que vous compilerez seront propres. Naturellement, ça implique de se passer desdits drivers. Encore une fois, Portage nous vient en aide, puisqu’il offre un USE flag disponible sur tous les noyaux (par exemple sys-kernel/hardened-sources pour moi).</p>
<p><code>echo 'sys-kernel/hardened-sources deblob' &gt;&gt; /etc/portage/package.use<br />
emerge -va hardened-sources</code></p>
<p>Et voilà le travail. Le script met un peu de temps à faire son boulot, mais ensuite, votre noyau ne contiendra que du logiciel libre ! Et avec les 2 astuces combinées, vous êtes certain de ne pas ajouter de logiciels non-libres sur votre système, hormis exceptions explicitement créées.</p>


feed_id: http://www.gordon.so/?p=32
title: Panlithea : Néo-Gælith
uri: Panlithea-Néo-Gælith
url: http://gordon.re/ecriture/panlithea-neo-gaelith.html
content:
<p>Voici enfin la suite de ma nouvelle, <a href="/ecriture/panlithea/panlithea-la-catatelie.html">La Catatélie</a>. Son écriture aura été laborieuse, et très longue. Je suis donc fier d’avoir pu la mener à bien, et j’espère à la fois qu’elle plaira, et qu’elle apportera des réponses aux interrogations levées précédemment. Je vous remercie par avance des différentes remarques, corrections, que je ne tarderai pas à incorporer au récit. J’en profite également pour remercier tous ceux qui m’ont aidé, de près ou de loin, à la rédaction de la précédente nouvelle, ainsi que celle-ci.</p>
<p>Sa licence est celle du blog, c’est à dire CC-by-sa. Et je ferai une version pdf bien jolie rapidement.</p>
<p><span id="more-32"></span></p>
<div class="text">
<h3>Journal d’Iskh — première entrée</h3>
<p>Il me semble indispensable d’effectuer ce travail de mémoire. Pour ce que mes semblables et moi avons vécu récemment, et pour ce qui arrivera à l’avenir. J’ignore si d’autres ont eu la même initiative, mais je tiens à ce que que cela puisse être transmis aux futures générations, si jamais elles subsistent.</p>
<p>Mes souvenirs sont encore très confus, et pourtant, plusieurs ors se sont écoulés depuis notre arrivée. Je vais essayer de narrer le plus précisément possible ce que les miens ont enduré. Tout d’abord, il faut savoir que nous sommes un peuple qui défia les Âges. Espèce supérieure de notre monde, nous l’avons dominé sous toutes ses facettes. Nous l’avons colonisé, et continué notre expansion vertigineuse. Jusqu’à ce que tout autour de nous commence à se disloquer. Ces événements nous conduisirent à un exode massif, une fuite immédiate, ordonnée par le Dessus, la caste qui nous dirigeait. Des immenses portails composés d’arcane, surgis d’on ne sait où, apparurent, et nous permirent de sauver notre civilisation. Avec le maigre recul qu’il m’est donné de prendre aujourd’hui, je constate que nul salut ne nous attendait. En réalité, j’ai eu de la chance. Ceux qui, comme moi, arrivèrent de l’autre côté, ont eu de la chance. Car, parmi les centaines de milliers de Panlithes que j’avais pu observer autour de moi avant de franchir l’immense édifice, seules quelques centaines ont atteint la sortie. Et dans quel état…</p>
<p>Vous qui lirez ces mots, je vous implore de me croire, malgré l’effroi de la chose. Ce que je raconte, je l’ai vécu et vu, et cela restera ancré au plus profond de mon âme. Je n’ai aucun souvenir de mon propre passage : j’ai, semble-t-il, perdu connaissance en franchissant le voile du portail. Mais j’ai pu voir émerger de nouveaux arrivants. Je me tenais à distance respectable du point d’arrivée, et, régulièrement — j’entends par là tous les deux ou trois arcs —, une forme sombre naissait à la surface du voile semi-opaque, grossissait rapidement, avant d’éclater dans un éclair de lumière vive. Alors, on retrouvait au sol ce qu’autrefois on aurait appelé un Panlithe. Au début, je fus horrifié de la vision de ces êtres déchiquetés, dont le corps avait été partiellement désintégré. Les blessures étaient diverses, mais souvent gravissimes, et avaient touché la quasi-totalité des arrivants. Je garde le souvenir d’un homme, semblant assez vieux, qui se matérialisa, puis chuta. Je le pensai alors mort, mais il se releva doucement, vraisemblablement exténué, et très affaibli. Plusieurs personnes accoururent vers lui pour l’aider à tenir debout, avant de le guider vers des abris de fortune. Je pus observer avec effroi son corps, dont des parties avaient tout simplement disparues, laissant pendre ses entrailles luminescentes et presque translucides. Autour de moi, les séquelles étaient tout aussi écœurantes : ici, un individu avait perdu la moitié de son corps, sectionné au niveau de l’abdomen, là, un autre se tordait de douleur : il n’avait plus le moindre fragment de peau pour recouvrir sa chair.  Des médecins improvisés tentaient de calmer ses souffrances du mieux possible, mais cela ne semblait pas apaiser le pauvre bougre. Ou encore, un bébé miraculeusement entier, recouvert des pieds à la tête des entrailles et du fluide vital de ce qui avait du être son parent, le protégeant de ses bras lors du passage. Pour ma part, j’ai perdu un bras, et de la peau sur une partie du visage. Malgré cela, nous pûmes constater avec surprise que nous étions toujours en vie, malgré des blessures visiblement létales. Personne n’avait d’explication à ce sujet, et nous avions bien d’autres préoccupations plus urgentes.</p>
<p>Ainsi, passé le désarroi de l’arrivée, nous avons pu constater où nous avions posé pied. Bien loin de la mégalopole étouffante que nous avions toujours connue, nous sommes tombés sur un paysage vierge, éclatant de couleurs vives et chatoyantes. Étrangement, la lumière ambiante ne semblait plus nous entourer, mais tombait maintenant du ciel, émise par un astre, chose que nous ne connaissions alors pas. Celui-ci portait son éclat sur des montagnes rocheuses nues, sur lesquelles nul bâtiment ne se hissait, sur d’immenses étendues de végétations, sur lesquelles il était évident que nul Panlithe n’avait jamais mis le pied. Tout autour de nous nous était étranger, les doux brins d’herbe caressant nos pieds, qui n’avaient connu que de plates routes modelées artificiellement. l’immense et dorénavant effrayant portail par lequel nous étions arrivés était situé au sommet d’une sorte de colline, nous permettant d’avoir une vue d’ensemble sur le paysage : à perte de vue, nulle trace visible de civilisation, seulement la nature, peut-être bien la même qui jadis avait proliféré sur Gælith…</p>
<p>Plus étrange encore, nous avons pu constater que l’astre qui brillait au dessus de nos têtes se déplaçait lentement, occasionnant des cycles d’alternance. Nous nous retrouvions ainsi la moitié du temps dans une obscurité profonde, dans laquelle ne brillaient que quelques points loin dans le ciel. Lorsque l’obscurité nous envahissait, certains d’entre nous crurent sentir des mouvements au loin, dans d’étranges et immenses forêts.</p>
<p>A l’heure où j’écris ces lignes, j’ai compté 5 de ces cycles, que les gens commencent à prendre comme référentiel temporel. Nous avons calculé qu’un jour dure environ 1,8 ors, c’est à dire très exactement 1838 arcs. Par ailleurs, le chaos n’a pas régné bien longtemps après notre sortie : les premiers venus eurent le bon sens de chercher à protéger le lieu de notre arrivée : des arcanistes amateurs cherchèrent à élever une bulle protectrice qui servirait de muraille aux Panlithes survivants. Cette opération fut désastreuse : les mages s’étouffèrent dès lors qu’ils cherchèrent à manipuler l’arcane. Leurs yeux vitreux semblaient appeler à l’aide tandis qu’ils ne parvenaient pas à produire mieux que quelques étincelles. L’un après l’autre, ils s’effondrèrent lourdement au sol, sans vie, un air horrifié sur leur visage. D’autres leur succédèrent rapidement, mus par le besoin urgent de protéger les leurs : usant de maintes précautions, ils parvinrent à puiser autour d’eux un infime flux d’arcane, qu’ils utilisèrent pour élever lentement mais sûrement le bouclier magique qui bientôt nous enveloppa tous, nous garantissant une sécurité minimale face à un environnement encore inconnu. Mais plus important, cette barrière rassura beaucoup les rescapés, qui purent se concentrer sur l’aide aux arrivants gravement blessés. Je ne suis d’ailleurs pas resté inoccupé ces premiers temps, utilisant la rigueur due à mon entraînement militaire pour coordonner les efforts. La vue de tous ces Panlithes agonisants, que nous essayions de sauver l’un après l’autre, en plus de ceux qui nous étaient arrivés sans vie, fut très dure à supporter. Faute de sauvetage promis par le Dessus, nous avons vécu l’enfer, et c’est presque un miracle que certains d’entre nous aient pu survivre…</p>
<p>Je crains pour mon peuple, et pour la postérité. Je relate tout ceci du mieux que je le peux. Actuellement, l’astre a disparu derrière l’horizon, et il ne me reste que peu de temps avant que l’obscurité ne m’empêche d’écrire. Mais je me suis promis de continuer ce récit. Il le faut, il nous faut des repères. Et sans mon bras, c’est peut-être ma seule façon de pouvoir être utile.</p>
<h3>Journal d’Iskh — jour 6</h3>
<p>Le sommeil n’a pas été facile à trouver. La souffrance est omniprésente au sein du camp de fortune. Chacun d’entre nous, ou presque, est horriblement mutilé. La vision du vieillard du premier jour me hante toujours. À la réflexion, j’ai certainement fait le même effet lors de ma propre sortie. Le flot ne discontinue pas : une équipe a pris le relais, comme toutes les nuits, pour s’occuper des arrivants et, faute de pouvoir pratiquer des soins, tente d’apaiser la douleur des pauvres âmes qui s’effondrent sur ce sol vierge. Au pied du portail, les fluides vitaux des blessés s’écoulent depuis notre arrivée. Le sol en est souillé, si bien que l’herbe, qui lorsque nous l’avons foulée était d’un paisible jaune pâle, se teinte aujourd’hui d’un inquiétant mauve foncé, et les brins se flétrissent peu à peu. Mais très honnêtement, c’est loin d’être notre priorité.</p>
<p>Cela fait cinq jours que je suis là, et trois que la bulle protectrice a été dressée. J’ignore comment les arcanistes parviennent à puiser la force nécessaire pour le maintenir en place, et ils ne fait aucun doute qu’ils l’ignorent eux aussi. Cette protection est d’une faiblesse évidente, et j’en viens à me demander si elle n’a pas été levée dans le seul but de rassurer artificiellement les personnes. Ceci étant, aucun danger supplémentaire ne s’est présenté, et nul n’a osé s’aventurer au-delà de la bulle. C’est un peu inquiétant : notre nombre augmente constamment, et nous sommes de plus en plus serrés. Il faut réfléchir à la suite avant d’être mis dos au mur.</p>
<p>Pour ma part, ma tâche a évolué : les premiers jours, je patrouillais le camp, cherchant à aider quiconque le demandait. Avec les nouveaux arrivants, les besoins ont évolué, et je me retrouve le plus souvent à transporter et distribuer, malgré mon handicap, quelques décoctions de fortune préparées par les arcanistes à base de l’herbe que nous foulons. Ça a été un gros risque, pour nous qui sommes habitués à une alimentation purement arcanique, de goûter ces végétaux inconnus, et nous avons eu de la chance : si les vertus nourrissantes de ces plantes ne sont guère satisfaisantes, elles nous permettent de gagner un tout petit peu de force, et nous en avons grandement besoin.</p>
<p>Il s’est passé quelque chose la nuit dernière. Rien d’extraordinairement grave, mais un petit événement qui a rapidement réveillé le camp entier et a provoqué la panique. Nous avions déjà remarqué au loin, à une distance de nous suffisante pour ne pas éveiller la crainte, une forêt dense aux couleurs variées. Je dois d’ailleurs reconnaître que dans l’obscurité, celle-ci est nettement moins accueillante. En tout cas, cette nuit, certains Panlithes ont cru apercevoir pendant quelques instants des lumières mouvantes luisant au-dessus des cimes. Cela a suffi à provoquer un vent de panique. Mais là où jadis, nous nous serions tous terrés dans nos habitations en attendant que ça passe, ici, il n’y avait nul toit pour nous protéger. Pour certains, il n’y avait pas même de peau pour recouvrir la chair. Alors ce fut une panique silencieuse. Les individus se recroquevillaient en pleurnichant, terrifiés de ressentir cette effroyable vulnérabilité. Personne ne dit mot, tous les regards étaient braqués sur la forêt, de nouveau obscure. Si bien que personne ne sut s’il y avait réellement eu ces lumières. Je ne sais trop quoi en penser. Nous ne connaissons encore rien de ce monde, et il se pourrait, tel l’astre au-dessus de nous, qu’il s’agisse d’un phénomène naturel. Je ne devrais sans doute pas me faire d’illusions à ce sujet, et rester sur mes gardes. Dans mon état actuel, je suis certainement dans l’incapacité totale de protéger qui que ce soit, mais mon entraînement et mon expérience me rendent plus apte à réagir rapidement et intelligemment en cas de menace.</p>
<p>Avec le temps, je trouve de moins en moins de temps pour écrire ces mémoires. Je suis fier de me rendre utile, mais j’espère que je parviendrai à continuer cette tâche, ou que quelqu’un saura prendre le relais.</p>
<h3>Journal d’Iskh – Jour 7</h3>
<p>J’ignore comment nous avons pu imaginer que nous subsisterions en consommant l’herbe que nous piétinons, et que nous polluons depuis notre arrivée. J’imagine sans peine qu’il s’agissait d’une solution d’urgence lors de notre arrivée, mais il faut reconnaître notre responsabilité pour la situation actuelle. Car nous sommes à court. Il ne nous reste plus d’herbe, hormis celle près du portail, totalement flétrie maintenant. Et visiblement, personne ne s’est demandé comment nous surmonterions ce problème. Il y a bien de l’herbe au-delà de notre faible bulle de protection, mais personne n’a eu l’audace de passer de l’autre côté. Enfin, j’imagine que quelqu’un le fera avant que nous ne mourions tous de faim. Ça pourrait même être moi, même si cette idée me révulse. J’espère également que nous trouverons rapidement une nouvelle source de nourriture.</p>
<p>Les arcanistes qui jusque là s’occupaient de préparer les décoctions en mélangeant ces herbes à ce qu’ils avaient pu produire de nectar d’arcane ont donc pu s’atteler à leurs recherches pour comprendre ce nouveau monde. Leur priorité semble être de réveiller leur arclé, qui chez presque tous les Panlithes réfugiés est devenue d’un gris terne, et ne provoque plus aucune sensation. Il est possible que cet appendice soit irrémédiablement détruit pour notre peuple, et même si personne n’évoque cette hypothèse à voix haute, je sens que tout le monde craint particulièrement que cela n’arrive, ou ne soit déjà arrivé. Nous avons toujours vécu en l’utilisant pour manipuler et maîtriser l’arcane, et ce lien est aujourd’hui rompu. Tout espoir n’est cependant pas perdu, puisque les arcanistes ont déjà réussi à créer la bulle protectrice par magie, et ce dès le second jour ici. C’est plus que prometteur, même si la performance porte la mort de plusieurs d’entre eux, et que sur Gælith, un seul Panlithe aurait été capable, sans entraînement spécifique, de monter une barrière infranchissable pour tout le camp.</p>
<p>Ce n’est  cependant pas notre seul problème. La population continue de grandir de façon constante. Il semble que nous ayons dépassé le millier d’individus, et bien évidemment, la surface disponible reste la même, faute de pouvoir agrandir la bulle. Donc, fatalement, nous allons finir par nous agglutiner. Il faut prendre l’initiative de s’étendre au-delà de nos frontières initiales, mais sans organisation définie, personne ne prend d’initiative. Mais il se pourrait que cela puisse changer d’ici peu. Avec l’augmentation de la population, certains d’entre nous tentent de diriger les opération, vocifèrent des ordres, mais personne n’écoute de tels inconnus. Je ne sais pas ce que nous préparent les jours qui viennent, j’espère sincèrement que nous saurons réagir avant qu’il ne soit trop tard. Nous avons survécu, si tant est que l’on puisse utiliser ce terme étant donné la situation, à la destruction de notre monde, cela doit avoir un sens, nous ne sommes pas là pour rien.</p>
<h3>Journal d’Iskh — Jour 8</h3>
<p>Les choses commencent à devenir inquiétantes. Nos réserves sont totalement épuisées depuis l’aube, et personne ne propose de solution. Certains d’entre nous ont cédé à la panique. Pas au point de braver l’inconnu au-delà de la bulle, cependant, ce qui aurait pourtant été bien pratique. La plupart d’entre nous étant arrivée après qu’ait été dressée la bulle, ils ignorent même si l’air du dehors est respirable, et ils ne croient évidemment pas sur parole ce que leurs disent les premiers arrivés. On ne peut pas leur en vouloir, cela fait partie de notre culture : ne pas croire ce que disent ceux des autres clans. Or, depuis la catastrophe, il n’y a plus de clans.</p>
<p>C’est peut-être ce qui a favorisé cette situation, d’ailleurs. J’ai remarqué il y a plusieurs jours que des gens commençaient à se déplacer en groupes, se réunissaient, parlaient à voix basse entre eux. Lors d’une de mes rondes, je me suis enquis d’un de ces groupes, qui passait près de moi, composé d’une quinzaine d’individus. Celui qui tenait visiblement le rôle de leader s’est approché de moi et m’a parlé de punition divine, entre autres baragouinements. C’est parfaitement ridicule, les dieux n’ont jamais interféré dans nos vies, ils n’ont que faire de punitions. Nous sommes seuls responsables de notre vie. Mais depuis, ces groupes, qui semblent tous véhiculer la même idée, parviennent à se faire entendre de ceux qui cherchent à tout prix à être rassurés. Ceux-ci se mettent à les rejoindre. Cette situation est préoccupante, mais c’est la seule lueur d’espoir des Panlithes, pardon, des Sozlithes, car, vraisemblablement sur pression de ces illuminés, les gens demandent avec insistance que le nom de notre peuple soit ainsi changé. Ce n’est pas illogique, après tout. Nous ne sommes plus des Panlithes, quelque chose nous a changé lors du passage au travers ce portail infernal. Le peuple Panlithe a été détruit, anéanti, et nous sommes ses enfants. Alors qu’il en soit ainsi. Et comme s’il n’y avait rien de plus important que ce sujet, des bruits ont couru pour prétendre que ce nouveau monde nous avait été offert par les dieux pour reconstruire une civilisation. Ceux-là même qui ont propagé cette rumeur ont même, pour appuyer leur crédibilité, donné un nom à ce monde, un nom qui n’est plus le nôtre : <em>Panlithea</em>. Bienvenue sur Panlithea ! Bah, Pourquoi pas, ils peuvent dire ce qu’ils veulent mais nous avons des priorités autrement plus hautes.</p>
<p>Je n’ai jamais été doué avec l’arcane, et sur ce nouveau monde où celle-ci ne coule pas tout autour de nous comme c’était le cas sur Gælith, je suis bien incapable de me servir de magie. Mais j’étais un psaòplo, membre entraîné de l’Arme. Je savais traquer et torturer les traîtres. Mais je ne suis plus rien, il me manque un bras et je ne suis plus que l’ombre de ce que j’étais jadis. Pour être franc, la crainte que l’on me demande de participer à une expédition au-delà de la bulle m’empêche de dormir depuis un certain temps. J’ai honte de ce comportement égoïste, mais lorsque j’imagine me trouver en dehors de cet espace protégé, mes entrailles se figent. Je n’ai jamais connu peur pareille. Je souhaite que les miens fassent preuve de plus de courage que moi, sans quoi nous serions perdus.</p>
<h3>Journal d’Iskh — Jour 9</h3>
<p>Le groupe dont je parlais hier semble s’être organisé. Une Sozlithe est sortie du lot, assumant alors le rôle de leader, et il semble que ce soit elle qui ait tout organisé dès le début. Aujourd’hui, elle a pris publiquement la parole. Ce qui suit n’est pas une retranscription exacte, mais je vais tenter de rapporter son discours du mieux possible.</p>
<p>J’ai immédiatement remarqué, lorsqu’elle a pris la parole, l’atmosphère sereine qu’elle dégageait, en contraste absolu avec les traits de son visage, dont la peau était incroyablement claire et tirée. On lisait un épuisement immense dans son regard, et pourtant elle parlait d’une voix vive et pleine de sagesse, comme si elle portait comme fardeau une tâche cruciale. Elle a alors entamé son discours, et un silence respectueux s’est immédiatement installé autour d’elle, tandis que le petit groupe qui s’était rassemblé grossissait à vue d’œil.</p>
<blockquote><p>« Frères Sozlithes, enfants meurtris du notre terre, écoutez-moi !<br />
Écoutez-moi, car vous êtes perdus, chacun d’entre vous. Vous êtes rescapés de la tragédie qui nous a tous frappés. Rescapés, et victimes, comme moi qui ai perdu plusieurs organes internes. Mes jours sont comptés ici, mais je ne peux partir sans avoir partagé mes secrets.</p>
<p>Je me nomme Okhia. J’ai parlé à beaucoup de monde ici depuis mon arrivée, et il me semble être la seule à avoir reçu ce don. Drëmathos m’a parlé, durant mon passage dans le portail. Comme vous le savez, ceci ne s’est jamais produit depuis les Âges ancestraux. Mais il est venu à moi et m’a parlé. Il m’a révélé la raison de notre présence ici.</p>
<p>Nous sommes rescapés de la destruction de notre monde. Nous sommes voués à survivre, et repartir de zéro ici. Panlithea, notre nouvelle terre, n’est un cadeau de personne. Nul ne nous l’a offert. Nous nous y sommes raccrochés dans un bienheureux réflexe de survie. Je ne vous mentirai pas en affirmant que je sais des choses que vous ignorez au sujet de ce monde. Mais je sais que nous avons l’obligation, envers notre peuple disparu, de survivre et de recréer une civilisation. Il est évident que notre avenir se trouve à l’extérieur de cette bulle, qui nous étouffera si l’on persiste à s’y blottir.</p>
<p>Surmontons notre crainte, frères Sozlithes. Surmontons notre méfiance envers les nôtres. Ne nous agrippons pas à nos vieilles traditions claniques. Nous devons tendre la main vers nos semblables, car nous appartenons tous au même clan, celui des rescapés. Unissons-nous, et prenons dès à présent l’initiative d’explorer Panlithea, notre nouveau foyer. Je tiens à être de l’expédition, moi qui tiens à peine debout. Réunissez votre courage, et, je vous en prie, suivez-moi. Il nous faut découvrir cette terre, trouver des moyens de subsister et de reconstruire notre peuple. »
</p></blockquote>
<p>Je peux dire que son discours a eu de l’effet, et un vent de confiance a parcouru l’assistance. Nous avions certainement besoin d’entendre ces mots, et Okhia le savait. La passion dans ses mots était telle que personne n’a remis en doute sa vision. Je n’aurais pas cru ça possible, mais des gens se sont joints à elle après son allocution, visiblement pour se porter volontaires pour une expédition. Depuis, je me sens coupable de ne pas avoir eu le courage d’en faire de même. Nul doute que ces personnes étaient elles aussi blessées, plus ou moins gravement, et que je n’avais certainement pas à me plaindre à côté d’eux… Mais je n’ai pas eu leur courage, malgré mon expérience et mes connaissances. Cette lâcheté m’empêchera à nouveau de dormir, je le sens.</p>
<h3>Journal d’Iskh — Jour 10</h3>
<p>Évidemment. Je me suis engagé. Je ne réalise pas encore tout à fait mon geste, mais je l’ai fait. Je ne saurais expliquer pourquoi, peut-être par désespoir, peut-être bien même par espoir insufflé par Okhia. Moi qui redoutait ça plus que tout, me voilà même à la tête, à cause de mon expérience, de l’expédition au-delà de la bulle. Ça s’est passé plus facilement que je ne l’avais imaginé. Après avoir englouti ma maigre ration d’arcane concentrée synthétisée par les arcanistes, j’ai rejoint ce qui est depuis hier le point de rassemblement des apprentis explorateurs. Il ne m’a fallu guère longtemps pour localiser Okhia, car toute l’agitation semblait centrée autour d’elle. M’armant de tout mon courage, je me suis présenté à elle. Elle m’a dévisagé de haut en bas d’un œil expert, m’a posé des questions sur mes compétences, sur mon état de santé et sur le nombre de jours passés depuis mon arrivée. J’ai été surpris par la dureté de sa voix, à des lieues de la passion qu’elle avait déchaînée la veille, et par l’expérience qui ressortait de ses mouvements et sa façon de préparer le futur groupe. Je le lui ai fait remarquer, m’étonnant de l’énergie qu’elle dégageait, pour une mourante. Je n’ai eu en réponse qu’un sourire énigmatique et un vague <em>« je vais mieux »</em>. Peu importe après tout, c’est une bonne chose que nous ne soyons pas retardés par ses problèmes de santé.</p>
<p>À vrai dire, j’ai été la dernière personne à m’engager. Okhia a insisté pour que le groupe ne dépasse pas les 6 personnes, pour être plus réactif dans l’inconnu où nous irons. Tous les autres ont rejoint Okhia dès hier, ce qui n’a qu’accentué ma honte de ne pas avoir voulu faire face à mon devoir. L’expédition sera donc constituée d’Okhia, de deux Sozlithes visiblement assez jeunes, peut-être encore enfants, qui disent être frère et sœur, d’une ex-Sentinelle, d’un citoyen qui s’est montré très mal à l’aise à l’idée de notre mission, et de moi-même. Notre objectif est double : d’abord, nous devons nous aventurer au-delà de la bulle et explorer les environs, pour mieux savoir où nous sommes, et ce que nous pouvons trouver à portée, et ensuite enquêter sur les lueurs observées dans la forêt proche, qui s’est répétée plusieurs fois depuis le vent de panique d’il y a quelques jours, et à chaque fois en pleine nuit. Nous ignorons totalement le risque de cette mission, et nul ne peut nous préparer à ce que nous trouverons.</p>
<p>Malgré ma peur, je suis aujourd’hui convaincu de la nécessité de cette expédition. La situation dans le camp devient dramatique. Le flux d’arrivants est toujours constant, et quasiment sans nourriture, les pertes se multiplient. La bulle de protection maintenant une atmosphère hermétique autour de nous, les odeurs des corps en décomposition, sommairement entassés dans une construction en terre durcie, se répandent et deviennent insoutenables. Évidemment, nous n’avons aucun moyen d’inhumer nos compagnons comme sur Gælith, l’opération étant trop consommatrice d’arcane.</p>
<p>Nous avons passé le reste de la journée à nous préparer. Nous n’emporterons qu’un minimum de victuailles, espérant nous ravitailler par nous-mêmes, et surtout pour ne pas priver le camp. Nous devrons également nous débrouiller par nous-mêmes si nous avons besoin d’outils, ou même d’armes. Évidemment, puisque nous n’avons rien de tel ici. Cependant, nous avons, à la demande d’Okhia, bénéficié d’une importante aide. Sachant que j’écrivais ces mémoires, elle m’a interdit d’en parler, mais je me dois de l’évoquer tout de même. Une équipe d’arcanistes a été réunie dans une construction sommaire en retrait du camp. Nous avons tous attendu devant, et avons été appelés à tour de rôle. Lorsque ce fut mon tour, j’entrai pour trouver les arcanistes, au nombre de 5, disposés en cercle, les yeux fermés et la tête vers le ciel. L’atmosphère à l’intérieur était sensiblement différente, et je remarquai que, bien qu’hermétiquement fermée, la case était faiblement éclairée de l’intérieur, sans source visible. Je fis immédiatement le rapprochement avec l’arcane, qui nous enveloppait sur Gælith, et qui luisait d’elle-même. Les arcanistes m’invitèrent dans un murmure à me placer en leur centre. Je remarquai qu’ils tenaient à peine debout, tremblottant légèrement, et compris que maintenir leur concentration devait être un effort épuisant. Doucement, ils élevèrent les bras à l’horizontale, touchant quasiment les doigts de leurs voisins, de façon à former un cercle dont je devais être le centre. C’est alors que je décelai un très léger mouvement de l’air, tandis que la lueur gagnait en intensité. Au bout de quelques instants, je discernais clairement le mouvement, qui était en réalité celui de l’arcane autour de moi, que je voyais alors aussi nettement que celle qui circulait dans les tubes d’artiris jadis. Elle tourbillonnait autour de moi, mue par les arcanistes à l’œuvre. La lueur étant de plus en plus forte, elle commença à m’éblouir. Alors que dans un réflexe je recouvrais mes yeux, la voix d’un des arcanistes, qui semblait tourner autour de moi, me dit : <em>« Ne bougez pas. Fermez les yeux »</em>. Ce que je fis, et ce n’est qu’après environ un décat que je sentis le mouvement s’apaiser autour de moi. Je rouvris les yeux pour constater que, si elle n’avait pas disparue, la lueur était devenue nettement moins forte, mais toujours présente, et bien plus palpable que lors de mon entrée. Les arcanistes avaient repris leur position initiale, et ne faisaient plus un geste. C’est alors que je remarquai que leur arclé brillait telle qu’elle avait l’habitude d’être sur Gælith. Instincivement, je portai ma main à mon front, en direction de ma propre arclé, avant de faire deux constatations effarées. Tout d’abord, j’avais miraculeusement retrouvé la faculté de l’utiliser, et elle m’abreuvait à nouveau de sensations arcaniques. Mais surtout, je remarquai avec stupéfaction que le bras que j’avais levé était celui que j’avais perdu lors du passage du portail. J’observai l’endroit où devait se trouver ma main, et bien que je la sentais à nouveau comme faisant partie de mon corps, elle n’était pas là. Mais à la place, ma sensation de l’arcane retrouvée me permit de déceler une concentration inhabituelle de fluide arcanique. Mon bras s’était reconstruit par magie, et, bien que n’étant plus physique, je pouvais l’utiliser à nouveau ! Les arcanistes m’invitèrent à rejoindre la salle adjacente tandis que je prenais pleinement conscience de ce don. Là m’attendaient Okhia et les les deux jeunes Sozlithes de mon groupe. Au sourire de notre leader, je compris qu’elle avait elle-même reçu ce don récemment, ce qui avait écarté sa mort inéluctable, en remplaçant ses organes physiques par leur version éthérée mais néanmoins fonctionnelle. Elle m’expliqua sommairement ce qui venait de m’arriver. Je ne saurais relater les détails, mais elle m’a bien fait comprendre le prix à payer pour cette opération : elle n’avait été possible qu’avec les meilleurs arcanistes survivants de Panlithea, était très coûteuse en efforts de leur part, et l’opération était particulièrement risquée. Pour cette raison, nous seuls en avons bénéficié, et dans le secret. J’aurais du m’élever contre cette évidente injustice, mais par faiblesse et égoïsme, je ne l’ai pas fait. Nous avons alors effectué le reste de la préparation dans cette case, où le faible matériel que nous pouvions emporter était réuni, avant de rentrer dormir peu après le crépuscule, pour éviter d’être vus avec nos membres ainsi réparés.</p>
<p>Me voici alors, écrivant tout cela alors que je n’en ai pas l’autorisation, et que je devrais profiter de cette dernière nuit de sommeil, car nous partons demain, à l’aube. Je n’emporterai pas mon journal, car si je viens à disparaître, mon héritage sera perdu. J’ignore combien de temps durera notre expédition, ni si nous reviendrons un jour. S’il nous arrive malheur, je sais que notre peuple continuera de se battre pour survivre et se reconstruire sur Panlithea.</p>
<p>J’espère pouvoir finir ce journal.
</p></div>


feed_id: http://gordon.re/?p=325
title: Gratuit pour les filles ? Sérieusement ?
uri: Gratuit-pour-les-filles-Sérieusement
url: http://gordon.re/hacktivisme/gratuit-pour-les-filles-serieusement.html
content:
<p><a href="http://gordon.re/wp-content/uploads/2012/06/ndh_sexisme.png"><img src="http://gordon.re/wp-content/uploads/2012/06/ndh_sexisme.png" alt="Sexisme à la Nuit du Hack" title="Sexisme à la Nuit du Hack" width="800" height="201" class="aligncenter size-full wp-image-330" /></a></p>
<p>J’ai toujours été vaguement choqué par ce genre d’« offre commerciale », bien avant de prendre conscience de l’importance de la lutte pour l’égalité sociale des genres. Et, après une récente discussion à ce sujet et, surtout, un <a href="https://twitter.com/jujusete/status/216468634405576705">revirement d’opinion</a>, je pense utile de poser mon opinion par écrit.</p>
<p>Les organismes, sociétés, ou autres, qui offrent l’entrée à un évènement ou lieu aux filles font preuve d’un sexisme sans appel. Voilà pourquoi.</p>
<h3>« On ramène de la viande fraîche »</h3>
<p>C’est bien évidemment l’argument souhaité par les organisateurs. Ramener des filles. Mais, quand on y pense, dans quel but ? Lorsque c’est pour une boîte de nuit, c’est naturellement pour favoriser les rencontres, et à la rigueur, cette volonté peut être louable, plus que la façon d’y parvenir du moins. Par contre, quand c’est dans le cadre de la <a href="https://www.nuitduhack.com/">Nuit du Hack</a>, un évènement très ciblé, sans le moindre lien avec le <a href="http://gordon.re/hacktivisme/traduction-la-misogynie-et-la-scene-hacker.html">meatspace</a>, où se rencontrent des compétences de toutes sortes, ça me dérange profondément. Pour quelle raison voudrait-on faire en sorte qu’il y ait plus de femmes ? Favoriser les rencontres ? Mais c’est totalement hors de propos ! Les gens qui se rendent à cet évènement y vont pour apprendre, pour s’entraîner, certainement pas pour y rencontrer l’âme sœur ou un quelconque plan cul ! Et surtout, considérer uniquement un sexe de la sorte est un message lancé à tous les visiteurs : « les filles qui seront là sont présentes avant tout pour régaler vos pupilles ». On insulte proprement toute compétence intellectuelle des femmes, en les rabaissant à un simple bout de viande tout juste bon à être regardé par les hackers mâles, qui eux ont des compétences dignes d’être prises au sérieux (quand bien même beaucoup ne viennent que par curiosité, sans être des brutes de pentesting). J’espère ne surprendre aucun de mes lecteurs (d’autant plus après le billet d’Okhin) en rappelant qu’avoir des compétences est parfaitement distinct de son genre, qu’il soit naturel ou décidé. Évidemment, ce genre d’évènement a lieu dans le meatspace, mais je pense qu’il est important d’y importer cet aspect du cyberspace : la non-personnification des « gens ». Quelqu’un qui hack n’est ni un homme ni une femme, mais un individu.</p>
<h3>Permettre aux hackers (nécessairement mâles) de se faire accompagner par leurs copines (nécessairement potiches)</h3>
<p>Pour la NdH, je pense que c’est l’argument qui a conduit à ce choix. Mais c’est involontairement très vexant. Pour les raisons que je viens d’écrire. Ça stéréotype à l’extrême les gens de ce milieu. Il est vrai que les hackers sont majoritairement des hommes, c’est une statistique et l’on n’y peut rien. Par contre, favoriser cet état de fait en considérant que ceux qui viendront à cet évènement seront forcément des hommes est malsain. Les femmes hackers se rendant à la NdH (que ce soit seules ou accompagnées de quelqu’un qui n’y comprendra rien) sont insultées : on leur dit « c’est payant, mais parce que tu es une femme, tu ne comprends tellement rien au sujet qu’il ne serait pas juste de te faire payer ». Encore une fois, c’est involontaire, bien sûr. Mais la plus dure tâche du combat féministe est bien de lutter contre ces discriminations du quotidien. Et quid des couples différents ? Savoir que le milieu hacker, censément plus ouvert que la moyenne, s’abaisse à cette considération me chagrine profondément. À en croire certain, le hacker est un mâle hétérosexuel, point. C’est une vision des choses qu’il est impératif de hacker. Je n’ai malheureusement pas la possibilité d’y être, mais je participe à ma manière, en écrivant ce billet. J’espère que des gens sur place sauront se faire entendre.</p>
<h3>Et si on appliquait nos principes ?</h3>
<p>Sérieusement, ça serait vraiment trop difficile d’éviter ce genre d’actions débiles et discriminantes ? De faire payer les visiteurs, quels qu’ils soient ? D’abord, ça permettrait de rapporter un peu plus de financement pour l’évènement, ce qui est une bonne chose. Mais aujourd’hui, est-ce que des femmes viennent seulement parce que c’est gratuit ?</p>
<p><a href="//seteici.ondule.fr">Ju</a> a changé d’avis là-dessus en voyant des couples heureux se balader. Est-ce que ça n’aurait vraiment pas pu être le cas s’ils avaient du payer deux billets ? Et puis, si les filles devaient payer comme tout le monde, pourquoi ne pas baisser le prix des billets, après tout ? Autre possibilité, pourquoi ne pas opter pour un <a href="http://fr.ulule.com/thsf-2012/">financement collaboratif</a> de l’évènement, comme l’a fait le <a href="http://thsf.tetalab.org">THSF</a> ? C’est une solution qui a fait ses preuves, qui fonctionne souvent mieux que prévu, qui permet à des gens le donner plus qu’on ne leur demande, simplement parce qu’ils savent qu’ils permettent l’existence de l’évènement, et à l’inverse, si certains veulent participer mais n’ont pas forcément les moyens de se payer une place, ils en ont la possibilité.</p>
<h3>C’est dans les deux sens</h3>
<p>J’ai enfin été choqué par des réponses au tweet de Ju précité : « oui, c’est sexiste, mais ça me paie le restau pour ce soir ». C’est peut-être même pire que l’acte en lui-même. L’acceptation de la discrimination si elle va dans notre sens est une forme de légitimisation du sexisme en général. Il ne faut pas alors s’étonner d’entendre des hommes dire qu’ils trouvent que les femmes <em>exagèrent avec les inégalités salariales, avec le viol, parce que c’est pas si grave que ça voyons</em>… Non, ce n’est pas plus normal, dans un sens ou dans l’autre. Et quand on choisit de se battre pour l’égalité, ça ne signifie pas « être plus égaux que les autres ». Beaucoup se moquent du féminisme, en prétendant qu’il s’agit de « femmes qui veulent dominer le monde ». Il faut bien constater que c’est trop dur pour beaucoup d’oser se remettre en question et d’accepter que la <em>simple</em> égalité sociale est méritée.</p>
<p><strong>Edit</strong> : Ju a écrit sur <a href="https://seteici.ondule.fr/2012/06/gratuit-pour-les-filles/">le même sujet</a>, mais pour défendre le point de vue opposé. Je vous encourage à le lire.</p>


feed_id: http://gordon.re/?p=298
title: [Traduction] Telecomix
uri: Traduction-Telecomix
url: http://gordon.re/hacktivisme/traduction-telecomix.html
content:
<p>Comme pour les précédents billets, il s’agit d’une traduction d’<a href="https://about.okhin.fr/posts/Telecomix/">Okhin</a>.</p>
<h3>Précompilation</h3>
<p>Ça fait presque deux ans que je traîne avec la géniale équipe composée de gens et méduses qu’est <a href="https://telecomix.org">Telecomix</a>, et je pense que c’est la première fois que j’écris à ce sujet. J’en ai beaucoup discuté récemment, principalement parce que pas mal de médias veulent discuter avec nous, mais aussi parce que j’ai entendu parler d’au moins deux autres projets à long terme au sujet des Hacktivistes.</p>
<p>De plus, nous avons eu une intéressante discussion avec l’équipe « de base », à propos des tenants et aboutissants du cluster, accompagnée d’un nombre grandissant de questions venant des gens.</p>
<p>Ce qui donne ce billet. Bien sûr, étant donné que Telecomix est la somme des gens à l’intérieur, ce n’est pas la vision d’un seul esprit, mais plutôt une partie de cette hydre gélatineuse.</p>
<h3>Suivre le lapin blanc</h3>
<p>On me pose souvent une question : comment est-ce que je me suis retrouvé dans Telecomix ? Je réponds généralement que c’est simplement arrivé. Je ne cherchais pas à entrer dans un tel groupe de personnes. Je ne pense pas que quiconque ayant un esprit sain serait volontaire pour rejoindre un groupe qui boufferait ses jours et ses nuits, attirerait l’attention sur lui dans des situations non souhaitées (et je ne parle pas des médias), augmenterait les attentes que les gens ont de lui, et le forcerait à faire des choix difficiles (aller se  coucher ou empêcher des gens de se faire tuer).</p>
<p>Si vous le présentez comme ça, personne ne l’acceptera. À part quelques prétendus héros, peut-être (mais les héros sont des sociopathes de toutes façons).</p>
<p>Alors, j’ai fini avec Telecomix au même moment où j’ai décidé de rejoindre un hackerspace. je suis entré là-dedans en rencontrant un tas de personnes. Le nom de Telecomix était déjà dans les médias (à cause d’Hosni Moubarak qui avait coupé les intertubes en Égypte), et j’aidais déjà pour le projet <a href="https://streisand.okhin.fr">Streisand</a>.</p>
<p>Je pense qu’on n’entre pas dans Telecomix. Ce n’est pas un endroit, principalement parce qu’il est possible de sortir d’un endroit, donc on ne peut pas y entrer. Vous ne pouvez pas vous y inscrire, car il n’y a pas de système d’inscription (quiconque vous dirait le contraire tenterait de vous avoir, mais c’est pas le sujet). Vous évoluez juste en quelque chose qui est Telecomix. Votre état d’esprit change, et évolue en ça.</p>
<p>Donc, vous vous réveillez un jour, et c’est comme « OMG!!!!!! I’M TELECOMIX NAO!!!!! ». Une fois que la caféine est redescendue dans votre organisme, et une fois que vous aurez laissé passer la matinée, vous vous rendrez compte que ces gens ne sont rien de plus ou de moins que des personnes normales.</p>
<p>Il n’y a pas de crypto-anarchistes qui parlent en langues hermétiques, qui engueulent tous ceux qui n’utilisent pas de systèmes cryptographiques forts et des conventions sociales cryptographiques ; il n’y a pas d’IA super-intelligente qui tente de dominer le monde ; il n’y a pas de supra-hackers qui se nourrissent de données et de caféine ; il n’y a personne qui cherche à sauver le monde.</p>
<h3>Entrer dans la Matrice</h3>
<p>C’est en partie vrai. Nous avons des bots qui peuvent se montrer schizophrènes et sociopathes à la fois. Il y a beaucoup de personnes différentes et uniques, venant de tout point du cyberspace. Il y a des sociologues, des ingénieurs en informatique, des fainéants, des hackers, des brasseurs de bière, des paranoïaques adeptes des théories conspirationnistes, des gens politisés et des apolitiques, et je suspecte même quelques aliens de participer au cluster.</p>
<p>Certains peuvent se demander à quoi ressemble un jour ordinaire dans un groupe d’hacktivistes. Je n’en sais rien, je peux seulement parler pour moi, et je pense que ça risque d’en surprendre certains. Est-ce que vous avez vu le film <a href="http://www.imdb.com/title/tt0113243/">Hackers</a> ? Vous devriez, il est sympa. Mais ça ne se passe pas comme ça.</p>
<p>Je passe énormément de temps à simplement être assis devant un ordinateur, à regarder des écrans remplis de terminaux (oui, je prends du plaisir à avoir des ordinateurs que personne d’autre que moi n’est capable de comprendre ou d’utiliser). Je fais ça pour mon travail, et pour mes hobbies.</p>
<p>Si vous regardez au-delà de l’écran, vous verrez que je suis connecté à pas mal de salons de discussion, qui ne racontent pas tant de choses que ça. Même lorsque j’écris des trucs, ou quand je bosse, par exemple sur ce billet pour mon usage personnel, je tape sur une console. En sirotant un café noir, sans me rendre compte qu’il est deux heures du matin, vous pouvez passer énormément de temps à discuter avec les gens, tandis que vous développez des programmes, que vous analysez des infrastructures, ou que vous ondulez simplement au travers des intertubes. C’est ce que je fais toute la journée. Mon job le requiert, j’aime le faire, et je le fais aussi avec les membres de Telecomix.</p>
<p>C’est mon pain quotidien. Me réveiller en retard, passer beaucoup trop de temps sur IRC et les intertubes, passer pas assez de temps à sortir avec des gens, se coucher trop tard. Et aussi me rendre dans des hackerspaces ou des conférences, pour faire des choses, échanger des connaissances et compétences avec les gens en <em>viande</em>. Ho, et jouer à pas mal de jeux (jeux de rôle avec crayons et papier, jeux vidéos, etc.), et passer du temps avec les médias quand ils le demandent.</p>
<p>Alors, vous voyez, j’ai une vie plutôt ordinaire. Je ne m’infiltre pas sous couverture dans les bases secrètes pour voler un ordinateur, je ne pirate pas des systèmes gouvernementaux juste pour trouver votre numéro de carte de crédit. J’essaie simplement de trouver de nouvelles façons de faire <a href="https://datalove.me">circuler les données</a>, parce que c’est ce qui m’intéresse.</p>
<h3>Rencontrer le cluster</h3>
<p>Demander à un agent ce qu’est Telecomix vous plongera dans un abîme de perplexité, car aucun de nous n’en a la même définition. Nous nous posons nous-mêmes souvent cette question, et la réponse change invariablement, sans que nous trouvions un consensus (mais nous n’en cherchons pas).</p>
<p>Il est clair que nous ne sommes pas une organisation, dans le sens où nous n’avons pas de tête identifiée, d’agenda, de plans ou de fonds. Nous pensons être un cluster encore trop centré. Pourquoi ça ? Parce que les gens se fient à nous au lieu d’essayer de construire leurs propres trucs. En tout cas, c’est l’impression que j’en ai de l’intérieur.</p>
<p>Nous pourrions faire bien plus de choses si nous avions des jours de 35 heures, ou si nous avions un moyen de travailler à temps plein pour Telecomix. Mais alors, je pense qu’on perdrait beaucoup de fun. Et c’est le plus important dans Telecomix : le fun. Nous sommes là pour passer du bon temps, faire des choses qui nous plaisent, des choses qui sont importantes (comme décentraliser la planète), mais on ne peut faire ça à ce rythme que si on a l’opportunité de rire et d’y prendre du plaisir.</p>
<p>C’est la partie qui peut décontenancer les gens. Nous ne changeons pas le monde parce que nous le devons. Merde, qui sommes-nous pour penser que nous devons changer le monde ? Le seul au monde qui puisse le faire, c’est vous. Nous changeons le monde parce que c’est marrant. Les trucs les plus dingues que nous ayons faits, nous les avons faits parce que nous nous sommes amusés à les faire.</p>
<p>Je me suis amusé à travailler sur des VPNs et des darknets fournis aux Syriens. Je n’ai pas fait ça parce que quelqu’un devait le faire. Ce n’est pas mon combat, et cette révolution appartient aux Syriens. Je l’ai fait parce que je voulais apprendre à ce sujet, je voulais tester comment les communications réseau pouvaient fonctionner dans des conditions difficiles. Lorsque le réseau a été attaqué par Hosni Moubarak, le cluster a simplement testé si on pouvait travailler avec les vieilles lignes analogiques, et comment les diffuser.</p>
<p>Nous nous amusons simplement avec des des situations bizarres et inattendues, parce que si nous faisions ça en pensant que nous le devions et que nous étions les seuls à pouvoir le faire, nous nous cramerions le cerveau.</p>
<h3>La leçon la plus difficile</h3>
<p>C’est difficile à comprendre. Lorsqu’on travaille avec un groupe de personnes au sein duquel il y a toujours du monde connecté qui discute de choses intéressantes, lorsqu’on aide des personnes par-delà le monde à essayer de communiquer et qu’elles se font arrêter et probablement tuer pour l’avoir fait, on prend un sérieux coup sur le moral. La caféine et le stress ne font pas bon ménage, et si vous y ajoutez un manque de sommeil, ça va vite devenir critique.</p>
<p>La force d’un cluster est sa redondance. Travailler avec autant de personnes différentes, sur autant de sujets différents (des radios amateurs aux darknets, en passant par les drones et ACTA) donne la possibilité de simplement partir et se déconnecter.</p>
<p>Ça ne vous fait pas plaisir, surtout lorsqu’il y a des vies en jeu. Mais vous ne serez plus bon à rien après 36h de veille, saturé de caféine, d’alcool, et de Cameron sait quoi. Vous devez maintenir une vie hors du cluster, ou vous devriendrez un bot.</p>
<p>La force d’un petit groupe d’hacktivistes (nous sommes 220 connectés sur #telecomix au moment où j’écris ça) est la différence de ses membres. Nous sommes souvent en désaccord sur pas mal de sujets, mais ce n’est pas un problème, nous sommes dans une faisocratie et si je veux que quelque chose soit fait, il me suffit de le faire. Et nous avons beaucoup à apprendre des gens qui nous sont différents.</p>
<p>Vivre avec des gens qui partagent votre idéal et toutes vos opinions est ennuyeux. Nous avons vécu des crises, et nous en connaîtront d’autres, parce que c’est comme ça qu’un système chaotique et non planifié devrait grandir.</p>
<h3>Exécuter</h3>
<p>Nous n’avons pas de plans. Pas de programme. Nous avons quelques canaux restreints qui existent principalement pour des raisons techniques. Ces raisons incluent le fait de crier votre rage au sujet de quelqu’un, en espérant que quelqu’un sera d’accord avec vous, vous rendre compte que vous êtes tout seul et que vous êtes un connard et un imbécile, puis vous calmer, vous rappeler de la commande <em>/ignore</em>, et revenir à la normale en marmonnant quelque chose à propos du retour de Cthulhu ou un truc du genre.</p>
<p>Le fait est que je perçois Telecomix comme une idée. Une puissante, en perpétuel changement. Ou comme un bar virtuel, dans lequel vous aurez des verres gratuits, servis par de beaux serveurs, serveuses et poulpes, tous virtuels. Mais vous avez saisi le principe. Ou pas. Je m’en fous.</p>
<p>Je ne suis pas sûr d’être arrivé à quoi que ce soit avec ça, mais je sais que j’ai pris du plaisir à l’écrire. Ça me fait me demander si vous aurez du plaisir à le lire. Je suis pas sûr que ça ait du sens.</p>
<p>Alors lançons ce <em>git push</em>, on verra bien ce que ça donne.</p>


feed_id: http://gordon.re/?p=274
title: [Traduction] La misogynie et la scène hacker
uri: Traduction-La-misogynie-et-la-scène-hacker
url: http://gordon.re/hacktivisme/traduction-la-misogynie-et-la-scene-hacker.html
content:
<p>Oui, encore un billet traduit d’<a href="https://about.okhin.fr">Okhin</a>. Parce que ce garçon est franchement intéressant et qu’on est d’accord sur plein de trucs. Ce qui ne m’empêche pas d’écrire pour moi, même si ce blog n’est pas très actif : je commets des billets chez le <a href="//blog.nicelab.org">Nicelab</a> et on m’<a href="http://seteici.midiblogs.com/archive/2012/03/31/internet-n-existe-pas.html">invite</a> parfois à écrire.</p>
<h3>La misogynie et la scène hacker</h3>
<p>Depuis un moment maintenant, je lis et entends un tas de choses au sujet de l’identité sexuelle et en particulier autour du milieu hacker. D’un côté, des gens écrivent des choses comme <a href="https://boumbox.wordpress.com/2012/03/29/les-geeks-vs-le-sexe-feminin/">celle-ci</a> et de l’autre, j’entends parler de plein de saletés qui arrivent aux gens à propos de leur identité sexuelle (discriminations, harcèlement, fausses accusations de viols, vraies accusations de viols…).</p>
<p>Ça me met mal à l’aise et ça m’énerve parfois parce que j’ai toujours considéré la communauté des hackers (peu importe le sens qu’on lui donne) comme une regroupement d’expériences sociales et comme une tentative de construction d’un monde meilleur. Vous pouvez me traiter d’idéaliste si vous le voulez.</p>
<p>Ho et si vous pensez que du fait de mon identité sexuelle ou parce que je suis un homme, je ne suis pas habilité à en parler, et bien fermez-la et lisez.</p>
<p>Et oui, il s’agit d’une réécriture de ce post, parce que mes idées étaient trop chaotiques pour rédiger un bon billet du premier coup.</p>
<h3>L’utilité de l’identité sexuelle</h3>
<p>Les seules utilités que je vois à l’identité sexuelle, c’est-à-dire les situations pour lesquelles l’identité sexuelle est une information nécessaire, sont toutes liées au sexe. Le seul moment où vous avez besoin de savoir si quelqu’un est une fille, est lorsque vous êtes attiré(e) par les filles et que vous voulez vous envoyer en l’air (ou engager une relation amoureuse, peu importe).</p>
<p>Ça veut dire que si vous utilisez une partie de votre message pour m’indiquer cette information, vous vous attendez à ce que je le prenne en compte et dans le cas spécifique de l’identité sexuelle, vous voulez que je vous considère comme sexuellement disponible.</p>
<h3>Au début, il y avait les cyberspaces</h3>
<h4>Dans le cyberspace, personne ne sait que vous êtes un chien</h4>
<p>Le cyberspace est un espace d’information pure. Votre <a href="https://about.okhin.fr/posts/Privacy">identité</a> est la quantité de données que vous émettez et, étant donné qu’Internet était originalement essentiellement basé sur du texte, personne ne pouvait savoir à quoi vous ressembliez. Vous pouviez être un garçon se faisant passer pour une fille qui penserait être une chatte.</p>
<p>C’est toujours vrai dans la plupart des cyberspaces, où vous n’avez pas à choisir une identité sexuelle ou à vous définir selon des informations de <em>viande</em>.</p>
<p>Donc, dans les cyberspaces, vous pouvez parfaitement vivre sans connaître l’identité sexuelle de vos interlocuteurs, à part si vous recherchez du sexe, auquel cas vous avez besoin de définir votre identité sexuelle.</p>
<h4>Hein, « cyberspace<strong>s</strong> » ?</h4>
<p>Oui, il y a différents cyberspaces. Il y a ceux qui sont sociaux, où les gens vont juste pour être avec des gens, discuter, organiser des rencontres, ou juste se comporter bizarrement dans un groupe qui partage plein de références à l’humour absurde et insensé que personne ne peut comprendre sans faire partie de ce groupe.</p>
<p>Et il y a les espaces où les gens partagent des informations techniques, cherchent les solutions à leurs problèmes, dans lesquels de travail est effectué. Ce sont les cyberspaces où les hackers font des trucs. </p>
<p>Il y a également les cyberspaces réservés aux bots, ou aux monstres tentaculaires. Il y a beaucoup de ruelles obscures, mais c’est ainsi que sont les cyberspaces.</p>
<h4>Les filles ne codent pas</h4>
<p>Tout comme les garçons. « Garçon » ou « Fille », ou « Queer » sont des identités sexuelles. Les identités sexuelles font du sexe, pas du code. Je suis parfaitement conscient que l’identité sexuelle est une importante partie du « soi », mais ce n’est pas la partie qui écrira du code.</p>
<p>La partie qui écrit du code est la partie « hacker ». Elle n’est pas reliée au genre, à l’identité ou orientation sexuelle de la personne. Quand quelqu’un se connecte et dit « Hé, je suis une fille, je veux apprendre le Python ! », on lui répond « Les filles ne codent pas. » (au mieux).</p>
<p>Alors, s’agit-il d’une politique du « ne demande pas, n’en parle pas » ? Et bien, oui et non. Dans un contexte technique, dans le cas où vous voulez apprendre des choses, votre identité sexuelle est impertinente. Elle n’a aucun intérêt. Si vous l’utilisez pour obtenir de l’aide, ça veut dire que vous pensez qu’être différent(e) favorisera les réponses à cause de cette différence. Vous utilisez votre identité sexuelle pour obtenir ce que vous voulez ? Alors ne vous plaignez pas de n’être vue que comme une paire se seins.</p>
<h4>Nous sommes définis par ce que nous faisons</h4>
<p>Un autre gros sujet parmi les communautés de hackers est la <a href="http://blog.nicelab.org/la-faisocratie-en-pratique.html" title="Quelques mots sur la faisocratie, sur le blog du Nicelab">faisocratie</a>. Nous interagissons les uns avec les autres selon ce que font ces autres, pas selon leurs apparences.</p>
<p>Notre richesse est basée sur nos connaissances et nos compétences, que nous tâchons de partager au mieux et non sur des choses que l’on peut acheter. La plupart des discriminations physiques auxquelles nous pouvons être confrontés dans la <em>viande</em> n’ont pas lieu d’être dans le cyberspace, du moment que vous ne les utilisez pas pour définir votre identité.</p>
<p>Dans les cyberspaces, nous avons une opportunité unique d’ignorer toutes les discriminations basées sur la nationalité, le genre, l’identité et l’orientation sexuelle, la couleur ou le handicap. Chaque fois que quelqu’un se définit sur l’un de ces critères, cela demande beaucoup de self-contrôle pour tous les autres pour ne pas l’insulter. Pour ceux qui font attention à ne pas insulter les gens, en tout cas.</p>
<p>Nous ne nous connectons pas pour socialiser. La plupart d’entre-nous sommes en ligne parce que c’est un moyen facile de partager des points de vue avec des gens à l’autre bout de la planète. Si nous voulions nous envoyer en l’air, nous serions sur d’autres cybespaces, mais ce n’est pas notre but. Quand une fille arrive et dit « Hé, regardez, je suis une fille ! », on lit généralement « Hé, regardez ! Nichons ! », parce que c’est ainsi qu’elle a voulu être considérée (sinon elle n’aurait pas indiqué qu’elle était une fille).</p>
<h4>Voilà les trolls</h4>
<p>À propos des « plaisanteries » en ligne et des mèmes sexistes qui émergent des cyberspaces : la plupart d’entre eux vient de /b/ et il y a une règle pour ça. La règle numéro 1 d’Internet. <q>Don’t talk about /b/.</q>. Et vous n’êtes pas forcés d’y aller.</p>
<p>Ces mèmes ne sont pas le problème. L’humour peut offenser les gens et il le fait, surtout l’humour basé sur l’identité de quelqu’un. Et oui, je peux parfaitement comprendre que certaines blagues ne soient pas drôles pour tout le monde et offensent certaines personnes.</p>
<p>Il existe un tas de sujets qui offensent les gens. Je pourrais, par exemple, être offensé par le fait que vous me voyiez comme un mec qui n’arrive pas à s’envoyer en l’air, ou comme l’intello aux grosses lunettes, ou le type bizarre du groupe, ou le techos qui va arranger toute la torture que votre matériel électronique vous inflige simplement en vivant avec vous. Et vous pourriez être offensée que je vous voie comme une paire de seins juste parce que vous m’avez dit que vous êtes une fille.</p>
<p>Oui, il y a des trolls sexistes, mais aussi des racistes, antisémites, ou BSDistes (les pires de tous, si vous voulez mon avis). C’est la pire partie du cyberspace, celle dont personne n’est fier, mais une part nécessaire. Car dès que cette partie disparaîtra, ça voudra dire que nous aurons atteint une forme sérieuse d’autocensure pour un soi-disant plus grand bien. Vous voulez combattre dans l’arène des trolls, très bien mais soyez prévenus qu’ils mordent.</p>
<h3>Mais nous sommes faits de viande</h3>
<p>Et là est tout le problème. Votre corps porte de nombreuses informations. Quand je vous verrai, avant de connaître votre nom, je connaîtrai votre genre, votre taille, votre couleur de peau, votre poids, votre attractivité, etc.</p>
<p>Toutes ces informations, que nous n’utilisons pas dans la majorité de nos interactions (car je passe plus de temps à parler aux gens dans le cyberspace que parmi la <em>viande</em>) sont obligatoires, un peu comme sur Facebook. Et vous ne pouvez pas les falsifier, contrairement à Facebook.</p>
<p>L’autre problème de la <em>viande</em> est qu’il n’y a aucun bouton « ignorer », « filtrer » ou « quitter ». Vous êtes forcé d’interagir avec les gens et ne pas répondre à quelqu’un est considéré comme impoli. Les règles diffèrent pas mal et parfois nous tendons à l’oublier.</p>
<p>Lorsque nous rencontrons « en vrai » des gens que nous connaissons déjà dans un cyberspace, on peut devenir extrêmement maladroit, mais la plupart du temps on parvient à y faire face. Et, à cause des pseudonymes, il peut arriver qu’on se rencontre sans faire de lien avec un nom (et ça arrive souvent). Alors les problèmes se posent principalement avec les gens qu’on ne connaît pas encore.</p>
<p>Les gens qui fuient ces rencontres, terrorisés parce qu’ils auront été vexés, sont une chose regrettable. Soit ces personnes auront simplement paniqué parce qu’elles n’auront pas compris quelles étaient les problématiques et les règles sociales, soit les initiés ont été méchants et ont oubliés qu’ils ne pouvaient être mis en <em>/ignore</em>.</p>
<h4>Est-ce qu’il y a un RFC pour ça ?</h4>
<p>Je pense que nous sommes conscients de cette situation. Et ce n’est pas quelque chose qu’il est facile d’arranger, particulièrement lorsque les deux camps ne partagent pas les mêmes règles. Les féministes tendent à se définir comme des femmes (du moins pour les femmes féministes, <em>NDG</em>), tandis que nous nous définissons comme hackers. C’est quelque chose de naturel, étant donné que leur combat est pour l’égalité des personnes, peu importe leur identité sexuelle, tandis que le nôtre est la récolte et le partage de tout type de savoir nécessaire pour comprendre le monde.</p>
<p>Dès lors qu’il y a une différence, il y a une discrimination. Les filles se plaignent que nous (hé, je me place pas là-dedans, moi ! <em>NDG</em>) soyons sexistes, elles devraient voir le sort qu’on réserve aux gens sous Windows. Le vrai problème est probablement que la plupart d’entre-nous se foutent bien de ces problématiques. Ce n’est pas un problème, c’est comme ça que ça fonctionne dans une faisocratie. Tout le monde ne cherche pas à s’émanciper des serveurs DNS racines, ou ne travaille pas sur un nouveau protocole de maillage dynamique ; les gens qui s’intéressent à ces problématiques y travaillent et lorsqu’ils atteignent leur objectif, ils en feront une jolie présentation à une conférence, ou publieront quelque part leurs travaux.</p>
<p>Le problème du sexisme est simplement un autre sujet. Il y a pas mal de personnes qui s’y penchent et ça commence à avoir de la visibilité. Nous sommes conscients de cela et du fait que ce n’est pas solvable par un <acronym title="Request For Comments">RFC</acronym>.</p>
<h4><em>Problem, officer?</em></h4>
<p>Nous sommes un peu rudes sur les bords. Et il nous arrive d’être impolis sans nécessairement nous en rendre compte. C’est plus une question de misanthropie latente que de misogynie latente. Lorsque nous sommes dans un hackerspace, nous ne sommes pas là essentiellement pour socialiser et il n’y a rien de plus ennuyeux que les gens qui se pointent en disant « Hé, salut, je m’appelle Luc ! ».</p>
<p>Il y a un autre truc que je déteste : la discrimination positive. Je ne ferai pas d’efforts pour être particulièrement sympathique avec les filles en particulier. J’essaie d’agir de la même façon avec tout le monde (oui, ça signifie être un connard pour tout le monde).</p>
<p>Je pense qu’il y a également une petite proportion d’entre-nous qui sont socialement inadaptés. Ils ne pigent pas, ou ne veulent pas piger, les conventions sociales. Je persiste à penser qu’ils ne sont pas la majorité d’entre-nous, mais ils sont ceux qui correspondent au cliché que tout le monde se fait sur les hackers. Virez-moi ce cliché et vous verrez qu’il y a plein de gens intéressants qui discuteront avec vous d’un tas de sujets différents.</p>
<p>Mais vous devez admettre que, même dans les conventions sociales considérées comme normales par la plupart des personnes, monopoliser l’attention de quelqu’un avec un sujet inintéressant est impoli. Ça ne me pose aucun problème. Vous n’êtes pas intéressé par la construction d’un quadricoptère, dites-le moi, j’arrêterai de vous embêter avec ça. Si vous venez me voir et commencez à me parler d’un sujet qui ne m’intéresse pas, je vous le dirai et vous n’aurez qu’à faire avec, car ce ne sera pas à cause de vous, mais seulement que le sujet duquel vous souhaitez me parler n’a aucun intérêt pour moi.</p>
<h3>Et ça devient physique</h3>
<p>C’est là le problème. Nous sommes loin d’être parfaits. Certains d’entre-nous tendent à se considérer comme des héros qui sauvent le monde. Certains d’entre-nous sont véritablement des sociopathes qui n’en ont rien à faire d’écraser des gens du moment qu’ils ont ce qu’ils veulent. Mais ces gens sont partout, pas seulement là où on se regroupe.</p>
<p>Lorsque ça en vient au physique, lorsque quelqu’un essaie de s’attaquer à une personne, que ce soit par le harcèlement, l’intimidation, ou l’agression sexuelle, nous nous devons d’intervenir. Je pense que la façon chaotique dont le monde des hackers fonctionne nous donne la possibilité d’essayer de résoudre ce problème.</p>
<p>Je ne sais pas comment le faire. Mais je ne pense pas que nous soyons capables de nous faire aux règles sociales avec lesquelles vous jouez. Vous voulez interagir avec les hackers ? Devenez-en un. Ensuite, si vous avez des problèmes, parlez-en publiquement, documentez les différents cas, trouvez un moyen de travailler en contournant ces problèmes, chargez-vous en. Nous ne pouvons apporter de solutions lorsqu’il semble que nous soyons le problème.</p>
<p>Ce billet a l’air de servir d’excuses pour certains. J’essaie juste de comprendre comment les choses fonctionnent. Je suis particulièrement chanceux, j’ai essuyé peu de discriminations ces 10 dernières années (et les quelques-unes que j’ai subies étaient dues au fait que je me comportais bizarrement volontairement) et il se pourrait que je n’ait pas la légitimité pour parler de ça.</p>
<h3>Hors-sujet</h3>
<p>Je n’ai pas parlé de porno, ou du fait que peu de filles vont en écoles d’ingénieurs, parce qu’il s’agit d’excuses et de symptômes, pas de causes. Je n’ai pas utilisé l’excuse du « mon enfance a été un enfer alors vengeons-nous sur les autres » non plus, parce qu’elle pourrait justifier n’importe quoi. J’ai essayé d’expliquer comment je percevais le problème de mon point de vue, pour en comprendre les origines.</p>
<p>Je persiste à penser que c’est un problème périphérique (mais néanmoins non mineur), mais se focaliser sur le problème de l’identité sexuelle est, pour moi, une erreur. Nous ne devrions pas discriminer. Point.</p>
<p><em>Edit : Je remercie chaleureusement Tris pour l’aide à la correction de cette traduction.</em></p>


title: Howto pratique : l’installation d’une Gentoo encore plus sécurisée
url: http://gordon.re/sysadmin/howto-pratique-linstallation-dune-gentoo-encore-plus-securisee.html
feed_id:
tag:gordon.re,2012-08-19:sysadmin/howto-pratique-linstallation-dune-gentoo-encore-plus-securisee.html


feed_id: tag:gordon.re,2016-02-21:/sysadmin/installation-de-proxmox-chiffree.html
title: Installation de Proxmox avec chiffrement de disque
uri: 2020-11-15-Installation-de-Proxmox-avec-chiffrement-de-disque
url: https://gordon.re/sysadmin/installation-de-proxmox-chiffree.html
content:
<p>Suite à l’installation d’une nouvelle machine en datacenter, j’ai souhaité
dépoussiérer mon utilisation de Proxmox, et réfléchir à ce qui pouvait être
fait pour améliorer mes précédentes utilisations, du point de vue de la
sécurité.</p>
<!-- cut -->

<h3>Première installation test</h3>
<p>Dès ma machine reçue (un Dell R210), j’ai téléchargé une image
<a href="http://proxmox.com">Proxmox</a> pour l’installer. Étant frileux sur l’adoption de
<a href="http://linuxfr.org/news/systemd-l-init-martyrise-l-init-bafoue-mais-l-init-libere">SystemD</a>,
j’ai opté pour une version 3.4 de Proxmox, basée sur Debian-oldstable, et donc
sous SysVinit. Je précise au passage que je dispose de deux disques durs dans
cette machine, et que je souhaite utiliser du
<a href="https://fr.wikipedia.org/wiki/RAID_%28informatique%29#RAID_1_:_Disques_en_miroir">RAID1</a>
soft afin de sécuriser mes données (dans le sens <em>« ne pas les perdre suite à
une panne »</em>). À savoir que l’installeur Proxmox ne <a href="https://pve.proxmox.com/wiki/Software_RAID">supporte pas le RAID
soft</a><sup>(en)</sup> lors d’une
installation <em>bare-metal</em>.</p>
<p>Bref, lors de l’installation, je remarque l’ajout d’options
« <a href="https://fr.wikipedia.org/wiki/ZFS">ZFS</a> » en tant que système de fichier
supporté pour le formatage. Excellente nouvelle, car ZFS gère la création de
systèmes en miroir, en alternative à <em>dm-raid</em>. Encore mieux, Proxmox propose,
si on utilise ZFS, de créer une grappe en miroir, et donc de tout gérer de
lui-même.</p>
<p>J’opte donc pour cette approche. J’installe Proxmox, je le configure, puis je
crée un conteneur pour tester mes repères (et les performances de la machine).
Ça fonctionne, très bien. Étant donné que c’est à ce moment que <a href="https://www.faimaison.net/actualites/installation-datacenter-host-reze.html">FAImaison
s’installe en
datacenter</a>,
j’en profite pour racker ma machine et jouer le rôle de <em>beta-testeur</em> pour
l’association. Ce qui se traduit par un succès, grâce aux adminsys qui ont fait
un super boulot. Bref, ça marche. Sauf qu’il y a un problème important : je
n’ai pas chiffré le disque, lors de l’installation. Étant donné que cette
machine sera vouée à héberger mes données, ce n’est pas un état de fait
acceptable.</p>
<h4>Approche naïve</h4>
<p>Je planifie donc une intervention au datacenter, avec cet objectif : copier
intégralement le contenu des disques sur un disque externe, puis reformater les
partitions ZFS pour créer une partition LUKS, puis restaurer les partitions ZFS
mirrorées sur les conteneurs LUKS ouverts. Piece of cheese, comme disent les
auvergnats. Sauf que c’était la théorie.</p>
<p>La pratique a donc été constituée d’une heure et demi de galère pour réussir à
simplement démarrer une clé USB live (Ubuntu, en l’occurrence), sur la machine.
Je m’en suis sorti en activant l’UEFI dans le BIOS du serveur. Ensuite est
venue la consternation en constatant le schéma de partitionnement d’un des
disques :</p>
<div class="codehilite"><pre><span></span><code><span class="gp">root@fromage:~/#</span> parted -l
<span class="go">Model: ATA WDC WD5003ABYX-1 (scsi)</span>
<span class="go">Disk /dev/sda: 500GB</span>
<span class="go">Sector size (logical/physical): 512B/512B</span>
<span class="go">Partition Table: gpt</span>

<span class="go">Number  Start   End     Size    File system  Name  Flags</span>
<span class="go"> 1      17.4kB  1049kB  1031kB                     bios_grub</span>
<span class="go"> 2      1049kB  500GB   500GB   zfs          zfs</span>
<span class="go"> 9      500GB   500GB   8389kB</span>


<span class="go">Model: ATA WDC WD5003ABYX-1 (scsi)</span>
<span class="go">Disk /dev/sdb: 500GB</span>
<span class="go">Sector size (logical/physical): 512B/512B</span>
<span class="go">Partition Table: gpt</span>

<span class="go">Number  Start   End     Size    File system  Name  Flags</span>
<span class="go"> 1      17.4kB  1049kB  1031kB                     bios_grub</span>
<span class="go"> 2      1049kB  500GB   500GB   zfs          zfs</span>
<span class="go"> 9      500GB   500GB   8389kB</span>


<span class="go">Model: Unknown (unknown)</span>
<span class="go">Disk /dev/zd0: 16.1GB</span>
<span class="go">Sector size (logical/physical): 512B/4096B</span>
<span class="go">Partition Table: loop</span>

<span class="go">Number  Start  End     Size    File system     Flags</span>
<span class="go"> 1      0.00B  16.1GB  16.1GB  linux-swap(v1)</span>
</code></pre></div>

<p>L’information utile est la suivante : contrairement aux architectures que <a href="https://gordon.re/sysadmin/howto-installation-gentoo-linux.html">j’ai
l’habitude de
traiter</a> en termes
de chiffrement de disque, il n’y a pas de partition <code>/boot</code>, mais une seule
(par disque) partition ZFS, qui contient toute la racine du système. J’apprends
donc que Grub sait démarrer nativement du ZFS.</p>
<p>Le problème, c’est que pour chiffrer la racine du disque, il faut que je puisse
sortir le noyau et son image <code>initramfs</code> de là, d’où la partition <code>/boot</code>
séparée. Du haut de ma connaissance moyenne de ZFS, je n’étais pas suffisamment
à l’aise pour tenter une modification à la volée du schéma de partitionnement.
Donc, impasse pour cette approche.</p>
<h4>Approche idéale : utilisation de chiffrement intégré à ZFS</h4>
<p>Il faut savoir que ZFS était un projet de Sun, initialement. Sun ayant été
racheté par <s>le mal absolu</s>Oracle, leur branche de ZFS a très vite perdu
sa licence libre. Aujourd’hui, seule cette branche supporte le chiffrement
intégré. Les versions intégrées à FreeBSD et GNU/Linux n’en disposent pas, et
ce n’est visiblement pas prêt d’arriver. Seconde impasse.</p>
<h4>Approche de compromis</h4>
<p>À ce stade, je commençais à me rendre compte qu’une réinstallation de la
machine était indispensable, et qu’il faudrait abandonner ZFS. Je me suis alors
renseigné sur l’état du <a href="https://lwn.net/Articles/639427/">chiffrement intégré à
Ext4</a><sup>(en)</sup>, existant depuis la
version 4.1 du noyau Linux. <a href="http://blog.quarkslab.com/a-glimpse-of-ext4-filesystem-level-encryption.html">Cet
article</a><sup>(en)</sup>
m’a fait comprendre que l’implémentation n’était pas tout à fait sèche, et
qu’elle partageait notamment la faiblesse de conception
d’<a href="https://en.wikipedia.org/wiki/ECryptfs">eCryptFS</a><sup>(en)</sup>, c’est à
dire que seul le contenu et le nom des fichiers est chiffré, pas les
méta-données (nombre de fichiers, dates d’accès et de modification…). Ne
souhaitant pas baser le chiffrement du serveur gérant mes données privées sur
un système instable, et étant donné que la version de Proxmox que je souhaitais
utiliser avait un kernel trop vieux, je suis passé à autre chose.</p>
<h4>Approche standard</h4>
<p>Par « standard », j’entends « comme à mon habitude », c’est à dire le formatage
à la main, avec un <code>/boot</code> séparé. Donc, plutôt que d’installer Proxmox en
<em>bare-metal</em>, il a fallu installer une Debian standard, avec chiffrement, puis,
une fois celle-ci opérationnelle, suivre <a href="https://pve.proxmox.com/wiki/Install_Proxmox_VE_on_Debian_Jessie">les instructions pour installer
Proxmox
dessus</a>. Le
tout en acceptant finalement de me baser sur la dernière version de Debian,
comprenant SystemD.</p>
<p>J’enchaîne donc sur la suite de l’article avec les instructions détaillées sur
cette installation.</p>
<h3>Installation définitive</h3>
<p>D’abord, il nous faut booter sur un installeur Debian.
<a href="http://cdimage.debian.org/debian-cd/8.3.0/amd64/iso-cd/debian-8.3.0-amd64-netinst.iso">Téléchargez</a>
donc celle-ci sur le <a href="https://debian.org">site officiel</a>, prenez soin de
vérifier <a href="http://cdimage.debian.org/debian-cd/8.3.0/amd64/iso-cd/SHA512SUMS">l’empreinte du
fichier</a> (et
vérifiez l’intégrité des
<a href="http://cdimage.debian.org/debian-cd/8.3.0/amd64/iso-cd/SHA512SUMS.sign">empreintes</a>.</p>
<div class="codehilite"><pre><span></span><code><span class="gp">gordon@fromage:~$</span> wget http://cdimage.debian.org/debian-cd/8.3.0/amd64/iso-cd/debian-8.3.0-amd64-netinst.iso
<span class="go">[…]</span>
<span class="gp">gordon@fromage:~$</span> wget http://cdimage.debian.org/debian-cd/8.3.0/amd64/iso-cd/SHA512SUMS
<span class="go">[…]</span>
<span class="gp">gordon@fromage:~$</span> wget http://cdimage.debian.org/debian-cd/8.3.0/amd64/iso-cd/SHA512SUMS.sign
<span class="go">[…]</span>
<span class="gp">gordon@fromage:~$</span> gpg --recv-key 6294BE9B
<span class="go">gpg: clef 6294BE9B : clef publique « Debian CD signing key &lt;debian-cd@lists.debian.org&gt; » importée</span>
<span class="gp">gordon@fromage:~$</span> gpg --verify SHA512SUMS.sign
<span class="go">gpg: les données signées sont supposées être dans « SHA512SUMS »</span>
<span class="go">gpg: Signature faite le dim. 24 janv. 2016 19:08:33 CET avec la clef RSA d&#39;identifiant 6294BE9B</span>
<span class="go">gpg: Bonne signature de « Debian CD signing key &lt;debian-cd@lists.debian.org&gt; » [inconnu]</span>
<span class="go">gpg: Attention : cette clef n&#39;est pas certifiée avec une signature de confiance.</span>
<span class="go">gpg:             Rien n&#39;indique que la signature appartient à son propriétaire.</span>
<span class="go">Empreinte de clef principale : DF9B 9C49 EAA9 2984 3258  9D76 DA87 E80D 6294 BE9B</span>
<span class="gp">gordon@fromage:~$</span> sha512sum -c SHA512SUMS --ignore-missing
<span class="go">debian-8.3.0-amd64-netinst.iso: Réussi</span>
</code></pre></div>

<p>Une fois ces vérifications passées avec succès, copiez l’image sur une clé USB
avec <code>dd</code>, en prenant soin de ne pas vous planter le nom de périphérique.</p>
<div class="codehilite"><pre><span></span><code><span class="gp">#</span> après branchement de la clé USB
<span class="gp">root@fromage:~$</span> dmesg <span class="p">|</span> tail -n <span class="m">1</span>
<span class="go">[16916.267063] sd 6:0:0:0: [sdb] Attached SCSI removable disk</span>
<span class="gp">#</span> ma clé est donc <span class="s2">&quot;sdb&quot;</span>
<span class="gp">root@fromage:~$</span> dd <span class="k">if</span><span class="o">=</span>debian-8.3.0-amd64-netinst.iso <span class="nv">of</span><span class="o">=</span>/dev/sdb <span class="nv">bs</span><span class="o">=</span>1M
</code></pre></div>

<p>Branchez la clé sur le serveur, démarrez dessus et sélectionnez « Expert
install ».</p>
<p><img src="media/12ed87be.debian-expert-install.png" data-original-source="https://gordon.re/images/proxmox-luks/debian-expert-install.png" alt="Démarrage de
l’installation Debian" title="Démarrage de l’installation Debian"
class="aligncenter size-full" /></p>

<p>Je ne m’étends pas sur l’intégralité de l’installation, si vous n’avez jamais
installé de Debian, peut-être que l’installation d’une Proxmox chiffrée est
inadaptée pour vous.</p>
<p>Lors de l’étape « Load installer components from CD », prenez soin de choisir
<code>crypto-dm-modules</code> et <code>parted-udeb</code> dans la liste.</p>
<p><img src="media/e5c3fba0.debian-installer-components.png" data-original-source="https://gordon.re/images/proxmox-luks/debian-installer-components.png"
alt="Sélection des composants d’installation" title="Sélection des composants
d’installation" class="aligncenter size-full" /></p>

<p>Continuez jusqu’à l’étape de partitionnement. Choisissez « Manual ». Voici, pour information, ce que nous allons mettre en place.</p>
<p><img src="media/3e0d0ff2.partitionnement.png" data-original-source="https://gordon.re/images/proxmox-luks/partitionnement.png" alt="Schéma de
partitionnement final" title="Schéma de partitionnement final"
class="aligncenter size-full" /></p>

<p><img src="media/ce1cfb97.debian-installer-manual-partition.png" data-original-source="https://gordon.re/images/proxmox-luks/debian-installer-manual-partition.png"
alt="Partitionnement manuel" title="Partitionnement manuel" class="aligncenter
size-full" /></p>

<p>Vous devriez avoir quelque chose de similaire. Au besoin, supprimez les
partitions existantes (ou créez une table de partition vierge), pour partir
d’un état similaire au mien.</p>
<p><img src="media/2c4fdf56.debian-installer-partition-step1.png" data-original-source="https://gordon.re/images/proxmox-luks/debian-installer-partition-step1.png"
alt="Disques vierges" title="Disques vierges" class="aligncenter size-full"
/></p>

<p>La toute première étape est de créer deux paires de volumes RAID : un pour le
<code>/boot</code>, l’autre pour le volume chiffré qui contiendra nos autres volumes.
Commencez donc par créer, dans <strong>chaque disque</strong>, une partition destinée à être
une grappe RAID.</p>
<p><img src="media/6d80df54.debian-installer-partition-step2.png" data-original-source="https://gordon.re/images/proxmox-luks/debian-installer-partition-step2.png"
alt="Création des partitions pour /boot" title="Création des partitions pour
/boot" class="aligncenter size-full" /></p>

<p><img src="media/c4dfe05c.debian-installer-partition-step3.png" data-original-source="https://gordon.re/images/proxmox-luks/debian-installer-partition-step3.png"
alt="Création des partitions pour /boot" title="Création des partitions pour
/boot" class="aligncenter size-full" /></p>

<p><img src="media/2256b721.debian-installer-partition-step4.png" data-original-source="https://gordon.re/images/proxmox-luks/debian-installer-partition-step4.png"
alt="Création des partitions pour /boot" title="Création des partitions pour
/boot" class="aligncenter size-full" /></p>

<p>Nous avons maintenant deux partitions destinées au RAID, un sur chaque disque.
Nous allons créer le volume pour <code>/boot</code>, puis nous occuper de la suite. Ça se
passe dans « Configure software RAID ». Suivez les instructions, sélectionnez
bien <code>/dev/sda1</code> et <code>/dev/sdb1</code>, qui sont les partitions que nous venons de
créer.</p>
<p><img src="media/c90d5d0a.debian-installer-partition-step5.png" data-original-source="https://gordon.re/images/proxmox-luks/debian-installer-partition-step5.png"
alt="Création du RAID pour /boot" title="Création du RAID pour /boot"
class="aligncenter size-full" /></p>

<p><img src="media/f8b1c700.debian-installer-partition-step6.png" data-original-source="https://gordon.re/images/proxmox-luks/debian-installer-partition-step6.png"
alt="Prêt à créer /boot" title="Prêt à créer /boot"
class="aligncenter size-full" /></p>

<p>Utilisons ce « RAID1 device #0 » pour créer une partition au format ext2 (pas
besoin de journalisation pour un <code>/boot</code>), et assignez-lui le bon point de
montage.</p>
<p><img src="media/461a0966.debian-installer-partition-step7.png" data-original-source="https://gordon.re/images/proxmox-luks/debian-installer-partition-step7.png"
alt="Création de /boot" title="Création de /boot" class="aligncenter size-full"
/></p>

<p><img src="media/767e1813.debian-installer-partition-step8.png" data-original-source="https://gordon.re/images/proxmox-luks/debian-installer-partition-step8.png"
alt="/boot créé" title="/boot créé" class="aligncenter size-full"
/></p>

<p>Étape suivante, utiliser l’espace libre restant sur les disques (notez qu’il
y a un espace libre d’1Mo avant mon RAID, ce n’est pas lui qui nous intéresse)
pour créer une seconde grappe RAID. On peut passer directement par le menu
« Configure software RAID ». Cette fois, sélectionnez bien les deux « FREE
SPACE », qui devraient de toutes façons être les seuls disponibles.</p>
<p><img src="media/030f7444.debian-installer-partition-step9.png" data-original-source="https://gordon.re/images/proxmox-luks/debian-installer-partition-step9.png"
alt="Création de la grappe RAID principale" title="Création de la grappe RAID
principale" class="aligncenter size-full" /></p>

<p><img src="media/b4ccbc44.debian-installer-partition-step10.png" data-original-source="https://gordon.re/images/proxmox-luks/debian-installer-partition-step10.png"
alt="RAID créé" title="RAID créé" class="aligncenter size-full" /></p>

<p>C’est maintenant sur la ligne en dessous de « RAID1 device #1 » que nous allons
créer le reste. Dans l’ordre : un conteneur LUKS (pour le chiffrement), puis un
groupe de volume LVM, puis nos partitions finales.</p>
<p>Allons donc dans « Configure encrypted volumes ». Sélectionnez <code>/dev/md1</code> comme
volume à chiffrer, étant donné que c’est le volume RAID principal (les autres
ne sont que les miettes restantes sur les disques, et notre <code>/boot</code>).</p>
<p><img src="media/6424ced9.debian-installer-partition-step11.png" data-original-source="https://gordon.re/images/proxmox-luks/debian-installer-partition-step11.png"
alt="Sélection du volume à chiffrer" title="Sélection du volume à chiffrer"
class="aligncenter size-full" /></p>

<p>À la fin de la configuration du volume chiffré, il faudra vous armer d’un peu
de patience, car l’installateur écrira des données aléatoires sur l’espace en
question, pour nettoyer d’éventuelles anciennes traces de fichiers.</p>
<p>Vient l’épineuse question du choix de la passphrase. Comme d’habitude,
choisissez avec soin et ne notez pas cette passphrase. Rappelez-vous pour
autant que si vous la perdez, votre serveur est mort.</p>
<p><img src="media/561c2bea.debian-installer-partition-step12.png" data-original-source="https://gordon.re/images/proxmox-luks/debian-installer-partition-step12.png"
alt="Volume LUKS créé" title="Volume LUKS créé" class="aligncenter size-full"
/></p>

<p>Étape suivante, si vous avez suivi : création du groupe de volumes LVM. Ça se
fait dans « Configure the Logical Volume Manager ». Créez un « volume group »
(je le nomme « vg0 », pas besoin d’être beaucoup plus créatif), puis choisissez
votre volume chiffré précédemment créé (<code>/dev/mapper/md1_crypt</code> ici).</p>
<p><img src="media/8ae036e9.debian-installer-partition-step13.png" data-original-source="https://gordon.re/images/proxmox-luks/debian-installer-partition-step13.png"
alt="Création du groupe de volumes" title="Création du groupe de volumes"
class="aligncenter size-full" /></p>

<p>Une fois le groupe de volume créé, il reste à créer les volumes logiques, soit
les partitions finales. Créez-en 3 : '<em>root</em>', '<em>data</em>' et '<em>swap</em>'. Leur
signification est claire. Le volume <em>data</em> contiendra <code>/var/lib/vz</code>, soit
l’intégralité des VMs de votre serveur. C’est donc lui qui sera logiquement le
plus gros. Vous devriez pouvoir vous en sortir avec 20Go pour <em>root</em> si vous
disposez de suffisamment de place. Pour <em>swap</em>, l’équivalent de la moitié de
votre RAM est correct.</p>
<p><img src="media/e642acd3.debian-installer-partition-step14.png" data-original-source="https://gordon.re/images/proxmox-luks/debian-installer-partition-step14.png"
alt="Détail des volumes logiques" title="Détail des volumes logiques"
class="aligncenter size-full" /></p>

<p><img src="media/3db6c47b.debian-installer-partition-step15.png" data-original-source="https://gordon.re/images/proxmox-luks/debian-installer-partition-step15.png"
alt="Détail des volumes logiques" title="Détail des volumes logiques"
class="aligncenter size-full" /></p>

<p>L’affichage de l’outil de partitionnement commence à sérieusement se
complexifier. Rassurez-vous, nous en avons quasiment fini. Il reste à créer les
systèmes de fichiers sur les volumes logiques nouvellement créés. J’opte pour
XFS. N’oubliez pas de définir le LV swap comme… du swap, ni de définir
<code>/var/lib/vz</code> comme point de montage du volume <em>data</em>.</p>
<p><img src="media/10b5f062.debian-installer-partition-step16.png" data-original-source="https://gordon.re/images/proxmox-luks/debian-installer-partition-step16.png"
alt="Fin du partitionnement" title="Fin du partitionnement"
class="aligncenter size-full" /></p>

<p>Nous en avons enfin fini. Enregistrez, puis continuez l’installation. Lors de
l’installation du boot loader (Grub), l’installeur m’a renvoyé une erreur, sans
trop d’explications. Il semble que l’installeur Debian soit cassé à ce niveau.
Pour corriger cela, choisissez « Execute a shell », puis entrez les commandes
suivantes :</p>
<div class="codehilite"><pre><span></span><code><span class="go">~ # parted /dev/sda</span>
<span class="go">GNU Parted 3.2</span>
<span class="go">Using /dev/sda</span>
<span class="go">Welcome to GNU Parted! Type &#39;help&#39; to view a list of commands.</span>
<span class="gp gp-VirtualEnv">(parted)</span> <span class="go">set 1 bios_grub on</span>
<span class="go">set 1 bios_grub on</span>
<span class="gp gp-VirtualEnv">(parted)</span> <span class="go">quit</span>
<span class="go">~ # parted /dev/sdb</span>
<span class="go">GNU Parted 3.2</span>
<span class="go">Using /dev/sdb</span>
<span class="go">Welcome to GNU Parted! Type &#39;help&#39; to view a list of commands.</span>
<span class="gp gp-VirtualEnv">(parted)</span> <span class="go">set 1 bios_grub on</span>
<span class="go">set 1 bios_grub on</span>
<span class="gp gp-VirtualEnv">(parted)</span> <span class="go">quit</span>
<span class="go">~ # exit</span>
</code></pre></div>

<p>Le menu principal réapparaît alors, et vous pouvez donc installer Grub sur
<code>/dev/sda</code>. Redémarrez ensuite.</p>
<p>Si tout se passe bien, Grub se lance, puis le système. Vous aurez alors à entrer votre passphrase LUKS pour déverrouiller le volume.</p>
<p><img src="media/9ee5ec03.debian-initramfs-luks-prompt.png" data-original-source="https://gordon.re/images/proxmox-luks/debian-initramfs-luks-prompt.png"
alt="prompt LUKS" title="Prompt LUKS"
class="aligncenter size-full" /></p>

<p>Entrez donc la passphrase, le système boote correctement.</p>
<p><img src="media/f9201b2a.debian-install-complete.png" data-original-source="https://gordon.re/images/proxmox-luks/debian-install-complete.png"
alt="Installation complète" title="Installation complète"
class="aligncenter size-full" /></p>

<p>C’est bien beau d’avoir un disque entièrement (ou presque) chiffré, mais
comment le déverrouiller en cas de reboot, étant donné que la machine est bien
au chaud dans un datacenter ? Il est possible de faire démarrer un démon SSH au
sein de l’initramfs, qui permet d’entrer la passphrase de façon sécurisée
à distance.</p>
<p>Authentifiez-vous donc sur votre système nouvellement installé, il va falloir
toucher un peu à la génération de l’initramfs. Je vous conseille la lecture de
ces deux pages
(<a href="https://wiki.faimaison.net/doku.php?id=debian-fde-dropbear">1</a>,
<a href="https://wiki.faimaison.net/doku.php?id=projets:wifi:ateliers:4_raid_luks_lvm&amp;do=">2</a>)
sur le wiki de FAImaison qui détaillent la procédure. Je vous suggère donc de
suivre le déroulé du premier lien, ce que j’ai fait moi-même.</p>
<p>Avant de redémarrer la machine pour tester le déchiffrement à distance,
n’oubliez pas d’installer grub sur <code>sdb</code>, pour assurer la redondance des
disques (<code>sdb</code> doit pouvoir remplacer <code>sda</code> à la volée) :</p>
<div class="codehilite"><pre><span></span><code><span class="gp">root@fromage:~#</span> grub-install /dev/sdb
</code></pre></div>

<p>Dans le fichier <code>/etc/initramfs-update/root/.ssh/authorized_keys</code> que  vous
avez rempli selon le guide précédent, insérez <code>command="cat - &gt;/lib/cryptsetup/passfifo"</code>
(sans oublier l’espace finale) juste avant votre
clé (ou avant chacune d’entre elles). Si vous aviez déjà tapé <code>update-initramfs -u</code>,
refaites-le pour prendre en compte cette modification.</p>
<p>Si, comme moi, votre système local utilise ZSH comme shell, la commande à base
de <code>read -p…</code> ne fonctionnera pas. À la place, utilisez celle-ci (qui
fonctionnera même sous bash, et qui prend en compte l’astuce précédente) :</p>
<div class="codehilite"><pre><span></span><code><span class="gp">gordon@local:~$</span> <span class="nb">echo</span> -n <span class="s1">&#39;Password: &#39;</span><span class="p">;</span> <span class="nb">read</span> -s pw<span class="p">;</span> <span class="nb">echo</span> -n <span class="nv">$pw</span> <span class="p">|</span> ssh  -o <span class="nv">UserKnownHostsFile</span><span class="o">=</span>~/.ssh/known_hosts.initramf root@fromage <span class="s2">&quot;cat - &gt;/lib/cryptsetup/passfifo&quot;</span><span class="p">;</span> <span class="nb">unset</span> pw
</code></pre></div>

<h4>On colle Proxmox par dessus</h4>
<p>Maintenant, il reste à suivre bêtement (ou presque) le <a href="https://pve.proxmox.com/wiki/Install_Proxmox_VE_on_Debian_Jessie">guide d’installation
Proxmox</a>.
J’attire votre attention sur un détail : lorsqu’il faut ajouter le dépôt
Proxmox sur APT, on vous demande d’ajouter la clé GPG utilisée pour signer les
paquets. Et la commande pour le faire est…</p>
<div class="codehilite"><pre><span></span><code><span class="go">wget -O- &quot;http://download.proxmox.com/debian/key.asc&quot; | apt-key add -</span>
</code></pre></div>

<p>Comme vous pouvez le voir, on vous recommande d’importer une clé GPG depuis un
serveur web non sécurisé. Pour rappel, vérifier l’intégrité des paquets grâce
à cette clé vous permet d’éviter d’installer des programmes réécrits par des
tiers, un peu comme peut l’être cette clé. En résumé, <strong>c’est une très
mauvaise pratique d’importer cette clé de cette façon-là</strong>, car rien ne vous
garantit que c’est la bonne.</p>
<p>Alors, que se passe-t-il si on essaie tout simplement de rajouter un « s » sur
« http » ? Et bien, le certificat TLS est invalide, car il appartient
à <em>enterprise.proxmox.com</em> et <em>proxmox.com</em>. Par ailleurs, le serveur web ne
renvoie pas vers la même page. <strong>Impossible donc de récupérer la clé GPG de
façon fiable par ce biais</strong>.</p>
<p>Pour l’instant, le seul moyen (largement détourné) pour m’assurer de la fiabilité de cette clé est le suivant :</p>
<p>1) Je télécharge l’ISO <em>bare-metal</em> de Proxmox sur <a href="https://www.proxmox.com/en/downloads/item/proxmox-ve-4-1-iso-installer-bittorrent">https://www.proxmox.com/en/downloads/item/proxmox-ve-4-1-iso-installer-bittorrent</a></p>
<p>2) Je vérifie l’empreinte (MD5, c’est très faible voir troué…) du fichier en conformité avec celle indiquée sur la page (attention à la consulter en HTTPS)</p>
<p>3) J’installe cette version de Proxmox dans une VM</p>
<p>4) Dans cette VM, je lance :</p>
<div class="codehilite"><pre><span></span><code><span class="gp">root@proxmox:~#</span> apt-key list <span class="p">|</span> grep -A2 proxmox
<span class="go">/etc/apt/trusted.gpg</span>
<span class="go">--------------------</span>
<span class="go">pub   1024D/9887F95A 2008-10-28</span>
<span class="go">uid                  Proxmox Release Key &lt;proxmox-release@proxmox.com&gt;</span>
<span class="go">sub   2048g/A87A1B00 2008-10-28</span>
</code></pre></div>

<p>5) L’ID court étant faible, je vérifie l’empreinte de cette clé, et je la compare avec celle fournie en ligne :</p>
<div class="codehilite"><pre><span></span><code><span class="gp">root@proxmox:~#</span> apt-key <span class="nb">export</span> 9887F95A <span class="p">|</span> gpg --import -a
<span class="go">gpg: key 9887F95A: public key &quot;Proxmox Release Key &lt;proxmox-release@proxmox.com&gt;&quot; imported</span>
<span class="go">gpg: Total number processed: 1</span>
<span class="go">gpg:               imported: 1</span>
<span class="gp">root@proxmox:~#</span> gpg --fingerprint 9887F95A
<span class="go">pub   1024D/9887F95A 2008-10-28</span>
<span class="hll"><span class="go">      Key fingerprint = BE25 7BAA 5D40 6D01 157D  323E C23A C7F4 9887 F95A</span>
</span><span class="go">uid                  Proxmox Release Key &lt;proxmox-release@proxmox.com&gt;</span>
<span class="go">sub   2048g/A87A1B00 2008-10-28</span>
</code></pre></div>

<p>6) Ensuite, sur la machine que je suis en train d’installer :</p>
<div class="codehilite"><pre><span></span><code><span class="gp">root@fromage:~#</span> wget <span class="s2">&quot;http://download.proxmox.com/debian/key.asc&quot;</span>
<span class="go">[…]</span>
<span class="gp">root@fromage:~#</span>  gpg --with-fingerprint key.asc 
<span class="go">pub  1024D/9887F95A 2008-10-28 Proxmox Release Key &lt;proxmox-release@proxmox.com&gt;</span>
<span class="hll"><span class="go">      Key fingerprint = BE25 7BAA 5D40 6D01 157D  323E C23A C7F4 9887 F95A</span>
</span><span class="go">sub  2048g/A87A1B00 2008-10-28</span>
</code></pre></div>

<p>7) Enfin, je compare les deux empreintes. Ici, elles sont identiques, mais
vérifiez bien par vous-mêmes. Ici, la faiblesse est l’empreinte MD5 de l’ISO.
Si ça peut aider, je mets à disposition <a href="/files/proxmox-release.asc">la clé en
question</a>, signée par mes soins, et hébergée sur
mon serveur où vous pouvez la récupérer en HTTPS. Si vous me faites confiance
(en général, ne le faites pas), ça peut vous faciliter la tâche.</p>
<p>Maintenant que vous avez la possibilité de récupérer les paquets de Proxmox et
que vous avez un moyen de savoir que ce sont les bons, continuez de suivre le
guide d’installation, vous ne devriez plus rencontrer de problèmes.</p>
<p>Et voilà, vous disposez maintenant d’un serveur chiffré, que vous pouvez
déverrouiller proprement à distance, prêt à héberger vos services !</p>


feed_id: tag:gordon.re,2016-02-15:/blog/rebirth.html
title: Rebirth
uri: 2020-11-15-Rebirth
url: https://gordon.re/blog/rebirth.html
content:
<p>Nouvelle version du blog !</p>
<p>Le dernier article remontant au 14 juillet… 2014, on était en droit de penser
que le blog était tombé à l’abandon. Il n’en est rien, je n’avais simplement
pas pris le temps de reprendre la plume.</p>
<p>C’est maintenant chose faite, et je profite de cet élan de motivation pour
rafraîchir le contenant, occasionnant ainsi une nouvelle version, comme dit
plus haut.</p>
<!-- cut -->

<h3>La recherche !</h3>
<p>Lorsque <a href="https://gordon.re/blog/vers-le-web-troispointzero.html">j’annonçais</a> ma
migration à <a href="http://getpelican.com">Pelican</a>, c’était l’un des points dont
j’acceptais la disparition. À la longue, j’ai regretté de ne pas pouvoir
accéder facilement à un article (ce dont j’avais besoin assez régulièrement).
Je reviens donc sur mes précédents propos : il est possible, avec Pelican,
d’avoir un moteur de recherche interne. Ça se fait grâce à un bout de code
Javascript, <a href="http://www.tipue.com/search/">Tipue</a>, qui va récupérer un fichier
d’indexation (en JSON), et effectuer une recherche là-dedans, avant de dérouler
les résultats de la recherche sur une page statique.</p>
<p>Je reviens donc sur ma précédente volonté de ne pas inclure de JS sur mes
pages. Néanmoins, le blog est parfaitement consultable sans JS, comme avant.
Les deux utilisation de JS sont des intégrations de logiciels libres, et
apportent uniquement de nouvelles fonctionnalités.</p>
<p>Le fonctionnement est donc le suivant : j’utilise le plugin
<a href="https://github.com/getpelican/pelican-plugins/tree/master/tipue_search">tipue-search</a>
qui génère, lors de la génération du site, un fichier JSON placé à la racine.
Ensuite, il n’y a qu’à intégrer le formulaire de recherche dans le template, et
tout fonctionne à peu près automagiquement. Je me suis basé sur l’intégration
du template <a href="https://github.com/talha131/pelican-elegant">elegant</a> pour faire
la mienne. À noter, j’ai récupéré la dernière version de Tipue plutôt que de
récupérer les fichiers fournis avec le plugin Pelican.</p>
<h3>Les commentaires</h3>
<p>Plus loin dans la contradiction avec <a href="https://gordon.re/hacktivisme/la-necessite-des-commentaires.html">mon ancien
moi</a>, j’ai décidé
d’intégrer des commentaires, de nouveau (de mémoire, la v3 de ce blog tournait
sous Wordpress). Là encore, générateur statique oblige, il n’est évidemment pas
possible de sauvegarder les commentaires côté serveur par Pelican, puisque
Pelican reste sur ma machine locale, et se contente de déployer des fichiers
statiques en ligne. Il est cependant possible d’intégrer dans Pelican un
système de commentaires, tel que Disqus (vous me voudrez pas de ne pas faire de
lien vers une plateforme centralisée et privatrice), mais évidemment, cette
solution est loin de me convenir. J’ai cependant entendu parler d’alternatives
libres et installables, parmi lesquelles <a href="https://posativ.org/isso">Isso</a>, qui
a retenu mon attention par la simplicité de son approche. En gros, il s’agit
d’installer Isso, qui est une petite webapp, sur un sous-domaine du blog, et
qui va servir une API consommable en JS. En intégrant un script dans la page,
on discute avec cette API, et on affiche les commentaires, et le moyen d’y
répondre. C’est très léger, c’est très simpliste, on peut commenter anonymement
et répondre aux commentaires, et c’est en Python (<em>et c’est le nom allemand
d’un Pokémon ♥</em>), donc j’ai fait mon choix.</p>
<p>Pour la mise en place d’Isso, je vous laisse consulter cet excellent billet en
français sur l’<a href="http://hackriculture.fr/isso-commentaires-auto-heberges-pour-pelican-et-autres-sites-statiques.html">installation d’Isso et son intégration dans
Pelican</a>.
Je n’ai rien d’intéressant à y ajouter, si ce n’est que vous devriez jeter un
œil régulièrement à ce blog.</p>
<p>Au-delà du point de vue technique, vous pouvez donc de nouveau commenter mes
articles. Amusez-vous bien.</p>
<h3>L’internationalisation</h3>
<p>J’ai toujours écrit en français sur mon blog, mais certains billets techniques
pourraient être utiles à des non-francophones. J’ai donc décidé de rendre ce
blog bilingue (français/anglais). Je rédigerai toujours en priorité mes
articles en français, puis, dans la mesure du possible, je les traduirai en
anglais. Il est possible que je ne le fasse que pour les articles techniques,
ça dépendra du temps que ça me prend.</p>
<p>Techniquement (ce qui implique que cet article sera traduit), j’ai donc :</p>
<ul>
<li>utilisé la fonctionnalité intégrée à Pelican permettant de rédiger un même
  contenu (article, page) dans plusieurs langues</li>
<li>installé le plugin
  <a href="https://github.com/getpelican/pelican-plugins/tree/master/i18n_subsites">i18n-subsites</a>,
  permettant de générer des sous-sites localisés. En consultant
  <a href="https://gordon.re/en/">https://gordon.re/en/</a>, vous serez donc sur la version anglophone du site. Les
  articles non traduits seront tout de même affichés dans leur langue
  originale</li>
<li>intégré l’<abbr title="internationalisation">i18n</abbr> dans mon template.
  Ce qui permet d’avoir une lecture beaucoup plus soignée sur la version
  anglophone</li>
</ul>
<p>Ce qui n’est pas encore fait :</p>
<ul>
<li>les catégories ne sont pas, pour le moment, internationalisées. Je n’ai pas
  encore trouvé comment faire (et pour être franc, je ne m’en suis pas vraiment
  occupé)</li>
<li>l’index de recherche, généré par Tipue, ne tient pas compte de la langue. Il
  ressort donc toutes les correspondances, dans toutes les langues. Ce qui peut
  être gênant lorsqu’on recherche des termes anglophones (ce qui est plus que
  susceptible d’arriver sur des articles techniques…). Ça peut être
  problématique, et je tâcherai de corriger ça.</li>
</ul>
<h3>Refonte CSS</h3>
<p>J’ai beau être satisfait de l’apparence du blog, je dois reconnaître que sa
réalisation n’est pas très propre. J’ai préféré sous-traiter la tâche de
refaire l’intégration à <a href="https://robinberthaud.fr">quelqu’un de bien plus compétent que moi dans le
domaine</a>. C’est encore en cours, mais il ne devrait
pas y avoir de changement bien notable (à part des bugs en moins).</p>
<p>Ce n’est pas du CSS, mais j’en profite pour notifier également le changement de
nom du blog, ainsi que son sous-titre : sensiblement plus sobre, à l’image des
futurs articles.</p>
<h3>Changement de cap sur le HTTPS</h3>
<p>Jusqu’à présent, je gérais ma propre
<a href="https://fr.wikipedia.org/wiki/Autorit%C3%A9_de_certification">CA</a> pour servir
ce blog, et mes autres sites, en HTTPS. Évidemment, ça imposait un
avertissement de sécurité à quiconque ne lui faisait pas confiance, c’est
à dire tout le monde, et <a href="https://gordon.re/hack/brainstorming-hacking-ssl.html">à
raison</a>.</p>
<p>Avec la création de <a href="https://letsencrypt.org/">Let’s Encrypt</a>, je peux
maintenant générer de façon quasi-automatique des certificats gratuitement,
j’en profite pour abandonner ma CA, et passer mes domaines chez Let’s Encrypt.
Oui, ça reste une CA qui fait du X.509, et c’est un modèle que je considère
comme cassé. Ce n’est donc pas la meilleure solution, loin de là. Mais ne
pouvant pas me battre sur tous les fronts à la fois, je fais un compromis ici.</p>
<p>Le script automagique fourni par Let’s Encrypt ne satisfaisant pas mes besoins
(notamment parce qu’il doit tourner en <em>root</em>), j’ai préféré en utiliser un
autre, parlant le même protocole :
<a href="https://github.com/gordon-/letsencrypt-nosudo">letsencrypt-nosudo</a></p>
<h3>Changement d’hébergeur</h3>
<p>Avec <a href="https://faimaison.net">FAImaison</a> qui est enfin <a href="https://www.faimaison.net/actualites/installation-datacenter-host-reze.html">devenu opérateur
IP</a>,
j’ai choisi de louer un espace dans le quart de baie de l’association pour
y installer une machine. C’est donc probablement le premier site web hébergé
intégralement sur l’infrastructure FAImaison, et je contrôle maintenant la
quasi-totalité de mon service (il y a des faiblesses sur la redondance réseau
et électrique, certes).</p>
<p>C’est à peu près tout pour cette mise à jour. Je vais tâcher de garder une
bonne dynamique et de republier régulièrement. D’ailleurs, j’ai une poignée de
choses à dire.</p>


feed_id: tag:gordon.re,2016-02-15:/en/blog/rebirth.html
title: Rebirth
uri: 2020-11-15-Rebirth
url: https://gordon.re/en/blog/rebirth.html
content:
<p>New version of the blog!</p>
<p>Since the last article was published on july 14th… 2014, you had the right to
think that the blog was abandonned. That’s not the case, I just didn’t take the
time to take pen.</p>
<p>This is now done, and I take this motivational impulse to also refresh the
container, causing a new version, like I said earlier.</p>
<!-- cut -->

<h3>Search!</h3>
<p>When I <a href="https://gordon.re/blog/vers-le-web-troispointzero.html">announced</a><sup>(fr)</sup> my migration to
<a href="http://getpelican.com">Pelican</a>, it was one of the features I agreed to lose.
Eventually, I regretted the capacity to get directly to a given article (which
I use often). So I go back to my words: it’s possible, with Pelican, to have an
internal search engine. It is done with a piece of Javascript code,
<a href="http://www.tipue.com/search">Tipue</a>, which will fetch a JSON index file, and
search it, before showing the search results on a static page.</p>
<p>I also go back to my previous wish that was to not use JS on my pages. However,
this blog is entirely readable without JS, like before. The two usages of JS
are integration of free softwares, and only bring new features.</p>
<p>The functioning is as the following: I am using the
<a href="https://github.com/getpelican/pelican-plugins/tree/master/tipue_search">tipue-search</a>
plugin that generates, while generating the website, a JSON file placed in the
root dir. Then, there is just to integrate the search form in the template, and
everything works mostly automagically. I used the integration of the
<a href="https://github.com/getpelican/pelican-plugins/tree/master/tipue_search">elegant</a>
template for mine. It is important to note that I took the latest version of
Tipue instead of taking the files provided with the Pelican plugin.</p>
<h3>Comments</h3>
<p>Further in <a href="https://gordon.re/hacktivisme/la-necessite-des-commentaires.html">my old
self</a><sup>(fr)</sup>
contradiction, I decided to integrate comments, again (if I remember correctly,
the v3 of this blog was running Wordpress). Here again, I can’t save comments
on the server with Pelican, because Pelican runs on my local machine, and
merely deploys static files online. It is nevertheless possible to integrate
a comment engine into Pelican, like Disqus (you won’t mind if I don’t make
a link to a centralized, privative, service), but obviously, this isn’t
a solution for me. However, I heard about free alternatives, among which
<a href="https://posativ.org/isso">Isso</a> caught my attention because of the simplicity
of its approach. Basically, you just have to install Isso, which is a tiny
webapp, on a blog subdomain, and it will serve an API that can be consumed by
JS. By integrating a script in the page, we discuss with this API, and we
display the comments, and the form to answer them. It’s very simplist, we can
comment anonymously, answer comments, it’s written in Python (<em>and it’s the
german name of a Pokemon ♥</em>), so I made my choice.</p>
<p>For the Isso deployment, I let you read this excellent article about
<a href="http://hackriculture.fr/isso-commentaires-auto-heberges-pour-pelican-et-autres-sites-statiques.html">installation of Isso and its integration into
Pelican</a><sup>(fr)</sup>.
I have nothing interessant to add, except that you should read thisblog.</p>
<p>Beyond the technical point of view, you can now comment my articles again. Have
fun.</p>
<h3>Internationalization</h3>
<p>I always wrote in french on my blog, but some technical posts should be useful
to non-french readers. So I decided to make this blog bilingual
(french/english). I will redact in priority in french, then, as far as
possible, I’ll translate those in english. It’s possible that I only take that
time for technical posts, though.</p>
<p>Technically (that implies that this article will be translated), I had to:</p>
<ul>
<li>use the Pelican feature to write a given content (article, page) in several
  languages</li>
<li>installed the
  <a href="https://github.com/getpelican/pelican-plugins/tree/master/i18n_subsites">i18n-subsites</a>
  plugin, allowing to generate localized subsites. By reading
  <a href="https://gordon.re/en/">https://gordon.re/en/</a>, you will be on the english version of the site. The
  untranslated articles will nevertheless be displayed in their original
  language.</li>
<li>integrated the <abbr title="internationalization">i18n</abbr> on my template,
  that allows to have a comfortable reading in the english version.</li>
</ul>
<p>What is yet to be done:</p>
<ul>
<li>categories are not yet internationalized. I didn’t find a way to do it (and
  to be honest, I didn’t really search for it yet)</li>
<li>the search index, generated by Tipue, doesn’t take the language into account.
  So it fetches every match, in every language. It can be a problem while
  searching for english terms (that is more than susceptible to appear in
  technical posts…). It may be a problem, and I will look for a solultion.</li>
</ul>
<h3>CSS overhaul</h3>
<p>Although I like the appearance of the blog, I have to admit that the realization is far from perfect. So I prefered to subcontract the integration cleaning to <a href="https://robinberthaud.fr">someone far better than me in that domain</a>. It’s still a work in progress, but there shouldn’t be much differences (except for less bugs).</p>
<p>That’s not CSS, but I take this moment to talk also about the name change of the blog as well as its subtitle: much sober, such as the future posts.</p>
<h3>Change of course about HTTPS</h3>
<p>Since now, I managed my own
<a href="https://en.wikipedia.org/wiki/Certificate_authority">CA</a> to serve this blog
and my other websites in HTTPS. Obviously, that forced a security warning to
everyone who didn’t trust it, meaning everyone (and <a href="https://gordon.re/hack/brainstorming-hacking-ssl.html">that’s not a bad
thing</a><sup>(fr)</sup>).</p>
<p>With the creation of <a href="https://letsencrypt.org">Let’s Encrypt</a>, I now can
generate free certificates nearly-automatically. So I abandon my CA, and
migrate my domains to Let’s Encrypt. Yes, that’s still a CA doing X.509, and
it’s a broken model for me. But I can’t fight on all fronts, so I make
a compromise here.</p>
<p>Since the automatic script provided by Let’s Encrypt doesn’t satisfy me
(especially because it requires <em>root</em> access), I prefered to use another that
speaks the same protocol):
<a href="https://github.com/gordon-/letsencrypt-nosudo">letsencrypt-nosudo</a>.</p>
<h3>A change of hosting</h3>
<p>With <a href="https://faimaison.net">FAImaison</a> at least becomming <a href="https://www.faimaison.net/actualites/installation-datacenter-host-reze.html">IP
operator</a>,
I choose to rent a space in the quarter bay of the association to rack my own
machine. So it is probably the first website hosted fully on the FAImaison
infrastructure, and I now control mostly every aspect of my service (there is
still redundancy weakness in network and electricity, indeed).</p>
<p>That’s all for this update. I’ll try to keep a good dynamic and publish
regularly. Beside, I have some things to say.</p>


feed_id: tag:gordon.re,2014-07-14:/sysadmin/planquez-un-peu-proxmox.html
title: Planquez (un peu) Proxmox
uri: 2020-11-15-Planquez-(un-peu)-Proxmox
url: https://gordon.re/sysadmin/planquez-un-peu-proxmox.html
content:
<p><a href="https://www.proxmox.com/">Proxmox</a> est un outil intéressant, simple à prendre
en main, offrant le moyen de gérer un serveur de virtualisation. Je l’utilise
depuis pas mal de temps, avec des VM
<a href="http://www.linux-kvm.org/page/Main_Page">qemu-kvm</a> comme des conteneurs
<a href="https://openvz.org/Main_Page">openvz</a>.</p>
<!-- cut -->

<p>Concrètement, il s’agit d’une distribution GNU/Linux basée sur
<a href="https://debian.org">Debian</a> embarquant les solutions de
virtualisation/conteneurs suscitées, et une jolie interface web s’appuyant sur
la lib JS <a href="http://www.sencha.com/products/extjs/">ExtJS</a> pour faciliter
l’administration de tout ça. Le problème, c’est que cette interface est
publique, accessible simplement via une URL, et il est possible de se connecter
en root directement dessus (via un module <a href="http://www.linux-pam.org/">pam</a>).
Or, je ne souhaite pas que l’on puisse avoir la main totale sur un serveur avec
un simple mot de passe, fut-il d’une robustesse redoutable. Une authentification
par mot de passe, c’est trop faible.</p>
<h3>Apache</h3>
<p>Du coup, ma solution est de reconfigurer le serveur web de Proxmox afin de
passer par un tunnel SSH en tant que seul moyen d’accéder à la console. Le
serveur web en question est un Apache, et il y a 2 fichiers à modifier pour
sécuriser cette partie : pour les trouver, il suffit de rechercher les
occurrences de « listen » dans le dossier d’Apache :</p>
<div class="codehilite"><pre><span></span><code><span class="gp">#</span> grep -Rl Listen /etc/apache2/
<span class="go">/etc/apache2/sites-enabled/pve.conf</span>
<span class="go">/etc/apache2/sites-available/pve.conf</span>
<span class="go">/etc/apache2/ports.conf</span>
</code></pre></div>

<p>Le fichier <em>/etc/apache2/sites-enabled/pve.conf</em> est une stricte copie de celui
dans sites-available, donc la modification sera à répliquer dans les deux
fichiers.</p>
<p>C’est la directive « <em>Listen</em> » d’Apache qui nous intéresse. On en trouve 2 dans
ports.conf, et un dans pve.conf. Elle indique simplement sur quelle interface on
désire faire écouter Apache. Si on précise seulement le port, on écoute sur
toutes les interfaces. Mais il est heureusement possible de préciser l’adresse
sur laquelle on souhaite écouter via « <em>Listen &lt;address&gt;:&lt;port&gt;</em> ».
Concrètement, on va changer ces fichiers pour n’écouter que sur l’adresse locale
(<em>127.0.0.1</em>).</p>
<div class="codehilite"><pre><span></span><code><span class="nb">Listen</span> <span class="m">127.0.0.1</span>:80
</code></pre></div>

<p>N’oubliez pas de remplacer le port par celui de la ligne en question. Redémarrez
le serveur (« <em>service apache2 restart</em> ») et constatez que l’interface web
n’est plus accessible via son adresse publique.</p>
<h3>SSH</h3>
<p>Si Apache n’écoute plus que sur l’adresse <em>localhost</em>, il vous faut être <strong>sur</strong>
cette machine pour accéder à l’interface. Mais je doute que
<a href="http://lynx.browser.org/">lynx</a> se comporte très bien avec une interface web
pleine de JS, alors il nous faut une autre solution : le tunnel SSH, dont je
parlais plus haut. Le principe est de se servir du serveur en tant que proxy
encapsulé dans du SSH (ainsi, pas besoin d’ajouter un <em>daemon</em> sur la machine).
La requête HTTP telle que vous la tapez sera donc réellement lancée depuis le
point de sortie (le serveur). Et si vous faites pointer votre navigateur sur
l’adresse <em>127.0.0.1</em>, c’est bel et bien sur le serveur que vous vous
retrouverez.</p>
<p>Mais pour que cette solution soit un tant soit peu efficace, il faut forcer
l’utilisation de clés SSH pour se connecter au serveur, à cause de la
problématique évoquée plus haut. Ma solution perso est de n’autoriser la
connexion SSH qu’avec une clé, et uniquement sur un utilisateur n’ayant aucun
droit, si ce n’est celui d’utiliser <em>su</em> pour passer en root. Il faudra donc
posséder la bonne clé SSH (et sa <em>passphrase</em>) ainsi que le pass root pour
pouvoir se connecter au serveur. Avant de modifier la configuration du serveur,
il vaut mieux installer la clé SSH. Si vous n’en avez pas sur votre poste,
créez-en une (à taper sur votre poste local) :</p>
<div class="codehilite"><pre><span></span><code><span class="gp">$</span> ssh-keygen
</code></pre></div>

<p>Je vous laisse le soin de choisir les options de votre clé. Par principe,
utilisez le maximum de bits possibles selon l’algorithme choisi. Choisissez
soigneusement votre <em>passphrase</em>, de sorte à la retenir sans négliger sa
robustesse.</p>
<p>Il nous faut maintenant créer un utilisateur sur le serveur, sur lequel on se
connectera :</p>
<div class="codehilite"><pre><span></span><code><span class="gp">#</span> useradd -m poney <span class="c1"># choisissez un nom pas trop évident</span>
<span class="gp">#</span> passwd poney <span class="c1"># choisissez un mot de passe temporaire</span>
</code></pre></div>

<p>Nous spécifions un mot de passe pour cet utilisateur, car il faudra s’y
connecter une première fois pour y stocker la clé. On supprimera le mot de passe
tout à l’heure.</p>
<p>Ensuite, utilisez <em>ssh-copy-id</em> pour ajouter votre clé sur le serveur
(toujours à taper sur votre poste local) :</p>
<div class="codehilite"><pre><span></span><code><span class="gp">$</span> ssh-copy-id poney@&lt;adresse du serveur&gt;
</code></pre></div>

<p>Si besoin, spécifiez via l’option <em>-i</em> le fichier de clé à envoyer au serveur.
Le mot de passe du compte <em>poney</em> vous est demandé.</p>
<p>Ensuite, nous sommes prêts à modifier la configuration du serveur. Voici donc
les lignes à modifier dans /etc/ssh/sshd_config :</p>
<div class="codehilite"><pre><span></span><code><span class="err">Port 9347 # on modifie le port par défaut, pour éviter les scanners idiots, choisissez-en un inutilisé au hasard</span>
<span class="err">PermitRootLogin no</span>
<span class="err">PasswordAuthentication no # on ne permet pas la connexion par un mot de passe</span>
</code></pre></div>

<p>Redémarrez le serveur via <em>service ssh restart</em>, <strong>ne vous déconnectez surtout
pas</strong>, au cas où votre configuration ait rendu toute nouvelle connexion
impossible, puis tentez de vous connecter depuis votre utilisateur fraîchement
créé (par le biais de sa clé) :</p>
<div class="codehilite"><pre><span></span><code><span class="gp">$</span> ssh -p <span class="m">9347</span> poney@&lt;adresse du serveur&gt;
</code></pre></div>

<p>Si tout se passe bien, ce ne sera plus le mot de passe du compte <em>poney</em> qui
sera demandé, mais la <em>passphrase</em> de votre clé SSH (possiblement dans une
fenêtre graphique, selon votre configuration). Si vous accédez au shell de
<em>poney</em> après ça, c’est que tout est bon. Vous pouvez maintenant accéder au root
en tapant « su - » (le tiret final permet de réinitialiser les variables
d’environnement, pour éviter que d’éventuelles saloperies ayant infecté <em>poney</em>
ne soient transmises à <em>root</em>), suivi de votre mot de passe <em>root</em>.</p>
<p>Respirez, on est presque à la fin.</p>
<p>Maintenant que l’on sait se connecter au serveur via un utilisateur tiers et via
une clé SSH uniquement, on peut supprimer le mot de passe de cet utilisateur :</p>
<div class="codehilite"><pre><span></span><code><span class="gp">#</span> passwd -d poney
</code></pre></div>

<p>La partie serveur est maintenant un peu plus sécurisée qu’avant. Il reste une
dernière chose à faire pour pouvoir accéder de nouveau à l’interface web.</p>
<h3>Poste client</h3>
<p>Avant d’oublier, nous allons utiliser le fichier de configuration
<em>~/.ssh/config</em> sur notre poste client pour faciliter la syntaxe de la
connexion :</p>
<div class="codehilite"><pre><span></span><code><span class="err">Host mon-serveur # remplacez par le nom que vous souhaitez</span>
<span class="err">HostName &lt;ip du serveur&gt;</span>
<span class="err">User poney</span>
<span class="err">Port 9347</span>
</code></pre></div>

<p>Ceci vous permettra de vous connecter par cette simple commande :</p>
<div class="codehilite"><pre><span></span><code><span class="gp">$</span> ssh mon-serveur
</code></pre></div>

<p>Maintenant, nous allons enfin configurer le tunnel SSH. Rien de bien complexe,
c’est intégré dans OpenSSH :</p>
<div class="codehilite"><pre><span></span><code><span class="gp">$</span> ssh -ND <span class="m">1234</span> mon-serveur <span class="c1"># utilisez un port de votre choix</span>
</code></pre></div>

<p>La connexion SSH se fait, et un proxy SOCKS5 est mis en place sur le port 1234
de votre adresse locale. Celui-ci sort sur le serveur. Il suffit alors de
configurer votre navigateur pour utiliser ce proxy. Sous Firefox, par exemple,
la configuration se trouve dans <em>Édition → Préférences → Avancé → Réseau →
Connexion → Paramètres</em>. Renseignez « 127.0.0.1 » comme hôte SOCKS, en mode
SOCKS v5, avec le port choisi plus haut. Surtout, supprimez les exceptions dans
le champ du dessous, car sinon vous ne pourrez pas accéder à l’interface Proxmox
(étant donné qu’elle sera sur l’adresse 127.0.0.1).</p>
<p><img src="media/598526d9.firefox_tunnel_ssh.png" data-original-source="https://gordon.re/images/proxmox/firefox_tunnel_ssh.png" alt="Configuration du proxy
dans Firefox" title="Configuration du proxy dans Firefox"
class="aligncenter size-full" /></p>

<p>Maintenant, faites pointer votre navigateur sur l’adresse <em>127.0.0.1</em> Si tout va
bien, vous serez redirigé sur le port 8006 en SSL, car c’est la configuration
par défaut de Proxmox, et vous pourrez accéder à l’interface comme avant.</p>
<p>Lorsque vous aurez fini ce que vous aviez à faire sur l’interface, reconfigurez
votre navigateur pour utiliser votre ancienne configuration de proxy,
déconnectez votre tunnel SSH (en tapant simplement « exit » ou en appuyant sur
<em>ctrl-D</em>). Si vous voulez y accéder de nouveau :</p>
<ol>
<li>lancez le tunnel SSH (<em>ssh -ND 1234 nom-serveur</em>)</li>
<li>configurez les paramètres de proxy de votre navigateur</li>
<li>visitez http://127.0.0.1 dans votre navigateur</li>
</ol>


feed_id: tag:gordon.re,2014-03-05:/developpement/listes-en-comprehension-en-python.html
title: Listes en compréhension en Python
uri: 2020-11-15-Listes-en-compréhension-en-Python
url: https://gordon.re/developpement/listes-en-comprehension-en-python.html
content:
<p>J’aime principalement deux choses dans le langage Python : la redoutable
simplicité de sa syntaxe, et l’incroyable puissance des listes en compréhension,
permettant d’effectuer des traitements en une seule ligne imbuvable. Oui, c’est
parfaitement contraire au premier point. Je vais donc revenir sur ces
listes en compréhensions.</p>
<!-- cut -->

<h3>De quoi parle-t-on ?</h3>
<p>Les <a href="http://fr.wikipedia.org/wiki/Liste_en_compr%C3%A9hension">listes en
compréhension</a> sont
une syntaxe présente dans le langage Python (entre autres) permettant de filtrer
un itérable (comme une liste). En gros, cela permet l’écriture d’une boucle
<em>for</em> dont la finalité est de créer une liste. Un exemple sera plus parlant.</p>
<div class="codehilite"><pre><span></span><code><span class="n">resultat</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">10</span><span class="p">):</span>
    <span class="n">resultat</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">i</span><span class="o">*</span><span class="mi">2</span><span class="p">)</span>
</code></pre></div>

<p>Cette syntaxe classique utilise 3 lignes pour générer la simple liste
[0,2,4,6,8,10,12,14,16,18,20]. Voyons maintenant comment écrire cela autrement :</p>
<div class="codehilite"><pre><span></span><code><span class="n">resultat</span> <span class="o">=</span> <span class="p">[</span><span class="n">i</span><span class="o">*</span><span class="mi">2</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">10</span><span class="p">)]</span>
</code></pre></div>

<p>Voila. Rien de plus. Nous arrivons au même résultat avec une écriture bien plus
concise. Il est possible de compléter l’exemple précédent :</p>
<div class="codehilite"><pre><span></span><code><span class="n">resultat</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">10</span><span class="p">):</span>
    <span class="k">if</span><span class="p">(</span><span class="n">i</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">):</span>
        <span class="n">resultat</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div>

<p>On itère <em>i</em> de 0 à 9, et on insère <em>i</em> dans <em>resultat</em> si celui-ci est pair
(c’est à dire si le résultat de sa division par 2 est nul).</p>
<p>Voyons maintenant la version en liste en compréhension :</p>
<div class="codehilite"><pre><span></span><code><span class="n">resultat</span> <span class="o">=</span> <span class="p">[</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="k">if</span> <span class="n">i</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">]</span>
</code></pre></div>

<p>On peut donc, grâce à la version verbeuse de l’expression, isoler les
différentes parties :</p>
<ul>
<li>Un itérable, ici <em>range(10)</em>, qui va nous servir de donnée de base ;</li>
<li>Une valeur, calculée pour chaque passage dans la boucle (il n’est pas
  obligatoire d’utiliser une valeur provenant de la source) ;</li>
<li>Une condition optionnelle, indiquée après l’itérable source.</li>
</ul>
<p>La puissance des listes en compréhension est incroyable. Pensez que l’itérable
source de votre liste en compréhension peut lui aussi être une liste en
compréhension !</p>
<h3>Expressions génératrices</h3>
<p>Si vous ne connaissez pas les générateurs en Python, il s’agit de structures
itérables dont la valeur est calculée au moment où on tente d’y accéder, et non
pas à l’assignation. Ce qui permet d’itérer sur de très gros volumes de données,
mais également d’itérer à l’infini sur une valeur.</p>
<div class="codehilite"><pre><span></span><code><span class="gp">&gt;&gt;&gt; </span><span class="k">def</span> <span class="nf">sq</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="gp">... </span>    <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;sq(</span><span class="si">%d</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="n">d</span><span class="p">)</span> <span class="c1"># on affiche quelque chose à chaque exécution</span>
<span class="gp">... </span>    <span class="k">return</span> <span class="n">n</span><span class="o">**</span><span class="mi">2</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">l</span> <span class="o">=</span> <span class="p">[</span><span class="n">sq</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">10</span><span class="p">)]</span>
<span class="go">sq(0)</span>
<span class="go">sq(1)</span>
<span class="go">sq(2)</span>
<span class="go">sq(3)</span>
<span class="go">sq(4)</span>
<span class="go">sq(5)</span>
<span class="go">sq(6)</span>
<span class="go">sq(7)</span>
<span class="go">sq(8)</span>
<span class="go">sq(9)</span>
</code></pre></div>

<p>Comme on le constate, avec une simple liste en compréhension, la fonction <em>sq()</em>
est appelée à l’assignation de la liste, car les valeurs sont calculées à ce
moment. Ce n’est pas le cas des expressions génératrices.</p>
<div class="codehilite"><pre><span></span><code><span class="gp">&gt;&gt;&gt; </span><span class="n">g</span> <span class="o">=</span> <span class="p">(</span><span class="n">sq</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">10</span><span class="p">))</span>
</code></pre></div>

<p>Rien n’est affiché. Notre fonction <em>sq()</em> n’est donc pas appelée. Elle le sera à
chaque fois qu’on cherchera à accéder à un élément du générateur.</p>
<div class="codehilite"><pre><span></span><code><span class="gp">&gt;&gt;&gt; </span><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">g</span><span class="p">:</span>
<span class="gp">... </span>    <span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
<span class="gp">... </span>
<span class="go">sq(0)</span>
<span class="go">0</span>
<span class="go">sq(1)</span>
<span class="go">1</span>
<span class="go">sq(2)</span>
<span class="go">4</span>
<span class="go">sq(3)</span>
<span class="go">9</span>
<span class="go">sq(4)</span>
<span class="go">16</span>
<span class="go">sq(5)</span>
<span class="go">25</span>
<span class="go">sq(6)</span>
<span class="go">36</span>
<span class="go">sq(7)</span>
<span class="go">49</span>
<span class="go">sq(8)</span>
<span class="go">64</span>
<span class="go">sq(9)</span>
<span class="go">81</span>
</code></pre></div>

<p>Les lignes « sq(×) » sont le signe que notre fonction <em>sq()</em> est exécutée à ce
moment. Et donc, en cas de données lourdes, on ne charge pas tout en mémoire
instantanément.</p>
<p>La seule chose qui distingue une expression génératrice d’une liste en
compréhension, syntaxiquement parlant, est simplement l’usage de parenthèses
autour de l’expression au lieu de crochets.</p>
<h3>Sets en compréhension</h3>
<p>Enfin, et parce que je préfère évoquer toutes les possibilités de cette syntaxe,
sachez qu’il est possible de générer un set (c’est à dire une liste
dédoublonnée) à partir d’une liste en compréhension. Il suffit pour cela
d’utiliser les accolades au lieu de crochets autour de l’expression.</p>
<div class="codehilite"><pre><span></span><code><span class="gp">&gt;&gt;&gt; </span><span class="n">s</span> <span class="o">=</span> <span class="p">[</span><span class="n">n</span> <span class="o">%</span> <span class="mi">5</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">10</span><span class="p">)]</span> <span class="c1"># liste en compréhension</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">s</span>
<span class="go">[0, 1, 2, 3, 4, 0, 1, 2, 3, 4]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">s</span> <span class="o">=</span> <span class="p">{</span><span class="n">n</span> <span class="o">%</span> <span class="mi">5</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">10</span><span class="p">)}</span> <span class="c1"># set en compréhension, sans doublon</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">s</span>
<span class="go">{0, 1, 2, 3, 4}</span>
</code></pre></div>

<h3>Un exemple ?</h3>
<p>La raison profonde pour laquelle j’ai voulu écrire cet article est le besoin
récent que j’ai eu de convertir une chaîne binaire en texte, par conversion des
octets en nombres décimaux, puis correspondance dans la table ascii. Malgré
l’existence de nombreux convertisseurs en ligne (<a href="http://www.gordontesos.com/cet-homme-est-fou/330-parlons-binaire-mais-parlons-bien.html">j’en ai moi-même
        écrit</a>),
je me suis dit qu’écrire un convertisseur en une ligne serait amusant, le tout
sous les yeux d’une <a href="http://joliegeekette.com">amie</a>. Et donc, voici :</p>
<div class="codehilite"><pre><span></span><code><span class="gp">&gt;&gt;&gt; </span><span class="n">s</span> <span class="o">=</span> <span class="s1">&#39;01010000011010010110111001101011011010010110010100100000010100000110100101100101001000000110100101110011001000000111010001101000011001010010000001100010011001010111001101110100&#39;</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span> <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="p">[</span><span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">i</span><span class="o">+</span><span class="mi">8</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">s</span><span class="p">),</span> <span class="mi">8</span><span class="p">)]]))</span>
<span class="go">Pinkie Pie is the best</span>
</code></pre></div>

<p>Voilà.</p>
<p>Bon, ok, je vous fais la version longue et commentée :</p>
<div class="codehilite"><pre><span></span><code><span class="n">s</span> <span class="o">=</span> <span class="s1">&#39;01010000011010010110111001101011011010010110010100100000010100000110100101100101001000000110100101110011001000000111010001101000011001010010000001100010011001010111001101110100&#39;</span>
<span class="n">conversion</span> <span class="o">=</span> <span class="p">[]</span> <span class="c1"># on stocke le résultat dans un tableau, qu’on convertira</span>
                <span class="c1"># ensuite en chaîne</span>

<span class="c1"># commençons par découper notre chaîne en octets (8 bits)</span>
<span class="n">octets</span> <span class="o">=</span> <span class="p">[]</span>
<span class="c1"># on doit itérer (taille de la chaîne / 8) arrondi au supérieur (au cas où)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span> <span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">s</span><span class="p">),</span> <span class="mi">8</span> <span class="p">):</span>
    <span class="n">octets</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">i</span><span class="o">+</span><span class="mi">8</span><span class="p">])</span> <span class="c1"># vivent les slices d’itérable : on découpe</span>
                            <span class="c1"># à partir de i caractères jusqu’à 8 de</span>
                            <span class="c1"># plus au maximum</span>
<span class="c1"># on a maintenant nos octets séparés. Il ne reste plus qu’à les convertir en</span>
<span class="c1"># décimaux, puis récupérer la valeur de la table ascii correspondante</span>
<span class="k">for</span> <span class="n">octet</span> <span class="ow">in</span> <span class="n">octets</span><span class="p">:</span>
    <span class="n">octet_dec</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">octet</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="c1"># pour convertir à partir de la base 2</span>
    <span class="n">conversion</span><span class="o">.</span><span class="n">append</span><span class="p">(</span> <span class="nb">chr</span><span class="p">(</span> <span class="n">octet_dec</span> <span class="p">)</span> <span class="p">)</span>

<span class="nb">print</span><span class="p">(</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span> <span class="n">conversion</span> <span class="p">)</span> <span class="p">)</span> <span class="c1"># ENFIN !</span>
</code></pre></div>

<p>Vous ne trouvez pas que la première version est plus, disons, succinte ?</p>
<p><strong>[edit]</strong> <a href="https://twitter.com/rogdham/status/441128671047208960">Rogdham</a> m’a
suggéré une amélioration du convertisseur binaire</p>


feed_id: tag:gordon.re,2013-10-07:/developpement/exceptions-python.html
title: Exceptions en Python
uri: 2020-11-15-Exceptions-en-Python
url: https://gordon.re/developpement/exceptions-python.html
content:
<p>Les exceptions sont un mécanisme de développement extrêmement pratique, mais pas
forcément clair pour tout le monde. Suite à une petite discussion, voici leur
fonctionnement en python3 :</p>
<!-- cut -->

<h3>Qu’est-ce qu’une exception ?</h3>
<p>Il s’agit d’objets se comportant comme des erreurs de fonctionnement du
programme. Toutes les erreurs, en python, sont des exceptions, et sont donc
manipulables. Cela sert à pouvoir traiter soi-même les erreurs, au lieu de
planter bêtement. Une structure existe pour effectuer ce traitement : son
fonctionnement en langue française donnerait ceci :</p>
<blockquote>
<p>Bon, effectue ces actions. Si jamais il y a une erreur à l’intérieur,
traite-la comme ceci.</p>
</blockquote>
<p>En python, ça se traduit par le bloc <em>try … except</em> :</p>
<div class="codehilite"><pre><span></span><code><span class="k">try</span><span class="p">:</span>
    <span class="n">do_some_actions</span><span class="p">()</span>
<span class="k">except</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Nous avons une erreur !&#39;</span><span class="p">)</span>
</code></pre></div>

<p>Si le bloc <em>try</em> renvoie une exception (donc une erreur), le bloc <em>except</em> est
exécuté. En l’occurrence, on affiche un message, puis on continue le programme.
Avec une vraie exception, ça donnerait ça :</p>
<div class="codehilite"><pre><span></span><code><span class="k">try</span><span class="p">:</span>
    <span class="n">result</span> <span class="o">=</span> <span class="mi">10</span> <span class="o">/</span> <span class="mi">0</span> <span class="c1"># une division par zéro, c’est paaaaas bien</span>
<span class="k">except</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Nous avons une erreur !&#39;</span><span class="p">)</span>
</code></pre></div>

<p>Cela reste néanmoins un fonctionnement très basique. On ne sait pas, à ce stade,
quelle est l’erreur. L’exception étant un objet, pouvoir la manipuler est la
base du traitement.</p>
<div class="codehilite"><pre><span></span><code><span class="k">try</span><span class="p">:</span>
    <span class="n">result</span> <span class="o">=</span> <span class="mi">10</span> <span class="o">/</span> <span class="mi">0</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Nous avons une erreur : </span><span class="si">%s</span><span class="s1"> !&#39;</span> <span class="o">%</span> <span class="n">e</span><span class="p">)</span>
</code></pre></div>

<p>Voici la forme étendue du <em>except</em> : on lui spécifie un type d’exception à
gérer, puis un nom de variable, qui contiendra notre exception. L’objet
Exception définit la méthode spéciale <em>__str__()</em> appelée automatiquement
lorsque l’on cherche à utiliser l’objet comme une chaîne de caractère (comme
c’est le cas dans notre exemple), et renvoie l’attribut message. Voici donc le
résultat des quelques lignes précédentes :</p>
<blockquote>
<p>Nous avons une erreur : integer division or modulo by zero !</p>
</blockquote>
<p>Pour savoir quel est le type de notre exception, consultez le nom de la classe :
<em>e.__class__.__name__</em>. Ce qui nous permettrait d’effectuer un
traitement comme ceci :</p>
<div class="codehilite"><pre><span></span><code><span class="k">try</span><span class="p">:</span>
    <span class="n">result</span> <span class="o">=</span> <span class="mi">10</span> <span class="o">/</span> <span class="mi">0</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span>
    <span class="n">exception_type</span> <span class="o">=</span> <span class="n">e</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span>
    <span class="k">if</span> <span class="n">exception_type</span> <span class="o">==</span> <span class="s1">&#39;ZeroDivisionError&#39;</span><span class="p">:</span>
        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Erreur de division par zéro&#39;</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Erreur </span><span class="si">%s</span><span class="s1"> : </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">exception_type</span><span class="p">,</span> <span class="n">e</span><span class="p">))</span>
</code></pre></div>

<p>Ainsi, vous traiterez différemment votre erreur selon son type. Mais la
structure <em>try … except</em> permet de faciliter ça, en conditionnant la récupération
des exceptions :</p>
<div class="codehilite"><pre><span></span><code><span class="k">try</span><span class="p">:</span>
    <span class="n">result</span> <span class="o">=</span> <span class="mi">10</span> <span class="o">/</span> <span class="mi">0</span>
<span class="k">except</span> <span class="ne">ZeroDivisionError</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Erreur de division par zéro&#39;</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Erreur </span><span class="si">%s</span><span class="s1"> : </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">e</span><span class="p">))</span>
</code></pre></div>

<p>Ici, soit nous récupérons une erreur <em>ZeroDivisionError</em>, soit nous récupérons…
n’importe quelle autre erreur, car la récupération conditionnelle traite
également les sous-types. Toute exception héritant de <em>Exception</em>, notre <em>except
Exception, e</em> saura récupérer n’importe quelle exception, et agit donc comme le
<em>default</em> d’un switch. Dans l’exemple précédent, la ligne 4 s’exécutera
<em>seulement si</em> on intercepte une exception ZeroDivisionError (ou un type
héritant de ZeroDivisionError. Si on obtient n’importe quelle autre exception,
on exécute la ligne 6. Si une exception d’un type non-traité est levée, python
s’arrêtera avec un traceback et un message d’erreur (qui sera celui de
l’exception)</p>
<p>Le bloc inclus dans le <em>try</em> est du code, il n’a rien de particulier. Il est
donc évidemment possible d’imbriquer des blocs <em>try … except</em>. Comme ceci :</p>
<div class="codehilite"><pre><span></span><code><span class="k">try</span><span class="p">:</span>
    <span class="n">do_something</span><span class="p">()</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">do_something_else</span><span class="p">()</span>
    <span class="k">except</span> <span class="ne">Exception</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span>
        <span class="k">raise</span> <span class="ne">UserWarning</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>

    <span class="k">try</span><span class="p">:</span>
        <span class="n">do_all_the_things</span><span class="p">()</span>
    <span class="k">except</span> <span class="ne">Exception</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span>
        <span class="k">raise</span> <span class="ne">UserWarning</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>

<span class="k">except</span> <span class="ne">UserWarning</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Le programme s’est arrêté avec le message suivant : </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">e</span><span class="p">)</span>
</code></pre></div>

<p>Si do_something_else() renvoie une exception, celle-ci est récupérée par le
<em>except</em> ligne 5, qui renvoie elle-même une exception (avec le mot-clé <em>raise</em>),
qui est alors récupérée par le <em>try</em> parent : on entre alors dans le dernier
<em>except</em>.</p>
<p>Pour finir, voyons comment créer nos exceptions :</p>
<div class="codehilite"><pre><span></span><code><span class="k">class</span> <span class="nc">MyException</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
    <span class="k">pass</span>
</code></pre></div>

<p>C’est aussi simple que ça : créez une classe vide qui hérite d’Exception, ou
d’une autre exception (par exemple, pour hiérarchiser vos exceptions), vu que le
nom de classe est ce qui permettra de récupérer conditionnellement vos
exceptions.</p>
<div class="codehilite"><pre><span></span><code><span class="k">try</span><span class="p">:</span>
    <span class="k">raise</span> <span class="n">MyException</span><span class="p">(</span><span class="s1">&#39;Message&#39;</span><span class="p">)</span>
<span class="k">except</span> <span class="n">MyException</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
</code></pre></div>

<p>Notre exception est levée, et est traitable comme une autre.</p>
<p>Une dernière chose : le mot-clé <em>finally</em>, qui est exécuté après une structure
<em>try … except</em>, quel que soit le bloc traité, autrement dit peu importe qu’une
exception ait été levée ou pas :</p>
<div class="codehilite"><pre><span></span><code><span class="k">try</span><span class="p">:</span>
    <span class="n">do_something</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
<span class="k">finally</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Nous avons exécuté le bloc.&#39;</span><span class="p">)</span>
</code></pre></div>

<p>Un <em>finally</em> est utile notamment pour libérer des ressources. Par exemple, si un
fichier est ouvert dans le <em>try</em> mais qu’une exception est levée avant sa
fermeture, le <em>finally</em> peut le fermer dans tous les cas.</p>


feed_id: tag:gordon.re,2013-05-30:/hacktivisme/la-necessite-des-commentaires.html
title: La nécessité des commentaires
uri: 2020-11-15-La-nécessité-des-commentaires
url: https://gordon.re/hacktivisme/la-necessite-des-commentaires.html
content:
<p>Je suis tombé sur cet
<a href="http://www.jeremyscheff.com/2011/08/jekyll-and-other-static-site-generators-are-currently-harmful-to-the-free-open-source-software-movement/">article</a>,
expliquant en quoi les générateurs de blogs statiques, comme
<a href="http://getpelican.com">Pelican</a> (utilisé ici même) étaient un danger pour
le logiciel libre. En gros, c’est centré sur l’absence de commentaires, hormis
en passant par un service tiers intégré en javascript (comme disqus). Je ne suis
absolument pas d’accord avec ses arguments, et, suite à un débat avec l’ami
<a href="http://www.libre-parcours.net/">Taziden</a>, je pense nécessaire d’expliquer mon
point de vue, au sujet des commentaires et le reste.</p>
<!-- cut -->

<p>Pour commencer, et par honnêté, je dois bien dire que le choix de me passer de
commentaires a été en partie imposé par le choix technologique de Pelican. En
partie seulement, parce que c’est moi qui ai fait ce choix, en connaissance de
cause.</p>
<h3>Revenons aux principes du blog</h3>
<p>Aujourd’hui, tout internaute lisant des blogs est habitué à pouvoir laisser son
avis sur un billet en bas de celui-ci. Cette habitude provient des moteurs de
blog très utilisés, comme <a href="http://wordpress.org">Wordpress</a>, ayant intégré cette
fonctionnalité. Mais ne cédons pas à la généralisation technologique. Je me
souviens encore de l’époque où « un blog » signifiait un truc sur
« .skyblog.com », la fameuse plateforme infestée de contenus d’une médiocrité
infinie. Aujourd’hui, on pourrait remplacer Skyblog par Wordpress. On a
indéniablement évolué, étant donné que Wordpress est un logiciel libre, et
qu’une importante partie des blogs existants sous cette plateforme sont hébergés
sur des serveurs persos. Mais dans l’idée, on tend quand même vers cette
généralisation : un blog a nécessairement des commentaires, comme un moteur de
recherche, des catégories, mots-clés, etc.</p>
<p>Mais pourquoi serait-ce le cas ? Un blog, ce n’est rien de plus qu’un journal
personnel. Un site web rédactionnel, peu importe que le contenu soit de la
veille technologique, des opinions politiques, ou des créations artistiques. En
fait, c’est un espace d’expression pour l’auteur, qui en fait ce qu’il veut. Les
moyens techniques pour arriver là sont : le protocole HTTP, et le langage HTML.
Le web, en somme, ni plus ni moins. Un simple éditeur de texte, un <span
title="pan">coin</span> sur un serveur web, et on peut écrire une page basique,
et du contenu à l’intérieur. On a un blog, pas moins vrai que le wordpress du
voisin ou celui-ci. Un blog n’a donc pas à avoir de fonctionnalités
particulières.</p>
<h3>La valeur des échanges</h3>
<p>Évidemment, je ne cherche pas à nier l’importance des commentaires de blog,
parfois bien plus intéressants que l’article lui-même, souvent enrichissants,
pour l’auteur et les lecteurs, qui assistent alors à la continuité d’un éventuel
débat lancé par le billet, ou des corrections, ajouts, etc…</p>
<p>Mais il s’agit de quelque chose qu’on ne remet pas en question. Les commentaires
vont sous l’article, et (Wordpress y a beaucoup contribué) ils sont structurés
de façon conventionnelle : un fil de messages chronologiquement ordonnés, avec
parfois des avatars récupérés depuis un service tiers fermé (dont le traitement
des données personnelles est
<a href="http://techthinker.com/gravatar-privacy-concern/">douteux</a>), parfois avec la
possibilité de répondre à un commentaire particulier… Cette dernière
fonctionnalité est intéressante, parce qu’elle permet à la discussion d’évoluer.
D’un échange entre l’auteur et ses lecteurs, on peut obtenir un débat autonome,
mais restant posté sur le blog.</p>
<p>L’avis de Taziden là-dessus est qu’il est indispensable pour un blog de proposer
une fonctionnalité de commentaires. Pour moi, c’est plus une habitude tenace
qu’un besoin. Pourquoi ne remettrait-on pas plutôt en question cette
fonctionnalité, pour la faire évoluer ? Pourquoi, au lieu de commentaires, ne
pas développer un système d’annotations collaboratives, fonctionnant telles des
calques sur le billet, pour enrichir l’article directement, comme on le peut le
faire avec <a href="https://pad.naohack.org">Etherpad</a> ? Il s’agit d’une simple idée
d’évolution, et je regrette que si peu de projets aient le courage de remettre à
plat les usages et habitudes pour proposer quelque chose de novateur (en cela,
le projet <a href="http://discourse.org">Discourse</a> m’intéresse énormément), plutôt que
de se sentir obligés d’intégrer les fonctionnalités « habituelles ».</p>
<p>Malgré cela, un blog reste un espace personnel. C’est l’espace de l’auteur.
Celui-ci ne souhaite pas nécessairement que ses articles soient commentés. Il
arrive d’ailleurs parfois d’écrire pour soi-même, et pas pour être lu. Les
commentaires sous un billet sont quelque chose que l’auteur peut proposer. C’est
un service supplémentaire. Souvent très enrichissant, mais toujours optionnel.
Il n’y a pas, je pense, lieu d’exiger de quelqu’un qu’il mette à disposition un
tel service, sous prétexte qu’il blogue. Et c’est tout à fait normal, un
blog n’est pas un service public ou quelque chose de démocratique.</p>
<h3>INTERNEEEEET</h3>
<p>J’ai une confidence à vous faire : mon blog permet les commentaires. D’ailleurs,
il en a régulièrement. Le fait qu’ils ne soient pas nécessairement écrits sous
chaque billet ne les rend pas inexistants ou invisibles.</p>
<p>Après la publication d’une grande partie de mes billets, il m’arrive de recevoir
un mail (chiffré ♥) contenant des remarques sur celui-ci, et avec un patch
attaché, contenant des corrections de forme. Je trouve ça génial, et ce n’est
pas le genre de chose qui aurait été possible avec un Wordpress. Mais encore,
lorsque je publie, je diffuse l’article sur plusieurs canaux, comme IRC ou
Statusnet (qui est ensuite renvoyé sur Twitter, qui est fermé), ou encore des
mailing-lists. Là, les retours se font, les discussions, débats ou trolls, selon
le sujet, se lancent. Et je n’ai aucun contrôle dessus. C’est quelque chose de
fondamental. Sur mon blog, je peux valider, dévalider, supprimer, bannir
quelqu’un, parce que j’en ai le contrôle (après tout, c’est <em>mon</em> espace). Mais
une des grandes forces d’Internet, c’est que la communication est possible,
quel qu’en soit le moyen. Je suis fortement attaché à la liberté d’expression,
vous le savez. Et je considère simplement qu’on est plus libre de discuter par
le moyen ou protocole qu’on veut, plutôt que de façon centralisée sur un site.</p>
<h4>Disqus ? CÉMAL !</h4>
<p>À ce titre, la solution proposée, notamment par Pelican, pour permettre les
commentaires, est généralement le service Disqus. Il s’agit d’une application
chargée en javascript qui va permettre de commenter un article via un service
externe. Ce service est totalement centralisé, fermé, et sous son propre
contrôle. J’ignore si un blogueur a la possibilité de supprimer un commentaire
posté sur disqus, mais je sais que la plateforme elle-même a ce droit. Et je ne
sais pas qui est derrière. Qu’est-ce qui me garantit que Disqus ne considèrera
pas unilatéralement que mon commentaire est un spam, ou contrevient à son
éthique ?</p>
<p>L’auteur de l’article évoqué plus haut appelle au développement d’un équivalent
libre à Disqus. À cela, je réponds « NOPE NOPE NOPE NOPE ». Un service tiers
centralisé, qu’il soit libre ou non, c’est mal. Ne serait-ce que parce que, peu
importe sa licence, je ne connais pas les personnes qui s’en occupent. Je n’ai
aucune garantie sur le service : est-ce qu’il risque de tomber en panne et ainsi
rendre inopérables les commentaires sur un grand nombre de blogs ? Est-ce que
les données sont sécurisées ? Est-ce que le service ne risque pas de fermer du
jour au lendemain ?</p>
<p>Ceci dit, je suis mauvaise langue. Rien n’empêche la création d’un service de
commentaires décentralisé, que l’on pourrait installer sur son propre serveur
pour servir ses propres commentaires. Ce serait une solution acceptable. Mais
l’inclusion dans le blog se ferait en javascript, ce qui n’est pas très
accessible. Je préfère me passer de javascript autant que possible, donc je
n’utiliserais vraisemblablement pas une telle solution.</p>
<p>Au lieu de cela, je laisse les retours se faire naturellement. On est sur
Internet, bon sang, les moyens de communication ne manquent pas. En réagissant
par le biais de protocoles plus adaptés pour ça, on ne dépend plus du blog, de
son auteur, d’un service tiers, et de tous les risques de censure en découlant.</p>
<p>Un autre avantage indirect est la possibilité de développer son avis par un
autre billet de blog qui se présentera en réponse du premier. Cela favorise la
discussion, qui est alors d’autant plus profonde qu’elle ne pourrait l’être en
140 caractères. Mon <a href="http://gordon.re/feminisme/a-ceux-qui-ralent.html">dernier
billet</a> est dans ce cas : je
voulais répondre en commentaire à Numendil, mais il les avait désactivés, alors
j’ai pris le temps de faire un billet complet.</p>
<h3>On n’est pas dans une salle de conférence</h3>
<p>On m’a rétorqué qu’il était important que les commentaires soient proposés par
le blog lui-même, en faisant le parallèle avec une conférence, où le public est
invités à la fin à poser des questions. Cela n’a, pour moi, pas plus de sens que
la tristement célèbre comparaison entre Internet et une autoroute. Les
contraintes physiques n’ont juste rien à voir. Une conférence se déroule dans un
lieu clos et défini, à un moment défini, et les personnes, pour se faire
entendre, parlent l’une après l’autre, et s’adressent au conférencier. Un blog
n’a aucune de ces contraintes. Par ailleurs, à certaines conférences auxquelles
j’ai pu participer (comme <a href="http://passageenseine.org">Passage En
Seine</a>), les retours se faisaient aussi sur IRC, donc
leur décentralisation est déjà possibe IRL, donc je ne vois pas le problème de
laisser les retours se faire ailleurs que sous l’article.</p>
<h3>Bad-buzz friendly</h3>
<p>Il n’y a pas que de gentils barbus <em>(visuel non contractuel)</em> qui s’expriment
sur les Internets. Il y a aussi des politiques vaguement pourris, des boîtes qui
cherchent à nous plumer sans trop que ça se voie, bref des gens qui ont un
intérêt économique (entre autres) à ce qu’on ne leur crache pas trop bruyamment
dessus. Et donc qui n’hésiteront pas à modérer sévèrement les moyens de
communications qu’ils daignent mettre en place, pour éviter tout débordement ou
diffusion d’une mauvaise image. Dans ce cas, l’utilisation de canaux tiers est
parfaitement indispensable, parce que certaines choses méritent d’être sues. Si
on se limite aux moyens autorisés, ce n’est plus du <em>minitel 2.0</em> qu’on utilise,
mais de la <em>télé 2.0</em>, où les diffuseurs sélectionnent ce qui a le droit d’être
dit. C’est un modèle du passé, et il faut absolument éviter de restreindre la
communication sur Internet à ces espaces de discussion qu’on veut bien nous
laisser.</p>
<p>Donc non, un blog statique ne nuit pas au logiciel libre. À l’inverse, il
encourage à l’utilisation épanouie d’Internet, c’est à dire à la
décentralisation des échanges, à l’utilisation de protocoles prévus pour ça. </p>


feed_id: tag:gordon.re,2013-04-22:/feminisme/a-ceux-qui-ralent.html
title: À ceux qui râlent
uri: 2020-11-15-À-ceux-qui-râlent
url: https://gordon.re/feminisme/a-ceux-qui-ralent.html
content:
<p>Je n’ai pas l’habitude d’écrire ce genre d’articles. Il s’agit d’une réponse à
un billet de <a href="http://pixellibre.net">quelqu’un que je considère encore comme un ami de
valeur</a>, <a href="http://pixellibre.net/2013/04/0-1-comprenne-qui-pourra/">au sujet du féminisme, ou plus exactement des
débats qu’il occasionne ces derniers
temps</a>. J’ai
initialement voulu répondre directement en commentaire, mais parce qu’il avait
fait le choix de les fermer, je me retrouve à écrire ici. J’en profite pour
mettre à plat certaines de mes opinions à ce sujet, en espérant ne pas trop
faire doublon avec mes articles précédents, notamment
<a href="http://gordon.re/feminisme/je-ne-suis-pas-feministe-je-suis-egalitariste.html">celui-ci</a>.</p>
<!-- cut -->

<h3>Le féminisme extrémiste (celui avec des grandes dents)</h3>
<p>Bon tout d’abord, je ne sais pas combien de fois il va falloir le rappeler : il
n’y a pas « le » féminisme. Pour rappel, il s’agit de revendication de
l’égalité des sexes et des genres. L’interprétation là-dessus est libre, ce qui
donne un tas de militantismes différents. Et crois-moi Jérôme (prenez
l’habitude, je m’adresse à une personne particulière dans ce billet), le
féminisme extrémiste, ce n’est pas ce que tu vois. Le féministe extrémiste
flirte sans gêne avec la misandrie, et ça se voit très vite. Et de tou·te·s les
féministes que je connais, personne ne soutient ces idées. Si vraiment tu veux
lire ce que je considère comme du féministe extrémiste (ce qui est revendication
de l’auteure), je te conseille de lire
<a href="https://jeputrefielepatriarcat.wordpress.com/2013/03/28/le-coit-une-aberration-totale-sauf-si-on-regarde-sa-fonction-dans-le-patriarcat/">ceci</a>.
Je préfère te prévenir, c’est <em>vraiment</em> violent. Ce que tu appelles « féminisme
extrémiste », ce sont des gens très visibles sur twitter qui passent une grande
partie de leur temps à se plaindre. Se plaindre de situations vécues, de
réponses qu’on leur fait, d’articles lus, etc. Crois-moi, personne ne fait ça de
gaieté de cœur. Seulement, quand on est sensibilisé au problème du sexisme, on a
la fâcheuse tendance à le voir partout. Et tu sais particulièrement combien il
est difficile de laisser couler des injustices qui sont sous notre nez.</p>
<h3>La pilule rouge</h3>
<p>Le fait est que ton article <strong>dénonce</strong>. Et qu’est-ce qu’il dénonce ? Le
comportement de certain·e·s féministes. Ce qui est intéressant (et ce qui
découle également de la discussion eue plus tôt avec deux autres hacktivistes),
c’est justement le sens de cette dénonciation. Pierre, Élodie ou toi, vous êtes
évidemment contre le sexisme. Dans les deux sens, je suis d’accord. Et quand
vous écrivez sur le sujet, c’est immanquablement pour… taper sur des féministes.
C’est révélateur, tu ne trouves pas ? N’aurait-il pas été plus utile, efficace
ou que sais-je de dénoncer le sexisme <em>concrètement</em> ? Par exemple, dans ton
billet, tu évoques des agressions que tu as subies, et que tu prends avec
légèreté. Chacun réagit à sa façon à ce genre d’actes, et je n’ai rien à redire
à la façon dont tu le prends. Contrairement à ce que l’on peut croire, je ne
considère en aucun cas qu’être victime d’agression doit marquer à vie et nous
forcer à vivre dans la honte et la culpabilité. Par contre, notre culture joue
un rôle important là-dedans, dans le fait que pour toi ça n’ait pas été très
grave. Car beaucoup de femmes prennent ce genre d’acte bien moins légèrement que
toi. Peut-être que leur fréquence y est pour quelque chose ? Je soupçonne que
oui, mais je n’en ai pas la preuve. Par contre, ce qui est avéré, c’est la
<strong>culture du viol</strong>. Le fait que les jeunes filles, dès la puberté, apprennent à
avoir peur, à redouter les agressions sexuelles. Agressions qui arrivent
d’ailleurs en très grande majorité dans le cercle privé ou familial, mais c’est
un autre sujet. Tu ne peux ignorer qu’on conseille aux femmes de ne pas sortir
seules le soir, de faire attention à elles, etc. Face à ça, comprends-tu la
gêne, la peur, quand un quelconque gentleman aborde une femme, qui n’a rien
demandé, dans un espace qu’elle considère culturellement comme <em>dangereux</em> ?
Sachant également que ce qu’on leur apprend à craindre est considéré comme
banal, ne serait-ce qu’au moment de porter plainte si l’on en a le courage
(difficile de porter plainte contre un membre de sa famille, surtout lorsque
c’est sur nous que sera jetée la honte dans la majorité des cas…). Vois-tu où je
veux en venir, et pourquoi <strong>ton</strong> ressenti face à des agressions (qui sont
condamnables avec la même fermeté que si tu avais été une femme, fût-il utile de
le préciser) est forcément différent de celui d’une femme ?</p>
<p>On me reproche, face à ça, de considérer les femmes comme des victimes en
puissance. Ce n’est pas vrai. Les femmes sont <strong>ciblées</strong> par des actes sexistes
à différentes échelles. Elles les subissent. Mais pourquoi une agression
devrait-elle entraîner la honte ou peur de sa cible ? Encore une fois, toute
cette discussion part de personnes qui ouvrent trop leur gueule. Qui n’ont
justement pas du tout une posture de victime, mais au contraire, décident de ne
plus se laisser faire, qu’il s’agisse de se défendre d’une agression physique ou
de protester contre un geste commun de la vie quotidienne, mais qui participe à
la société patriarcale. Car, quand on choisit la pilule rouge, qu’on accepte de
remettre en cause notre culture, notre société, et, au fond, nous, on voit
l’envers du décor, la matrice. On voit à quel point le sexisme est <em>partout</em>, et
on perd facilement les pédales. C’est tout simplement ce qui arrive lorsque
quelqu’un comme moi se met à réagir au quart de tour sur twitter. On pense
constamment « Mais comment ne peuvent-ils pas voir ces injustices ? ». Je me
trompe peut-être à ce sujet, mais je vous vois (vous, qui écrivez pour dénoncer
l’attitude ou les propos de féministes énervé·e·s) comme des personnes, non pas
ayant choisi la pilule bleue, mais surtout qui n’ont pas été confrontées à ce
choix. Imaginez le film <em>Matrix</em> si, au lieu de latter des vilains en costard et
lunettes noires, les héros avaient pour but d’expliquer à la population qu’ils
sont dans la matrice… J’aime à penser que ça donnerait des situations similaires
à ce que nous vivons. Ceci dit, dans mon analogie, le camp des héros est
clairement défini, et il s’agit comme par hasard de celui que je m’attribue.
J’aimerais beaucoup connaître votre avis là-dessus.</p>
<p>Quoi qu’il en soit, une fois la pilule rouge avalée, on commence à remettre en
question notre environnement. Lors d’un débat, on s’aperçoit que la seule femme
présente n’arrive pas à en placer une ou à se faire écouter. On remarque
également les remarques, davantage tournées vers son apparence que vers ses
idées. On tend un peu plus l’oreille quand on entend une femme se plaindre du
comportement des gens dans la rue (et pas seulement des hommes). Parfois, et
c’est plus difficile, on se prend soi-même à lâcher une parole qui autrefois
n’aurait pas posé problème, mais qui aujourd’hui sonne faux, parce que vous
remarquez qu’elle est discriminante et gratuite. Ça peut être quelque chose
d’aussi insignifiant en apparence que le fait d’user de « Mademoiselle » pour
s’adresser à une jeune femme, ou bien un glacial « t’as vu comment tu t’es
habillée, aussi ? » à une femme qui raconte comment elle a failli être violée
quelques instants plus tôt. Je comprends que cela provoque un agacement : on
déterre toutes ces petites choses qui composent notre vie de tous les jours,
toutes ces choses acquises, avec lesquelles on vit. Et remettre en question sa
culture est une chose quand on a choisi d’ouvrir les yeux, mais se le prendre en
pleine gueule alors qu’on ne s’en soucie pas peut effectivement mettre très mal
à l’aise, et occasionner le l’agressivité en signe de défense.</p>
<p>C’est ce qui arrive lorsque que l’on dénonce le sexisme dans la société, mais
c’est exactement pareil dans les communautés, comme les geeks. À la différence
près que, quand on s’identifie comme geek, on s’attache à cette culture. Et
inévitablement, on tombe dans le communautarisme. Que ce soit pour le milieu
geek ou les autres. La réponse hautaine qu’on va tenir à un nouveau qui demande
des conseils candides (et parfois un peu idiots) dans notre domaine d’expertise,
c’est du communautarisme. On a notre communauté, et on veut naturellement
s’assurer qu’on n’y entre pas n’importe comment, car c’est un espace familier.
Quand on tape parfois brutalement sur <a href="https://twitter.com/tris_acatrinei">Tris</a>
quand elle parle de sécu, quand bien même c’est argumenté, c’est du
communautarisme, et je reconnais en faire moi-même. Voyez, je reconnais
reproduire le problème, et j’en suis conscient. Et pourtant, je continue à lui
dire ce que je pense, ce qui est rarement glorieux. Ridicule, vous ne trouvez
pas ? D’ailleurs, je ne passe pas à côté du sexisme très installé dans certaines
œuvres, comme la série <em>Game of Thrones</em>. Et pourtant, je l’aprécie. Parfois, le
fait d’avoir cette analyse inconsciente des constructions genrées dans la
fiction gâche le plaisir de la découverte. C’est comme ça, c’est ça le revers
de la pilule rouge. On voit le monde encore plus sombre qu’avant. Mais on sait
qu’on a alors les clés en main pour changer ça à notre échelle, en commençant
par moins reproduire ces schémas. « Moins », et pas « plus », car la tâche est
monumentale, et la seule façon de refuser du jour au lendemain toute forme de
sexisme serait de couper tout lien avec la société, et de subir un lavage de
cerveau. Ce qui ne serait pas très efficace. Alors on accepte de vivre dans ce
monde sexiste, on continue d’aprécier des œuvres, même si elles se montrent
sexistes. Il faut savoir faire des compromis, et connaître les limites de son
militantisme.</p>
<h3>Revenons au sujet</h3>
<p>Dans ton article, Jérôme, tu persistes à expliquer en quoi tu réfutes le terme
de féminisme pour parler d’égalité. Je suis égalitariste, tu le sais. Je ne
souhaite pas inverser les privilèges, je souhaite que femmes et hommes soient au
même niveau social, aient les même chances par défaut dans la vie.</p>
<p>Mais.</p>
<p>Être pour l’égalité sans aller plus loin, c’est une bien belle déclaration, qui
n’a d’égale à son ardeur que son inutilité. C’est une déclaration de principe,
rien de plus. Parce qu’il est impossible d’évoquer l’égalité hommes-femmes sans
évoquer le patriarcat. Or, je te n’ai jamais vu ne serait-ce qu’employer ce mot.
Sais-tu seulement ce qu’il signifie ? Il signifie que la société dans laquelle
on vit a été pensée par et pour des hommes, et que les femmes y sont réduites à
l’état de ressource. Évidemment, la société a évolué, et la place des femmes
avec elle. Reste qu’historiquement, la domination était très claire : les hommes
gouvernaient, et les femmes obéissaient. Aujourd’hui, est-ce différent ? « On
n’est plus dans les années 50 », mais on n’est pas encore dans les années
10 000. Autrement dit, il y a <strong>beaucoup</strong> de chemin. Des exemples ? Le plafond
de verre, qui symbolise l’extrême difficulté qu’ont les femmes à atteindre les
postes à responsabilités. Ou l’inégalité salariale, ou encore la culture du
viol, conçue pour culpabiliser les victimes et souvent d’excuser les auteurs. Ou
encore la banalité que représente l’abordage d’une femme dans la rue, qui n’a
rien demandé. Le patriarcat enseigne qu’on le peut, et qu’une femme doit se
faire belle pour plaire aux hommes.</p>
<p>Le patriarcat, c’est une composante majeure de notre société. Il est normal que
ça couine un peu quand on tape dessus. En tout cas, si tu souhaites lutter pour
l’égalité, il y a une chose importante à faire. Et difficile. C’est le choix de
la pilule, dont je parlais plus haut. Admettre l’existence du partiarcat, pour
commencer (c’est pas si évident). Et surtout, admettre qu’en tant qu’homme, <a href="http://www.crepegeorgette.com/2013/04/22/moi-valerie-je/">tu
es naturellement
privilégié</a>. Ce n’est
pas une honte, une critique ou quoi que ce soit. D’ailleurs tu n’y peux rien,
tu n’as pas choisi ton genre. Mais c’est un fait, tu fais partie de la « caste »
mise en avant par le patriarcat. Il y a fort à parier que l’immense majorité des
gens qui liront ce billet sont privilégiés, d’une façon ou d’une autre. Toi,
Pierre et moi, nous sommes des hommes blancs hétérosexuels cis (c’est à dire qui
vivons notre genre assigné à la naissance). Cela fait 4 raisons d’être
privilégiés. Nous sommes réellement quasiment au sommet de la pyramide sociale
des discriminations. Ce sont les femmes qui sont victimes du patriarcat. Ce sont
tous ceux dont la couleur de peau n’est pas celle des anciens conquérants
européens qui sont victimes du racisme. Ce sont les homosexuel·le·s, bis,
transgenres et queers qui sont victimes d’homophobie ou de transphobie. Pas
nous. Je le répète, ce n’est pas un jugement, mais un constat. En admettant ses
privilèges, on accepte de <strong>faire partie du problème</strong>. À ce moment, ça ne
devient plus « des râleuses qui nous emmerdent avec leurs problèmes dont on n’a
rien à faire ». On sait qu’on en est aussi, qu’on participe à ça. Après, on est
libre de changer nos habitudes. D’accepter, non pas de renoncer à ces
privilèges, mais de travailler à les partager. Ce n’est bien sûr pas un acte
individuel, et je ne peux pas dire « tiens, prends ma place d’homme aux yeux de
la société ». Pas par faute d’envie, mais parce que changer mon regard n’est
qu’une pierre à l’édifice. Pour que ça ait un impact, il faut naturellement
qu’une masse critique ait conscience de ce problème, et fasse un effort pour y
remédier. Cette masse critique, c’est vous et moi, pas « les vilains
misogynes ». Admettre ça, c’est lutter pour l’égalité des genres. C’est être
féministe.</p>
<p>Et toi, Jérôme, qui es pour l’égalité, t’es-tu remis en question ? Ou te
contentes-tu de taper sur celles et ceux qui s’efforcent de sensibiliser les
autres ? Au contraire, ai-je envie de dire. Car quand tu dénonces le fait que le
dossier de Mar_Lard pointe du doigt « les geeks », il est clair que tu te sens
vexé, car on sous-entend que ta précieuse communauté pourrait avoir un problème,
pire, que tu pourrais en faire partie. Non content d’être du communautarisme
bien idiot, il s’agit d’un rejet pur et dur du problème. Tu préfères penser que
le sexisme, bien sûr que ça existe, mais ce sont « les autres ». Pas de ça
autour de toi, sinon tu l’aurais vu, n’est-ce pas ? Et si c’était le simple fait
de ne pas le remarquer qui te mettait mal à l’aise ? Tu sais, depuis le (faible)
temps que je milite pour l’égalité, j’ai fini par repérer les patterns courants
de ceux qui tapent sur le féminisme, mais qui sont d’accord sur le principe,
hein, <strong>mais</strong>… Mais faut pas crier aussi fort, mais faut pas généraliser sur
les geeks, y’en a des biens… Et là, je ne te fais que les réponses construites.
Parce que dans leur immense majorité, les réactions sont purement <em>haineuses</em>.
As-tu jeté un œil sur les commentaires du moindre article rédigé par Mar_Lard ?
Toi qui parles d’égalité, et de ses billets, n’as-tu pas trouvé pertinent, même
si tu souhaitais critiquer intelligemment, de signaler cet état de fait ?
D’ailleurs, qu’en penses-tu, toi qui, sans le vouloir, participes à la levée de
boucliers qui suit inévitablement ce pavé dans la mare ?</p>
<p>Non pas que le dossier dont il est question ne soit pas critiquable. Au
contraire. Il s’agit du travail personnel de quelqu’un de passionnée par le
sujet, et dont ce n’est pas le métier. Ça se ressent, évidemment. Mais on va lui
reprocher de ne pas parler de quelque chose, d’avoir un ton incorrect. Tout est
prétexte à critiquer son texte. Ça a quelque chose de malsain, et je dois dire
que je t’en veux de ne pas avoir vu plus loin que ça.</p>
<p>Finalement, tu as raison, tas de pixels. C’est bien une question de binaire. La
pilule rouge ou bleue. La reconnaissance du problème ou son déni.</p>


feed_id: tag:gordon.re,2013-04-07:/developpement/bonjouraxolotl.html
title: Bonjour Axolotl !
uri: 2020-11-15-Bonjour-Axolotl
url: https://gordon.re/developpement/bonjouraxolotl.html
content:
<p>Il y a quelques semaines, on m’a parlé de la possibilité d’adopter des
<a href="https://fr.wikipedia.org/wiki/Axolotl">axolotls</a>. Je connaissais
vaguement ces bestioles, mais la proposition m’a donné envie d’en
apprendre plus sur elles. Après lecture de la page Wikipedia, je suis
tombé sous le charme de ces bestioles. Voyez par vous-mêmes : une
bestiole qui sourit tout le temps, qui passe sa vie sous forme de larve,
qui peut se regénérer jusqu’à des parties de son cerveau 
(<a href="https://fr.wikipedia.org/wiki/Wolverine">Arme X</a> ?), qui a des branchies
rigolotes et poilues, et surtout, qui mange comme un idiot tout ce qui est
plus petit que lui. Je trouve ça génial.</p>
<!-- cut -->

<div class="center"><img src="media/c45f6285.axo.jpg" data-original-source="https://gordon.re/images/bonjouraxolotl/axo.jpg"
alt="Un axolotl" /></div>

<p>J’ai rapidement eu l’idée de monter un petit site, dans la lignée des
<a href="http://bonjourlechat.fr">Bonjour le chat</a> et autres variations plus
portées sur les humain·e·s, c’est à dire un blog simpliste postant une
photo chaque matin. La quasi-totalité de ces sites est hébergée et gérée
par Tumblr, mais vous connaissez mon amour pour les plateformes
centralisées et pseudo-gratuites. Je suis donc parti sur
<a href="http://getpelican.com">Pelican</a>, comme pour mon blog, avec dans l’idée
la possibilité d’automatiser la création de posts.</p>
<p>Le travail a donc consisté à :</p>
<ul>
<li>installer un Pelican</li>
<li>créer un template Jinja pour Pelican reprenant le thème simpliste
  utilisé sur les bonjour* ;</li>
<li>créer un script de publication automatique ;</li>
<li>récupérer des photos d’axolotls ;</li>
<li>???</li>
<li>PROFIT.</li>
</ul>
<h3>Installation</h3>
<p>Le bon sens et la conception de Pelican veulent que le contenu soit
généré depuis le poste local, pour être envoyé vers le serveur sans
qu’il ne soit nécessaire d’avoir un interpréteur Python sur celui-ci.
Dans mon cas, souhaitant une génération automatique, il m’a semblé plus
propice de tout déléguer au serveur. Ainsi, j’ai installé Pelican sur
mon serveur en suivant le
<a href="http://docs.getpelican.com/en/3.1.1/getting_started.html#kickstart-a-blog">guide</a>,
et configuré le serveur web pour servir le dossier <em>output</em>.</p>
<p>Je me suis aperçu après coup qu’une fonctionnalité intéressante me
manquait dans Pelican : la possibilité, pour chaque article, d’avoir le
lien vers son prédécesseur et/ou successeur, pour obtenir une navigation
simple. Ce fonctionnement peut être obtenu via un plugin :
<a href="https://github.com/getpelican/pelican-plugins/tree/master/pelicanext/neighbors">Neighbors</a>.
Celui-ci, une fois téléchargé, se place à la racine du projet Pelican,
et on l’inclut via le fichier de configuration, que voici :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><code><span class="ch">#!/usr/bin/env python</span>
<span class="c1"># -*- coding: utf-8 -*- #</span>

<span class="n">AUTHOR</span> <span class="o">=</span> <span class="sa">u</span><span class="s1">&#39;Axoloto&#39;</span>
<span class="n">SITENAME</span> <span class="o">=</span> <span class="sa">u</span><span class="s1">&#39;Bonjour Axolotl&#39;</span>
<span class="n">SITESUBTITLE</span> <span class="o">=</span> <span class="sa">u</span><span class="s1">&#39;Le site qui vous fera dire « Bonjour l’&lt;a &#39;</span>\
              <span class="o">+</span><span class="sa">u</span><span class="s1">&#39;href=&quot;https://fr.wikipedia.org/wiki/Axolotl&quot;&gt;axolotl&lt;/a&gt; ! »&#39;</span>\
              <span class="o">+</span><span class="sa">u</span><span class="s1">&#39;&lt;br /&gt;&lt;br /&gt;Tous les matins, 10h, une nouvelle &lt;strong&gt;photo&#39;</span>\
              <span class="o">+</span><span class="sa">u</span><span class="s1">&#39;&lt;/strong&gt; d’&lt;strong&gt;axolotl&lt;/strong&gt; !&#39;</span>
<span class="n">SITEURL</span> <span class="o">=</span> <span class="s1">&#39;http://bonjouraxolotl.fr&#39;</span>

<span class="n">TIMEZONE</span> <span class="o">=</span> <span class="s1">&#39;Europe/Paris&#39;</span>

<span class="n">DEFAULT_LANG</span> <span class="o">=</span> <span class="sa">u</span><span class="s1">&#39;fr&#39;</span>

<span class="c1"># Blogroll</span>
<span class="n">LINKS</span> <span class="o">=</span>  <span class="p">((</span><span class="s1">&#39;Pelican&#39;</span><span class="p">,</span> <span class="s1">&#39;http://docs.notmyidea.org/alexis/pelican/&#39;</span><span class="p">),</span>
          <span class="p">(</span><span class="s1">&#39;Python.org&#39;</span><span class="p">,</span> <span class="s1">&#39;http://python.org&#39;</span><span class="p">),</span>
          <span class="p">(</span><span class="s1">&#39;Jinja2&#39;</span><span class="p">,</span> <span class="s1">&#39;http://jinja.pocoo.org&#39;</span><span class="p">),</span>
          <span class="p">(</span><span class="s1">&#39;You can modify those links in your config file&#39;</span><span class="p">,</span> <span class="s1">&#39;#&#39;</span><span class="p">),)</span>

<span class="c1"># Social widget</span>
<span class="n">SOCIAL</span> <span class="o">=</span> <span class="p">((</span><span class="s1">&#39;You can add links in your config file&#39;</span><span class="p">,</span> <span class="s1">&#39;#&#39;</span><span class="p">),</span>
                  <span class="p">(</span><span class="s1">&#39;Another social link&#39;</span><span class="p">,</span> <span class="s1">&#39;#&#39;</span><span class="p">),)</span>

<span class="n">DEFAULT_PAGINATION</span> <span class="o">=</span> <span class="mi">1</span>

<span class="n">THEME</span> <span class="o">=</span> <span class="s1">&#39;template&#39;</span>
<span class="n">FEED_DOMAIN</span> <span class="o">=</span> <span class="s1">&#39;http://bonjouraxolotl.fr&#39;</span>
<span class="n">FEED_RSS</span> <span class="o">=</span> <span class="s1">&#39;/feeds&#39;</span>
<span class="n">FEED_ATOM</span> <span class="o">=</span>  <span class="kc">None</span>

<span class="n">PLUGINS</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;neighbors&quot;</span><span class="p">]</span>
</code></pre></div>
</td></tr></table>
<p>Dans les quelques trucs intéressants, notez que j’ai restreint les pages
à 1 seul article, et que j’ai inclus le plugin à la dernière ligne. Le
reste est très simple. J’ai aussi choisi d’utiliser du RSS au lieu
d’Atom.</p>
<h3>Création du template</h3>
<p>Je me suis basé sur le markup généré par bonjourlechat.fr pour créer mon
template. Il n’y a basiquement besoin que de 3 pages : la page
d’accueil, la page d’un article, et la page d’archives. D’ailleurs, je
ne me suis même pas préoccupé de cette dernière…</p>
<p>Pour commencer, j’ai copié le template notmyidea, situé dans
<em>$PELICAN_INSTALL_PATH/themes/notmyidea</em>, dans la racine du projet,
renommé en « template ». À l’intérieur de celui-ci, on trouve deux
dossiers : <em>static</em> et <em>templates</em>. Le premier sera copié tel quel dans
le dossier <em>output</em>, tandis que le second contient le code Jinja
permettant de générer les pages. Celles qui nous intéressent sont
<em>base.html</em>, <em>index.html</em>, article.html<em> et </em>article_infos.html<em>. La
différence entre les deux derniers est que </em>article.html<em> est la page
complète d’un article tandis que </em>article_infos* n’est que le bloc HTML
d’un article seul. Je l’ai mis dans un fichier à part pour pouvoir
l’inclure facilement depuis les différentes pages sans avoir besoin de
le réécrire. voici le contenu des fichiers :</p>
<p>base.html</p>
<div class="codehilite"><pre><span></span><code><span class="cp">&lt;!DOCTYPE html&gt;</span>
<span class="p">&lt;</span><span class="nt">html</span> <span class="na">lang</span><span class="o">=</span><span class="s">&quot;en&quot;</span><span class="p">&gt;</span>
<span class="p">&lt;</span><span class="nt">head</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">title</span><span class="p">&gt;</span><span class="cp">{%</span> <span class="k">block</span> <span class="nv">title</span> <span class="cp">%}{{</span> <span class="nv">SITENAME</span> <span class="cp">}}{%</span><span class="k">endblock</span><span class="cp">%}</span><span class="p">&lt;/</span><span class="nt">title</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">meta</span> <span class="na">charset</span><span class="o">=</span><span class="s">&quot;utf-8&quot;</span> <span class="p">/&gt;</span>
        <span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&quot;stylesheet&quot;</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;</span><span class="cp">{{</span> <span class="nv">SITEURL</span> <span class="cp">}}</span><span class="s">/theme/css/</span><span class="cp">{{</span> <span class="nv">CSS_FILE</span> <span class="cp">}}</span><span class="s">&quot;</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;text/css&quot;</span> <span class="p">/&gt;</span>
        <span class="cp">{%</span> <span class="k">if</span> <span class="nv">FEED_ALL_ATOM</span> <span class="cp">%}</span>
        <span class="p">&lt;</span><span class="nt">link</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;</span><span class="cp">{{</span> <span class="nv">FEED_DOMAIN</span> <span class="cp">}}</span><span class="s">/</span><span class="cp">{{</span> <span class="nv">FEED_ALL_ATOM</span> <span class="cp">}}</span><span class="s">&quot;</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;application/atom+xml&quot;</span> <span class="na">rel</span><span class="o">=</span><span class="s">&quot;alternate&quot;</span> <span class="na">title</span><span class="o">=</span><span class="s">&quot;</span><span class="cp">{{</span> <span class="nv">SITENAME</span> <span class="cp">}}</span><span class="s"> Atom Feed&quot;</span> <span class="p">/&gt;</span>
        <span class="cp">{%</span> <span class="k">endif</span> <span class="cp">%}</span>
        <span class="cp">{%</span> <span class="k">if</span> <span class="nv">FEED_ALL_RSS</span> <span class="cp">%}</span>
        <span class="p">&lt;</span><span class="nt">link</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;</span><span class="cp">{{</span> <span class="nv">FEED_DOMAIN</span> <span class="cp">}}</span><span class="s">/</span><span class="cp">{{</span> <span class="nv">FEED_ALL_RSS</span> <span class="cp">}}</span><span class="s">&quot;</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;application/rss+xml&quot;</span> <span class="na">rel</span><span class="o">=</span><span class="s">&quot;alternate&quot;</span> <span class="na">title</span><span class="o">=</span><span class="s">&quot;</span><span class="cp">{{</span> <span class="nv">SITENAME</span> <span class="cp">}}</span><span class="s"> RSS Feed&quot;</span> <span class="p">/&gt;</span>
        <span class="cp">{%</span> <span class="k">endif</span> <span class="cp">%}</span>
<span class="p">&lt;/</span><span class="nt">head</span><span class="p">&gt;</span>

<span class="p">&lt;</span><span class="nt">body</span> <span class="na">id</span><span class="o">=</span><span class="s">&quot;index&quot;</span> <span class="na">class</span><span class="o">=</span><span class="s">&quot;home&quot;</span><span class="p">&gt;</span>
    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">&quot;wrapper&quot;</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">&quot;topNav&quot;</span><span class="p">&gt;</span>
            <span class="p">&lt;</span><span class="nt">ul</span><span class="p">&gt;</span>
                <span class="p">&lt;</span><span class="nt">li</span><span class="p">&gt;&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;/archives.html&quot;</span><span class="p">&gt;</span>Archives<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
                <span class="p">&lt;</span><span class="nt">li</span><span class="p">&gt;&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;</span><span class="cp">{{</span> <span class="nv">FEED_DOMAIN</span> <span class="cp">}}</span><span class="s">/</span><span class="cp">{{</span> <span class="nv">FEED_ADD_RSS</span> <span class="cp">}}</span><span class="s">&quot;</span><span class="p">&gt;</span>RSS<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
            <span class="p">&lt;/</span><span class="nt">ul</span><span class="p">&gt;</span>
        <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">&quot;contentHolder&quot;</span><span class="p">&gt;</span>
            <span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">&quot;mastHead&quot;</span><span class="p">&gt;</span>
                <span class="p">&lt;</span><span class="nt">h1</span><span class="p">&gt;&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;</span><span class="cp">{{</span> <span class="nv">SITEURL</span> <span class="cp">}}</span><span class="s">/&quot;</span><span class="p">&gt;</span><span class="cp">{{</span> <span class="nv">SITENAME</span> <span class="cp">}}</span><span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;&lt;/</span><span class="nt">h1</span><span class="p">&gt;</span>
                <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>
                    <span class="p">&lt;</span><span class="nt">span</span> <span class="na">style</span><span class="o">=</span><span class="s">&quot;font-family: Arial&quot;</span><span class="p">&gt;</span><span class="cp">{{</span> <span class="nv">SITESUBTITLE</span> <span class="cp">}}</span><span class="p">&lt;/</span><span class="nt">span</span><span class="p">&gt;</span>
                <span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
            <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
            <span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">&quot;content&quot;</span><span class="p">&gt;</span>
                <span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">&quot;postHolder&quot;</span><span class="p">&gt;</span>
                    <span class="cp">{%</span> <span class="k">block</span> <span class="nv">content</span> <span class="cp">%}</span>
                    <span class="cp">{%</span> <span class="k">endblock</span> <span class="cp">%}</span>
                <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
            <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
        <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">&quot;footer&quot;</span><span class="p">&gt;</span>
            <span class="p">&lt;</span><span class="nt">p</span> <span class="na">style</span><span class="o">=</span><span class="s">&quot;text-align:center&quot;</span><span class="p">&gt;</span>
                Fièrement propulsé par <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;http://getpelican.com/&quot;</span><span class="p">&gt;</span>Pelican<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>,
                qui se repose sur <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;http://python.org&quot;</span><span class="p">&gt;</span>Python<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>.
            <span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>

            <span class="p">&lt;</span><span class="nt">p</span> <span class="na">style</span><span class="o">=</span><span class="s">&quot;text-align: center&quot;</span><span class="p">&gt;</span>Thème par
            <span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;http://daelan.com/&quot;</span><span class="p">&gt;</span>Daelan<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>, merci !<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
        <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span><span class="c">&lt;!-- /#contentinfo --&gt;</span>
    <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
<span class="p">&lt;/</span><span class="nt">body</span><span class="p">&gt;</span>
<span class="p">&lt;/</span><span class="nt">html</span><span class="p">&gt;</span>
</code></pre></div>

<p>article.html</p>
<div class="codehilite"><pre><span></span><code><span class="cp">{%</span> <span class="k">extends</span> <span class="s2">&quot;base.html&quot;</span> <span class="cp">%}</span><span class="x"></span>
<span class="cp">{%</span> <span class="k">block</span> <span class="nv">title</span> <span class="cp">%}{{</span> <span class="nv">article.title</span><span class="o">|</span><span class="nf">striptags</span> <span class="cp">}}</span><span class="x"> — </span><span class="cp">{{</span> <span class="nv">SITENAME</span> <span class="cp">}}{%</span>
    <span class="k">endblock</span> <span class="cp">%}</span><span class="x"></span>
<span class="cp">{%</span> <span class="k">block</span> <span class="nv">content</span> <span class="cp">%}</span><span class="x"></span>
<span class="x">    </span><span class="cp">{%</span> <span class="k">include</span> <span class="s1">&#39;article_infos.html&#39;</span> <span class="cp">%}</span><span class="x"></span>
<span class="cp">{%</span> <span class="k">endblock</span> <span class="cp">%}</span><span class="x"></span>
</code></pre></div>

<p>article_infos.html</p>
<div class="codehilite"><pre><span></span><code><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;post&quot;</span><span class="nt">&gt;</span>
    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;labels&quot;</span><span class="nt">&gt;</span>
        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;date&quot;</span><span class="nt">&gt;</span>
            <span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">&quot;</span><span class="cp">{{</span> <span class="nv">SITEURL</span> <span class="cp">}}</span><span class="s">/</span><span class="cp">{{</span> <span class="nv">article.url</span> <span class="cp">}}</span><span class="s">&quot;</span><span class="nt">&gt;</span>
                <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;month&quot;</span><span class="nt">&gt;</span><span class="cp">{{</span> <span class="nv">article.date.strftime</span><span class="o">(</span><span class="s1">&#39;%d %m&#39;</span><span class="o">)</span> <span class="cp">}}</span><span class="nt">&lt;/span&gt;</span> 
                <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;year&quot;</span><span class="nt">&gt;</span><span class="cp">{{</span> <span class="nv">article.date.year</span> <span class="cp">}}</span><span class="nt">&lt;/span&gt;</span>
            <span class="nt">&lt;/a&gt;</span>
        <span class="nt">&lt;/div&gt;</span>
        <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;navigation&quot;</span> <span class="na">style=</span><span class="s">&quot;position: absolute; top:0; right: 0;&quot;</span><span class="nt">&gt;</span>
            <span class="cp">{%</span> <span class="k">if</span> <span class="nv">article.prev_article</span> <span class="cp">%}</span>
                <span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">&quot;</span><span class="cp">{{</span> <span class="nv">article.prev_article.url</span> <span class="cp">}}</span><span class="s">&quot;</span><span class="nt">&gt;&lt;b&gt;</span>«<span class="nt">&lt;/b&gt;&lt;/a&gt;</span>
            <span class="cp">{%</span> <span class="k">endif</span> <span class="cp">%}</span>
            <span class="cp">{%</span> <span class="k">if</span> <span class="nv">article.next_article</span> <span class="cp">%}</span>
                <span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">&quot;</span><span class="cp">{{</span> <span class="nv">article.next_article.url</span> <span class="cp">}}</span><span class="s">&quot;</span><span class="nt">&gt;&lt;b&gt;</span>»<span class="nt">&lt;/b&gt;&lt;/a&gt;</span>
            <span class="cp">{%</span> <span class="k">endif</span> <span class="cp">%}</span>
        <span class="nt">&lt;/div&gt;</span>
    <span class="nt">&lt;/div&gt;</span>
    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;photo&quot;</span><span class="nt">&gt;</span>
        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;permalink&quot;</span><span class="nt">&gt;</span>
            <span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">&quot;</span><span class="cp">{{</span> <span class="nv">SITEURL</span> <span class="cp">}}</span><span class="s">/</span><span class="cp">{{</span> <span class="nv">article.url</span> <span class="cp">}}</span><span class="s">&quot;</span><span class="nt">&gt;</span>+<span class="nt">&lt;/a&gt;</span>
            <span class="cp">{{</span> <span class="nv">article.content</span> <span class="cp">}}</span>

            <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;caption&quot;</span><span class="nt">&gt;&lt;p&gt;</span><span class="cp">{{</span> <span class="nv">article.title</span> <span class="cp">}}</span><span class="nt">&lt;/p&gt;&lt;/div&gt;</span>
        <span class="nt">&lt;/div&gt;</span>
    <span class="nt">&lt;/div&gt;</span>
<span class="nt">&lt;/div&gt;</span>
</code></pre></div>

<p>Un dernier détail : le CSS. J’ai copié bêtement le CSS du site cible,
que j’ai mis dans template/css/main.css :</p>
<div class="codehilite"><pre><span></span><code><span class="cm">/* -- reset this mutha!  -- */</span>
<span class="s s-Atom">html</span><span class="p">,</span> <span class="s s-Atom">body</span><span class="p">,</span> <span class="o">div</span><span class="p">,</span> <span class="s s-Atom">span</span><span class="p">,</span> <span class="s s-Atom">applet</span><span class="p">,</span> <span class="s s-Atom">object</span><span class="p">,</span> <span class="s s-Atom">iframe</span><span class="p">,</span>
<span class="s s-Atom">h1</span><span class="p">,</span> <span class="s s-Atom">h2</span><span class="p">,</span> <span class="s s-Atom">h3</span><span class="p">,</span> <span class="s s-Atom">h4</span><span class="p">,</span> <span class="s s-Atom">h5</span><span class="p">,</span> <span class="s s-Atom">h6</span><span class="p">,</span> <span class="s s-Atom">p</span><span class="p">,</span> <span class="s s-Atom">blockquote</span><span class="p">,</span> <span class="s s-Atom">pre</span><span class="p">,</span>
<span class="s s-Atom">a</span><span class="p">,</span> <span class="s s-Atom">abbr</span><span class="p">,</span> <span class="s s-Atom">acronym</span><span class="p">,</span> <span class="s s-Atom">address</span><span class="p">,</span> <span class="s s-Atom">big</span><span class="p">,</span> <span class="s s-Atom">cite</span><span class="p">,</span> <span class="s s-Atom">code</span><span class="p">,</span>
<span class="s s-Atom">del</span><span class="p">,</span> <span class="s s-Atom">dfn</span><span class="p">,</span> <span class="s s-Atom">em</span><span class="p">,</span> <span class="s s-Atom">font</span><span class="p">,</span> <span class="s s-Atom">img</span><span class="p">,</span> <span class="s s-Atom">ins</span><span class="p">,</span> <span class="s s-Atom">kbd</span><span class="p">,</span> <span class="s s-Atom">q</span><span class="p">,</span> <span class="s s-Atom">s</span><span class="p">,</span> <span class="s s-Atom">samp</span><span class="p">,</span>
<span class="s s-Atom">small</span><span class="p">,</span> <span class="s s-Atom">strike</span><span class="p">,</span> <span class="s s-Atom">strong</span><span class="p">,</span> <span class="s s-Atom">sub</span><span class="p">,</span> <span class="s s-Atom">sup</span><span class="p">,</span> <span class="s s-Atom">tt</span><span class="p">,</span> <span class="s s-Atom">var</span><span class="p">,</span>
<span class="s s-Atom">b</span><span class="p">,</span> <span class="s s-Atom">u</span><span class="p">,</span> <span class="s s-Atom">i</span><span class="p">,</span> <span class="s s-Atom">center</span><span class="p">,</span>
<span class="s s-Atom">dl</span><span class="p">,</span> <span class="s s-Atom">dt</span><span class="p">,</span> <span class="s s-Atom">dd</span><span class="p">,</span> <span class="s s-Atom">ol</span><span class="p">,</span> <span class="s s-Atom">ul</span><span class="p">,</span> <span class="s s-Atom">li</span><span class="p">,</span>
<span class="s s-Atom">fieldset</span><span class="p">,</span> <span class="s s-Atom">form</span><span class="p">,</span> <span class="s s-Atom">label</span><span class="p">,</span> <span class="s s-Atom">legend</span><span class="p">,</span>
<span class="s s-Atom">table</span><span class="p">,</span> <span class="s s-Atom">caption</span><span class="p">,</span> <span class="s s-Atom">tbody</span><span class="p">,</span> <span class="s s-Atom">tfoot</span><span class="p">,</span> <span class="s s-Atom">thead</span><span class="p">,</span> <span class="s s-Atom">tr</span><span class="p">,</span> <span class="s s-Atom">th</span><span class="p">,</span> <span class="s s-Atom">td</span> <span class="p">{</span>
    <span class="nn">margin</span><span class="p">:</span> <span class="mi">0</span><span class="p">;</span>
    <span class="nn">padding</span><span class="p">:</span> <span class="mi">0</span><span class="p">;</span>
    <span class="nn">border</span><span class="p">:</span> <span class="mi">0</span><span class="p">;</span>
    <span class="nn">outline</span><span class="p">:</span> <span class="mi">0</span><span class="p">;</span>
    <span class="s s-Atom">font</span><span class="o">-</span><span class="nn">size</span><span class="p">:</span> <span class="mi">100</span><span class="c1">%;</span>
    <span class="s s-Atom">vertical</span><span class="o">-</span><span class="nn">align</span><span class="p">:</span> <span class="s s-Atom">baseline</span><span class="p">;</span>
    <span class="nn">background</span><span class="p">:</span> <span class="s s-Atom">transparent</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">body</span> <span class="p">{</span>
    <span class="s s-Atom">line</span><span class="o">-</span><span class="nn">height</span><span class="p">:</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">ol</span><span class="p">,</span> <span class="s s-Atom">ul</span> <span class="p">{</span>
    <span class="s s-Atom">list</span><span class="o">-</span><span class="nn">style</span><span class="p">:</span> <span class="s s-Atom">none</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">blockquote</span><span class="p">,</span> <span class="s s-Atom">q</span> <span class="p">{</span>
    <span class="nn">quotes</span><span class="p">:</span> <span class="s s-Atom">none</span><span class="p">;</span>
<span class="p">}</span>

<span class="nn">blockquote</span><span class="p">:</span><span class="s s-Atom">before</span><span class="p">,</span> <span class="nn">blockquote</span><span class="p">:</span><span class="s s-Atom">after</span><span class="p">,</span>
<span class="nn">q</span><span class="p">:</span><span class="s s-Atom">before</span><span class="p">,</span> <span class="nn">q</span><span class="p">:</span><span class="s s-Atom">after</span> <span class="p">{</span>
    <span class="nn">content</span><span class="p">:</span> <span class="s s-Atom">&#39;&#39;</span><span class="p">;</span>
    <span class="nn">content</span><span class="p">:</span> <span class="s s-Atom">none</span><span class="p">;</span>
<span class="p">}</span>

<span class="cm">/* remember to define focus styles! */</span>
<span class="s s-Atom">:focus</span> <span class="p">{</span>
    <span class="nn">outline</span><span class="p">:</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

<span class="cm">/* remember to highlight inserts somehow! */</span>
<span class="s s-Atom">ins</span> <span class="p">{</span>
    <span class="s s-Atom">text</span><span class="o">-</span><span class="nn">decoration</span><span class="p">:</span> <span class="s s-Atom">none</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">del</span> <span class="p">{</span>
    <span class="s s-Atom">text</span><span class="o">-</span><span class="nn">decoration</span><span class="p">:</span> <span class="s s-Atom">line</span><span class="o">-</span><span class="s s-Atom">through</span><span class="p">;</span>
<span class="p">}</span>

<span class="cm">/* -- end reset  -- */</span>

<span class="s s-Atom">body</span><span class="p">{</span>
    <span class="nn">margin</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
    <span class="nn">padding</span><span class="p">:</span><span class="mi">6</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="s s-Atom">text</span><span class="o">-</span><span class="nn">align</span><span class="p">:</span><span class="s s-Atom">center</span><span class="p">;</span>
    <span class="s s-Atom">font</span><span class="o">-</span><span class="nn">family</span><span class="p">:</span> <span class="nv">Helvetica</span><span class="p">,</span> <span class="nv">Arial</span><span class="p">,</span> <span class="nv">Verdana</span><span class="p">,</span> <span class="nv">Sans</span><span class="o">-</span><span class="nv">Serif</span><span class="p">;</span>
    <span class="nn">background</span><span class="p">:</span> <span class="s s-Atom">#fff</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#wrapper</span><span class="p">{</span>
    <span class="nn">width</span><span class="p">:</span><span class="mi">895</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="nn">height</span><span class="p">:</span><span class="s s-Atom">auto</span><span class="p">;</span>
    <span class="nn">margin</span><span class="p">:</span><span class="mi">0</span> <span class="s s-Atom">auto</span><span class="p">;</span>
    <span class="nn">padding</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
    <span class="s s-Atom">text</span><span class="o">-</span><span class="nn">align</span><span class="p">:</span><span class="s s-Atom">left</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#topNav</span><span class="p">{</span>
    <span class="nn">position</span><span class="p">:</span><span class="s s-Atom">relative</span><span class="p">;</span>
    <span class="nn">float</span><span class="p">:</span><span class="s s-Atom">left</span><span class="p">;</span>
    <span class="nn">width</span><span class="p">:</span><span class="mi">895</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="nn">height</span><span class="p">:</span><span class="mi">90</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="nn">margin</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
    <span class="nn">padding</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#topNav</span> <span class="s s-Atom">ul</span><span class="p">{</span>
    <span class="nn">position</span><span class="p">:</span><span class="s s-Atom">relative</span><span class="p">;</span>
    <span class="nn">float</span><span class="p">:</span><span class="s s-Atom">right</span><span class="p">;</span>
    <span class="nn">margin</span><span class="p">:</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#topNav</span> <span class="s s-Atom">ul</span> <span class="s s-Atom">li</span><span class="p">{</span>
    <span class="nn">position</span><span class="p">:</span><span class="s s-Atom">relative</span><span class="p">;</span>
    <span class="nn">float</span><span class="p">:</span><span class="s s-Atom">left</span><span class="p">;</span>
    <span class="nn">margin</span><span class="p">:</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">20</span><span class="s s-Atom">px</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#topNav</span> <span class="s s-Atom">ul</span> <span class="s s-Atom">li</span> <span class="nn">a</span><span class="p">:</span><span class="s s-Atom">link</span><span class="p">,</span><span class="s s-Atom">#topNav</span> <span class="s s-Atom">ul</span> <span class="s s-Atom">li</span> <span class="nn">a</span><span class="p">:</span><span class="s s-Atom">visited</span><span class="p">{</span>
    <span class="s s-Atom">font</span><span class="o">-</span><span class="nn">size</span><span class="p">:</span><span class="mi">12</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="nn">color</span><span class="p">:</span><span class="s s-Atom">#</span><span class="mi">000000</span><span class="p">;</span>
    <span class="s s-Atom">text</span><span class="o">-</span><span class="nn">decoration</span><span class="p">:</span><span class="s s-Atom">none</span><span class="p">;</span>
    <span class="nn">background</span><span class="p">:</span><span class="s s-Atom">#</span><span class="nv">FFFFFF</span><span class="p">;</span>
    <span class="nn">border</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
    <span class="nn">padding</span><span class="p">:</span><span class="mi">3</span><span class="s s-Atom">px</span> <span class="mi">6</span><span class="s s-Atom">px</span> <span class="mi">3</span><span class="s s-Atom">px</span> <span class="mi">6</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="s s-Atom">line</span><span class="o">-</span><span class="nn">height</span><span class="p">:</span><span class="mi">18</span><span class="s s-Atom">px</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#topNav</span> <span class="s s-Atom">ul</span> <span class="s s-Atom">li</span> <span class="nn">a</span><span class="p">:</span><span class="s s-Atom">hover</span><span class="p">{</span>
    <span class="nn">color</span><span class="p">:</span><span class="s s-Atom">#</span><span class="nv">FFFFFF</span><span class="p">;</span>
    <span class="nn">background</span><span class="p">:</span><span class="s s-Atom">#</span><span class="mi">0000</span><span class="nv">FF</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#contentHolder</span><span class="p">{</span>
    <span class="nn">position</span><span class="p">:</span><span class="s s-Atom">relative</span><span class="p">;</span>
    <span class="nn">float</span><span class="p">:</span><span class="s s-Atom">left</span><span class="p">;</span>
    <span class="nn">width</span><span class="p">:</span><span class="mi">895</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="nn">height</span><span class="p">:</span><span class="s s-Atom">auto</span><span class="p">;</span>
    <span class="s s-Atom">min</span><span class="o">-</span><span class="nn">height</span><span class="p">:</span> <span class="mi">500</span><span class="s s-Atom">px</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#mastHead</span><span class="p">{</span>
    <span class="nn">position</span><span class="p">:</span><span class="s s-Atom">relative</span><span class="p">;</span>
    <span class="nn">float</span><span class="p">:</span><span class="s s-Atom">left</span><span class="p">;</span>
    <span class="nn">width</span><span class="p">:</span><span class="mi">395</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="nn">height</span><span class="p">:</span><span class="s s-Atom">auto</span><span class="p">;</span>
    <span class="nn">margin</span><span class="p">:</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">;</span>
    <span class="nn">display</span><span class="p">:</span><span class="s s-Atom">inline</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#mastHead</span> <span class="s s-Atom">h1</span><span class="p">{</span>
    <span class="nn">margin</span><span class="p">:</span><span class="mi">9</span><span class="s s-Atom">px</span> <span class="mi">18</span><span class="s s-Atom">px</span> <span class="mi">18</span><span class="s s-Atom">px</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#mastHead</span> <span class="s s-Atom">h1</span> <span class="nn">a</span><span class="p">:</span><span class="s s-Atom">link</span><span class="p">,</span><span class="s s-Atom">#mastHead</span> <span class="s s-Atom">h1</span> <span class="nn">a</span><span class="p">:</span><span class="s s-Atom">visited</span><span class="p">{</span>
    <span class="s s-Atom">letter</span><span class="o">-</span><span class="nn">spacing</span><span class="p">:</span><span class="o">-</span><span class="mi">2</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="s s-Atom">font</span><span class="o">-</span><span class="nn">size</span><span class="p">:</span><span class="mi">36</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="nn">background</span><span class="p">:</span><span class="s s-Atom">#</span><span class="mi">0000</span><span class="nv">FF</span><span class="p">;</span>
    <span class="nn">padding</span><span class="p">:</span><span class="mi">18</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="s s-Atom">line</span><span class="o">-</span><span class="nn">height</span><span class="p">:</span><span class="mi">54</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="nn">border</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
    <span class="s s-Atom">text</span><span class="o">-</span><span class="nn">decoration</span><span class="p">:</span><span class="s s-Atom">none</span><span class="p">;</span>
    <span class="nn">color</span><span class="p">:</span><span class="s s-Atom">#</span><span class="nv">FFFFFF</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#mastHead</span> <span class="s s-Atom">h1</span> <span class="nn">a</span><span class="p">:</span><span class="s s-Atom">hover</span><span class="p">{</span>
    <span class="nn">background</span><span class="p">:</span><span class="s s-Atom">#</span><span class="mi">0000</span><span class="nv">FF</span><span class="p">;</span>
    <span class="nn">color</span><span class="p">:</span><span class="s s-Atom">#</span><span class="mi">000000</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#mastHead</span> <span class="s s-Atom">p</span><span class="p">{</span>
    <span class="s s-Atom">font</span><span class="o">-</span><span class="nn">family</span><span class="p">:</span><span class="nv">Georgia</span><span class="p">,</span> <span class="s2">&quot;Times New Roman&quot;</span><span class="p">,</span> <span class="nv">Serif</span><span class="p">;</span>
    <span class="s s-Atom">font</span><span class="o">-</span><span class="nn">family</span><span class="p">:</span><span class="s s-Atom">#</span><span class="mi">000000</span><span class="p">;</span>
    <span class="s s-Atom">font</span><span class="o">-</span><span class="nn">size</span><span class="p">:</span><span class="mi">11</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="nn">padding</span><span class="p">:</span><span class="mi">9</span><span class="s s-Atom">px</span> <span class="mi">36</span><span class="s s-Atom">px</span> <span class="mi">9</span><span class="s s-Atom">px</span> <span class="mi">18</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="s s-Atom">line</span><span class="o">-</span><span class="nn">height</span><span class="p">:</span><span class="mi">18</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="nn">margin</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#mastHead</span> <span class="s s-Atom">form</span><span class="p">{</span>
    <span class="nn">padding</span><span class="p">:</span><span class="mi">9</span><span class="s s-Atom">px</span> <span class="mi">18</span><span class="s s-Atom">px</span> <span class="mi">9</span><span class="s s-Atom">px</span> <span class="mi">18</span><span class="s s-Atom">px</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#mastHead</span> <span class="s s-Atom">input</span><span class="p">{</span>
    <span class="nn">padding</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
    <span class="nn">margin</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#mastHead</span> <span class="nn">a</span><span class="p">:</span><span class="s s-Atom">link</span><span class="p">,</span> <span class="s s-Atom">#mastHead</span> <span class="nn">a</span><span class="p">:</span><span class="s s-Atom">visited</span><span class="p">{</span>
    <span class="s s-Atom">text</span><span class="o">-</span><span class="nn">decoration</span><span class="p">:</span><span class="s s-Atom">none</span><span class="p">;</span>
    <span class="nn">color</span><span class="p">:</span><span class="s s-Atom">#</span><span class="mi">0000</span><span class="nv">FF</span><span class="p">;</span>
    <span class="s s-Atom">border</span><span class="o">-</span><span class="nn">bottom</span><span class="p">:</span> <span class="mi">1</span><span class="s s-Atom">px</span> <span class="s s-Atom">dotted</span> <span class="s s-Atom">#</span><span class="nv">FFFFFF</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#mastHead</span> <span class="nn">a</span><span class="p">:</span><span class="s s-Atom">hover</span><span class="p">{</span>
    <span class="s s-Atom">text</span><span class="o">-</span><span class="nn">decoration</span><span class="p">:</span><span class="s s-Atom">none</span><span class="p">;</span>
    <span class="nn">color</span><span class="p">:</span><span class="s s-Atom">#</span><span class="mi">0000</span><span class="nv">FF</span><span class="p">;</span>
    <span class="s s-Atom">border</span><span class="o">-</span><span class="nn">bottom</span><span class="p">:</span> <span class="mi">1</span><span class="s s-Atom">px</span> <span class="s s-Atom">dotted</span> <span class="s s-Atom">#</span><span class="nv">FFFFFF</span><span class="p">;</span>
<span class="p">}</span>

<span class="o">div</span><span class="p">.</span><span class="s s-Atom">photo</span> <span class="s s-Atom">img</span><span class="p">{</span>
    <span class="nn">border</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">a</span><span class="p">.</span><span class="s s-Atom">hyperLink:link</span><span class="p">,</span><span class="s s-Atom">a</span><span class="p">.</span><span class="s s-Atom">hyperLink:visited</span><span class="p">{</span>
    <span class="nn">color</span><span class="p">:</span><span class="s s-Atom">#</span><span class="mi">0000</span><span class="nv">FF</span><span class="p">;</span>
    <span class="s s-Atom">text</span><span class="o">-</span><span class="nn">decoration</span><span class="p">:</span><span class="s s-Atom">none</span><span class="p">;</span>
    <span class="s s-Atom">font</span><span class="o">-</span><span class="nn">size</span><span class="p">:</span><span class="mi">18</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="s s-Atom">line</span><span class="o">-</span><span class="nn">height</span><span class="p">:</span><span class="mi">18</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="s s-Atom">font</span><span class="o">-</span><span class="nn">weight</span><span class="p">:</span><span class="s s-Atom">bold</span><span class="p">;</span>
    <span class="nn">border</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">a</span><span class="p">.</span><span class="s s-Atom">hyperLink:hover</span><span class="p">{</span>
    <span class="nn">color</span><span class="p">:</span><span class="s s-Atom">#</span><span class="nv">FFFFFF</span><span class="p">;</span>
<span class="p">}</span>

<span class="p">.</span><span class="s s-Atom">description</span><span class="p">{</span>
    <span class="nn">position</span><span class="p">:</span><span class="s s-Atom">relative</span><span class="p">;</span>
    <span class="nn">float</span><span class="p">:</span><span class="s s-Atom">left</span><span class="p">;</span>
    <span class="nn">width</span><span class="p">:</span><span class="mi">100</span><span class="c1">%;</span>
    <span class="nn">height</span><span class="p">:</span><span class="s s-Atom">auto</span><span class="p">;</span>
    <span class="nn">margin</span><span class="p">:</span><span class="mi">18</span><span class="s s-Atom">px</span> <span class="mi">0</span> <span class="mi">18</span><span class="s s-Atom">px</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

<span class="p">.</span><span class="s s-Atom">post</span><span class="p">{</span>
    <span class="nn">position</span><span class="p">:</span><span class="s s-Atom">relative</span><span class="p">;</span>
    <span class="nn">float</span><span class="p">:</span><span class="s s-Atom">left</span><span class="p">;</span>
    <span class="s s-Atom">border</span><span class="o">-</span><span class="nn">bottom</span><span class="p">:</span><span class="mi">1</span><span class="s s-Atom">px</span> <span class="s s-Atom">dotted</span> <span class="s s-Atom">#ccc</span><span class="p">;</span>
    <span class="nn">padding</span><span class="p">:</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">18</span><span class="s s-Atom">px</span> <span class="mi">0</span><span class="p">;</span>
    <span class="nn">width</span><span class="p">:</span><span class="mi">100</span><span class="c1">%;</span>
    <span class="nn">height</span><span class="p">:</span><span class="s s-Atom">auto</span><span class="p">;</span>
    <span class="s s-Atom">font</span><span class="o">-</span><span class="nn">size</span><span class="p">:</span><span class="mi">11</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="s s-Atom">line</span><span class="o">-</span><span class="nn">height</span><span class="p">:</span><span class="mi">18</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="nn">margin</span><span class="p">:</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">18</span><span class="s s-Atom">px</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

<span class="p">.</span><span class="s s-Atom">labels</span><span class="p">{</span>
    <span class="nn">margin</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
    <span class="nn">padding</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#content</span><span class="p">{</span>
    <span class="nn">position</span><span class="p">:</span><span class="s s-Atom">relative</span><span class="p">;</span>
    <span class="nn">float</span><span class="p">:</span><span class="s s-Atom">left</span><span class="p">;</span>
    <span class="nn">width</span><span class="p">:</span><span class="mi">500</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="nn">height</span><span class="p">:</span><span class="s s-Atom">auto</span><span class="p">;</span>
    <span class="nn">margin</span><span class="p">:</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">;</span>
    <span class="nn">display</span><span class="p">:</span><span class="s s-Atom">inline</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#content</span> <span class="s s-Atom">p</span><span class="p">{</span>
    <span class="s s-Atom">font</span><span class="o">-</span><span class="nn">size</span><span class="p">:</span><span class="mi">11</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="s s-Atom">line</span><span class="o">-</span><span class="nn">height</span><span class="p">:</span><span class="mi">18</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="nn">margin</span><span class="p">:</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">18</span><span class="s s-Atom">px</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#content</span> <span class="s s-Atom">h2</span><span class="p">{</span>
    <span class="nn">position</span><span class="p">:</span><span class="s s-Atom">relative</span><span class="p">;</span>
    <span class="nn">float</span><span class="p">:</span><span class="s s-Atom">left</span><span class="p">;</span>
    <span class="nn">width</span><span class="p">:</span><span class="mi">500</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="nn">padding</span><span class="p">:</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">;</span>
    <span class="nn">height</span><span class="p">:</span><span class="s s-Atom">auto</span><span class="p">;</span>
    <span class="s s-Atom">line</span><span class="o">-</span><span class="nn">height</span><span class="p">:</span><span class="mi">18</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="s s-Atom">font</span><span class="o">-</span><span class="nn">size</span><span class="p">:</span><span class="mi">18</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="nn">margin</span><span class="p">:</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">18</span><span class="s s-Atom">px</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#content</span> <span class="s s-Atom">h2</span> <span class="nn">a</span><span class="p">:</span><span class="s s-Atom">link</span><span class="p">,</span><span class="s s-Atom">#content</span> <span class="s s-Atom">h2</span> <span class="nn">a</span><span class="p">:</span><span class="s s-Atom">visited</span><span class="p">{</span>
    <span class="nn">color</span><span class="p">:</span><span class="s s-Atom">#</span><span class="mi">0000</span><span class="nv">FF</span><span class="p">;</span>
    <span class="s s-Atom">text</span><span class="o">-</span><span class="nn">decoration</span><span class="p">:</span><span class="s s-Atom">none</span><span class="p">;</span>
    <span class="nn">border</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#content</span> <span class="s s-Atom">h2</span> <span class="nn">a</span><span class="p">:</span><span class="s s-Atom">hover</span><span class="p">{</span>
    <span class="nn">color</span><span class="p">:</span><span class="s s-Atom">#</span><span class="nv">FFFFFF</span><span class="p">;</span>
<span class="p">}</span>

<span class="p">.</span><span class="s s-Atom">date</span><span class="p">{</span>
    <span class="s s-Atom">border</span><span class="o">-</span><span class="nn">bottom</span><span class="p">:</span><span class="mi">1</span><span class="s s-Atom">px</span> <span class="s s-Atom">dotted</span> <span class="s s-Atom">#</span><span class="mi">666</span><span class="p">;</span>
    <span class="nn">float</span><span class="p">:</span><span class="s s-Atom">left</span><span class="p">;</span>
    <span class="s s-Atom">font</span><span class="o">-</span><span class="nn">size</span><span class="p">:</span><span class="mi">18</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="s s-Atom">font</span><span class="o">-</span><span class="nn">weight</span><span class="p">:</span><span class="s s-Atom">bold</span><span class="p">;</span>
    <span class="s s-Atom">letter</span><span class="o">-</span><span class="nn">spacing</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="nn">margin</span><span class="p">:</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">18</span><span class="s s-Atom">px</span> <span class="mi">0</span><span class="p">;</span>
    <span class="nn">padding</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
    <span class="nn">position</span><span class="p">:</span><span class="s s-Atom">relative</span><span class="p">;</span>
    <span class="s s-Atom">text</span><span class="o">-</span><span class="nn">transform</span><span class="p">:</span><span class="s s-Atom">uppercase</span><span class="p">;</span>
    <span class="s s-Atom">line</span><span class="o">-</span><span class="nn">height</span><span class="p">:</span><span class="mi">18</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="nn">width</span><span class="p">:</span><span class="mi">500</span><span class="s s-Atom">px</span><span class="p">;</span>
<span class="p">}</span>

<span class="p">.</span><span class="s s-Atom">year</span><span class="p">{</span>
    <span class="nn">color</span><span class="p">:</span><span class="s s-Atom">#</span><span class="mi">0000</span><span class="s s-Atom">ff</span><span class="p">;</span>
    <span class="s s-Atom">letter</span><span class="o">-</span><span class="nn">spacing</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

<span class="p">.</span><span class="s s-Atom">month</span><span class="p">{</span>
    <span class="nn">color</span><span class="p">:</span><span class="s s-Atom">#</span><span class="mi">0000</span><span class="nv">FF</span><span class="p">;</span>
    <span class="s s-Atom">letter</span><span class="o">-</span><span class="nn">spacing</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#content</span> <span class="nn">a</span><span class="p">:</span><span class="s s-Atom">link</span><span class="p">,</span> <span class="s s-Atom">#content</span> <span class="nn">a</span><span class="p">:</span><span class="s s-Atom">visited</span><span class="p">{</span>
    <span class="s s-Atom">text</span><span class="o">-</span><span class="nn">decoration</span><span class="p">:</span><span class="s s-Atom">none</span><span class="p">;</span>
    <span class="nn">color</span><span class="p">:</span><span class="s s-Atom">#</span><span class="mi">0000</span><span class="nv">FF</span><span class="p">;</span>
    <span class="s s-Atom">border</span><span class="o">-</span><span class="nn">bottom</span><span class="p">:</span> <span class="mi">1</span><span class="s s-Atom">px</span> <span class="s s-Atom">dotted</span> <span class="s s-Atom">#</span><span class="nv">FFFFFF</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#content</span> <span class="nn">a</span><span class="p">:</span><span class="s s-Atom">hover</span><span class="p">{</span>
    <span class="s s-Atom">text</span><span class="o">-</span><span class="nn">decoration</span><span class="p">:</span><span class="s s-Atom">none</span><span class="p">;</span>
    <span class="nn">color</span><span class="p">:</span><span class="s s-Atom">#</span><span class="mi">0000</span><span class="nv">FF</span><span class="p">;</span>
    <span class="s s-Atom">border</span><span class="o">-</span><span class="nn">bottom</span><span class="p">:</span> <span class="mi">1</span><span class="s s-Atom">px</span> <span class="s s-Atom">dotted</span> <span class="s s-Atom">#</span><span class="nv">FFFFFF</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#footer</span><span class="p">{</span>
    <span class="nn">position</span><span class="p">:</span><span class="s s-Atom">relative</span><span class="p">;</span>
    <span class="nn">float</span><span class="p">:</span><span class="s s-Atom">left</span><span class="p">;</span>
    <span class="nn">width</span><span class="p">:</span><span class="mi">895</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="nn">height</span><span class="p">:</span><span class="s s-Atom">auto</span><span class="p">;</span>
    <span class="s s-Atom">border</span><span class="o">-</span><span class="nn">top</span><span class="p">:</span><span class="mi">1</span><span class="s s-Atom">px</span> <span class="s s-Atom">dotted</span> <span class="s s-Atom">#efefef</span><span class="p">;</span>
    <span class="nn">padding</span><span class="p">:</span><span class="mi">18</span><span class="s s-Atom">px</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">;</span>
    <span class="nn">margin</span><span class="p">:</span><span class="mi">18</span><span class="s s-Atom">px</span> <span class="mi">0</span> <span class="mi">18</span><span class="s s-Atom">px</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#footer</span> <span class="s s-Atom">p</span><span class="p">{</span>
    <span class="s s-Atom">font</span><span class="o">-</span><span class="nn">size</span><span class="p">:</span><span class="mi">11</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="s s-Atom">line</span><span class="o">-</span><span class="nn">height</span><span class="p">:</span><span class="mi">18</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="nn">margin</span><span class="p">:</span><span class="mi">0</span> <span class="mi">20</span><span class="s s-Atom">px</span> <span class="mi">0</span> <span class="mi">20</span><span class="s s-Atom">px</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#footer</span> <span class="nn">a</span><span class="p">:</span><span class="s s-Atom">link</span><span class="p">,</span> <span class="s s-Atom">#footer</span> <span class="nn">a</span><span class="p">:</span><span class="s s-Atom">visited</span><span class="p">{</span>
    <span class="s s-Atom">text</span><span class="o">-</span><span class="nn">decoration</span><span class="p">:</span><span class="s s-Atom">none</span><span class="p">;</span>
    <span class="nn">color</span><span class="p">:</span><span class="s s-Atom">#</span><span class="mi">000</span><span class="p">;</span>
    <span class="s s-Atom">border</span><span class="o">-</span><span class="nn">bottom</span><span class="p">:</span> <span class="mi">1</span><span class="s s-Atom">px</span> <span class="s s-Atom">dotted</span> <span class="s s-Atom">#</span><span class="nv">FFFFFF</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#footer</span> <span class="nn">a</span><span class="p">:</span><span class="s s-Atom">hover</span><span class="p">{</span>
    <span class="s s-Atom">text</span><span class="o">-</span><span class="nn">decoration</span><span class="p">:</span><span class="s s-Atom">none</span><span class="p">;</span>
    <span class="nn">color</span><span class="p">:</span><span class="s s-Atom">#</span><span class="mi">0000</span><span class="nv">FF</span><span class="p">;</span>
    <span class="s s-Atom">border</span><span class="o">-</span><span class="nn">bottom</span><span class="p">:</span> <span class="mi">1</span><span class="s s-Atom">px</span> <span class="s s-Atom">dotted</span> <span class="s s-Atom">#</span><span class="nv">FFFFFF</span><span class="p">;</span>
<span class="p">}</span>

<span class="p">.</span><span class="s s-Atom">caption</span><span class="p">{</span>
    <span class="nn">position</span><span class="p">:</span><span class="s s-Atom">relative</span><span class="p">;</span>
    <span class="nn">float</span><span class="p">:</span><span class="s s-Atom">left</span><span class="p">;</span>
    <span class="nn">margin</span><span class="p">:</span><span class="mi">18</span><span class="s s-Atom">px</span> <span class="mi">0</span> <span class="mi">18</span><span class="s s-Atom">px</span> <span class="mi">0</span><span class="p">;</span>
    <span class="nn">width</span><span class="p">:</span><span class="mi">100</span><span class="c1">%;</span>
    <span class="nn">height</span><span class="p">:</span><span class="s s-Atom">auto</span><span class="p">;</span>
<span class="p">}</span>

<span class="p">.</span><span class="s s-Atom">regular</span><span class="p">,</span> <span class="p">.</span><span class="s s-Atom">quote</span><span class="p">,</span> <span class="p">.</span><span class="s s-Atom">video</span><span class="p">,</span> <span class="p">.</span><span class="s s-Atom">photo</span><span class="p">,</span> <span class="p">.</span><span class="s s-Atom">audio</span><span class="p">,</span> <span class="p">.</span><span class="s s-Atom">conversation</span><span class="p">,</span> <span class="p">.</span><span class="s s-Atom">link</span><span class="p">{</span>
    <span class="nn">position</span><span class="p">:</span><span class="s s-Atom">relative</span><span class="p">;</span>
    <span class="nn">float</span><span class="p">:</span><span class="s s-Atom">left</span><span class="p">;</span>
    <span class="nn">width</span><span class="p">:</span><span class="mi">100</span><span class="c1">%;</span>
    <span class="nn">height</span><span class="p">:</span><span class="s s-Atom">auto</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">big</span><span class="p">{</span>
    <span class="s s-Atom">font</span><span class="o">-</span><span class="nn">size</span><span class="p">:</span><span class="mi">24</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="s s-Atom">line</span><span class="o">-</span><span class="nn">height</span><span class="p">:</span><span class="mi">18</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="nn">padding</span><span class="p">:</span><span class="mi">0</span> <span class="mi">5</span><span class="s s-Atom">px</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

<span class="p">.</span><span class="s s-Atom">source</span><span class="p">{</span>
    <span class="nn">color</span><span class="p">:</span><span class="s s-Atom">#</span><span class="mi">666</span><span class="p">;</span>
<span class="p">}</span>

<span class="p">.</span><span class="s s-Atom">permalink</span><span class="p">{</span>
    <span class="nn">position</span><span class="p">:</span><span class="s s-Atom">absolute</span><span class="p">;</span>
    <span class="nn">top</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
    <span class="nn">left</span><span class="p">:</span><span class="o">-</span><span class="mi">18</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="nn">height</span><span class="p">:</span><span class="mi">18</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="nn">margin</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
    <span class="nn">padding</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
    <span class="s s-Atom">line</span><span class="o">-</span><span class="nn">height</span><span class="p">:</span><span class="mi">18</span><span class="s s-Atom">px</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#navigation</span> <span class="p">{</span>
    <span class="s s-Atom">font</span><span class="o">-</span><span class="nn">size</span><span class="p">:</span> <span class="mi">22</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="s s-Atom">font</span><span class="o">-</span><span class="nn">weight</span><span class="p">:</span> <span class="s s-Atom">bold</span><span class="p">;</span>
<span class="p">}</span>

<span class="s s-Atom">#pages</span><span class="p">{</span>
    <span class="s s-Atom">font</span><span class="o">-</span><span class="nn">weight</span><span class="p">:</span><span class="s s-Atom">normal</span><span class="p">;</span>
    <span class="nn">color</span><span class="p">:</span><span class="s s-Atom">#</span><span class="mi">999</span><span class="p">;</span>
    <span class="nn">padding</span><span class="p">:</span><span class="mi">0</span><span class="p">;</span>
    <span class="s s-Atom">font</span><span class="o">-</span><span class="nn">size</span><span class="p">:</span><span class="mi">11</span><span class="s s-Atom">px</span><span class="p">;</span>
    <span class="nn">margin</span><span class="p">:</span><span class="mi">10</span><span class="s s-Atom">px</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>

<p>Voilà tout pour la partie Pelican. Vous avez un beau site, vide mais
beau. Maintenant, remplissons-le dynamiquement.</p>
<h3>Le contenu</h3>
<p>Les sites bonjour* ont généralement une légende sous chaque photo.
Disons qu’on s’en fout. J’ai opté pour un fonctionnement minimaliste :
on pose des images dans un dossier, et le script, appelé une fois par
jour,  prend la plus ancienne pour en faire un article puis la supprime.</p>
<div class="codehilite"><pre><span></span><code><span class="c1"># -*- coding: utf-8 -*-</span>

<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">locale</span>
<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">date</span>
<span class="kn">import</span> <span class="nn">Image</span>

<span class="n">locale</span><span class="o">.</span><span class="n">setlocale</span><span class="p">(</span><span class="n">locale</span><span class="o">.</span><span class="n">LC_TIME</span><span class="p">,</span> <span class="s1">&#39;fr_FR.utf-8&#39;</span><span class="p">)</span>

<span class="n">content_dir</span> <span class="o">=</span> <span class="s1">&#39;content&#39;</span>
<span class="n">content_image_dir</span> <span class="o">=</span> <span class="s1">&#39;images&#39;</span>
<span class="n">source_dir</span> <span class="o">=</span> <span class="s1">&#39;source&#39;</span>
<span class="n">max_size</span> <span class="o">=</span> <span class="p">(</span><span class="mi">500</span><span class="p">,</span> <span class="mi">500</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">create_article</span><span class="p">(</span><span class="n">filename</span><span class="p">):</span>
    <span class="n">today</span> <span class="o">=</span> <span class="n">date</span><span class="o">.</span><span class="n">today</span><span class="p">()</span>
    <span class="n">output_filename</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">.jpg&#39;</span> <span class="o">%</span> <span class="n">today</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">&#39;%Y-%m-</span><span class="si">%d</span><span class="s1">&#39;</span><span class="p">)</span>
    <span class="n">im</span> <span class="o">=</span> <span class="n">Image</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">source_dir</span><span class="p">,</span> <span class="n">filename</span><span class="p">))</span>
    <span class="n">im</span><span class="o">.</span><span class="n">thumbnail</span><span class="p">(</span><span class="n">max_size</span><span class="p">)</span>
    <span class="n">im</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">content_dir</span><span class="p">,</span> <span class="n">content_image_dir</span><span class="p">,</span> <span class="n">output_filename</span><span class="p">))</span>

    <span class="n">article_vars</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;today_str&#39;</span><span class="p">:</span> <span class="n">date</span><span class="o">.</span><span class="n">today</span><span class="p">()</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">&#39;%a </span><span class="si">%d</span><span class="s1"> %b %Y&#39;</span><span class="p">),</span>
                    <span class="s1">&#39;date&#39;</span><span class="p">:</span> <span class="n">today</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">&#39;%Y-%m-</span><span class="si">%d</span><span class="s1">&#39;</span><span class="p">),</span>
                    <span class="s1">&#39;output_filename&#39;</span><span class="p">:</span> <span class="n">output_filename</span><span class="p">}</span>

    <span class="n">article</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;Title: </span><span class="si">%(today_str)s</span><span class="s2"></span>
<span class="s2">Date: </span><span class="si">%(date)s</span><span class="s2"></span>

<span class="s2">![</span><span class="si">%(today_str)s</span><span class="s2">](./images/</span><span class="si">%(output_filename)s</span><span class="s2">)&quot;&quot;&quot;</span> <span class="o">%</span> <span class="n">article_vars</span>
    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">content_dir</span><span class="p">,</span> <span class="n">output_filename</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;jpg&#39;</span><span class="p">,</span> <span class="s1">&#39;md&#39;</span><span class="p">)),</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">article_file</span><span class="p">:</span>
        <span class="n">article_file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">article</span><span class="p">)</span>

<span class="n">file_list</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="n">source_dir</span><span class="p">)</span>
<span class="n">oldest_file</span> <span class="o">=</span> <span class="bp">None</span>

<span class="k">for</span> <span class="n">cur_file</span> <span class="ow">in</span> <span class="n">file_list</span><span class="p">:</span>
    <span class="n">cur_mtime</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">getmtime</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">source_dir</span><span class="p">,</span> <span class="n">cur_file</span><span class="p">))</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">oldest_file</span> <span class="ow">or</span> <span class="n">cur_mtime</span> <span class="o">&lt;</span> <span class="n">oldest_mtime</span><span class="p">:</span>
        <span class="n">oldest_file</span> <span class="o">=</span> <span class="n">cur_file</span>
        <span class="n">oldest_mtime</span> <span class="o">=</span> <span class="n">cur_mtime</span>

<span class="n">create_article</span><span class="p">(</span><span class="n">oldest_file</span><span class="p">)</span>
<span class="n">os</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">source_dir</span><span class="p">,</span> <span class="n">oldest_file</span><span class="p">))</span>
</code></pre></div>

<p>Enregistrez ça dans la racine du site, sous le nom content_generator.py par
exemple. C’est testé sous python 2.6 et 2.7. À chaque appel, il listera
les fichiers dans <em>source</em> (vous devriez créer ce dossier), les classera
par date de modification, puis dépilera la première pour en faire un
article : il la redimensionnera aux dimensions voulues, puis écrira un
article basique en Markdown, contenant seulement l’image et la date.</p>
<p>À ce niveau, le billet sera écrit mais pas encore publié. C’est un
script bash qui s’en chargera, et qui sera appelé par cron. Enregistrez
ce qui suit dans cron.sh à la racine du site :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5
6</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><code><span class="ch">#!/bin/bash</span>

<span class="nv">PATH</span><span class="o">=</span><span class="s2">&quot;/usr/local/bin:/usr/bin:/bin&quot;</span>
<span class="nb">cd</span> /path/to/bonjouraxolotl
python content_generator.py
make html
</code></pre></div>
</td></tr></table>
<p>Adaptez bien évidemment les chemins. Il ne reste plus qu’à éditer la
crontab :</p>
<div class="codehilite"><pre><span></span><code><span class="err"># crontab -l</span>
<span class="err">0 10 * * * /path/to/bonjouraxolotl/cron.sh</span>
</code></pre></div>

<p>Tous les matins à 10h, un nouvel axolotl !</p>
<p>EDIT : corrections et amélioration du script python par
<a href="http://rogdham.net">Rogdham</a>, merci à lui.</p>


feed_id: tag:gordon.re,2013-03-01:/feminisme/traduction-rajouter-du-napalm-sur-le-feu.html
title: [Traduction] Rajouter du napalm sur le feu
uri: 2020-11-15-Traduction-Rajouter-du-napalm-sur-le-feu
url: https://gordon.re/feminisme/traduction-rajouter-du-napalm-sur-le-feu.html
content:
<p>Ça fait longtemps que je n’avais pas traduit de <a href="https://about.okhin.fr/posts/Bring_Moar_Fire/">billet
d’Okhin</a>. Celui-ci est
particulièrement intéressant, et parle à nouveau de sexisme.</p>
<p>Si vous avez la flemme de tout lire, voici un résumé : </p>
<blockquote>
<p>Allez vous faire voir, arrêtez d’être fainéant·e et lisez.</p>
</blockquote>
<!-- cut -->

<h3>Rajouter du napalm sur le feu.</h3>
<h4>Mise au point</h4>
<p>Je suis privilégié. Peu importe ce que je peux dire sur l’état de ce monde, il
est clair que je suis né de son meilleur côté. Je peux m’exprimer sans risquer
d’être frappé ou torturé. Je peux traverser la rue pour acheter à manger sans
risquer de me faire abattre par un sniper. Je sais que je dors au chaud chaque
nuit, et que je peux avoir trois repas (ou plus) par jour (tant que je n’oublie
pas de les prendre).</p>
<p>Et je ne serai pas insulté, agressé, violé, considéré comme une minorité, je ne
me sentirai pas en danger pour le simple fait de marcher dans la rue.</p>
<p>Tout ça parce que je suis un homme blanc. J’ai acquis des privilèges (que je
n’ai pas demandés) par le simple fait d’être né. Et c’est naze. Je veux dire, le
fait d’avoir des privilèges implique que j’aie du pouvoir sur d’autres
personnes. Et c’est naze, parce que ça signifie que ces personnes (celles sur
lesquelles j’ai du pouvoir) ne sont pas libres, ce qui entrave ma liberté (si
les personnes autour de moi ne sont pas libres, je ne peux pas bénéficier de ma
liberté).</p>
<p>Alors oui, être privilégié rend la vie plus facile, mais ça ne va pas. Je ne
veux pas de ça. Et se débarasser de ça prendra beaucoup de temps, parce que la
société dans laquelle je vis a besoin de changer beaucoup plus globalement. Et
ça commence en sensibilisant sur la situation (et ensuite en la changeant en
abandonnant ce pouvoir).</p>
<h4>Faits et statistiques</h4>
<p>S’il n’y avait aucune discrimination dans l’éducation, alors les compétences
seraient également réparties dans la population, et donc vous devriez trouver
des personnes compétentes n’importe où. Je veux dire, si 20% de la population
avait la peau bleue, alors il devrait y avoir 20% de personnes à la peau bleue
parmi les gens qui cuisinent. Ça vous semble correct ?</p>
<p>Donc, si notre système éducatif fonctionne bien, il devrait tendre à développer
l’intérêt et la curiosité de façon égale. Alors, le fait que j’aie rencontré 5
femmes depuis que j’ai commencé mes études dans un domaine technologique (une
dans une société, les 4 autres étaient des camarades de classe) est soit une
erreur statistique, soit la preuve que le système ne fonctionne pas aussi bien.
J’ai rencontré d’autres femmes dans les départements technologiques dans
lesquels j’ai travaillé, mais elles occupaient principalement des postes
créatifs (design, intégration…).</p>
<p>Il y a donc quelque chose de cassé là-dedans. J’ai un problème pour rester
longtemps dans une société : depuis 13 ans que je travaille (oui, j’ai commencé
tôt), hormis la société dans laquelle j’ai fait mon apprentissage, je n’ai
jamais passé plus d’un an dans la même entreprise. Donc ça en fait 8. De
différentes tailles, de différents horizons.</p>
<p>Et bien, je n’ai jamais rencontré une femme dans les départements IT de ces
boîtes. Parfois, c’était moi le département IT, mais même dans les équipes de
développement, je n’ai jamais rencontré une seule femme. Les seules femmes que
j’ai rencontrées viennent de la scène hacker (et la plupart du temps, je ne
l’apprenais qu’en les rencontrant dans le <em>meatspace</em>, mais c’est un autre
sujet).</p>
<p>Donc, quand quelqu’un me dit, au sujet du sexisme, que « si ce n’est pas cassé,
il ne faut pas essayer de le réparer » comme un argument pour ne pas penser à
des politiques anti-harcèlement, je pense qu’ils ont tort. C’est un problème.</p>
<h4>Un politicien sauvage apparaît !</h4>
<p>L’autre jour (deux ou trois jours avant cette rédaction),
<a href="https://twitter.com/_LaMarquise/">@_LaMarquise</a> a été agressée dans la rue par
un type se masturbant en public, et elle en a parlé sur twitter. Un illuminé de
service, <a href="https://twitter.com/romain_pp">@romain_pp</a>, a trouvé pertinent de faire
une plaisanterie à ce propos. Le fait est que cette personne est membre du Parti
Pirate Français et Suisse, et si j’ai bien tout compris au fonctionnement de ce
parti, n’importe qui peut parler en son nom. C’est même écrit dans le nom de son
compte twitter, dans sa description, et même dans son image d’arrière-plan.
Alors ouais, c’était la parole du Parti Pirate.</p>
<p>Les choses se sont envenimées sur Twitter, et la principale argumentation contre
La Marquise était qu’elle n’était pas rationnelle. Je vais développer plus tard,
mais basiquement, je tend à penser qu’on ne peut pas attendre de quelqu’un sous
le choc d’être rationnel.</p>
<p>On lui a aussi dit qu’elle était agressive, qu’elle ne devrait pas rendre
publiques ces choses personnelles, comme une agression (très bien, alors
pourquoi est-ce que les gens tweetent à propos de leur vie privée ?), qu’elle ne
devait pas déranger leur petite tranquilité.</p>
<p>Le Parti Pirate a écrit une lettre en réponse à La Marquise. Ils l’ont fait en
privé (étant donné que je n’ai pas pu la trouver en ligne). Ce que je trouve
étrange pour un parti qui défend la transparence à tous les niveaux de la
société. Ceci dit, les systèmes informatisés sont sympas, parce qu’ils
permettent de copier les choses à coût négligeable, et donc voici <a href="http://www.twitlonger.com/show/l69r7b">une copie de
cette lettre</a> (elle a été fournie par
Marquise, et je n’ai aucune raison de douter de sa parole là-dessus). En
substance, ils disent regretter ce que l’un de leurs membres a dit, et également
le « buzz » qui s’en est suivi. Ils n’ont pas saisi l’opportunité d’opter pour
une position plus active, pas plus qu’ils n’ont blâmé le membre.</p>
<p>Basiquement, la lettre est une tentative d’effort pour calmer le jeu sans
prendre réellement position pour ou contre le sexisme. S’ils sont contre le
sexisme, ils devraient, au moins, renvoyer Romain, sinon ils n’auraient pas
besoin d’écrire à ce sujet. Cette lettre prouve que ce qui est important pour
eux est d’éteindre l’incendie médiatique plutôt que défendre une position.</p>
<p>Ce qui est honteux est également qu’ils sont généralement les premiers à blâmer
ce genre de comportement dans les autres partis. Il y a aussi un problème
concernant la liberté d’expression, mais j’y reviendrai.</p>
<h4>Au sujet de la violence</h4>
<p>Vivre dans la peur d’être agressé·e ou violé·e n’aide pas à garder la tête
froide. Comme je l’ai dit (et d’autres l’ont dit aussi), garder la tête froide
est un privilège des gens qui ont du pouvoir, ne l’oubliez pas. L’insurrection,
et la nécessité du changement, mènent à la violence, c’est inévitable. <a href="https://violenceparfoisoui.wordpress.com/2013/01/24/timult-critique-ideologie-non-violence/">Ce
billet</a>
l’explique assez bien, et cette citation est intéressante :</p>
<blockquote>
<p>La soumission des opprimés est liée à l’ordre établi. C’est le fait de
déranger cet ordre en brisant ses chaînes, et en s’en prenant aux maîtres qui
est perçu comme un scandale. Dans le langage des maîtres, qui devient le
langage courant, la violence ne vient pas de ceux qui commettent cette
violence, mais des vilains qui osent se rebeller.</p>
<p>-- </p>
<p><strong>Igor Reitzman</strong></p>
</blockquote>
<p>Quand quelqu’un vous crie dessus à propos de quelque chose, vous devriez
l’écouter, parce que cette chose est importante pour la personne (si ça ne l’est
pas pour vous). Vous n’imagineriez pas les Révolutionnaires Français demander
gentiment à Louis XVI s’il accepterait de bien vouloir céder le pouvoir. Un tas
de personnes ne voudrait pas abandonner le pouvoir, et il faut parfois les
forcer à le faire.</p>
<p>Ça m’a pris un moment pour comprendre ça, parce que ce n’est jamais agréable
quand des gens vous hurlent dessus. C’est irritant, et on a tendance à répondre
à l’agressivité par l’agressivité. Je ne suis pas sûr d’être totalement
d’accord avec ça, mais j’essaie de comprendre les raisons pour lesquelles les
gens crient (et j’essaie aussi de ne pas répondre trop rapidement, parce qu’en
général ça n’aide pas la situation, quelle qu’elle soit).</p>
<p>Alors oui, des féministes utilisent la violence, qu’elle soit physique ou
morale. Et si ça vous dérange, ça veut dire que ça marche. Vous devriez poser
des questions et tenter de comprendre pourquoi elles sont en colère, au lieu de
leur dire de se calmer.</p>
<h4>Au sujet de la liberté d’expression</h4>
<p>Par ailleurs, je suis contre la censure. Ça veut dire que je condamne le fait de
brider la parole. Je veux que les nazis puissent exprimer leurs idées, car c’est
comme cela que vous pourrez trouver leurs idées dangereuses. Et je veux que les
misogynes puissent le faire aussi, parce que c’est comme ça que vous les
reconnaîtrez. Et c’est également le seul moyen d’échanger avec eux autour du
problème.</p>
<p>Mais la liberté d’expression va dans les deux sens. Ce n’est pas parce que
quelqu’un est autorisé à dire quelque chose qu’il n’a pas le droit d’être
contredit, décrié, puni ou autre. Vous avez le droit de faire des blagues
sexistes. Et j’ai le droit de vous dire qu’elles ne sont pas drôles. J’ai même
le droit de le dire à tout le monde. Si vous ne le voulez pas, et que vous
préférez pouvoir dire ce que vous voulez sans conséquences, alors vous défendez
la censure.</p>
<p>Alors oui, ça me dérange, ce qui est arrivé à BSides (voici <a href="http://violetblue.tumblr.com/post/44107008572/what-happened-with-my-security-bsides-talk">le point de vue de
Violet</a>
, et <a href="https://adainitiative.org/2013/02/keeping-it-on-topic-the-problem-with-discussing-sex-at-technical-conferences/">celui de
AdaInitiative</a>.
Pour résumer, une conférence sur le sexe et les drogues, qui avait été annoncée,
a été supprimée de l’agenda à cause de la peur d’une chasse aux sorcières par
l’équipe du BSides (que ce soit à l’initiative d’AdaInitiative ou non n’est pas
très clair à mes yeux) au prétexte qu’il pourrait y avoir des victimes de viol
qui auraient pu être stressées (il semble que c’est comme ça que les troubles de
stress post-traumatiques) si elles avaient assisté à la conférence, et que
parler de la façon dont les drogues fonctionnent, en particulier le GHB, dans
une conférence nommée « Sexe et drogues : vulnérabilités connues et méthodes
d’exploitation » serait une incitation au viol.</p>
<p>L’argument est que, dans les conférences de hack, les gens font des sujets
nommés « Vulnérabilités connues et méthodes d’exploitation » pour encourager
l’exploitation de ces vulnérabilités. Et bien c’est une idée fausse. La plupart
de ces conférences se préoccupent plus d’expliquer comment se protéger contre ces
vulnérabilités plutôt que comment les exploiter.</p>
<p>En général, ces vulnérabilités sont patchées au cours de la conférence, ou du
moins, les gens qui gèrent le logiciel en question travaillent dessus (s’ils
prennent leur boulot au sérieux, je veux dire). Bien sûr, certains les utilisent
pour leur propre profit, mais il s’agit d’une minorité.</p>
<p>Et en réalité, les gens qui utilisent ces vulnérabilités pour leur propre profit
n’ont pas intérêt à ce que celles-ci soient connues. Les rendre publiques est de
la prévention et de l’éducation, ce n’est pas fait pour mettre en danger les
gens. C’est comme ça que la prévention fonctionne.</p>
<p>Maintenant, faut-il faire de la prévention dans la communauté technophile ? Bien
sûr qu’il le faut. Il y a tout un historique d’agressions sexuelles et de viols
dans ce genre de conférences. Si vous refusez d’en parler, vous ne pouvez
éduquer les gens et vous ne les changerez pas. AdaInitiative disent qu’ils
organisent leur propre <em>camp</em> pour en discuter. Mais c’est comme faire une
campagne de prévention des drogues dans un camp de scouts : vous n’aiderez pas
des drogués à gérer leur addiction.</p>
<p>Alors oui, il nous faut éduquer nos camarades hackers, particulièrement lors
d’occasions où il y a beaucoup d’alcool, de drogues et de manque de sommeil,
parce que tout cela change votre perception des choses. Alors en parler est une
nécessité. Et, si la discussion devient offensante, alors les gens doivent le
dire et le condamner, mais vous ne pouvez pas savoir comment ça se passera avant
que ça n’arrive.</p>
<p>Il y a toujours ce problème avec les victimes de viols et les <acronym
title="Troubles de Stress Post-Traumatiques">TSPT</acronym>. Je peux comprendre
que des gens ayant subi une agression et/ou un viol n’aient pas envie d’être
exposés à une conférence qui en parle (hé, c’est à eux de gérer leur souffrance
comme ils l’entendent). Et il semble qu’il y ait une coutume autour des
« trigger warnings », que je ne comprends pas tout à fait (ça semble fonctionner
un peu comme les labels « PEGI » pour les jeux vidéos).</p>
<h4>Fin</h4>
<p>Hmm, je pense avoir loupé plusieurs points. Ou je peux me planter sur d’autres.
Si vous le pensez, faites-le moi savoir. Vous pouvez me trouver assez
facilement.</p>


feed_id: tag:gordon.re,2013-02-25:/feminisme/je-ne-suis-pas-feministe-je-suis-egalitaire.html
title: « Je ne suis pas féministe, je suis égalitariste »
uri: 2020-11-15-Je-ne-suis-pas-féministe-je-suis-égalitariste
url: https://gordon.re/feminisme/je-ne-suis-pas-feministe-je-suis-egalitaire.html
content:
<p>Depuis quelques temps que je m’implique activement dans les débats sur le
féminisme, il y a cet argument, qui revient souvent, et qui est non seulement
inutile, mais surtout contre-productif. Je m’explique.</p>
<p>Lorsqu’on défend les valeurs féministes, par exemple en dénonçant un
comportement sexiste, on a tendance à heurter la sensibilité des hommes, qui ne
comprennent pas le problème. Se sentant attaqués, ils cherchent nativement à
discréditer les attaques. Lorsqu’il s’agit de défenseurs de l’égalité, il est
difficile de trouver des arguments cohérents. Alors ils attaquent la forme, à
commencer par le nom « féminisme ».</p>
<!-- cut -->

<h3>« Je suis antiféministe ».</h3>
<p>J’ai eu envie de mettre une très grosse paire de claques à l’auteur de cette
phrase, que je considère comme un ami, et qui est très engagé dans les mêmes
valeurs que moi : la défense des libertés, l’égalité, le partage. Se déclarer
anti-féministe, ce n’est ni plus ni moins que de se déclarer contre l’égalité
des genres. Parce que le féminisme n’a <strong>jamais</strong> été la lutte contre les
hommes. Mais le fait est qu’avec des réactions spontanées comme celle-ci, il est
vrai qu’on a rarement envie de faire un câlin à leur auteur.</p>
<p>Pourquoi se déclarer « antiféminisme », en fait ? Parce qu’on croit qu’il ne
faut pas favoriser les femmes, et que la discrimination positive c’est mal ? Je
suis assez d’accord, mais on ne parle pas de discrimination positive, ici.</p>
<h3>Discrimination ?</h3>
<p>Le féminisme, tel que je le vois (et tel qu’il est vu par celles et ceux qui
partagent ces valeurs), c’est la lutte pour l’<strong>égalité</strong> des genres. Et,
accrochez-vous bien, ça marche dans les deux sens. Les petites habitudes ancrées
dans la société, comme celle qui veut qu’on paie le restaurant à une femme, sont
aussi du sexisme, et sont aussi mal vues. Notez tout de même l’échelle : ce que
les femmes vivent à cause du sexisme, c’est par exemple la peur constante
d’être agressées lorsqu’elles se retrouvent dans la rue, tandis que ce que les
hommes redoutent le plus, c’est de « devoir » payer le restaurant. Alors on
combat toutes les formes de discrimination basées sur le genre, mais soyez
honnêtes : ce sont les femmes, en immense majorité, qui en sont victimes.</p>
<p>Pourquoi on parle de <em>féminisme</em>, et pas d’<em>égalitarisme</em> ? Pour cette raison.
Parce qu’on ne se voile pas la face, qu’on admet que le problème touche
essentiellement les femmes, et parce qu’il ne faut pas l’oublier ni le nier. Ça
s’appelle les « male tears », et c’est une réponse fort courante, quand on
évoque des problèmes de sexisme : un homme répond « oui mais regardez-moi, j’ai
des problèmes moi aussi », dans le but de détourner l’attention du problème
initial (souvent en se cachant derrière un problème tout à fait minime).
Demander à ce qu’on parle d’« égalitarisme » à la place de « féminisme », c’est
la même logique : on détourne le regard du fait que ce sont quasi-exclusivement
les femmes qui en sont victimes, on exige, en notre qualité de mâle, de profiter
aussi de ce combat (alors que c’est déjà le cas), mais surtout, qu’on enlève
cette référence exclusive aux femmes !</p>
<p>Alors on se dit « ho, faut pas le prendre comme ça, je cherche pas à mal, je
veux juste qu’on soit précis sur le terme ». Mais l’effet concret est que l’on
attaque les gens qui parlent de ces problèmes, qu’on les discrédite. Donc pour
le coup, oui c’est antiféministe, parce qu’on utilise des arguments de forme
pour dénigrer les arguments féministes. On se place contre eux, parce qu’on
n’aime pas le nom. C’est ridicule, et c’est totalement contraire aux valeurs que
la plupart de ceux que je connais défendent.</p>
<h3>Féminisme VS masculinisme</h3>
<p>Si vous avez suivi, on peut résumer bêtement « féminisme = lutte pour
l’égalité ». Mais alors, quid du masculinisme, dont on entend parler ces
derniers temps ? S’agit-il du pendant masculin de la lutte pour l’égalité ?
C’est tout le contraire, en fait.</p>
<p>Pourquoi ne serait-ce pas le cas ? Parce que dans nos sociétés lourdement
sexistes, l’homme est <strong>toujours</strong> en haut. C’est lui le privilégié, c’est lui
qui a mis en place ce sexisme pour rester à la « bonne » place. Alors, lutter
pour que les femmes soient mieux considérées, et appeler ça le masculinisme ? Ça
n’a pas de sens. Par contre, lutter pour conserver, et même augmenter ses
privilèges, ça ce sont les valeurs du masculinisme. Chercher à faire taire la
lutte féministe, parce qu’on ne voudrait surtout pas partager le trône : « on
n’est pas bien, entre couilles ? ». Le masculinisme, c’est la lutte pour le
retour de la femme à la cuisine, pour revenir sur leurs droits. En somme, le
culte du patriarcat.</p>
<h3>Les privilèges masculins</h3>
<p>Le simple fait d’être un homme a beaucoup d’implications en termes de sexisme.
Vous pouvez être fervent féministe, il est important de ne pas ignorer cet état
de fait : la société est construite sur des valeurs sexistes, et les hommes sont
privilégiés. Par exemple, si vous êtes un homme :</p>
<ul>
<li>pensez-vous régulièrement à la façon dont vous réagiriez si vous étiez agressé
dans la rue ?</li>
<li>vous fait-on des remarques si votre tenue vestimentaire est trop provocante,
  ou même pas assez ?</li>
<li>vous traite-t-on spontanément comme responsable si vous vous faites agresser ?
  (exemples : « tu es sûr que tu ne voulais pas ? », « c’est normal, vu comment
  tu étais habillé », « fallait pas sortir tout seul »…)</li>
<li>considère-t-on que vous devez être protégé en permanence par quelqu’un du
  genre opposé, car vous ne savez pas vous défendre ?</li>
</ul>
<p>Si vous avez répondu « oui » à ces affirmations, soit vous êtes d’une
affligeante mauvaise foi, soit votre style de vie vous a certainement fait
comprendre que, dans la majorité des cas, être un homme était mieux perçu en
société. Les hommes ont le privilège de ne pas avoir peur en permanence dans la
rue (une rue standard d’une ville standard d’un pays en paix, disons). <strong>Les
hommes ont le privilège de ne même pas être conscients de ce privilège</strong>. Ce
n’est pas un reproche, puisque ce n’est pas la faute des hommes, mais de la
société. Seulement, il faut le savoir. Il faut savoir ce que peut être la vie
d’une femme aujourd’hui. Je suis prêt à parier que ça fera relativiser
certains qui trouvent que « les féministes en font un peu trop ».</p>


feed_id: tag:gordon.re,2013-01-29:/developpement/mot-de-passe-pourquoi-comment.html
title: Le mot de passe : Pourquoi, comment ?
uri: 2020-11-15-Le-mot-de-passe-Pourquoi-comment
url: https://gordon.re/developpement/mot-de-passe-pourquoi-comment.html
content:
<p>On entend tout et son contraire au sujet des mots de passe et de leur gestion,
en informatique. Alors je vais tenter de faire le point, en prenant tour à tour
le point de vue de l’utilisateur, et du développeur en charge de la sécurité
d’une application.</p>
<!-- cut -->

<h3>Côté utilisateur</h3>
<h4>Pourquoi un mot de passe ?</h4>
<p>Un mot de passe est un élément d’authentification. Il s’agit d’une donnée
secrète, normalement connue d’une seule personne. Pour vérifier qu’un
interlocuteur est légitime, on vérifie s’il connaît ce secret partagé.
Naturellement, dans une utilisation aussi simpliste (on ne parle même pas
d’informatique), il apparaît naturellement que, lorsque l’on « prouve » son
identité en fournissant le mot de passe, on n’est plus le seul à le connaître.
Et que donc, si on l’utilise auprès de plusieurs tiers, ceux-ci peuvent se faire
facilement passer pour nous. Si cela est possible, la sécurité apportée par le
mot de passe est totalement compromise.</p>
<h4>Faiblesses</h4>
<p>On pense alors naturellement à utiliser un mot de passe différent pour chaque
interlocuteur. Ça a du sens : si je m’authentifie avec un mot de passe <em>a</em>
auprès de Alpha, mais que je n’utilise <em>a</em> nulle part ailleurs, Alpha n’aura que
faire de ce mot de passe. Il ne pourra se compromettre que lui-même. <strong>Il est
donc important de nepas réutiliser un mot de passe.</strong></p>
<p><img src="media/d7bdc26f.password_reuse.png" data-original-source="https://gordon.re/images/passwords/password_reuse.png" alt="Réutilisation de
mot de passe — XKCD"
title="Réutilisation de mot de passe — XKCD" width="480" height="1189"
class="aligncenter size-full" /></p>

<p>Un mot de passe est censé être un secret. Donc pas devinable. Pour cela, il faut
évidemment qu’il ne soit pas « logique ». Il est malheureusement plus que
courant que <a href="http://www.whatsmypass.com/the-top-500-worst-passwords-of-all-time">des utilisateurs choisissent comme mot de passe leur date de
naissance</a>,
le nom de leur poney, ou bien les premières lettres de leur clavier (quand ce
n’est pas tout simplement « password » ou « 0000 »). Du coup, si je cherche à
deviner le mot de passe de quelqu’un, j’ai tout à gagner à essayer ces
combinaisons-là. Et ne vous dites pas « pas grave, j’ai mis une majuscule dans
le nom de mon chien », ou « j’ai rajouté 007 à ma date de naissance », car
cette attaque, appelée
<a href="https://fr.wikipedia.org/wiki/Attaque_par_force_brute">bruteforce</a>, permet
d’essayer des centaines  milliers de combinaisons par seconde, et ce sans grand
effort. <strong>Proscrivez impérativement les mots de passe simples à deviner.</strong></p>
<h4>Comment ?</h4>
<p>Comment, alors, générer un mot de passe suffisamment robuste pour garantir un
niveau de sécurité minimal ? Il y a plusieurs possibilités :</p>
<ul>
<li>utiliser un générateur aléatoire. Il en existe une floppée en ligne, mais
  n’oubliez pas que si vous acceptez un mot de passe généré par une page web,
  vous n’êtes pas seul à le connaître. Cela s’apparente à de la paranoïa, mais
  c’est rarement une bonne idée de faire courir un risque à son mot de passe dès
  sa génération. Il existe cependant des logiciels libres (dont le comportement
  est donc vérifiable) qui proposent de telles fonctionnalités. Par exemple,
  <a href="https://www.keepassx.org/">Keepassx</a>, en plus de sa fonctionnalité principale
  que je détaillerai plus bas, dispose d’un certain nombres de possibilités
  pour générer un mot de passe.</li>
<li>utiliser un mot de passe principal, modifié pour chaque usage. C’est à dire
  que chaque site utilisera un mot de passe différent, mais qu’à partir du mot
  de passe principal et d’une donnée en relation avec le site, vous serez
  capable de retrouver le mot de passe particulier. Mettons par exemple que vous
  ayiez un compte sur site example.org, et que votre mot de passe principal est
  « pinkiepieisthebestpony » (on se refait pas…). Le mot de passe pour ce site
  pourrait être, par exemple, « peixnakmipelpei.eoirsgtehxeabmepsltep.oonry »,
  soit le mix des deux noms, en répétant si besoin le nom du site, et à raison
  d’une alternance d’une lettre à l’autre. Si vous vous contentez de concaténer
  les deux valeurs, si un mot de passe vient à être connu (et vous n’avez pas à
  faire confiance en un site), il sera aisé de comprendre quel est le mot de
  passe principal, et toute votre sécurité est compromise.</li>
<li>utiliser une dérivation de la méthode principale : vous avez un mot de passe
  principal et un nom de site. La différence est que vous allez rendre illisible
  le résultat, en le hachant par exemple. Pour ce faire, passez le mot de passe
  dans un algorithme de hachage (sous GNU/Linux, il y a ça sur à peu près tous
  les systèmes : il suffit de taper <em>echo &lt;mot de passe> | sha1sum</em>, et vous
  obtenez une chaîne identifiant votre mot de passe. Je couvrirai le principe du
  hachage dans la deuxième partie du billet. Mais ainsi, aucune partie du mot de
  passe principal n’est envoyée au site. L’inconvénient est évidemment qu’il
  faut avoir l’utilitaire de hachage choisi sous la main (il est bien
  évidemment proscrit d’utiliser un service en ligne pour ça, car votre mot de
  passe n’a pas à sortir de votre machine en clair).</li>
</ul>
<p><a href="https://github.com/ker2x/passgen">Une autre implémentation</a> de cette solution
  m’a été indiquée : il s’agit d’une simple page HTML, que vous pouvez (et
  devriez) copier en local avant de l’utiliser. Ensuite, à partir d’un mot de
  passe principal et un nom de site/service, un mot de passe unique sera généré.
* utiliser d’autres méthodes d’authentification, lorsque cela est possible. Par
  exemple, si vous utilisez <acronym title="Secure SHell">ssh</acronym>, il est
  possible de s’authentifier par le biais d’une clé DSA/RSA, ce qui est une
  méthode par la <em>possession</em>, en opposition avec une méthode par le <em>connu</em>. En
  clair, un serveur disposant de votre clé publique ne peut pas la réutiliser
  pour se faire passer pour vous, vu qu’il ne s’agit pas d’un secret partagé.</p>
<h3>Mieux que le mot de passe : la phrase de passe</h3>
<p><img src="media/9f7bbbf1.password_strength.png" data-original-source="https://gordon.re/images/passwords/password_strength.png" alt="Phrase de
passe — XKCD"
title="Phrase de passe | XKCD" width="740" height="601"
class="aligncenter size-full" /></p>

<p>Sémantiquement, une phrase est une suite de mots. C’est cela dont il s’agit.
Mais pas une suite de mots de passe, tels que « 6fQuhYP4EC EB9bWpLy78
6XcMGS5Y2P ». Une suite de mots courants de votre langue maternelle. Supposons
une liste de <a href="https://fr.wiktionary.org/wiki/Wiktionnaire:Liste_de_1750_mots_fran%C3%A7ais_les_plus_courants">1750 mots courants
français</a>
, dans laquelle on piochera quelques mots <strong>totalement au hasard</strong>. 5 mots
peuvent suffire. Par exemple, ceux-ci :</p>
<blockquote>
<p>nain, jambon, debout, désordre, mouchoir</p>
</blockquote>
<p>Je le répète, il est crucial de choisir au hasard ces mots. On a sinon tendance
à penser à des mots inspirés par notre environnement direct, et il suffit alors
de connaître cet environnement pour deviner les mots possibles. Ici, les mots
sélectionnés n’ont strictement aucun lien. D’un point de vue statistique, on a
donc 1750^5 possibilités pour générer une phrase de passe par la méthode
décrite. Mais le plus important est la possibilité de la remémorer. Car il est
difficile, et il n’y a aucun moyen intelligent de retenir un mot de passe. Mais
une phrase composée de mots courants peut être facilement mémorisée. Par
exemple, imaginons une situation pouvant expliquer ces choix de mots :</p>
<blockquote>
<p>un nain mange du jambon debout car c’est le désordre, et il n’a pas de
mouchoir</p>
</blockquote>
<p>Vous avez déjà retenu cette phrase de passe. Et elle est raisonnablement solide.
Pour donner une idée de grandeur, avec 9 caractères alphanumériques contenant
des majuscules, on a moins de possibilités (58^9). Et la complexité de
mémorisation est incomparable.</p>
<p>Le problème avec cette solution est le besoin d’aléa. Elle n’est efficace que si
les mots n’ont réellement aucun rapport, et la majorité des gens à qui on
demande ça piocheront invariablement dans leur environnement.</p>
<h4>Autres méthodes d’authentification</h4>
<p>J’ai volontairement ici fait l’impasse sur les autres méthodes
d’authentification, par exemple basées sur les tokens ou clés asymétriques. Non
pas qu’il s’agisse de mauvaises solutions, bien au contraire, mais le seul thème
des mots de passe est suffisamment complexe et intéressant à traiter.</p>
<p>Il faut également garder en tête un principe simple : c’est un être humain que
l’on cherche à authentifier. C’est à dire qu’à partir d’un certain niveau de
robustesse du mot de passe, le maillon faible devient évidemment l’utilisateur,
et on ne peut pas l’améliorer informatiquement (sauf en le transformant en
cyborg, mais ça mériterait de donner lieu à un autre billet).</p>
<p><img src="media/cf5e86d1.security.png" data-original-source="https://gordon.re/images/passwords/security.png" alt="Le mythe de la sécurité
— XKCD" title="Le mythe de la sécurité — XKCD" width="448" height="274"
class="aligncenter size-full" /></p>

<h4>Qu’en faire ?</h4>
<p>On le dira toujours : on n’écrit pas un mot de passe. Ni sur un post-it collé
sur son écran, ni sous son clavier, ni même dans un fichier ~/.keywords (ou
autre). Mais naturellement, lorsque l’on est amené à connaître un grand nombre
de mots de passe, il devient impératif de trouver une solution, sous peine de
réutiliser les mots de passe ou de les rendre trop simples à découvrir, parce
que ce sera naturel de ne pas perdre 10 minutes à se remémorer le moindre mot de
passe.</p>
<p>Quoi qu’on en dise, il peut donc être justifié de noter ses mots de passe. Mais
certainement pas en clair. Il existe plusieurs possibilités de bases chiffrées,
comme par exemple la fonctionnalité de mot de passe principal de
<a href="https://www.mozilla.org/fr/firefox/fx/">Firefox</a> répond à ce besoin : les
fichiers enregistrés dans le navigateur sont naturellement écrits sur le disque,
mais sous une forme chiffrée par un mot de passe principal qui, lui, doit être
retenu par l’utilisateur. Une autre possibilité est Keepassx, dont je parlais
plus haut. Il s’agit d’un logiciel libre et interopérable, proposant les options
qu’on s’attend de voir avec un tel logiciel. Quelques précautions de base
s’imposent :</p>
<ul>
<li>Ne mettez pas tous vos œufs dans le même panier. Faites en sorte qu’un fichier
  de mots de passe compromis ne puisse porter préjudice qu’à une chose.</li>
<li>Ne stockez que les mots de passe que vous ne pouvez pas retenir (faites un
  effort).</li>
<li>Ne lésinez pas sur la sûreté du mot de passe principal. Keepassx permet
  d’utiliser une clé (sous forme de fichier), un mot de passe, ou… les deux.
  Préférez les deux, il s’agira d’une authentification forte, et il est
  généralement préférable d’en avoir pour protéger des mots de passe. La clé ne
  doit pas se trouver à côté du conteneur (elle devrait rester avec vous et non
  sur la machine), et le mot de passe doit évidemment être robuste.</li>
<li>Et le plus important : les clés sont présentes en clair en mémoire lorsque le
  conteneur est ouvert. Donc refermez-le immédiatement après usage.</li>
</ul>
<h3>Côté développeur</h3>
<h4>Pourquoi un mot de passe ?</h4>
<p>Un mot de passe est un élément d’authentification. Il s’agit d’une donnée
secrète, normalement connue d’une seule personne. Pour vérifier qu’un
interlocuteur est légitime, on vérifie s’il connaît ce secret. Naturellement,
dans une utilisation aussi simpliste (on ne parle même pas d’informatique), il
apparaît naturellement que, lorsqu’un utilisateur nous « prouve » son identité
en fournissant son mot de passe, on le connaît aussi. Ce « on » peut être un
site web, une société, bref plusieurs personnes peuvent avoir accès aux données.
Et on a la responsabilité vis-à-vis de l’utilisateur de protéger son élément
d’authentification.</p>
<h4>Premièrement</h4>
<p><strong>On n’enregistre jamais le mot de passe d’un utilisateur en clair</strong>. Jamais
jamais. Vraiment. Parce qu’il suffit de jeter un œil à la base de données, d’une
façon ou d’une autre (par une intrusion informatique, ou par l’action d’un
employé malveillant). Tout ce dont on a besoin est de pouvoir vérifier que le
mot de passe d’un utilisateur est correct. Cela ne requiert pas nécessairement
d’avoir soi-même le mot de passe pour le comparer.</p>
<h4>Chiffrer ?</h4>
<p>La cryptographie, l’art de rendre un message illisible à quiconque ne lui est
pas destiné, c’est très bien. Mais chiffrer les mots de passe des utilisateurs
avant de les stocker en base de données n’est pas une bonne idée. Car, si on
doit pouvoir comparer le mot de passe, le destinataire du message se retrouve
être l’application web qui l’a elle-même chiffrée. On retrouve alors le même
problème : quiconque a accès à l’application peut déchiffrer facilement les mots
de passe. En réalité, il faut qu’il soit impossible de retrouver les mots de
passe.</p>
<h4>Hacher</h4>
<p>Il existe des fonctions cryptographiques qui permettent de générer des <em>sommes
de contrôle</em>, des chaînes raisonnablement uniques construites à partir d’un
message, ne permettant théoriquement pas de retrouver le message d’origine. Ainsi,
deux chaînes proches génèrent deux empreintes parfaitement différentes. On peut
se servir de ce principe pour ne stocker en base de données que les empreintes
des mots de passe des utilisateurs. Lorsque quelqu’un tente de s’authentifier,
il envoie son mot de passe, et notre application en génère l’empreinte, puis
compare les deux empreintes. Si elles sont identiques, l’authentification est
validée.</p>
<p>La fonction de hachage la plus connue est sans doute le
<a href="https://fr.wikipedia.org/wiki/MD5">MD5</a>. Ne l’utilisez pas. Il est bien trop
faible, et il est aujourd’hui facile, par le biais de tables de correspondances,
de retrouver une chaîne capable de générer une empreinte donnée. Il y a bien
d’autres algorithmes plus fiables. Nous verrons cela plus tard.</p>
<h4>Saler</h4>
<p>Il existe, pour les algorithmes courants (essentiellement md5 et
<a href="https://fr.wikipedia.org/wiki/Sha1">sha1</a>), des <a href="https://fr.wikipedia.org/wiki/Rainbow_table">rainbow
tables</a>, fichiers contentant de
grandes quantités d’empreintes, associées à la chaîne hachée. Ainsi, même avec
les mots de passe hachés en base, il est parfois possible (notamment lorsque les
utilisateurs ont de mauvaises habitudes d’utilisation de mots de passe) de
retrouver un mot de passe à partir de son empreinte. Pour cela, on va ajouter un
grain de sel, rendant l’empreinte plus unique. Concrètement, il s’agit d’un
élément rajouté au mot de passe avant de le hacher. On peut par exemple définir
une chaîne aléatoire, stockée en clair dans notre application (à un autre
endroit que la base de données), qui sera ajoutée à la fin de chaque mot de
passe avant qu’il passe à la moulinette du hachoir. Si notre sel est
suffisamment grand et aléatoire, il a peu de chances d’être présent dans les
rainbow tables.</p>
<p>Autre problème : peu importe l’algorithme, son principe est de générer une
empreinte unique pour une chaîne donnée. Par conséquent, si deux utilisateurs
utilisent par hasard le même mot de passe, leur empreinte sera la même. Ce qui
n’est pas un dysfonctionnement de l’application, mais permet à un attaquant d’en
déduire que les deux utilisateurs possèdent le même mot de passe. Si par hasard
(et avec un peu de volonté et de patience), il s’avère que l’un des utilisateurs
a écrit son mot de passe sur un post-it sur son écran, ou plus probablement s’il
tombe dans le piège d’un mail de
<a href="https://fr.wikipedia.org/wiki/Phishing">phishing</a>, il est alors trivial de
compromettre le second. Il est alors important d’ajouter un niveau de sécurité
au stockage des mots de passe de notre application.</p>
<p>Ce dernier problème est lié au fait que notre sel est statique : on utilise le
même pour tous les utilisateurs, donc on ne se prémunit pas de mots de passe
identiques. Il faut alors rendre le sel dynamique, autrement dit d’en utiliser
un différent pour chaque utilisateur. On peut par exemple utiliser l’identifiant
unique d’un utilisateur comme base de sel (car un identifiant seul est trop
court). Utilisons donc l’empreinte de l’identifiant, comme sel pour générer
l’empreinte du mot de passe. Tous nos mots de passe seront donc bien différents
en base. On a fini ?</p>
<p>Non.</p>
<p>Le sel est alors assez faible, car devinable (il s’agit de l’empreinte d’un
identifiant numérique probablement auto-incrémenté, et parfois connu de tous les
utilisateurs, si par exemple on l’utilise dans les <acronym title="Unified
Resource Locator">URL</acronym>. En gardant l’idée d’utiliser un sel dynamique,
on peut le générer nous-mêmes, de façon pseudo-aléatoire. Il convient ensuite de
le stocker, évidemment, sinon nous ne pourrons pas vérifier ultérieurement le
mot de passe. Donc on a un sel, enregistré à côté de l’empreinte. Si ces données
sont compromises, il n’est normalement pas possible (sauf faiblesse dans
l’algorithme) de revenir au mot de passe initial à partir de ces éléments. À ce
niveau-là, on a une sécurité acceptable pour notre application. Voyons jusqu’où
on peut monter, et quels en sont les coûts.</p>
<h4>Aller plus hauuuut ♫</h4>
<p>Au stade où nous en sommes, il est toujours possible, si l’on parvient à
récupérer les informations en base de données, d’attaquer sauvagement
l’empreinte au bruteforce. Je répète le principe : on teste toutes les chaînes
possibles avec cet algorithme, en y ajoutant le sel, jusqu’à ce que ça passe. Il
est possible d’handicaper très sérieusement cette attaque : en utilisant une
fonction de hachage lente. Car, si pour une application, on cherche à obtenir
le meilleurs temps de réponse possible, l’étape d’authentification est
normalement unique par session, et il ne s’agit pas d’une étape qui nécessite
une grande réactivité. D’un autre côté, rendre plus lent le calcul d’une
empreinte peut passer inaperçu auprès de notre utilisateur, tandis qu’un
attaquant qui cherche à tester des millions de chaînes mettra beaucoup plus de
temps à réaliser son attaque. Pour cela, on peut utiliser l’algorithme
<a href="https://www.tarsnap.com/scrypt.html">scrypt</a>, auquel on peut demander de passer
un temps donné sur le calcul d’une empreinte, ce qui fera différer celle-ci.
Attention : scrypt est le nom de deux applications séparées : un utilitaire de
chiffrement symétrique, et un algorithme de dérivation de clé. C’est ce dernier
qui nous intéresse. Il faut également savoir que scrypt n’est pas présent par
défaut dans tous les langages. Par exemple en python, il vous faudra installer
(via <em>pip</em>) <a href="http://pypi.python.org/pypi/scrypt/">scrypt</a>). Avec une durée
d’exécution nettement supérieure aux autres méthodes, celle-ci est
raisonnablement résistante au bruteforce.</p>
<p>Attention toutefois. L’utilisation de cet algorithme passe par un module tiers.
Donc pas forcément validé par des experts. Et récupéré, via pip, en http en
clair. Il n’y a donc pas de certification au sujet de ce code. Vous devez donc,
avant de l’utiliser, vous assurer par vos propres moyens que ce module est digne
de confiance.</p>
<h4>Encore un peu ?</h4>
<p>L’état de l’art consiste maintenant à isoler la partie de vérification du mot de
passe, de façon matérielle si possible, en utilisant un
<a href="https://fr.wikipedia.org/wiki/Hardware_Security_Module">HSM</a>. On peut
toutefois, et pour une sécurité moins bonne, opter pour une isolation
logicielle, par exemple en désignant une machine virtuelle isolée du réseau, et
accessible uniquement depuis notre application, qui sera seule à pouvoir traiter
l’authentification. Ainsi, si notre application est compromise, la partie
authentification est intacte, et les empreintes ne sont même pas connues (sauf
compromission totale de l’infrastructure, évidemment, donc il ne faut pas
négliger une bonne gestion des données confidentielles), même au sein d’un tel
module.</p>
<h4>Trop c’est trop ?</h4>
<p><a href="http://reflets.info/la-securite-cest-les-autres/">Sachez rester en terrain
connu</a>. Vous n’êtes pas un
expert reconnu en cryptographie, alors n’inventez pas la roue. Ne vous dites
jamais que jouer au petit chimiste et piocher ça et là des algorithmes que vous
appliquerez les uns au-dessus des autres renforcera votre code, car c’est
l’inverse qui se passera : vous ne saurez pas ce que vous faites, et il ne
s’agira certainement pas d’une recommandation sérieuse de sécurité.</p>
<p>De la même façon, <strong>n’essayez jamais de créer votre algorithme de sécurité</strong>.
Faites-le pour rire dans votre coin si vous voulez, mais ne vous amusez en aucun
cas à l’utiliser en production, tant qu’il ne s’agira pas d’un standard reconnu.</p>
<h3>Conclusion</h3>
<p>Le mot de passe est une donnée critique dans un Système Informatique, et doit
être traité en connaissance de cause. Il n’est pas nécessaire d’être un expert
pour respecter les bons usages, il faut simplement qu’ils soient connus. Pour
finir, je vous conseille <a href="http://crackstation.net/hashing-security.htm">un billet qui traite du même
sujet</a> en plus technique, en
abordant d’autres points de vue.</p>
<p><em>Les images de utilisés sont l’œuvre de Randall Munroe, et sont publiées sous
licence <a href="https://xkcd.com/license.html">CC-by-nc</a> sur <a href="http://xkcd.com">XKCD</a>.</em></p>
<p><em>Merci à <a href="http://unhandledexpression.com">Geoffroy Couprie</a>,
<a href="http://cyphercat.eu">Skhaen</a>, <a href="http://rogdham.net">Rogdham</a> et
<a href="https://progval.net">Progval</a> pour la relecture et les ressources</em></p>


feed_id: tag:gordon.re,2013-01-07:/hacktivisme/un-hackerspace-nantais.html
title: Un hackerspace nantais
uri: 2020-11-15-Un-hackerspace-nantais
url: https://gordon.re/hacktivisme/un-hackerspace-nantais.html
content:
<p>Suite à <a href="https://status.ndn.cx/notice/1572310">un rapide gazouillage</a>, une
réunion s’est aujourd’hui improvisée dans un bar de Nantes, dans l’optique de
rassembler des gens intéressés pour la création d’un hackerspace. Compte-rendu.</p>
<!-- cut -->

<h3>Qu’est-ce qu’un hackerspace ?</h3>
<p><img src="media/96497f22.mateist.png" data-original-source="https://gordon.re/images/hackerspace-nantes/mateist.png" alt="Mateist"
title="Mateist — CC-BY-SA HSBP" width="299" height="234" class="aligncenter
size-full" /></p>

<p>Je ne pense pas qu’il y ait de définition académique. Alors voici ma définition
très personnelle. Nous n’avons pas évoqué ce que nous pensions être un
hackerspace, et il me semble pertinent de le faire à l’avenir.</p>
<p>Un hackerspace est avant tout un lieu d’échange. De fait centré sur la
technologie, mais ce n’est pas une limite. En réalité, c’est un endroit
autonome, aussi indépendant que possible, dans lequel les gens viennent partager
leurs connaissances, compétences, expériences, et idées. Par nature, il est donc
raisonnablement anarchiste. À mon sens, il y a 3 notions à respecter
impérativement :</p>
<ul>
<li><strong>ouverture</strong>. Parce que malgré l’image élitiste que les gens peuvent parfois
avoir, il est important que le hackerspace soit ouvert à tous, et à tout. C’est
à dire, en premier lieu, aucune discrimination. On accueille toute personne
souhaitant y entrer, avant tout parce qu’on n’a pas à avoir de l’autorité sur
elle. Ouvert à tout, également. Parce que quiconque veut faire quelque
chose peut le faire. Ce n’est pas pour autant que tout le monde doit y
participer, mais il ne faut pas, par exemple, décréter qu’un hackerspace ne fera
pas de domotique, sous prétexte que ça ne semble pas suffisamment important pour
mériter qu’on y consacre du temps. Ajouter des règles restrictives serait
totalement contre-productif et à l’opposé des valeurs défendues.</li>
<li><strong>partage</strong>. Naturellement, c’est un lieu de mise en commun de connaissances.
S’il n’est pas interdit d’entrer dans un hackerspace pour se poser sur un coin
de table et bosser tout seul, il faut admettre que ça n’a pas vraiment 
d’intérêt et qu’il vaut mieux le faire chez soi. La véritable valeur ajoutée
du hackerspace, c’est la possibilité de travailler ensemble, d’apprendre des
autres, et d’apprendre aux autres ce que l’on sait faire, en retour (ou pas
d’ailleurs, il ne s’agit pas d’« un prêté pour un rendu »), de mutualiser de
l’outillage, et de partager ensuite au reste du monde ce que l’on conçoit, au
travers des <a href="http://fr.wikipedia.org/wiki/Licence_libre">licences libres</a>. </li>
<li><strong>fun</strong>. C’est peut-être surprenant de le trouver parmi les valeurs clés d’un
tel lieu, mais c’est pour moi crucial. Les hackerspaces sont gérés par leurs
membres, qui ne sont pas des employés. Personne n’est payé pour venir, alors il
faut garder à l’esprit que, si les gens viennent, c’est par envie. Il est donc
important de renouveler l’envie en prenant du plaisir à faire ce qu’on y fait,
en toutes circonstances. Que ce soit en travaillant sur des projets ou en
prenant soin du lieu, il est inefficace de le faire sous la contrainte. Ne
forcez personne à travailler avec vous sur un projet : s’il n’intéresse
personne, faites-le ailleurs (ou tout seul au hackerspace si vous voulez), mais
ça ne sera pas un mal (ou une défaite personnelle). Juste pas la bonne
opportunité.</li>
</ul>
<p>C’est une définition très théorique, en fait, parce que je ne vois pas comment
expliquer plus concrètement. Je pourrais expliquer ce qu’est le
<a href="//blog.nicelab.org">Nicelab</a>, par exemple, mais chaque hackerspace est unique.
En gros, on peut s’attendre à un bout de garage avec des barbu·e·s passionné·e·s
qui bricolent des trucs étranges, codent pendant des heures en buvant de la
bière, soudent ou dessoudent des appareils. Ou ça peut être complètement
différent.</p>
<h3>État des lieux</h3>
<p>Je débarque fraîchement à Nantes, après avoir passé l’essentiel de ma vie à
Nice. J’ai participé à la fondation du Nicelab, lancé en septembre 2011, et j’ai
été depuis l’un des membres les plus actifs, ce qui me donne une certaine
expérience pour faire la même chose en mieux ici. Car, bien qu’il y ait
énormément de dynamisme, il n’y a pas encore de vrai hackerspace. En partie
parce que les gens se sont focalisés sur la création du <a href="http://ffdn.org">FAI
local</a> <a href="http://faimaison.net">Faimaison</a>, ce qui est une bonne
chose. Maintenant que Faimaison tourne, et profitant de mon arrivée, j’ai
commencé à secouer les choses pour relancer l’idée.</p>
<p>C’est un projet qui peut donc intéresser les gens de Faimaison, dont certains
suivent l’idée de très près. Également les libristes de <a href="http://linux-nantes.org">Linux
Nantes</a>, ou encore des hackers non-affiliés, qui
seraient ravis de pouvoir partager leurs activités. Nantes est très dynamique à
ce niveau, et entre Numerama et la Cantine Numérique d’un côté, et la myriade de
start-ups technophiles de l’autre, un hackerspace sera une nouvelle pièce de
brassage culturel.</p>
<p>Enfin, il y a déjà un fablab à Nantes, et d’après ce que j’ai compris, il est
sur le point de faire une bouture. Les fablabs sont sensiblement différents des
hackerspaces, entre autres pour leur finalité : même s’il est souvent possible
dans un hackerspace de construire des choses, la finalité reste le partage de
connaissances, et non la construction en soi. Peu importe que les gens viennent
pour <em>faire</em> ou pas, dans un hackerspace. En bref, c’est assez complémentaire du
hackerspace. Il y a d’ailleurs peut-être une opportunité là-dedans : le fablab
pourrait fournir le local du hackerspace. Mais c’est pour l’instant une idée en
l’air, et il faudra que tous les intéressés se rencontrent.</p>
<h3>What do?</h3>
<p>D’abord, en discuter. On l’a déjà fait ce soir, on était 4. Ce qu’on a
rapidement dit, c’est qu’il semblait pertinent de s’installer en premier lieu à
B17, le local associatif utilisé notamment par Faimaison et Linux Nantes. C’est
un lieu sympa, grand, en centre-ville, très intéressant pour se retrouver. Il y
a des PCs, du réseau, des tables, il n’y a pas besoin de plus pour lancer une
dynamique. Si on peut y stocker une caisse de matériel et d’outillage pour faire
un peu d’électronique de base, ça couvrira déjà 80% des activités que j’ai pu
voir en un an d’existence du Nicelab. Alors certes, ça implique de mutualiser le
lieu, donc de ne pas l’ouvrir comme bon nous semblerait, et ce sera compliqué
d’y laisser du matériel un peu lourd (comme une perceuse à colonne). Mais il
faut savoir faire des compromis, sinon on n’est pas prêts d’avancer. Et pour ne
pas décider de trop de choses à 4, même si je suis assez partisan d’un
fonctionnement
<a href="//blog.nicelab.org/la-faisocratie-en-pratique.html">faisocratique</a> pour un tel
projet, je proposerai dans les prochains jours de faire une nouvelle réunion, 
dans le but de faire connaissance et de commencer à échanger sur des projets.
La suite se planifiera à ce moment, je n’ai pas de visibilité sur la façon
dont les choses vont évoluer, étant donné qu’idéalement, il s’agira de la somme
de ce que tous les membres y apporteront.</p>


feed_id: tag:gordon.re,2012-12-17:/cryptographie/traduction-ecb-la-mauvaise-facon-de-faire.html
title: [Traduction] ECB : La mauvaise façon de faire
uri: 2020-11-15-Traduction-ECB-La-mauvaise-façon-de-faire
url: https://gordon.re/cryptographie/traduction-ecb-la-mauvaise-facon-de-faire.html
content:
<p>Voici une traduction de <a href="http://www.rogdham.net/2012/11/24/ecb-youre-doing-it-wrong.en">Rogdham</a>, un hacker que j’ai eu le plaisir de rencontrer au <a href="https://nicelab.org">Nicelab</a>. Ce billet est une explication très claire des problèmes de conception du mode <acronym title="Electronic CodeBook">ECB</acronym> appliqué aux algorithmes de chiffrement.</p>
<!-- cut -->

<h3>ECB : La mauvaise façon de faire</h3>
<h4>1 — Electronic CodeBook</h4>
<p>Le chiffrement par blocs (tels que l’<acronym title="Advanced Encryption Standard">AES</acronym>) est une bonne méthode pour chiffrer un bloc (par exemple de 16 octets) de données en utilisant un algorithme qui a été démontré (quelle qu’en soit la méthode) comme sûr.</p>
<p>Le problème est que les messages que nous voulons envoyer chiffrés sont généralement plus longs que 16 octets. D’où le besoin de passer d’un algorithme par blocs à un algorithme par flux.</p>
<p>Pour ce faire, il existe différents modes d’opération. Parmi eux, ECB est le plus simple : on considère le message comme une suite consécutive de blocs, et on applique simplement le chiffrement à chaque bloc séparément. Cependant, ce mode est connu pour ne pas être sûr, étant donné qu’il est sujet aux analyses fréquentielles.</p>
<div class="center"><img src="media/63d32301.tux_ecb.jpg" data-original-source="https://gordon.re/images/ecb/tux_ecb.jpg" alt="Tux chiffré en mode ECB : nous pouvons toujours reconnaître qu’il s’agit de la mascotte de Linux" /></div>

<p>L’image ci-dessus a été chiffrée en utilisant le mode ECB. Nous avons perdu des détails (comme les couleurs utilisées), mais il est assez clair que l’image originale était Tux, la mascotte de Linux.</p>
<p>Bon, cet exemple avait pour but de démontrer la faiblesse de ECB. Comment un attaquant s’y prendrait-il pour exploiter un algorithme de chiffrement <em>sûr</em> qui utiliserait le mode ECB ?</p>
<h4>2 — Contexte</h4>
<p>Comme vous l’avez peut-être lu dans <a href="http://r.rogdham.net/15">mon précédent article</a>, j’ai participé au <a href="http://polictf.it/">PoliCTF</a>, qui était une compétition de sécurité en <acronym title="Capture The Flag">CTF</acronym>. Le challenge B1N 500 consistait à récupérer un fichier depuis un programme binaire.</p>
<p>La partie du programme qui nous intéressera pour le reste de cet article fonctionne comme tel :</p>
<ol>
<li>Il demande une clé à l’utilisateur.</li>
<li>Il déchiffre des données avec AES en mode ECB en utilisant cette clé.</li>
<li>Il enregistre les données dans un fichier appelé 0.bmp.</li>
</ol>
<p>Comment vous y prendriez-vous ? Si vous voulez essayer, <a href="/images/ecb/polictf_ecb_0.bmp">voici le fichier <acronym title="BitMaP">BMP</acronym> obtenu lorsque l’on donne une clé vide au binaire</a>. Bien sûr, il ne s’agit pas d’une image BMP valide.</p>
<p>J’ai réussi à obtenir le token lors de ce CTF, mais ça n’était que la première étape (sur 3) du challenge B1n 500. Malheureusement, nous n’avons pas été capables d’aller plus loin faute de temps, donc vous ne trouverez pas d’exploit complet ici.</p>
<h4>3 — Exploit</h4>
<p>L’exploit commence avec de l’analyse fréquentielle.</p>
<p>Étant donné qu’on sait qu’AES est utilisé, on peut assumer que les blocs font 16 octets. Donc on découpe le fichier en blocs, et on compte la répartition des différents blocs.</p>
<div class="center"><img src="media/c44d95f6.polictf_ecb_frequencies.png" data-original-source="https://gordon.re/images/ecb/polictf_ecb_frequencies.png" alt="Analyse fréquentielle" /></div>

<p>Comme le montre le graphique ci-dessus, un même bloc représente 90% de la taille du fichier, le second 6,8%, et les autres sont à moins de 1%.</p>
<p>L’idée suivante est simple : remplaçons les blocs les plus fréquents par des pixels blancs, et les second plus fréquents par des pixels noirs, et laissons de côté les autres.</p>
<p>Mais nous avons un problème : quelle est la taille de l’image ? La méthode par tâtonnage est appropriée dans ce cas. Essayez différentes valeurs, et vous obtenez finalement une image valide !</p>
<div class="center"><img src="media/10cdada9.polictf_ecb_first_result.png" data-original-source="https://gordon.re/images/ecb/polictf_ecb_first_result.png" alt="Premier résultat" /></div>

<p>C’est loin d’être parfait, pour deux raisons :</p>
<ul>
<li>Nous avions oublié que le format BMP liste les pixels de bas en haut et de gauche à droite, alors l’image doit être retournée.</li>
<li>Il y a un certain décalage à faire, étant donné que nous ne connaissons pas la taille des en-têtes du fichier (j’ai également retiré un certain nombre de pixels blancs avant et après cette image).</li>
</ul>
<p>Étant donné qu’il s’agissait d’un CTF, j’étais pressé par le temps, alors j’ai simplement ouvert mon éditeur d’images favori, effectué une transformation miroir et lu le token : <kbd>Trolld</kbd>. Mission accomplie.</p>
<p>Ceci dit, pour aller plus loin, nous devrions envisager ceci :</p>
<ul>
<li>Partir du principe que le header fait 54 octets, ce qui aurait résolu le problème de décalage.</li>
<li>Utiliser plus que les 2 plus fréquents blocs.</li>
</ul>
<p>Ce qui donne le résultat suivant :</p>
<div class="center"><img src="media/6b29c6fb.polictf_ecb_second_result.png" data-original-source="https://gordon.re/images/ecb/polictf_ecb_second_result.png" alt="Second résultat" /></div>

<h4>4 — Conclusion</h4>
<p>Le mode ECB n’est pas sûr. Nous le savions déjà, mais cela a été particulièrement facile de savoir à quoi l’image ressemblait sans avoir la moindre idée de la clé.</p>
<p>Bien sûr, cela a fonctionné parce que le format BMP n’est pas compressé, ou quoi que ce soit. La compression est un moyen d’agrandir l’entropie des données. Mais si l’attaquant a suffisamment de données, l’analyse fréquentielle fonctionnera toujours. Ceci dit, si vous augmentez l’entropie de façon à ce que vos données aient l’air aléatoires, vous serez en sécurité. Devinez quoi ? C’est exactement ce que fait le chiffrement.</p>
<p>Et il est inutile d’utiliser un mauvais mode de chiffrement par-dessus un bon. Contentez-vous d’en utiliser un meilleur.</p>


feed_id: tag:gordon.re,2012-12-17:/blog/vers-le-web-troispointzero.html
title: Vers le web Troipoinzéro !
uri: 2020-11-15-Vers-le-web-Troipoinzéro
url: https://gordon.re/blog/vers-le-web-troispointzero.html
content:
<p>Ceux qui me lisent depuis longtemps peuvent percevoir une évolution constante dans ce blog. Ou une régression, si vous préférez. Le fait est que depuis la version 2 (sur gordontesos.com), je suis passé à une version épurée de tout script, voire de tout appel externe : aucune image n’était appelée sur un autre serveur, pas même les avatars fournis par Gravatar, qui étaient récupérées en local. Pas de boutons de partage social non plus, notamment parce qu’il s’agit de petites saloperies traceuses, mais également parce que les gens qui veulent partager un billet n’ont pas besoin d’un bouton clignotant pour le faire.</p>
<p>Et bien je passe un nouveau cap. Bienvenue sur la quatrième mouture du Kikooblog du Poney ! À première vue, peu de différences, mais si vous regardez bien :</p>
<ul>
<li>Les pages sont très sensiblement plus rapides à charger</li>
<li>Le title du blog a évolué en conséquence (et il est 20% plus cool)</li>
<li>Il n’y a plus de formulaire de recherche</li>
<li>Il n’y a plus la liste de mes dernières publications sur <a href="https://status.ndn.cx">StatusNet</a></li>
<li>Il n’y a plus de commentaires, ni de moyen d’en laisser</li>
</ul>
<!-- cut -->

<h3>Wait, WHAT ?</h3>
<p>Hormis le second point, tout s’explique par un fait très simple : le blog est maintenant statique. Donc, à l’heure d’une évolution parfois douteuse du web, je prends le sens inverse. Il y a deux vraies raisons derrière tout ça :</p>
<ul>
<li>Je prévois de ne plus faire mentir le footer du blog à court terme, et donc de véritablement héberger ce blog sur mon grille-pain. C’est un projet fun que j’ai réalisé, et dont je parlerai prochainement, une fois mis en prod. En tout cas, c’est une bête pas très puissante, et donc pour limiter sa charge, un blog en HTML pur est ce qu’il y a de mieux (les contenus lourds resteront hébergés sur un gros serveur, faut pas déconner).</li>
<li>Wordpress devient trop lourd. En réalité, il l’a toujours été, mais je suis de plus en plus frustré qu’un moteur de blog se permette d’altérer mes textes, quand bien même je tape directement en HTML (par exemple, il convertit les « -- » en « — », ce qui est très gênant quand on colle du code). Il m’est inconcevable de ne pas avoir totalement la main sur mes contenus, même seulement par défaut, alors Wordpress ⇒ poubelle. Niveau sécurité, c’est également une avancée notable.</li>
</ul>
<p>J’ai donc, influencé par <a href="http://rogdham.net">Rogdham</a>, choisi de tout migrer sous <a href="http://getpelican.com">Pelican</a>. Il s’agit d’un petit logiciel écrit en python, qui transforme tout bêtement du contenu écrit en Markdown (une syntaxe légère) en arborescence HTML, en y collant un template utilisant la syntaxe <a href="http://jinja.pocoo.org">Jinja</a> (qui tend à se standardiser). J’ai donc réécrit entièrement le template de la v3 du blog, en gardant simplement le CSS. Si vous vous posez la question, sachez que ça a été très rapide et simple. Pelican tourne donc sur ma machine en local, j’écris mes billets, et grâce à un joli Makefile, je génère l’intégralité des pages. Avec une commande supplémentaire, j’uploade ces pages sur le serveur. En fait, c’est un fonctionnement tout bête mais efficace. Avec un peu de git pour versionner tout ça et y accéder facilement sur n’importe lequel de mes postes, ça donne une possibilité de rédaction assez souple. Du coup, le serveur se retrouve à ne servir que du HTML pur, ce qui a de nombreux avantages. Mais aussi des inconvénients :</p>
<ul>
<li>Plus de recherche possible, vu qu’il n’y a plus de code applicatif sur le serveur. Mais vous pouvez naviguer via les catégories et tags.</li>
<li>Plus de liste des derniers messages de micro-blogging, mais il suffit de les consulter directement via l’interface web, un client dédié ou autre.</li>
<li>Plus de commentaires. C’est le véritable point sensible. Notamment parce qu’il est arrivé d’avoir de très intéressants débats en commentaires. Pour l’heure, vous pouvez toujours réagir par mail(<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#98;&#108;&#111;&#103;&#64;&#103;&#111;&#114;&#100;&#111;&#110;&#46;&#114;&#101;">&#98;&#108;&#111;&#103;&#64;&#103;&#111;&#114;&#100;&#111;&#110;&#46;&#114;&#101;</a>), j’éditerai les billets pour inclure les contributions. Peut-être que ça incitera à écrire de vrais billets argumentés en réponse, et ça serait une très bonne chose. Et pour les réactions courtes, il semble que le micro-blogging fasse l’affaire.</li>
</ul>
<p>C’est tout pour aujourd’hui. Il reste quelques détails à peaufiner sur ce nouveau blog, mais tout devrait être corrigé rapidement.</p>


title: Howto pratique : l’installation d’une Gentoo encore plus sécurisée
uri: 2020-11-15-
url: https://gordon.re/sysadmin/howto-pratique-linstallation-dune-gentoo-encore-plus-securisee.html
feed_id:
tag:gordon.re,2012-08-19:/sysadmin/howto-pratique-linstallation-dune-gentoo-encore-plus-securisee.html

content:
<p>Il y a un certain temps, j’avais écrit un billet expliquant étape par étape <a href="https://gordon.re/sysadmin/howto-installation-gentoo-linux.html">l’installation d’une Gentoo Linux</a> avec des partitions intégralement chiffrées. Ma récente aventure avec <a href="http://freebsd.org/">FreeBSD</a> sur une de mes machines, et mon retour sous Gentoo me donne l’occasion de pousser un peu plus loin cet objectif.</p>
<!-- cut -->

<p>En effet, le simple fait de chiffrer un disque ne le rend pas totalement sécurisé par miracle. La faiblesse d’un système de chiffrement, en pratique, repose souvent dans la clé et la façon de la gérer par l’utilisateur. Parce qu’un chiffrement <a href="https://secure.wikimedia.org/wikipedia/fr/wiki/Rijndael">Rijndael</a> bien barbu ne vaut rien si sa clé est la date de naissance de l’utilisateur, naturellement. Sans tomber dans cet extrême, la solution retenue précédemment avait quelques faiblesses :</p>
<ul>
<li>Il suffisait d’une passphrase pour déchiffrer toutes les partitions. En cryptographie, on évite d’utiliser la même clé plusieurs fois, pour éviter les recoupements éventuels. Par ailleurs, la taille de la passphrase influait sur la protection apportée, et il fallait donc trouver l’équilibre entre une passphrase suffisamment forte et une qui puisse se retenir. Oublier sa passphrase impliquant une perte définitive des données.</li>
<li>Le noyau et l’initramfs se trouvaient sur le disque dur. Quelqu’un disposant d’un accès physique aurait donc pu altérer les exécutables pour, par exemple, enregistrer la frappe lors de la saisie de la passphrase, compromettant ainsi les données.</li>
</ul>
<p>Il existe donc une solution pas très complexe à cela, mais que je n’avais pas voulu essayer à l’époque (par peur de voir trop gros d’un coup, l’autre raison étant que les explications claires n’étaient pas encore écrites sur le <a href="http://en.gentoo-wiki.com/wiki/DM-Crypt_with_LUKS">guide utilisé</a>) : stocker le noyau et l’initramfs sur un support amovible, qui serait sur moi en permanence, et qui par ailleurs contiendrait la clé de déchiffrement du disque, chiffrée en GPG. La dernière fois, utiliser GPG ne me semblait pas être une bonne idée, mais le fait de stocker la clé sur un support externe apporte une solution convenable à ce problème : on a maintenant une authentification forte (car basée sur 2 méthodes distinctes) pour déverrouiller la machine : il faut à la fois posséder le support externe et connaître la passphrase pour accéder au disque. Par ailleurs, au lieu d’avoir plusieurs partitions que l’on déverrouillera avec la même clé, on peut utiliser LVM pour créer des partitions logiques, stockées sur une seule partition physique, qui, elle, sera chiffrée en premier lieu.</p>
<p>En plus de cela, j’ai choisi de partir sur le projet <a href="http://www.gentoo.org/proj/fr/hardened/primer.xml">Gentoo Hardened</a>, qui est un ensemble de modifications et d’ajouts pensés pour la sécurité, sur la distribution Gentoo. Concrètement, il s’agit de l’ajout de PaX, SElinux, GRsec et autres modules améliorant la sécurité du système en consolidant les accès systèmes, fichiers, etc. Cette « déclinaison » de la Gentoo a la réputation d’être le meilleur choix de sécurité pour du GNU/Linux (les systèmes BSD étant encore un cran au-dessus, pour peu qu’on sache les utiliser comme il faut). Et pour finir, j’ai souhaité garder un système Libre, sans exception. Bien que non référencée dans les distributions <a href="https://www.gnu.org/distros/free-distros.html">GNU-compliant</a> par la <a href="http://fsf.org/">Free Software Foundation</a>, deux petites astuces permettent de se prémunir de tout code non-libre dans son beau système. Non seulement parce que je crois qu’utiliser du logiciel libre me permet d’avoir confiance dans mon système, mais également par principe, sachant que j’utilise très peu de logiciels non-libres sur mes autres systèmes. C’est en quelque sorte un défi.</p>
<h3>Disque dur chiffré, le retour</h3>
<p>Pour rappel, les améliorations du système précédent sont donc :</p>
<ul>
<li>L’utilisation de LVM pour n’avoir qu’un volume LUKS à déchiffrer (ce qui est plus pratique <strong>et</strong> plus sécurisé)</li>
<li>L’utilisation d’un keyfile au lieu d’une passphrase, pour avoir une clé nettement plus longue et dont on n’a pas besoin de se souvenir, elle-même chiffrée par une passphrase avec GPG</li>
<li>Le stockage du noyau, de l’image initramfs, et du keyfile sur un support amovible, que je garderai constamment sur moi</li>
<li>Pour finir, on change de méthode de génération de l’initramfs, en optant pour <a href="https://www.kernel.org/pub/linux/utils/boot/dracut/dracut.html">Dracut</a> , qui sait tout faire tout seul</li>
</ul>
<p>Au moment de partitionner le disque, nous allons donc créer une seule partition, puisque c’est LVM qui, à l’intérieur, s’occupera de la segmenter en partitions logiques. Dans cet article, on supposera que le disque dur est <em>/dev/sda</em>. Avec fdisk ou votre outil de partitionnement préféré, supprimez donc tout, puis créez une unique partition qui prendra toute la capacité disponible (ce sera <em>/dev/sda1</em>). Cette partition sera un conteneur LUKS, qui, une fois ouvert, contiendra le VG de LVM, dans lequel seront nos 3 partitions : root (<em>/</em>), home (<em>/home</em>) et swap (non monté). Mais pour commencer, on génère la clé. Pour cela, je pioche dans le générateur de pseudo-aléa <em>/dev/random</em> une quantité raisonnable de données, que je découpe proprement pour avoir une chaîne alphanumérique de 255 caractères.</p>
<div class="codehilite"><pre><span></span><code>head -c <span class="m">255</span> /dev/random <span class="p">|</span> uuencode -m - <span class="p">|</span> head -n -1 <span class="p">|</span> tail -n +2 <span class="p">|</span> tr -d <span class="s1">&#39;\n&#39;</span> <span class="p">|</span> gpg --symmetric -a &gt; sda1.gpg <span class="c1">#puis on agite sauvagement la souris, ou on tape comme un goret sur son clavier, pour générer de l’entropie</span>
</code></pre></div>

<p>Nous avons notre clé. Notez que nous avons pris soin de supprimer les retours à la ligne pour éviter une mauvaise surprise avec les pipes, bien qu’il ne devrait pas en avoir. Créons maintenant le conteneur LUKS.</p>
<div class="codehilite"><pre><span></span><code>gpg --quiet --decrypt sda1.gpg <span class="p">|</span> cryptsetup -d - -v --cipher serpent-cbc-essiv:sha256 --key-size <span class="m">256</span> luksFormat /dev/sda1
</code></pre></div>

<p>Notez bien le « -d - », il permet d’éviter le genre d’ennuis cité ci-dessus, et surtout, il sera utilisé par défaut par le script d’initialisation, alors il vaut mieux utiliser la même méthode. Ensuite, pour ouvrir le conteneur :</p>
<div class="codehilite"><pre><span></span><code>gpg --quiet --decrypt sda1.gpg <span class="p">|</span> cryptsetup -d - luksOpen /dev/sda1 vg0
</code></pre></div>

<p>Le nom du volume LUKS (ici vg0) importe peu, et je fais confiance à votre imagination fertile pour attribuer un nom qui vous fera briller en société. Notre volume étant ouvert (mais pas formaté, ni monté) dans <em>/dev/mapper/vg0</em>, nous allons pouvoir en faire un VG, justement, et crééer les partitions à l’intérieur.</p>
<div class="codehilite"><pre><span></span><code>pvcreate /dev/mapper/vg0
vgcreate vg0 /dev/mapper/vg0 <span class="c1">#le premier vg0 est le nom du volume, tandis que /dev/mapper/vg0 est la partition LUKS ouverte. Faut suivre hein</span>
<span class="c1">#on peut créer nos LV. Mettons que notre disque fait 100Go</span>
lvcreate -n root -L 49g vg0
lvcreate -n home -L 49g vg0
lvcreate -n swap -L 2g vg0
</code></pre></div>

<p>Vous aurez compris que l’on a assigné 2Go de swap (l’équivalent de notre mémoire physique, au cas où on voudrait suspendre le système), puis que l’on a bêtement redistribué équitablement à <em>/home</em> et <em>/</em>. N’hésitez pas à personnaliser ces valeurs pour correspondre à vos besoins. Nous avons maintenant nos partitions, prêtes à recevoir un filesystem (XFS dans mon cas). Si jamais vous devez reprendre votre installation (à cause d’une tentative infructueuse de boot, par exemple), vous risquez de vous demander comment retrouver vos volumes LVM, après avoir déchiffré <em>/dev/sda</em> :</p>
<div class="codehilite"><pre><span></span><code>vgscan <span class="o">&amp;&amp;</span> vgchange -ay
</code></pre></div>

<p>Et vos partitions vous attendront sagement dans <em>/dev/vg0/</em><em>. Activez le swap avec « </em>mkswap /dev/vg0/swap &amp;&amp; swapon /dev/vg0/swap<em> », puis continuez l’installation classique du système. Après la compilation du noyau, il est inutile de l’installer, car nous n’utiliserons de toutes façons pas le </em>/boot<em>. À la place, installez </em>sys-kernel/dracut*, qui se chargera de générer un initramfs tout beau pour vous. Mais avant, spécifiez les modules que vous souhaitez compiler (j’indique mon propre choix, utile pour cette installation) :</p>
<div class="codehilite"><pre><span></span><code><span class="nb">echo</span> <span class="s1">&#39;DRACUT_MODULES=&quot;crypt crypt-gpg lvm&quot;&#39;</span> &gt;&gt; /etc/make.conf
<span class="nb">echo</span> <span class="s1">&#39;sys-kernel/dracut device-mapper&#39;</span> &gt;&gt; /etc/portage/package.use
emerge -va dracut
</code></pre></div>

<p>Ensuite, il vous faut un support amovible, tel qu’une bête clé USB. Commençons par effacer son MBR : après l’avoir insérée, et vérifié son nom de device (ici, <em>/dev/sdb</em>), installez syslinux, puis tapez :</p>
<div class="codehilite"><pre><span></span><code>emerge -va syslinux
dd <span class="k">if</span><span class="o">=</span>/dev/zero <span class="nv">of</span><span class="o">=</span>/dev/sdb <span class="nv">bs</span><span class="o">=</span>1024k <span class="nv">count</span><span class="o">=</span><span class="m">5</span> <span class="nv">conv</span><span class="o">=</span>notrunc
mke2fs -m0 /dev/sdb1
mkdir tempdir <span class="o">&amp;&amp;</span> <span class="nb">cd</span> tempdir
cp /usr/portage/distfiles/syslinux-*.tar.bz2 .
tar -xvjf syslinux-*.tar.bz2
<span class="nb">cd</span> syslinux-*
cat mbr/mbr.bin &gt; /dev/sdb
mkdir /mnt/usb
mount /dev/sdb1 /mnt/usb
<span class="nb">cd</span> /mnt/usb
cp /usr/src/linux/arch/&lt;arch&gt;/boot/bzImage . <span class="c1">#remplacez &lt;arch&gt; par votre architecture</span>
cp syslinux-&lt;version&gt;/com32/menu/menu.c32 .
cp chemin/vers/sda1.gpg .
</code></pre></div>

<p>Il ne reste plus qu’à générer l’initramfs avant de rendre le médium bootable. À ce stade, vous êtes toujours en chroot, avec un système dont il y fort à parier dont le noyau diffère de celui que vous venez de compiler. Dracut va donc logiquement couiner, ne trouvant pas les modules du noyau actuel. Il faut donc d’abord générer les dépendances de modules pour le noyau actuel, puis générer l’initramfs en lui indiquant le bon répertoire pour les modules :</p>
<div class="codehilite"><pre><span></span><code>depmod <span class="sb">`</span>uname -r<span class="sb">`</span>
</code></pre></div>

<p>Avant d’utiliser dracut, on va le configurer un peu, histoire de s’assurer qu’il chargera les bons modules (ça serait bête de ne pas pouvoir utiliser gpg, par exemple). Tout ce que j’ai eu à faire a été de modifier cette ligne dans <em>/etc/dracut.conf</em> :</p>
<div class="codehilite"><pre><span></span><code><span class="nv">add_dracutmodules</span><span class="o">+=</span><span class="s2">&quot;crypt crypt-gpg lvm dm selinux&quot;</span>
</code></pre></div>

<p>Nous sommes enfin prêts à générer l’image.</p>
<div class="codehilite"><pre><span></span><code>dracut -k /lib/modules/<span class="sb">`</span>uname -r<span class="sb">`</span>
mv initramfs-* initramfs-<span class="sb">`</span>uname -r<span class="sb">`</span>.img
</code></pre></div>

<p>Il nous reste cependant à configurer le programme de démarrage, extlinux. Créez un fichier <em>extlinux.conf</em> dans <em>/mnt/usb</em>, et adaptez son contenu selon le mien :</p>
<div class="codehilite"><pre><span></span><code><span class="err">DEFAULT menu.c32</span>
<span class="err">TIMEOUT 100</span>
<span class="err">PROMPT 0</span>
<span class="err">LABEL Gentoo</span>
<span class="err">    MENU LABEL Gentoo ^Linux</span>
<span class="err">    MENU DEFAULT</span>
<span class="err">    KERNEL bzImage</span>
<span class="err">    APPEND root=/dev/vg0/root rd.luks.key=/sda1.gpg initrd=initramfs-&lt;version&gt;.img</span>
</code></pre></div>

<p>Vérifiez scrupuleusement les paramètres de boot, dans « APPEND ». Ils sont la principale source de boot foireux. Si vous désirez choisir une keymap précise (par défaut, ce sera en qwerty), ajoutez « <em>vconsole.keymap=</em><em><keymap></em><strong> », en insérant le nom de la keymap, </strong>fr-dvorak-bepo pour moi*. On finit donc :</p>
<div class="codehilite"><pre><span></span><code>extlinux .
<span class="nb">cd</span>
umount /mnt/usb
sync
</code></pre></div>

<p>Et on tente le reboot. Naturellement, vérifiez que votre BIOS vous permet de booter sur un support amovible. N’oubliez d’ailleurs pas de brancher ledit support, ça évitera un arrachage de cheveux tout à fait inopportun. Si vous avez bien fait les choses, un joli menu s’affichera, vous proposant de booter votre noyal. Après validation, celui-ci se chargera, exécutera l’initramfs, qui analysera alors le disque, et, trouvant le keyfile que vous lui avez indiqué, vous demandera sa passphrase. Méfiez-vous de la keymap, si vous ne l’avez pas fixée manuellement. Ensuite, le système continue paisiblement son boot. Félicitations, vous venez de faire un pas de plus vers la paranoïa sécuritaire.</p>
<h3>Gentoo, GNU/Linux libre ?</h3>
<p>Pour finir, deux mots sur l’astuce évoquée, pour bénéficier d’un système 100% libre selon les termes très stricts de la FSF. Si vous êtes habitué de Portage, vous savez qu’il connaît la licence de chaque paquet, et que, si vous tentez d’installer certains programmes pas trop libres, il vous demandera d’accepter explicitement cette nouvelle licence. Et bien <a href="http://www.gentoo.org/doc/en/handbook/handbook-x86.xml?part=2&amp;chap=1#doc_chap4">Portage permet de définir la politique d’acceptation des licences</a>, et c’est très bien fait, car il possède des « sets » de licences, permettant de les trier facilement. Il suffit de spécifier votre choix dans <em>/etc/make.conf</em>. Par exemple, j’ai opté pour ça :</p>
<div class="codehilite"><pre><span></span><code><span class="nv">ACCEPT_LICENCE</span><span class="o">=</span><span class="s2">&quot;-* @FREE&quot;</span>
</code></pre></div>

<p>Ce qui n’accepte que les programmes sous licence libre agréée par la FSF. Comme vous pouvez le voir, c’est simplissime. Il y a encore une chose à faire : le noyau Linux contient, dans ses sources officielles, des morceaux de code binaire non libre, essentiellement des drivers. Il existe un script permettant d’analyser les sources, de débusquer ces <em>blobs</em> et de les supprimer. Ainsi, les sources que vous compilerez seront propres. Naturellement, ça implique de se passer desdits drivers. Encore une fois, Portage nous vient en aide, puisqu’il offre un USE flag disponible sur tous les noyaux (par exemple <em>sys-kernel/hardened-sources</em> pour moi).</p>
<div class="codehilite"><pre><span></span><code><span class="nb">echo</span> <span class="s1">&#39;sys-kernel/hardened-sources deblob&#39;</span> &gt;&gt; /etc/portage/package.use
emerge -va hardened-sources
</code></pre></div>

<p>Et voilà le travail. Le script met un peu de temps à faire son boulot, mais ensuite, votre noyau ne contiendra que du logiciel libre ! Et avec les 2 astuces combinées, vous êtes certain de ne pas ajouter de logiciels non-libres sur votre système, hormis exceptions explicitement créées.</p>


feed_id: tag:gordon.re,2012-07-30:/panlithea/neo-gaelith.html
title: Panlithea : Néo-Gælith
uri: 2020-11-15-Panlithea-Néo-Gælith
url: https://gordon.re/panlithea/neo-gaelith.html
content:
<p>Voici enfin la suite de ma nouvelle, <a href="https://gordon.re/panlithea/la-catatelie.html">La Catatélie</a>. Son écriture aura été laborieuse, et très longue. Je suis donc fier d’avoir pu la mener à bien, et j’espère à la fois qu’elle plaira, et qu’elle apportera des réponses aux interrogations levées précédemment. Je vous remercie par avance des différentes remarques, corrections, que je ne tarderai pas à incorporer au récit. J’en profite également pour remercier tous ceux qui m’ont aidé, de près ou de loin, à la rédaction de la précédente nouvelle, ainsi que celle-ci.</p>
<p>Sa licence est celle du blog, c’est à dire CC-by-sa. Et je ferai une version pdf bien jolie rapidement.</p>
<!-- cut -->
<div class="text">
<h3>Journal d’Iskh — première entrée</h3>
<p>Il me semble indispensable d’effectuer ce travail de mémoire. Pour ce que mes semblables et moi avons vécu récemment, et pour ce qui arrivera à l’avenir. J’ignore si d’autres ont eu la même initiative, mais je tiens à ce que que cela puisse être transmis aux futures générations, si jamais elles subsistent.</p>
<p>Mes souvenirs sont encore très confus, et pourtant, plusieurs ors se sont écoulés depuis notre arrivée. Je vais essayer de narrer le plus précisément possible ce que les miens ont enduré. Tout d’abord, il faut savoir que nous sommes un peuple qui défia les Âges. Espèce supérieure de notre monde, nous l’avons dominé sous toutes ses facettes. Nous l’avons colonisé, et continué notre expansion vertigineuse. Jusqu’à ce que tout autour de nous commence à se disloquer. Ces événements nous conduisirent à un exode massif, une fuite immédiate, ordonnée par le Dessus, la caste qui nous dirigeait. Des immenses portails composés d’arcane, surgis d’on ne sait où, apparurent, et nous permirent de sauver notre civilisation. Avec le maigre recul qu’il m’est donné de prendre aujourd’hui, je constate que nul salut ne nous attendait. En réalité, j’ai eu de la chance. Ceux qui, comme moi, arrivèrent de l’autre côté, ont eu de la chance. Car, parmi les centaines de milliers de Panlithes que j’avais pu observer autour de moi avant de franchir l’immense édifice, seules quelques centaines ont atteint la sortie. Et dans quel état…</p>
<p>Vous qui lirez ces mots, je vous implore de me croire, malgré l’effroi de la chose. Ce que je raconte, je l’ai vécu et vu, et cela restera ancré au plus profond de mon âme. Je n’ai aucun souvenir de mon propre passage : j’ai, semble-t-il, perdu connaissance en franchissant le voile du portail. Mais j’ai pu voir émerger de nouveaux arrivants. Je me tenais à distance respectable du point d’arrivée, et, régulièrement — j’entends par là tous les deux ou trois arcs —, une forme sombre naissait à la surface du voile semi-opaque, grossissait rapidement, avant d’éclater dans un éclair de lumière vive. Alors, on retrouvait au sol ce qu’autrefois on aurait appelé un Panlithe. Au début, je fus horrifié de la vision de ces êtres déchiquetés, dont le corps avait été partiellement désintégré. Les blessures étaient diverses, mais souvent gravissimes, et avaient touché la quasi-totalité des arrivants. Je garde le souvenir d’un homme, semblant assez vieux, qui se matérialisa, puis chuta. Je le pensai alors mort, mais il se releva doucement, vraisemblablement exténué, et très affaibli. Plusieurs personnes accoururent vers lui pour l’aider à tenir debout, avant de le guider vers des abris de fortune. Je pus observer avec effroi son corps, dont des parties avaient tout simplement disparues, laissant pendre ses entrailles luminescentes et presque translucides. Autour de moi, les séquelles étaient tout aussi écœurantes : ici, un individu avait perdu la moitié de son corps, sectionné au niveau de l’abdomen, là, un autre se tordait de douleur : il n’avait plus le moindre fragment de peau pour recouvrir sa chair.  Des médecins improvisés tentaient de calmer ses souffrances du mieux possible, mais cela ne semblait pas apaiser le pauvre bougre. Ou encore, un bébé miraculeusement entier, recouvert des pieds à la tête des entrailles et du fluide vital de ce qui avait du être son parent, le protégeant de ses bras lors du passage. Pour ma part, j’ai perdu un bras, et de la peau sur une partie du visage. Malgré cela, nous pûmes constater avec surprise que nous étions toujours en vie, malgré des blessures visiblement létales. Personne n’avait d’explication à ce sujet, et nous avions bien d’autres préoccupations plus urgentes.</p>

<p>Ainsi, passé le désarroi de l’arrivée, nous avons pu constater où nous avions posé pied. Bien loin de la mégalopole étouffante que nous avions toujours connue, nous sommes tombés sur un paysage vierge, éclatant de couleurs vives et chatoyantes. Étrangement, la lumière ambiante ne semblait plus nous entourer, mais tombait maintenant du ciel, émise par un astre, chose que nous ne connaissions alors pas. Celui-ci portait son éclat sur des montagnes rocheuses nues, sur lesquelles nul bâtiment ne se hissait, sur d’immenses étendues de végétations, sur lesquelles il était évident que nul Panlithe n’avait jamais mis le pied. Tout autour de nous nous était étranger, les doux brins d’herbe caressant nos pieds, qui n’avaient connu que de plates routes modelées artificiellement. l’immense et dorénavant effrayant portail par lequel nous étions arrivés était situé au sommet d’une sorte de colline, nous permettant d’avoir une vue d’ensemble sur le paysage : à perte de vue, nulle trace visible de civilisation, seulement la nature, peut-être bien la même qui jadis avait proliféré sur Gælith…</p>
<p>Plus étrange encore, nous avons pu constater que l’astre qui brillait au dessus de nos têtes se déplaçait lentement, occasionnant des cycles d’alternance. Nous nous retrouvions ainsi la moitié du temps dans une obscurité profonde, dans laquelle ne brillaient que quelques points loin dans le ciel. Lorsque l’obscurité nous envahissait, certains d’entre nous crurent sentir des mouvements au loin, dans d’étranges et immenses forêts.</p>
<p>A l’heure où j’écris ces lignes, j’ai compté 5 de ces cycles, que les gens commencent à prendre comme référentiel temporel. Nous avons calculé qu’un jour dure environ 1,8 ors, c’est à dire très exactement 1838 arcs. Par ailleurs, le chaos n’a pas régné bien longtemps après notre sortie : les premiers venus eurent le bon sens de chercher à protéger le lieu de notre arrivée : des arcanistes amateurs cherchèrent à élever une bulle protectrice qui servirait de muraille aux Panlithes survivants. Cette opération fut désastreuse : les mages s’étouffèrent dès lors qu’ils cherchèrent à manipuler l’arcane. Leurs yeux vitreux semblaient appeler à l’aide tandis qu’ils ne parvenaient pas à produire mieux que quelques étincelles. L’un après l’autre, ils s’effondrèrent lourdement au sol, sans vie, un air horrifié sur leur visage. D’autres leur succédèrent rapidement, mus par le besoin urgent de protéger les leurs : usant de maintes précautions, ils parvinrent à puiser autour d’eux un infime flux d’arcane, qu’ils utilisèrent pour élever lentement mais sûrement le bouclier magique qui bientôt nous enveloppa tous, nous garantissant une sécurité minimale face à un environnement encore inconnu. Mais plus important, cette barrière rassura beaucoup les rescapés, qui purent se concentrer sur l’aide aux arrivants gravement blessés. Je ne suis d’ailleurs pas resté inoccupé ces premiers temps, utilisant la rigueur due à mon entraînement militaire pour coordonner les efforts. La vue de tous ces Panlithes agonisants, que nous essayions de sauver l’un après l’autre, en plus de ceux qui nous étaient arrivés sans vie, fut très dure à supporter. Faute de sauvetage promis par le Dessus, nous avons vécu l’enfer, et c’est presque un miracle que certains d’entre nous aient pu survivre…</p>
<p>Je crains pour mon peuple, et pour la postérité. Je relate tout ceci du mieux que je le peux. Actuellement, l’astre a disparu derrière l’horizon, et il ne me reste que peu de temps avant que l’obscurité ne m’empêche d’écrire. Mais je me suis promis de continuer ce récit. Il le faut, il nous faut des repères. Et sans mon bras, c’est peut-être ma seule façon de pouvoir être utile.</p>
<h3>Journal d’Iskh — jour 6</h3>
<p>Le sommeil n’a pas été facile à trouver. La souffrance est omniprésente au sein du camp de fortune. Chacun d’entre nous, ou presque, est horriblement mutilé. La vision du vieillard du premier jour me hante toujours. À la réflexion, j’ai certainement fait le même effet lors de ma propre sortie. Le flot ne discontinue pas : une équipe a pris le relais, comme toutes les nuits, pour s’occuper des arrivants et, faute de pouvoir pratiquer des soins, tente d’apaiser la douleur des pauvres âmes qui s’effondrent sur ce sol vierge. Au pied du portail, les fluides vitaux des blessés s’écoulent depuis notre arrivée. Le sol en est souillé, si bien que l’herbe, qui lorsque nous l’avons foulée était d’un paisible jaune pâle, se teinte aujourd’hui d’un inquiétant mauve foncé, et les brins se flétrissent peu à peu. Mais très honnêtement, c’est loin d’être notre priorité.</p>
<p>Cela fait cinq jours que je suis là, et trois que la bulle protectrice a été dressée. J’ignore comment les arcanistes parviennent à puiser la force nécessaire pour le maintenir en place, et ils ne fait aucun doute qu’ils l’ignorent eux aussi. Cette protection est d’une faiblesse évidente, et j’en viens à me demander si elle n’a pas été levée dans le seul but de rassurer artificiellement les personnes. Ceci étant, aucun danger supplémentaire ne s’est présenté, et nul n’a osé s’aventurer au-delà de la bulle. C’est un peu inquiétant : notre nombre augmente constamment, et nous sommes de plus en plus serrés. Il faut réfléchir à la suite avant d’être mis dos au mur.</p>
<p>Pour ma part, ma tâche a évolué : les premiers jours, je patrouillais le camp, cherchant à aider quiconque le demandait. Avec les nouveaux arrivants, les besoins ont évolué, et je me retrouve le plus souvent à transporter et distribuer, malgré mon handicap, quelques décoctions de fortune préparées par les arcanistes à base de l’herbe que nous foulons. Ça a été un gros risque, pour nous qui sommes habitués à une alimentation purement arcanique, de goûter ces végétaux inconnus, et nous avons eu de la chance : si les vertus nourrissantes de ces plantes ne sont guère satisfaisantes, elles nous permettent de gagner un tout petit peu de force, et nous en avons grandement besoin.</p>
<p>Il s’est passé quelque chose la nuit dernière. Rien d’extraordinairement grave, mais un petit événement qui a rapidement réveillé le camp entier et a provoqué la panique. Nous avions déjà remarqué au loin, à une distance de nous suffisante pour ne pas éveiller la crainte, une forêt dense aux couleurs variées. Je dois d’ailleurs reconnaître que dans l’obscurité, celle-ci est nettement moins accueillante. En tout cas, cette nuit, certains Panlithes ont cru apercevoir pendant quelques instants des lumières mouvantes luisant au-dessus des cimes. Cela a suffi à provoquer un vent de panique. Mais là où jadis, nous nous serions tous terrés dans nos habitations en attendant que ça passe, ici, il n’y avait nul toit pour nous protéger. Pour certains, il n’y avait pas même de peau pour recouvrir la chair. Alors ce fut une panique silencieuse. Les individus se recroquevillaient en pleurnichant, terrifiés de ressentir cette effroyable vulnérabilité. Personne ne dit mot, tous les regards étaient braqués sur la forêt, de nouveau obscure. Si bien que personne ne sut s’il y avait réellement eu ces lumières. Je ne sais trop quoi en penser. Nous ne connaissons encore rien de ce monde, et il se pourrait, tel l’astre au-dessus de nous, qu’il s’agisse d’un phénomène naturel. Je ne devrais sans doute pas me faire d’illusions à ce sujet, et rester sur mes gardes. Dans mon état actuel, je suis certainement dans l’incapacité totale de protéger qui que ce soit, mais mon entraînement et mon expérience me rendent plus apte à réagir rapidement et intelligemment en cas de menace.</p>

<p>Avec le temps, je trouve de moins en moins de temps pour écrire ces mémoires. Je suis fier de me rendre utile, mais j’espère que je parviendrai à continuer cette tâche, ou que quelqu’un saura prendre le relais.</p>
<h3>Journal d’Iskh – Jour 7</h3>
<p>J’ignore comment nous avons pu imaginer que nous subsisterions en consommant l’herbe que nous piétinons, et que nous polluons depuis notre arrivée. J’imagine sans peine qu’il s’agissait d’une solution d’urgence lors de notre arrivée, mais il faut reconnaître notre responsabilité pour la situation actuelle. Car nous sommes à court. Il ne nous reste plus d’herbe, hormis celle près du portail, totalement flétrie maintenant. Et visiblement, personne ne s’est demandé comment nous surmonterions ce problème. Il y a bien de l’herbe au-delà de notre faible bulle de protection, mais personne n’a eu l’audace de passer de l’autre côté. Enfin, j’imagine que quelqu’un le fera avant que nous ne mourions tous de faim. Ça pourrait même être moi, même si cette idée me révulse. J’espère également que nous trouverons rapidement une nouvelle source de nourriture.</p>
<p>Les arcanistes qui jusque là s’occupaient de préparer les décoctions en mélangeant ces herbes à ce qu’ils avaient pu produire de nectar d’arcane ont donc pu s’atteler à leurs recherches pour comprendre ce nouveau monde. Leur priorité semble être de réveiller leur arclé, qui chez presque tous les Panlithes réfugiés est devenue d’un gris terne, et ne provoque plus aucune sensation. Il est possible que cet appendice soit irrémédiablement détruit pour notre peuple, et même si personne n’évoque cette hypothèse à voix haute, je sens que tout le monde craint particulièrement que cela n’arrive, ou ne soit déjà arrivé. Nous avons toujours vécu en l’utilisant pour manipuler et maîtriser l’arcane, et ce lien est aujourd’hui rompu. Tout espoir n’est cependant pas perdu, puisque les arcanistes ont déjà réussi à créer la bulle protectrice par magie, et ce dès le second jour ici. C’est plus que prometteur, même si la performance porte la mort de plusieurs d’entre eux, et que sur Gælith, un seul Panlithe aurait été capable, sans entraînement spécifique, de monter une barrière infranchissable pour tout le camp.</p>
<p>Ce n’est  cependant pas notre seul problème. La population continue de grandir de façon constante. Il semble que nous ayons dépassé le millier d’individus, et bien évidemment, la surface disponible reste la même, faute de pouvoir agrandir la bulle. Donc, fatalement, nous allons finir par nous agglutiner. Il faut prendre l’initiative de s’étendre au-delà de nos frontières initiales, mais sans organisation définie, personne ne prend d’initiative. Mais il se pourrait que cela puisse changer d’ici peu. Avec l’augmentation de la population, certains d’entre nous tentent de diriger les opération, vocifèrent des ordres, mais personne n’écoute de tels inconnus. Je ne sais pas ce que nous préparent les jours qui viennent, j’espère sincèrement que nous saurons réagir avant qu’il ne soit trop tard. Nous avons survécu, si tant est que l’on puisse utiliser ce terme étant donné la situation, à la destruction de notre monde, cela doit avoir un sens, nous ne sommes pas là pour rien.</p>
<h3>Journal d’Iskh — Jour 8</h3>
<p>Les choses commencent à devenir inquiétantes. Nos réserves sont totalement épuisées depuis l’aube, et personne ne propose de solution. Certains d’entre nous ont cédé à la panique. Pas au point de braver l’inconnu au-delà de la bulle, cependant, ce qui aurait pourtant été bien pratique. La plupart d’entre nous étant arrivée après qu’ait été dressée la bulle, ils ignorent même si l’air du dehors est respirable, et ils ne croient évidemment pas sur parole ce que leurs disent les premiers arrivés. On ne peut pas leur en vouloir, cela fait partie de notre culture : ne pas croire ce que disent ceux des autres clans. Or, depuis la catastrophe, il n’y a plus de clans.</p>
<p>C’est peut-être ce qui a favorisé cette situation, d’ailleurs. J’ai remarqué il y a plusieurs jours que des gens commençaient à se déplacer en groupes, se réunissaient, parlaient à voix basse entre eux. Lors d’une de mes rondes, je me suis enquis d’un de ces groupes, qui passait près de moi, composé d’une quinzaine d’individus. Celui qui tenait visiblement le rôle de leader s’est approché de moi et m’a parlé de punition divine, entre autres baragouinements. C’est parfaitement ridicule, les dieux n’ont jamais interféré dans nos vies, ils n’ont que faire de punitions. Nous sommes seuls responsables de notre vie. Mais depuis, ces groupes, qui semblent tous véhiculer la même idée, parviennent à se faire entendre de ceux qui cherchent à tout prix à être rassurés. Ceux-ci se mettent à les rejoindre. Cette situation est préoccupante, mais c’est la seule lueur d’espoir des Panlithes, pardon, des Sozlithes, car, vraisemblablement sur pression de ces illuminés, les gens demandent avec insistance que le nom de notre peuple soit ainsi changé. Ce n’est pas illogique, après tout. Nous ne sommes plus des Panlithes, quelque chose nous a changé lors du passage au travers ce portail infernal. Le peuple Panlithe a été détruit, anéanti, et nous sommes ses enfants. Alors qu’il en soit ainsi. Et comme s’il n’y avait rien de plus important que ce sujet, des bruits ont couru pour prétendre que ce nouveau monde nous avait été offert par les dieux pour reconstruire une civilisation. Ceux-là même qui ont propagé cette rumeur ont même, pour appuyer leur crédibilité, donné un nom à ce monde, un nom qui n’est plus le nôtre : <em>Panlithea</em>. Bienvenue sur Panlithea ! Bah, Pourquoi pas, ils peuvent dire ce qu’ils veulent mais nous avons des priorités autrement plus hautes.</p>

<p>Je n’ai jamais été doué avec l’arcane, et sur ce nouveau monde où celle-ci ne coule pas tout autour de nous comme c’était le cas sur Gælith, je suis bien incapable de me servir de magie. Mais j’étais un psaòplo, membre entraîné de l’Arme. Je savais traquer et torturer les traîtres. Mais je ne suis plus rien, il me manque un bras et je ne suis plus que l’ombre de ce que j’étais jadis. Pour être franc, la crainte que l’on me demande de participer à une expédition au-delà de la bulle m’empêche de dormir depuis un certain temps. J’ai honte de ce comportement égoïste, mais lorsque j’imagine me trouver en dehors de cet espace protégé, mes entrailles se figent. Je n’ai jamais connu peur pareille. Je souhaite que les miens fassent preuve de plus de courage que moi, sans quoi nous serions perdus.</p>
<h3>Journal d’Iskh — Jour 9</h3>
<p>Le groupe dont je parlais hier semble s’être organisé. Une Sozlithe est sortie du lot, assumant alors le rôle de leader, et il semble que ce soit elle qui ait tout organisé dès le début. Aujourd’hui, elle a pris publiquement la parole. Ce qui suit n’est pas une retranscription exacte, mais je vais tenter de rapporter son discours du mieux possible.</p>
<p>J’ai immédiatement remarqué, lorsqu’elle a pris la parole, l’atmosphère sereine qu’elle dégageait, en contraste absolu avec les traits de son visage, dont la peau était incroyablement claire et tirée. On lisait un épuisement immense dans son regard, et pourtant elle parlait d’une voix vive et pleine de sagesse, comme si elle portait comme fardeau une tâche cruciale. Elle a alors entamé son discours, et un silence respectueux s’est immédiatement installé autour d’elle, tandis que le petit groupe qui s’était rassemblé grossissait à vue d’œil.</p>
<blockquote><p>« Frères Sozlithes, enfants meurtris du notre terre, écoutez-moi !<br />
Écoutez-moi, car vous êtes perdus, chacun d’entre vous. Vous êtes rescapés de la tragédie qui nous a tous frappés. Rescapés, et victimes, comme moi qui ai perdu plusieurs organes internes. Mes jours sont comptés ici, mais je ne peux partir sans avoir partagé mes secrets.</p>
<p>Je me nomme Okhia. J’ai parlé à beaucoup de monde ici depuis mon arrivée, et il me semble être la seule à avoir reçu ce don. Drëmathos m’a parlé, durant mon passage dans le portail. Comme vous le savez, ceci ne s’est jamais produit depuis les Âges ancestraux. Mais il est venu à moi et m’a parlé. Il m’a révélé la raison de notre présence ici.</p>
<p>Nous sommes rescapés de la destruction de notre monde. Nous sommes voués à survivre, et repartir de zéro ici. Panlithea, notre nouvelle terre, n’est un cadeau de personne. Nul ne nous l’a offert. Nous nous y sommes raccrochés dans un bienheureux réflexe de survie. Je ne vous mentirai pas en affirmant que je sais des choses que vous ignorez au sujet de ce monde. Mais je sais que nous avons l’obligation, envers notre peuple disparu, de survivre et de recréer une civilisation. Il est évident que notre avenir se trouve à l’extérieur de cette bulle, qui nous étouffera si l’on persiste à s’y blottir.</p>
<p>Surmontons notre crainte, frères Sozlithes. Surmontons notre méfiance envers les nôtres. Ne nous agrippons pas à nos vieilles traditions claniques. Nous devons tendre la main vers nos semblables, car nous appartenons tous au même clan, celui des rescapés. Unissons-nous, et prenons dès à présent l’initiative d’explorer Panlithea, notre nouveau foyer. Je tiens à être de l’expédition, moi qui tiens à peine debout. Réunissez votre courage, et, je vous en prie, suivez-moi. Il nous faut découvrir cette terre, trouver des moyens de subsister et de reconstruire notre peuple. »

</p></blockquote>
<p>Je peux dire que son discours a eu de l’effet, et un vent de confiance a parcouru l’assistance. Nous avions certainement besoin d’entendre ces mots, et Okhia le savait. La passion dans ses mots était telle que personne n’a remis en doute sa vision. Je n’aurais pas cru ça possible, mais des gens se sont joints à elle après son allocution, visiblement pour se porter volontaires pour une expédition. Depuis, je me sens coupable de ne pas avoir eu le courage d’en faire de même. Nul doute que ces personnes étaient elles aussi blessées, plus ou moins gravement, et que je n’avais certainement pas à me plaindre à côté d’eux… Mais je n’ai pas eu leur courage, malgré mon expérience et mes connaissances. Cette lâcheté m’empêchera à nouveau de dormir, je le sens.</p>
<h3>Journal d’Iskh — Jour 10</h3>
<p>Évidemment. Je me suis engagé. Je ne réalise pas encore tout à fait mon geste, mais je l’ai fait. Je ne saurais expliquer pourquoi, peut-être par désespoir, peut-être bien même par espoir insufflé par Okhia. Moi qui redoutait ça plus que tout, me voilà même à la tête, à cause de mon expérience, de l’expédition au-delà de la bulle. Ça s’est passé plus facilement que je ne l’avais imaginé. Après avoir englouti ma maigre ration d’arcane concentrée synthétisée par les arcanistes, j’ai rejoint ce qui est depuis hier le point de rassemblement des apprentis explorateurs. Il ne m’a fallu guère longtemps pour localiser Okhia, car toute l’agitation semblait centrée autour d’elle. M’armant de tout mon courage, je me suis présenté à elle. Elle m’a dévisagé de haut en bas d’un œil expert, m’a posé des questions sur mes compétences, sur mon état de santé et sur le nombre de jours passés depuis mon arrivée. J’ai été surpris par la dureté de sa voix, à des lieues de la passion qu’elle avait déchaînée la veille, et par l’expérience qui ressortait de ses mouvements et sa façon de préparer le futur groupe. Je le lui ai fait remarquer, m’étonnant de l’énergie qu’elle dégageait, pour une mourante. Je n’ai eu en réponse qu’un sourire énigmatique et un vague <em>« je vais mieux »</em>. Peu importe après tout, c’est une bonne chose que nous ne soyons pas retardés par ses problèmes de santé.</p>
<p>À vrai dire, j’ai été la dernière personne à m’engager. Okhia a insisté pour que le groupe ne dépasse pas les 6 personnes, pour être plus réactif dans l’inconnu où nous irons. Tous les autres ont rejoint Okhia dès hier, ce qui n’a qu’accentué ma honte de ne pas avoir voulu faire face à mon devoir. L’expédition sera donc constituée d’Okhia, de deux Sozlithes visiblement assez jeunes, peut-être encore enfants, qui disent être frère et sœur, d’une ex-Sentinelle, d’un citoyen qui s’est montré très mal à l’aise à l’idée de notre mission, et de moi-même. Notre objectif est double : d’abord, nous devons nous aventurer au-delà de la bulle et explorer les environs, pour mieux savoir où nous sommes, et ce que nous pouvons trouver à portée, et ensuite enquêter sur les lueurs observées dans la forêt proche, qui s’est répétée plusieurs fois depuis le vent de panique d’il y a quelques jours, et à chaque fois en pleine nuit. Nous ignorons totalement le risque de cette mission, et nul ne peut nous préparer à ce que nous trouverons.</p>
<p>Malgré ma peur, je suis aujourd’hui convaincu de la nécessité de cette expédition. La situation dans le camp devient dramatique. Le flux d’arrivants est toujours constant, et quasiment sans nourriture, les pertes se multiplient. La bulle de protection maintenant une atmosphère hermétique autour de nous, les odeurs des corps en décomposition, sommairement entassés dans une construction en terre durcie, se répandent et deviennent insoutenables. Évidemment, nous n’avons aucun moyen d’inhumer nos compagnons comme sur Gælith, l’opération étant trop consommatrice d’arcane.</p>
<p>Nous avons passé le reste de la journée à nous préparer. Nous n’emporterons qu’un minimum de victuailles, espérant nous ravitailler par nous-mêmes, et surtout pour ne pas priver le camp. Nous devrons également nous débrouiller par nous-mêmes si nous avons besoin d’outils, ou même d’armes. Évidemment, puisque nous n’avons rien de tel ici. Cependant, nous avons, à la demande d’Okhia, bénéficié d’une importante aide. Sachant que j’écrivais ces mémoires, elle m’a interdit d’en parler, mais je me dois de l’évoquer tout de même. Une équipe d’arcanistes a été réunie dans une construction sommaire en retrait du camp. Nous avons tous attendu devant, et avons été appelés à tour de rôle. Lorsque ce fut mon tour, j’entrai pour trouver les arcanistes, au nombre de 5, disposés en cercle, les yeux fermés et la tête vers le ciel. L’atmosphère à l’intérieur était sensiblement différente, et je remarquai que, bien qu’hermétiquement fermée, la case était faiblement éclairée de l’intérieur, sans source visible. Je fis immédiatement le rapprochement avec l’arcane, qui nous enveloppait sur Gælith, et qui luisait d’elle-même. Les arcanistes m’invitèrent dans un murmure à me placer en leur centre. Je remarquai qu’ils tenaient à peine debout, tremblottant légèrement, et compris que maintenir leur concentration devait être un effort épuisant. Doucement, ils élevèrent les bras à l’horizontale, touchant quasiment les doigts de leurs voisins, de façon à former un cercle dont je devais être le centre. C’est alors que je décelai un très léger mouvement de l’air, tandis que la lueur gagnait en intensité. Au bout de quelques instants, je discernais clairement le mouvement, qui était en réalité celui de l’arcane autour de moi, que je voyais alors aussi nettement que celle qui circulait dans les tubes d’artiris jadis. Elle tourbillonnait autour de moi, mue par les arcanistes à l’œuvre. La lueur étant de plus en plus forte, elle commença à m’éblouir. Alors que dans un réflexe je recouvrais mes yeux, la voix d’un des arcanistes, qui semblait tourner autour de moi, me dit : <em>« Ne bougez pas. Fermez les yeux »</em>. Ce que je fis, et ce n’est qu’après environ un décat que je sentis le mouvement s’apaiser autour de moi. Je rouvris les yeux pour constater que, si elle n’avait pas disparue, la lueur était devenue nettement moins forte, mais toujours présente, et bien plus palpable que lors de mon entrée. Les arcanistes avaient repris leur position initiale, et ne faisaient plus un geste. C’est alors que je remarquai que leur arclé brillait telle qu’elle avait l’habitude d’être sur Gælith. Instincivement, je portai ma main à mon front, en direction de ma propre arclé, avant de faire deux constatations effarées. Tout d’abord, j’avais miraculeusement retrouvé la faculté de l’utiliser, et elle m’abreuvait à nouveau de sensations arcaniques. Mais surtout, je remarquai avec stupéfaction que le bras que j’avais levé était celui que j’avais perdu lors du passage du portail. J’observai l’endroit où devait se trouver ma main, et bien que je la sentais à nouveau comme faisant partie de mon corps, elle n’était pas là. Mais à la place, ma sensation de l’arcane retrouvée me permit de déceler une concentration inhabituelle de fluide arcanique. Mon bras s’était reconstruit par magie, et, bien que n’étant plus physique, je pouvais l’utiliser à nouveau ! Les arcanistes m’invitèrent à rejoindre la salle adjacente tandis que je prenais pleinement conscience de ce don. Là m’attendaient Okhia et les les deux jeunes Sozlithes de mon groupe. Au sourire de notre leader, je compris qu’elle avait elle-même reçu ce don récemment, ce qui avait écarté sa mort inéluctable, en remplaçant ses organes physiques par leur version éthérée mais néanmoins fonctionnelle. Elle m’expliqua sommairement ce qui venait de m’arriver. Je ne saurais relater les détails, mais elle m’a bien fait comprendre le prix à payer pour cette opération : elle n’avait été possible qu’avec les meilleurs arcanistes survivants de Panlithea, était très coûteuse en efforts de leur part, et l’opération était particulièrement risquée. Pour cette raison, nous seuls en avons bénéficié, et dans le secret. J’aurais du m’élever contre cette évidente injustice, mais par faiblesse et égoïsme, je ne l’ai pas fait. Nous avons alors effectué le reste de la préparation dans cette case, où le faible matériel que nous pouvions emporter était réuni, avant de rentrer dormir peu après le crépuscule, pour éviter d’être vus avec nos membres ainsi réparés.</p>

<p>Me voici alors, écrivant tout cela alors que je n’en ai pas l’autorisation, et que je devrais profiter de cette dernière nuit de sommeil, car nous partons demain, à l’aube. Je n’emporterai pas mon journal, car si je viens à disparaître, mon héritage sera perdu. J’ignore combien de temps durera notre expédition, ni si nous reviendrons un jour. S’il nous arrive malheur, je sais que notre peuple continuera de se battre pour survivre et se reconstruire sur Panlithea.</p>
<p>J’espère pouvoir finir ce journal.
</p>
</div>


feed_id: tag:gordon.re,2012-06-25:/hacktivisme/gratuit-pour-les-filles-serieusement.html
title: Gratuit pour les filles ? Sérieusement ?
uri: 2020-11-15-Gratuit-pour-les-filles-Sérieusement
url: https://gordon.re/hacktivisme/gratuit-pour-les-filles-serieusement.html
content:
<p><img src="media/cc02b4d6.ndh_sexisme.png" data-original-source="https://gordon.re/images/sexisme-ndh/ndh_sexisme.png" alt="Sexisme à la Nuit du Hack" title="Sexisme à la Nuit du Hack" width="800" height="201" class="aligncenter size-full" /></p>

<p>J’ai toujours été vaguement choqué par ce genre d’« offre commerciale », bien avant de prendre conscience de l’importance de la lutte pour l’égalité sociale des genres. Et, après une récente discussion à ce sujet et, surtout, un <a href="https://twitter.com/jujusete/status/216468634405576705">revirement d’opinion</a>, je pense utile de poser mon opinion par écrit.</p>
<p>Les organismes, sociétés, ou autres, qui offrent l’entrée à un évènement ou lieu aux filles font preuve d’un sexisme sans appel. Voilà pourquoi.</p>
<!-- cut -->

<h3>« On ramène de la viande fraîche »</h3>
<p>C’est bien évidemment l’argument souhaité par les organisateurs. Ramener des filles. Mais, quand on y pense, dans quel but ? Lorsque c’est pour une boîte de nuit, c’est naturellement pour favoriser les rencontres, et à la rigueur, cette volonté peut être louable, plus que la façon d’y parvenir du moins. Par contre, quand c’est dans le cadre de la <a href="https://www.nuitduhack.com/">Nuit du Hack</a>, un évènement très ciblé, sans le moindre lien avec le <a href="https://gordon.re/hacktivisme/traduction-la-misogynie-et-la-scene-hacker.html">meatspace</a>, où se rencontrent des compétences de toutes sortes, ça me dérange profondément. Pour quelle raison voudrait-on faire en sorte qu’il y ait plus de femmes ? Favoriser les rencontres ? Mais c’est totalement hors de propos ! Les gens qui se rendent à cet évènement y vont pour apprendre, pour s’entraîner, certainement pas pour y rencontrer l’âme sœur ou un quelconque plan cul ! Et surtout, considérer uniquement un sexe de la sorte est un message lancé à tous les visiteurs : « les filles qui seront là sont présentes avant tout pour régaler vos pupilles ». On insulte proprement toute compétence intellectuelle des femmes, en les rabaissant à un simple bout de viande tout juste bon à être regardé par les hackers mâles, qui eux ont des compétences dignes d’être prises au sérieux (quand bien même beaucoup ne viennent que par curiosité, sans être des brutes de pentesting). J’espère ne surprendre aucun de mes lecteurs (d’autant plus après le billet d’Okhin) en rappelant qu’avoir des compétences est parfaitement distinct de son genre, qu’il soit naturel ou décidé. Évidemment, ce genre d’évènement a lieu dans le meatspace, mais je pense qu’il est important d’y importer cet aspect du cyberspace : la non-personnification des « gens ». Quelqu’un qui hack n’est ni un homme ni une femme, mais un individu.</p>
<h3>Permettre aux hackers (nécessairement mâles) de se faire accompagner par leurs copines (nécessairement potiches)</h3>
<p>Pour la NdH, je pense que c’est l’argument qui a conduit à ce choix. Mais c’est involontairement très vexant. Pour les raisons que je viens d’écrire. Ça stéréotype à l’extrême les gens de ce milieu. Il est vrai que les hackers sont majoritairement des hommes, c’est une statistique et l’on n’y peut rien. Par contre, favoriser cet état de fait en considérant que ceux qui viendront à cet évènement seront forcément des hommes est malsain. Les femmes hackers se rendant à la NdH (que ce soit seules ou accompagnées de quelqu’un qui n’y comprendra rien) sont insultées : on leur dit « c’est payant, mais parce que tu es une femme, tu ne comprends tellement rien au sujet qu’il ne serait pas juste de te faire payer ». Encore une fois, c’est involontaire, bien sûr. Mais la plus dure tâche du combat féministe est bien de lutter contre ces discriminations du quotidien. Et quid des couples différents ? Savoir que le milieu hacker, censément plus ouvert que la moyenne, s’abaisse à cette considération me chagrine profondément. À en croire certain, le hacker est un mâle hétérosexuel, point. C’est une vision des choses qu’il est impératif de hacker. Je n’ai malheureusement pas la possibilité d’y être, mais je participe à ma manière, en écrivant ce billet. J’espère que des gens sur place sauront se faire entendre.</p>
<h3>Et si on appliquait nos principes ?</h3>
<p>Sérieusement, ça serait vraiment trop difficile d’éviter ce genre d’actions débiles et discriminantes ? De faire payer les visiteurs, quels qu’ils soient ? D’abord, ça permettrait de rapporter un peu plus de financement pour l’évènement, ce qui est une bonne chose. Mais aujourd’hui, est-ce que des femmes viennent seulement parce que c’est gratuit ?</p>
<p><a href="http://seteici.ondule.fr/">Ju</a> a changé d’avis là-dessus en voyant des couples heureux se balader. Est-ce que ça n’aurait vraiment pas pu être le cas s’ils avaient du payer deux billets ? Et puis, si les filles devaient payer comme tout le monde, pourquoi ne pas baisser le prix des billets, après tout ? Autre possibilité, pourquoi ne pas opter pour un <a href="http://fr.ulule.com/thsf-2012/">financement collaboratif</a> de l’évènement, comme l’a fait le <a href="http://thsf.tetalab.org/">THSF</a> ? C’est une solution qui a fait ses preuves, qui fonctionne souvent mieux que prévu, qui permet à des gens le donner plus qu’on ne leur demande, simplement parce qu’ils savent qu’ils permettent l’existence de l’évènement, et à l’inverse, si certains veulent participer mais n’ont pas forcément les moyens de se payer une place, ils en ont la possibilité.</p>
<h3>C’est dans les deux sens</h3>
<p>J’ai enfin été choqué par des réponses au tweet de Ju précité : « oui, c’est sexiste, mais ça me paie le restau pour ce soir ». C’est peut-être même pire que l’acte en lui-même. L’acceptation de la discrimination si elle va dans notre sens est une forme de légitimisation du sexisme en général. Il ne faut pas alors s’étonner d’entendre des hommes dire qu’ils trouvent que les femmes <em>exagèrent avec les inégalités salariales, avec le viol, parce que c’est pas si grave que ça voyons…</em> Non, ce n’est pas plus normal, dans un sens ou dans l’autre. Et quand on choisit de se battre pour l’égalité, ça ne signifie pas « être plus égaux que les autres ». Beaucoup se moquent du féminisme, en prétendant qu’il s’agit de « femmes qui veulent dominer le monde ». Il faut bien constater que c’est trop dur pour beaucoup d’oser se remettre en question et d’accepter que la <em>simple</em> égalité sociale est méritée.</p>
<p><strong>Edit :</strong>* Ju a écrit sur <a href="https://seteici.ondule.fr/2012/06/gratuit-pour-les-filles/">le même sujet</a>, mais pour défendre le point de vue opposé. Je vous encourage à le lire.</p>
<!-- cut -->
<p><strong>Edit 2 :</strong> Étant donné la migration de ce blog sous un format statique, il n’est plus possible de commenter les articles. Cependant, celui-ci avait généré une intéressante discussion, recopiée ici telle quelle.</p>
<blockquote>
<p><strong>Le 23 juin 2012 à 14 h 50 min, <a href="http://duckduckgo.com/">Noname</a> a dit :</strong></p>
<p>Ba c’est surtout pour aider à la reproduction du hacker qui sans ça risquerait une disparition certaine bientôt si on fait rien pour préserver l’espèce mais malheureusement les filles ne jouent pas le jeu d’ailleurs on signale qu’a la nuit du hack il y a beaucoup de garçons déguisés pour ne pas payer le prix de l’entrée .</p>
<blockquote>
<p><strong>Le 23 juin 2012 à 14 h 57 min, <a href="https://www.gordon.re/">Gordon</a> a dit :</strong></p>
<p>Et ça se voit pas trop, la barbe ? :]</p>
<blockquote>
<p><strong>Le 23 juin 2012 à 15 h 16 min, <a href="http://duckduckgo.com/">Noname</a> a dit :</strong></p>
<p>ba les portiers font plus attention au décolleté qu’au reste donc ça passe !
Sinon on attend toujours le début de l’atelier t-shirts mouillés!</p>
</blockquote>
</blockquote>
</blockquote>
<p><span></span></p>
<blockquote>
<p><strong>Le 23 juin 2012 à 15 h 03 min, <a href="http://www.deadalnix.me/">deadalnix</a> a dit :</strong></p>
<p>Gordon, tu m’édite ce commentaire pour virer ça et tu me lourde le précédent ? J’ai foiré l’URL de mon site :D</p>
<p>Je comptais écrire dessus, mais ce que tu racontes la est exactement ce que j’aurais voulu écrire. Donc tout d’abord merci.</p>
<p>La France est un pays étrange sur le sujet. Il est schizophrène, ne sait pas s’il veut l’égalité des sexes ou non.</p>
<p>Comment justifier que l’écart des salaires est problématique quand l’on trouve normal que l’homme invite la femme au resto ou ailleurs, par exemple ? Comment veut-on que les femmes soient considérées en politique si elle ne sont la que pour remplir un quota légal, et non pour leur compétences ?</p>
<p>Dans les pays scandinaves par exemple, la parité est un sujet important. Il est par exemple très mal vu d’inviter une femme lors d’une sortie. Cela signifierait que l’on considère qu’elle est incapable de subvenir à ses besoin besoins et qu’elle a donc forcement besoin d’un homme pour le faire à sa place. En bref, on l’insulte. Dans l’autre sens, on ne constate pas les mêmes écarts de salaires que ce que l’on peut voir en France.</p>
<p>C’est un sujet sérieux sur lequel la France doit faire un choix. Ou bien on veut l’égalité, ou bien on ne la veut pas, mais la situation actuelle n’a strictement aucun sens.</p>
<blockquote>
<p><strong>Le 24 juin 2012 à 17 h 28 min, <a href="http://seteici.ondule.fr/">Ju</a> a dit :</strong></p>
<p>Ce que j’aime chez Gordon et toi, ce pourquoi vous êtes aussi mes amis, et ce que je retrouve souvent chez des copains bidouilleurs, c’est cet esprit curieux et cet envie d’égalité puisque dans le cyberspace, nous sommes finalement tous au même niveau (et c’est une très bonne chose.
Et tu nous le montres encore plus avec ce commentaire.
Ce n’est pas que l’homme qui invite la femme au resto, de mon point de vue, c’est aussi la nana qui l’accepte, le conçoit… alors qu’il est si sympa de s’inviter leur l’autre de temps en temps. Idem pour les cadeaux, etc.
Mais il ne faut pas oublier que la Frane est un pays latin, méditerranéen et que, de par son histoire, reste cette image de « domination » masculine, même sur les offres d’emploi. On cherche un/une journaliste mis un rédacteur en chef…</p>
</blockquote>
</blockquote>
<p><span></span></p>
<blockquote>
<p><strong>Le 23 juin 2012 à 18 h 16 min, deuzeffe a dit :</strong></p>
<p>Hello Gordon et lizot,</p>
<p>Il y a de l’idée, mais il faut pousser plus loin, voire retourner
l’argument et l’interpréter différemment.</p>
<p>Comme toi, je mets de côté la gratuité des soirées dansantes, bien qu’on
pourrait y développer le même genre de retournement (sans jeu de mots,
merci).</p>
<p>Vous voulez, nous voulons hacker la société ? Alors oui, commençons par
nous-mêmes. Commençons par nous libérer de ce leitmotiv bien-pensant, de ce
confort de pensée, de cette pensée unique : la société n’est pas
égalitaire entre les genres alors on va tout faire pour la forcer à l’être
en faisant des lois, des règlements, des quotas, de l’égalitarisme
imposé, que sais-je encore !?</p>
<p>Si on pensait autrement ? Si on pensait que « Gratuit pour les filles »
n’est pas un appât, une condescendance, mais un cadeau, une invite à
reconnaître que oui, nous ne sommes pas assez nombreuses en info., que
oui, nos talents de hackeuses (en info. ou dans d’autres domaines) ne sont
pas assez reconnus parce que, finalement, c’est notre lot quotidien (entre
autre, celui que nous impose la société à la maison ou au boulot, mais pas
que). Donc, renversons la charge de la preuve, nous risquons d’y voir plus
clair et il se peut que cela devienne efficace.</p>
<p>Pourquoi les filles excellent au lycée puis partent sur des filières
supérieures courtes comme si elles n’osaient pas pousser leurs études plus
loin (je te laisse retrouver les réf. INSEE qui vont bien) ? Pourquoi les
trouve-t-on plus en bio. qu’en sciences dures ? [là il y a un développement
à faire qui n'a pas trop sa place ici] Pour quoi ? Pour qu’un pré carré
soi-disant masculin soit préservé ? Je n’y crois pas non plus : les études
socio. (pareil, je te laisse trouver les réf.) montrent que les dirigeantes
ont à coeur de faire fructifier leur territoire et sont beaucoup efficaces
dans la gestion des entreprises que les dirigeants qui sont plus enclins à
l’étendre au risque de faire sombrer la structure par manque de solidité
de fond. Donc pour quoi ?</p>
<p>Le « Gratuit pour les filles », c’est un cadeau d’égalité de respect qui
nous est fait : la société ne vous permet pas, à vous les filles de
participer de tout ce que vous êtes intellectuellement et moralement ? Qu’à
cela ne tienne ! Venez, entrez, on /sait/ que vous avez des talents qui
s’expriment différemment des nôtres, on /sait/ que vous pouvez vous sentir
frustrées de ne pas pouvoir participer à votre juste valeur, alors, entrez,
/nous/ on vous fait votre place.</p>
<p>Hackons notre pensées, nos mots, le hack matériel viendra de lui-même.</p>
<p>Mes 2F^Hcents.</p>
<blockquote>
<p><strong>Le 23 juin 2012 à 18 h 46 min, <a href="https://www.gordon.re/">Gordon</a> a dit :</strong></p>
<p>Je ne suis pas du tout d’accord avec toi.</p>
<p>Tu parles de lois, quotas, égalité forcée. Ce n’est évidemment pas une solution. Il faut éduquer les gens pour faire considérer l’égalité des sexes comme normale, pas l’imposer par la rigueur. Ça n’a jamais marché, et ça ne marchera pas plus.</p>
<p>Ton principal argument est que la gratuité pour les femmes serait un « cadeau »… Dans ce cas, pourquoi le rôle des femmes ne serait-il pas de s’occuper des tâches ménagères, en cadeau pour les mâles qui mettent à manger sur la table ? Perso, je ne vois aucune différence. Et c’est ce que j’explique dans mon dernier point : ça me chagrine, parce qu’à partir du moment où on tire un profit personnel d’une inégalité, celle-ci ne semble plus importante.</p>
<p>En l’occurrence, que représente le prix d’entrée de la NdH ? La participation aux frais. Parce qu’on considère que les présents profitent de l’organisation, et doivent donc contribuer à ce qui a été mis en place pour eux. Comment peut-on alors justifier la gratuité pour une catégorie de personnes ?</p>
<p>Par ailleurs, tu parles de preuve de respect pour les femmes « techos », mais il est tout aussi faux de penser que toutes les femmes venant à un tel évènement sont des brutes, que de penser la même chose des hommes. Certain(e)s viennent par curiosité, d’autres pour accompagner, d’autre encore pour gagner le CtF… Qu’ils soient hommes ou femmes. Pourquoi devrait-on alors rendre hommage aux compétences de toutes les femmes présentes, et pas aux hommes, alors que dans les deux cas, il y a des gens très compétents comme des touristes ?</p>
<p>En gros, ce que tu défends ici, c’est justement la discrimination positive. Je n’aime pas du tout cette idée, parce qu’à un moment où un autre, elle retombera dessus, et aura l’effet parfaitement inverse. Par ailleurs, elle favorise encore une fois la différenciation des deux catégories, alors qu’il n’y aurait pas la moindre raison de le faire ici.</p>
<p>Je reste persuadé qu’on ne lutte pas contre une discrimination par la discrimination, mais par l’éducation et l’acceptation.</p>
<p>PS : « a société ne vous permet pas, à vous les filles de participer de tout ce que vous êtes intellectuellement et moralement ? »
Bien sûr que si, elle le permet.</p>
<blockquote>
<p><strong>Le 23 juin 2012 à 19 h 34 min, deuzeffe a dit :</strong></p>
<p>C’est bien ce que je craignais : je n’ai absolument pas réussi à faire comprendre que ce n’est pas de la discrimination positive. Tant pis.</p>
<p>PS : regarde la proportion des femmes dans différentes professions et tu verras que la société les cantonne systématiquement toujours dans les mêmes domaines, même s’ils ne correspondent pas à leurs capacités intellectuelles ou morales. Combien de laissées pour compte pour une NKM, une F. Pellerin, une L. de la Raudière ou une M. Billard ?</p>
<p>Et la société, c’est nous tous…</p>
<blockquote>
<p><strong>Le 23 juin 2012 à 19 h 42 min, <a href="https://www.gordon.re/">Gordon</a> a dit :</strong></p>
<p>Je suis parfaitement d’accord avec ça, mais j’avoue que je ne comprends pas le rapport. Je sais bien que lorsque les quotas de parité sont imposés, on utilise les femmes pour les postes les moins importants, et c’est ce que je voulais dire par « l’égalité forcée est une mauvaise solution ».</p>
<p>Par contre, je ne vois pas en quoi faire ce geste peut être un cadeau. À première vue si, bien sûr, parce que fatalement, elles économisent de l’argent, mais je pense qu’on devrait considérer tous les visiteurs de la même façon. La meilleure façon de montrer l’égalité, c’est précisément ne pas montrer de différence de comportement.</p>
<blockquote>
<p><strong>Le 23 juin 2012 à 20 h 12 min, 2A a dit :</strong></p>
<p>Hello, je suis assez d’accord avec miss deuzeffe en fait.
Gordon, je suis d’accord avec toi aussi :o )</p>
<p>Mais amha on ne PEUT pas actuellement faire comme si notre societe etait juste, egalitaire ou que sais-je … Avant de causer d’egalite, il faut se dire qu’il y a un lourd retard a rattraper. Est ce qu’actuellement les filles peuvent tout faire comme les hommes ? Non.
Donc faire des « cadeaux » (qui seraient plutot dus a mon sens) ? Oui :)</p>
<p>D’ailleurs pourquoi n’offrir que l’entree en boite, ou une conso pour les nanas ?? (1/ramener de la viande, 2/ la mettre a disposition du public masculin ?)
N’est il pas la le soucis ?</p>
<p>Donc dans l’immediat le point de vue de deuzeffe me semble etre plus qu’urgent, et quand les choses auront changees on pourra faire payer les filles !</p>
<blockquote>
<p><strong>Le 23 juin 2012 à 20 h 31 min, <a href="https://www.gordon.re/">Gordon</a> a dit :</strong></p>
<p>Et si une femme souhaite « faire comme si l’égalité existait » et veut qu’on lui demande de payer sa place comme tout le monde ? Dans ce cas, c’est l’organisation de la NdH qui fait la discrimination…</p>
<p>On se heurte à une divergence d’opinion que les arguments pourraient difficilement faire pencher. Soit.</p>
<p>Par contre, tu suggères qu’« offrir » la place à la NdH serait en quelque sorte une façon de « s’excuser » pour toutes les inégalités dans l’autre sens ? Je doute que ça soit l’objectif du combat féministe… ni même que ça suffise à accepter le reste.</p>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
<p><span></span></p>
<blockquote>
<p><strong>Le 24 juin 2012 à 16 h 42 min, <a href="http://www.deadalnix.me/">deadalnix</a> a dit :</strong></p>
<p>Je vais être rude, mais des fois il faut.</p>
<p>Tu es une fille c’est bien. Cette info est importante pour moi si je cherche à te sauter.</p>
<p>Quand on parle hacking, montre moi le code. Le reste, c’est du bruit.</p>
</blockquote>
</blockquote>
<p><span></span></p>
<blockquote>
<p><strong>Le 23 juin 2012 à 19 h 55 min, Kima a dit :</strong></p>
<p>Il y a le fait que le milieu de hack est très masculin, et donc l’argument « On est aussi ouverts aux filles, on n’est pas machos ». Mais le résultat est effectivement assez foireux, et ne se distingue pas des offres du même genre, et cette fois ouvertement machistes, que l’on peut voir habituellement.</p>
</blockquote>
<p><span></span></p>
<blockquote>
<p><strong>Le 23 juin 2012 à 20 h 34 min, deuzeffe a dit :</strong></p>
<p>Il faut commencer tout doucement, avec le moins de rigorisme imposé (pas de quotas, pas de discrimination* positive) : donc, générosité envers les plus défavorisés, love, humanisme, toussa (je force un peu le trait pour essayer de me faire comprendre).</p>
<p>Et l’égalité, si, c’est avoir un comportement différent, adapté à chaque situation/groupe/personne/etc. pour qu’/in fine/ chacun puisse avoir la même possibilité d’évoluer (en gros). Tu ne donnes pas de chips (au vinaigre) à un bébé pour le nourrir ni de lait artificiel à un athlète de haut niveau pour qu’il explose ses records. (image exagérée mais toujours pour la même raison)</p>
<p>Et mon propos était aussi (surtout ?) sur le hack de la pensée, du langage.
* tiens, encore un mot à hacker, ça…</p>
<blockquote>
<p><strong>Le 23 juin 2012 à 20 h 45 min, <a href="https://www.gordon.re/">Gordon</a> a dit :</strong></p>
<p>« Tu ne donnes pas de chips (au vinaigre) à un bébé »
Si !
Bon, ok, je ne suis pas prêt à être parent :D</p>
<p>Sinon, les raisons que tu évoques ont une justification médicale. Faire ou pas payer une certaine catégorie de personnes, c’est seulement du social.</p>
<p>Quand à la générosité, je l’exerce différemment, et, je l’espère, de manière plus concrète : je porte plus attention aux discriminations, et je prends bien plus facilement la défense d’une victime de discrimination plutôt qu’une autre (la victime en question pouvant naturellement être un homme, qu’on traiterait par exemple de goujat parce qu’il ne paie pas le restaurant à sa compagne).</p>
<blockquote>
<p><strong>Le 24 juin 2012 à 18 h 56 min, deuzeffe a dit :</strong></p>
<p>Je comprends ton comportement. Mais j’en vois tellement qui, au prétexte de lutter contre La Discrimination, gomment et ignorent les différences, que je crains que cela tourne à l’égalitarisme et non se dirige vers légalité. J’espère me tromper.</p>
</blockquote>
</blockquote>
</blockquote>
<p><span></span></p>
<blockquote>
<p><strong>Le 24 juin 2012 à 16 h 38 min, binnie a dit :</strong></p>
<p>hello, je suis l’auteur du tweet « oui, c’est sexiste, mais ça me paie le restau pour ce soir » que tu cites.</p>
<p>crois bien que c’était évidemment une vanne désabusée. pas une quelconque validation de tout ça.</p>
<p>je suis complètement d’accord avec ton article, je n’ai juste plus l’envie ou l’énergie de m’insurger contre ce genre de truc, je suis fatiguée de tout ça.</p>
<p>j’ai fait des études d’informatique ou j’étais la seule fille de ma classe pendant une année entière, je bosse pratiquement qu’avec des mecs depuis dix ans, et je peux te dire que niveau combat féministe, j’ai donné.</p>
<p>aujourd’hui, je me contente de prendre ma place sans la mendier, en essaynt d’ignorer ce que je trouve anormal. il m’arrive encore de râler, mais je suis tombe dans l’àquoibonisme, notamment quand je me retrouve face à ce genre de trucs de tarification complètement wtf comme pour la nuit du hack. cela dit quand d’autres prennent le relai, qui plus est quand ce sont des garçons, je suis ravie. il ne faut pas laisser passer ce genre de trucs.</p>
<p>enfin, même si je ne suis pas d’accord avec les organisateurs, je ne voulais pas me passer de ces conférences sous pretexte que l’entrée était gratuite pour les femmes (et tout le truc que ça implique, que tu as très bien résumé.)</p>
<p>pour moi le plus important reste de me cultiver et satisfaire ma curiosité, avant tout.</p>
<blockquote>
<p><strong>Le 24 juin 2012 à 18 h 50 min, deuzeffe a dit :</strong></p>
<p>Est-ce que tu penses qu’exiger de payer aurait pu changer la vision de choses de certains ?</p>
<blockquote>
<p><strong>Le 24 juin 2012 à 19 h 21 min, binnie a dit :</strong></p>
<p>hello.</p>
<p>honnetement, non. je ne pense pas que cela aurait changé quoi la vision de qui que ce soit.</p>
<p>il y a encore une distinction des genre trop présente dans ce domaine pour qu’elle soit effacée avec quelques events qui s’employeraient à la gommer. le chemin sera bien plus long que ça.</p>
<p>à vrai dire, c’est surtout moi, et beaucoup d’autres garçons et filles, comme je le constate, qui poserions un regard différent, plus bienveillant, sur les choix d’organisation de cet event.</p>
</blockquote>
</blockquote>
<p><span></span></p>
<blockquote>
<p><strong>Le 24 juin 2012 à 18 h 51 min, <a href="http://seteici.ondule.fr/">Ju</a> a dit :</strong></p>
<p>héhé ! j’ai meme trollé en te proposant de trouver des chaises en disant qu’on est enceinte (d’ailleurs à ce propos http://seteici.midiblogs.com/archive/2011/04/28/martine-a-la-banque.html ) et oui, il m’arrive de profiter, tant pis pour ceux qui ne cherchent pas les bonnes combines !
pour le reste, je suis 100% d’accord avec toi sur la curiosité</p>
</blockquote>
<p><span></span></p>
<blockquote>
<p><strong>Le 24 juin 2012 à 19 h 06 min, <a href="https://www.gordon.re/">Gordon</a> a dit :</strong></p>
<p>Je prends le relais pour la lutte féministe, à mon échelle. Et peut-être que ça te remotivera de savoir que tu n’es pas seule à lutter :)</p>
<blockquote>
<p><strong>Le 24 juin 2012 à 19 h 23 min, binnie a dit :</strong></p>
<p>merci o/
tu vas te faire des copines.</p>
<blockquote>
<p><strong>Le 24 juin 2012 à 19 h 27 min, <a href="">Gordon</a> a dit :</strong></p>
<p>Pourquoi seulement des copines ? :)</p>
<blockquote>
<p><strong>Le 24 juin 2012 à 19 h 43 min, binnie a dit :</strong></p>
<p>des copains et des copines. #fixed</p>
<p>et je constate que ce tweet https://twitter.com/binnie/status/216918429192556545 a été favé / rt autant par des garçons que par des filles, parmis mes followers.</p>
<p>on y arrive :]</p>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
<p><span></span></p>
<blockquote>
<p><strong>Le 24 juin 2012 à 16 h 41 min, binnie a dit :</strong></p>
<p>also : y a possbilité de récupérer le programme que tu as développé pour faire des slides text mode comme pour ta prez le week-end dernier à la cantine ? merci :)</p>
<blockquote>
<p><strong>Le 24 juin 2012 à 18 h 46 min, toto a dit :</strong></p>
<p>http://gordon.re/files/t++.git et c’est un fork de tpp (http://www.synflood.at/tpp.html)</p>
<blockquote>
<p><strong>Le 24 juin 2012 à 19 h 01 min, <a href="https://www.gordon.re/">Gordon</a> a dit :</strong></p>
<p>La banane a très bien répondu. Je ferai prochainement un billet, quand j’aurai implémenté suffisamment de fonctions de base. Bien sûr, vous pouvez d’ores et déjà m’envoyer des patches. Actuellement, la rétrocompatibilité avec TPP est cassée. Je le corrigerai rapidement.</p>
<blockquote>
<p><strong>Le 24 juin 2012 à 19 h 53 min, binnie a dit :</strong></p>
<p>merci.</p>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
<p><span></span></p>
<blockquote>
<p><strong>Le 24 juin 2012 à 17 h 08 min, Xavier a dit :</strong></p>
<p>Merci pour cet article.</p>
<p>J’ai été moi aussi choqué par cela.</p>
<p>À la base, j’accompagnais une amie. Elle est beaucoup plus hackeuse/codeuse que je ne le suis, mais certaines conférences me semblaient intéressantes, donc j’ai acheté mon ticket.</p>
<p>Arrivés à l’entrée, j’ai présenté mon QR-code à la demoiselle du staff. Code validé, elle me dit « vous êtes un garçon donc vous avez un badge », et me tend également le t-shirt (immettable car taille XL, mais passons).
Je reste devant le stand d’accueil, j’attends un truc qui n’arrive pas, puis je lance « mais, euh, y’a rien pour les filles ? » Sourire gêné de la staffeuse, « Eh bien non ». Je relance « non mais même pas un badge ? » Négatif.
Mon amie me pousse vers la salle, lançant un « arrête d’essayer de gratter des trucs » en souriant. J’évoque le sexisme de la chose mais on passe rapidement aux conférence.</p>
<p>À l’intérieur, de nombreuses filles arboraient fièrement leur badge par-dessus leur t-shirt, donc je pense que la staffeuse de l’accueil a cru que mon amie m’accompagnais gentiment, quand c’était plus l’inverse (elle devait avoir un look trop normal, hohoho). Que même cet état d’esprit se retrouve au sein de l’équipe organisatrice de la NdH me fait un peu mal.</p>
<blockquote>
<p><strong>Le 24 juin 2012 à 18 h 30 min, <a href="https://twitter.com/#!/emilie_1987">emilie_1987</a> a dit :</strong></p>
<p>Avec le mec de l’accueil j’ai eu le droit au t-shirt ^^</p>
</blockquote>
</blockquote>
<p><strong>Ping : <a href="http://seteici.ondule.fr/2012/06/gratuit-pour-les-filles/">http://seteici.ondule.fr/2012/06/gratuit-pour-les-filles/</a></strong></p>
<blockquote>
<p><strong>Le 24 juin 2012 à 18 h 19 min, <a href="https://twitter.com/#!/emilie_1987">emilie_1987</a> a dit :</strong></p>
<p>Bonjour, je me permets de venir interagir sur le sujet. Pour un peu défendre mon côté féminin dans ce monde rempli d’hommes sans pour autant aller jusqu’à la partie politique.</p>
<p>Tout d’abord, je ne connaissais pas du tout que ce types de convention existait. En en apprenant plus sur l’histoire de cette nuit du hack dès la première conférence, j’ai tout de suite vu l’ampleur que ça avait.
Je ne suis pas du tout de ce domaine-là. J’ai un niveau basique en informatique. Mais je suis toujours partante pour connaitre de nouvelles choses et enrichir mes connaissances dans l’informatique.
Je suis venue accompagner mon partenaire qui lui est ingénieur dans la sécurité en informatique. Et il adore toutes ces choses là. Depuis quelques temps j’essaie un minimum de m’intéresser à ce qu’il fait mais comme dit plus haut, je suis aussi une geekette. Alors j’ai trouvé que justement s’était le moment de montrer que je suis capable de m’intéresser à son monde. En plus, le côtté gratuit était parfait et je connaissais bien les lieux pour y avoir travaillé (j’ai même retrouvé un ancien collègue pour dire).</p>
<p>Certes, c’est un domaine macho. J’avais l’impression d’être dans une fosse aux lions. Que dès que mon partenaire me laissait seul, y en a un qui serait venu me bouffer. Je me sentais épiée dès qu’il n’était plus là ou qu’il avait le dos tournée.
C’était le côté dérangeant, et pourtant, je faisais partie des nanas qui étaient habillées classiques et pas en pouf comme j’ai pu le voir en fin de soirée.
Quand je lisais certains tweets aussi, ça me faisait peur d’être cataloguée de viande fraiche. Hors, j’ai tout de même 25 ans alors je ne suis plus toute fraiche ^^ !</p>
<p>J’ai pu également revoir une amie qui elle est aussi dans une école d’ingé en informatique et qui m’a initié à ce qu’elle faisait. J’en étais très surprise de voir tout ce qu’elle connaissait. Elle animait un des stands.
Pour être honnête, pour moi le mot hacker s’arrêtait à la profession hacker les forums des gens et les emmerder à poster des messages multiples ce qui m’a longtemps emmerdé pendant des années lorsque j’étais sur des forums !
Cette nuit du hack m’a permis de voir ce côté hacker autrement. Et j’ai pu ainsi donc voir comment la réel diversité de ce domaine.
Et j’étais encore plus surprise de voir que je comprenais toutes les conférences, même en anglais. Quand je ne comprenais pas quelque chose, je n’hésitais pas à demander à mon partenaire. Et le voir aussi sérieux s’était juste trop chou.
J’ai apprécié surtout les conférences du matin et celle sur le Hacking Mobile. J’en ai même pris des notes dans mon cahier.</p>
<p>Honnêtement, totu dépendra du lieu de l’année prochaine, mais je serais prête à payer si le prix reste à 50e maximum et je vais même investir dans un ordinateur portable pour la prochaine nuit du hack.
J’ai pu rencontrer de superbes personnes. Pour moi ce genre d’évènements ne s’arrête pas qu’aux conférences et aux activités du hack. Mais à l’apprentissage, la découverte, la rencontre de nouvelles personnes lié à ce domaine ou non, à l’enrichissement personnel. Et ça ne me gênerait pas du tout d’y aller l’an prochain sans mon partenaire.</p>
<blockquote>
<p><strong>Le 24 juin 2012 à 18 h 33 min, <a href="http://seteici.ondule.fr/">Ju</a> a dit :</strong></p>
<p>la question est : y serais-tu allée si tu avais du payer 30 euros ? (au passage, contente de t’avoir rencontrée) et je plussoie pour ton amie qui animait l’atelier arduino-led, j’en parle d’ailleurs dans mon billet, super intéressant. Ton propos illustre bien ce que j’écris sur les couples dans mon billet, j’en ai vu plein comme vous.
Ah oui, il y avait des pouffes à la fin ? raconte, raconte, raconte !</p>
<blockquote>
<p><strong>Le 24 juin 2012 à 18 h 36 min, <a href="https://twitter.com/#!/emilie_1987">emilie_1987</a> a dit :</strong></p>
<p>Bah honnêtement je l’aurais fais, je voulais aller au paris-web mais vu le prix, laisse tomber !
Et ça faisait un moment que je voulais aller faire une conf comme celles-là ayant vu les 2 dernières pour PSES ^^</p>
<p>Oui, elles se sont montrées aux alentours de 22h30 ^^ elles étaient avec leur copain mais la façon dont elles s’habillaient laissait à désirer.</p>
</blockquote>
</blockquote>
<p><span></span></p>
<blockquote>
<p><strong>Le 24 juin 2012 à 19 h 05 min, <a href="https://www.gordon.re/">Gordon</a> a dit :</strong></p>
<p>Juste un conseil, si tu comptes acheter un ordinateur pour l’année prochaine, blinde-le avant de l’apporter ;)</p>
<p>(par exemple, s’il tourne sous windows, je ne lui donne pas 5 minutes de durée de vie à la NdH ;) )
<strong>Le 24 juin 2012 à 19 h 10 min, <a href="https://twitter.com/#!/emilie_1987">emilie_1987</a> a dit :</strong></p>
<p>T’en fais pas, je demanderais conseille à des pro avant ^^</p>
</blockquote>
</blockquote>
<p><span></span></p>
<blockquote>
<p><strong>Le 24 juin 2012 à 19 h 29 min, <a href="http://biaise.net/">Biaise</a> a dit :</strong></p>
<p>Débile ce principe de gratuit pour les filles.</p>
<p>Que chaque participant qui a payé puisse inviter un noob gratuitement sur une journée du festival, pour lui faire découvrir, ça ce serait utile et ça ramènerait du monde ! :)</p>
<p>Et chuis d’accord avec le côté « viande fraiche ! lol »
Déjà qu’en events hackers en tant que femmes on se coltine parfois des gros lourds, mais si en + l’organisation encourage cette idée de la fille qui est là pour décorer/accompagner/servir le thé/divertir…</p>
</blockquote>
<p><span></span></p>
<blockquote>
<p><strong>Le 24 juin 2012 à 19 h 45 min, Aa a dit :</strong></p>
<p>J’ai un peu bondi en lisant cette histoire d’entrée gratuite…</p>
<p>En fait ce qu’il faudrait savoir c’est la motivation derrière cette opération : est-ce que l’idée était d’avoir une ambiance « festive » en même temps que le hacking et alors on est dans la même mentalité que pour les boîtes de nuit, avoir « de la chair fraîche » ou, moins méchamment, varier un peu les publics ? Pas très classe mais compréhensible ;</p>
<p>Ou est-ce que l’idée était d’avoir plus de femmes participantes, de hackeuses ? Alors c’est très maladroit…</p>
<p>C’est un problème récurrent dans le milieu geek : on est très peu de femmes, vraiment peu. Mais il y a aussi très peu de noirs, très peu de handicapés, etc. En fait c’est juste un milieu très homogène, très « entre-soi », alors même que pris isolément les geeks ne sont pas machos ni rien, ils construisent juste une ambiance « de mecs » quand ils sont ensemble, et ça devient parfois rébarbatif pour des nanas, cercle vicieux…</p>
<p>Parmi les filles que je connais dans ce milieu (et selon mes opinions personnelles), en général on n’a pas envie d’être traitées autrement, pas envie d’être mises en avant, avantagées ou autre, on a juste envie d’être là <em>naturellement</em>, que ça semble normal à tout le monde… C’est très agaçant aussi par certains côtés d’être traitées différemment parce que femmes, ça enferme aussi dans une différence.</p>
<p>Il est très compliqué de trouver une bonne solution pour faire venir plus de filles dans ce genre d’évènements (ou de communautés), parce qu’en réalité le problème vient de bien plus loin, en premier lieu sans doute du peu de filles dans l’informatique en général. Donc je ne jetterai pas la pierre trop fort (mais je la jette quand même ^^) aux organisateurs si ils ont cru bien faire.</p>
<p>Simplement pour une prochaine fois, juste dire « venez accompagné, votre accompagnant a son entrée gratuite », c’est bien moins discriminant (si je suis une nana codeuse et mon copain non, si je suis homo, si je viens juste avec un pote qui découvre etc.). Peut être que dans les faits ça va juste faire venir plus de filles, pourquoi pas. Mais au moins ça ne sera pas discriminant…</p>
<p>Ah et sinon toute une équipe d’assoces libristes organise un « apéro diversité » en octobre, on va essayer de justement favoriser la diversité sous toutes ses formes (pas que les femmes) dans notre milieu de geeks, avec un esprit positif et ouvert : venez ! http://wiki.april.org/images/8/8e/Affiche-apero_diversite2012.svg :-)</p>
<blockquote>
<p><strong>Le 24 juin 2012 à 19 h 52 min, <a href="https://www.gordon.re/">Gordon</a> a dit :</strong></p>
<p>Parfaitement d’accord avec toi, merci de ta contribution.</p>
<p>Juste un troll sur la fin : la diversité, c’est d’habiter à Paris (ou suffisamment près) ? ;)</p>
<blockquote>
<p><strong>Le 24 juin 2012 à 20 h 30 min, Aa a dit :</strong></p>
<p>Rahhh dis pas ça, tu parles à une provinciale pure souche égarée malencontreusement à Paris… :D</p>
<p>L’idée c’est de commencer, mais l’idée de sortir de Paris est là aussi, bien sûr !</p>
</blockquote>
</blockquote>
</blockquote>
<p><span></span></p>
<blockquote>
<p><strong>Le 24 juin 2012 à 20 h 28 min, <a href="http://www.suumitsu.eu/">Mitsu</a> a dit :</strong></p>
<p>La génétique a doté les hommes d’une plus grande capacité de réflexion et les femmes d’une plus grande capacité émotionnelle. Faut croire que l’évolution a trouvé ce qui est le mieux pour l’espèce (et ça peut changer à terme), mais quoi qu’il en soit: il y a une réelle différence physique et mentale entre les hommes et les femmes. C’est pas du sexisme, c’est un constat froidement scientifique. Ce qu’il faut impérativement souligner, c’est que c’est des TENDANCES: chacun est unique. Ça on peut pas le changer (et il ne faut pas le changer), libre à chacun d’être ce qu’il est et de vivre comme il l’entend.</p>
<p>Entre ce qu’on veut être et ce qu’on est il y a une différence qui peut être minime comme immense. Mon avis est que la société ne doit pas imposer une catégorisation aux individus, imposer une classe, une « place » pour chacun, un « modèle » individuel, familial ou sociétal. La loi sur la parité hommes/femmes en politique ? Profondément sexiste, rétrograde, discriminant, inégalitaire et dégradant, voilà ce que j’en dis. Et ces entrées gratuites pour les filles ? Pareil.</p>
<p>Présumer que les filles SANS DISTINCTION ne peuvent pas être intéressées par la NdH (parce que « c’est pas un truc de filles » ou parce qu’elles devraient juste être bonnes à accompagner leur geek de copain ou régaler les yeux des autres, peu importe les raisons) c’est une erreur immonde. Que je sache la NdH n’est pas un immense « speed dating » auquel il faut apporter de la chair fraîche (ou des animaux à l’abattoir, c’est selon). La NdH s’adresse à tou(te)s les intéressé(e)s qu’ils/elles soient accompagné(e)s ou pas, la discrimination XX / XY n’a pas lieu d’être. Pire: je vois ce « cadeau » fait aux filles comme une grosse insulte envers les filles, l’illustration que la catégorisation est assumée et imposée, pour des thèmes qui, rappelons-le, relèvent beaucoup plus des passions de chacun (et leur partage) que de la volonté de perpétuer l’espèce !!</p>
<p>(et d’ailleurs, qui a dit que la NdH se limitait aux homo sapiens ? les autres êtres vivants aussi sont dotés d’intelligence !)</p>
<p>Bref, que l’entrée soit à 20 € pour tous. Y compris pour les poneys :)</p>
<p>ps: … et pourquoi elle est payante, l’entrée ? ô_ô Le partage du savoir et des connaissances doit il être limité à ceux qui ont des euros, de la monnaie, voire tout simplement de la richesse matérielle ? J’aime pas ça, moi…</p>
<blockquote>
<p><strong>Le 24 juin 2012 à 20 h 39 min, <a href="https://www.gordon.re/">Gordon</a> a dit :</strong></p>
<p>Pour ta dernière question, c’est tout bêtement que louer une salle de Disneyland, ça coûte des brouzoufs. Et que HZV ne peut pas se permettre de payer ça chaque année tout seul.</p>
<p>Sinon, évidemment qu’il y a des différences entre un homme et une femme. Et il y en a aussi entre nous deux, peut-être même plus. So ? On est tous des lolpixels avec une interface faite en viande, après, chacun se customise comme il veut. Effectivement, il n’y a pas lieu de catégoriser pour autant.</p>
<blockquote>
<p><strong>Le 24 juin 2012 à 21 h 01 min, <a href="http://www.suumitsu.eu/">Mitsu</a> a dit :</strong></p>
<p>(le sujet serait encore plus intéressant à étudier si l’on pouvait changer d’apparence physique et/ou de sexe génétique instantanément et à volonté, ainsi que le développement de la robotique adaptative, on en reparle dans quelques décennies ?)</p>
<p>Au sujet de la salle, des frais de location des lieux, il me semble mieux que la charge soit à ceux qui donnent et pas à ceux qui reçoivent. En clair: que les frais soient assurés par les exposants et pas du tout par les visiteurs. Au risque de se retrouver avec une salle sans exposants, mais ça à la limite c’est bien: les soirées hack dans les caves de chacun c’est la classe, c’est plus « dans l’esprit hack ». Promis si je descends sur Nice, j’apporte ma carte contrôleur SATA-miniUSB soudée/scotchée maison, ça va plaire à Gordon certainement :D</p>
<p>L’internet c’est magnifique parce que c’est anonyme/pseudonyme. Si je vous dis que je suis une fille: voilà, je suis une fille. Si je vous dis que je suis un garçon: voilà, je suis un garçon. Si je vous dis que je suis un renard panda roux à tricorne « tape &amp; bones » avec bandeau pirate sur l’oeil gauche, .. bah voilà, considérez-moi ainsi car c’est le sens de mon pseudonymat actuel :) Chacun se juge non pas sur son apparence physique ou ses gênes, mais bien sur ce qui a été réalisé, pensé, communiqué, présenté au monde entier. Si l’internet doit sur ce point préfigurer la société de demain, j’adhère sans réserves dès maintenant ;)</p>
<blockquote>
<p><strong>Le 24 juin 2012 à 21 h 07 min, <a href="https://www.gordon.re/">Gordon</a> a dit :</strong></p>
<p>C’est le choix qui a été fait par les orgas de la NdH. D’autres en ont fait d’autres : PSES est financé par ses sponsors, le THSF est financé collaborativement. On peut ne pas être content, mais dans ce cas, autant aller dans un autre ou faire le sien :)</p>
<blockquote>
<p><strong>Le 25 juin 2012 à 20 h 53 min, <a href="http://seteici.ondule.fr/">Ju</a> a dit :</strong></p>
<p>Ca vaudrait le coup de savoir cmbien coute la location ici http://www.disneylandparis-business.com/fr/conferences_reunions/centre_de_congres_du_disneys_hotel_newyork mais qqch me dit qu’on est sur des budgets faramineux par rapport au THSF</p>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
<p><span></span></p>
<blockquote>
<p><strong>Le 24 juin 2012 à 21 h 26 min, <a href="http://changaco.net/">Changaco</a> a dit :</strong></p>
<p>Je ne peux que plussoyer ce billet égalitariste.</p>
</blockquote>
<p><span></span></p>
<blockquote>
<p><strong>Le 30 juin 2012 à 19 h 48 min, <a href="http://www.hackerzvoice.net/">tr00ps</a> a dit :</strong></p>
<p>Bonjour.</p>
<p>Notre but a donner des acces gratuit aux femmes n est en aucun ca de ramener de la chair fraiche. Le pourcentage de femme reste relativement faible malgre une evolution depuis 2 ans.</p>
<p>Nous faisons la gratuite des femmes pour plusieurs raisons :</p>
<p>Que les conjointes copines peuvent un peut plus comprendre la passion de son partenaire sans que cela ne soit trop couteux
Tanter de rendre le monde du hacking plus mixe.</p>
<p>Nous sommes ouvert a tout dialogues pour expliquer notre point de vue.</p>
<p>Notre but est une transmission d information et un partage du savoir pour tous. Femme homme jeune vieux etc…. un enfant n aurais pas payer non plus.</p>
<p>Entree gratuite pour les femmes n est pas forcememnt du sexisme.</p>
</blockquote>
<p><span></span></p>
<blockquote>
<p><strong>Le 3 septembre 2012 à 14 h 39 min, Rouzz a dit :</strong></p>
<p>Salut,</p>
<p>Comme beaucoup de post dans ce genre je suis d’accord sur le fond.
Ce qui me dérange c’est que comme les autres tu ne vois que le coté « la femme est la victime ».</p>
<p>Je suis désolé mais pour moi ce genre de choses est aussi insultant et dérangeant pour l’homme que pour la femme. Cela insinue que les hommes qui viendraient avec leur copine s’en servent de trophée ou que forcément si y’a plus de fille ça attire les mecs (tu sais, ces pervers en manque qui ne cherche qu’à voir des paires de seins).</p>
<p>Et pourquoi en boîte de nuit on part du principe que c’est le mec qui vient pour pécho ? Ca marche dans les deux sens aussi, donc c’est pas plus normal qu’il y ait ce genre d’offres.</p>
</blockquote>


