# rss_item

guid: tag:linuxfr.org,2005:Diary/37415
title: Let's Encrypt, Nginx et Wordpress
author: Anthony Levaufre
url: https://linuxfr.org/users/nonsenz/journaux/let-s-encrypt-nginx-et-wordpress
feedurl: http://linuxfr.org/journaux.atom
content:
<p>Bonjour mon petit journal,<br>
Je voulais te dire que je me suis enfin penché sur le sujet du passage de sites web en https. J'ai trouvé plein d'informations sur le web, des documentations très bien faites, mais jamais exhaustives. J'ai donc décidé d'écrire moi-même deux articles sur le sujet.<br>
Le premier traite de l'installation d'un certificat Let's Encrypt sur un serveur nginx (en l'occurrence un reverse-proxy mais ça marche aussi sur un serveur web).<br><a href="https://w3.nonsenz.org/2017/06/lets-encrypt-nginx-https/">https://w3.nonsenz.org/2017/06/lets-encrypt-nginx-https/</a></p>

<p>Le second traite de la problématique spécifique de migration d'un site Wordpress en https.<br><a href="https://w3.nonsenz.org/2017/07/site-wordpress-en-https/">https://w3.nonsenz.org/2017/07/site-wordpress-en-https/</a><br>
Il complète directement le premier. Avec ces deux articles, on est donc accompagné pas à pas pour passer un site web Wordpress en https. J'espère que ça pourra aider certaines personnes. N'hésitez pas à me faire des retours si vous avez des difficultés lors de l'application de ces how-to.</p><div><a href="https://linuxfr.org/users/nonsenz/journaux/let-s-encrypt-nginx-et-wordpress.epub">Télécharger ce contenu au format Epub</a></div>    <p><a href="https://linuxfr.org/users/nonsenz/journaux/let-s-encrypt-nginx-et-wordpress#comments">Lire les commentaires</a></p>


guid: tag:linuxfr.org,2005:Diary/37416
title: Enigmaki : le retour du koala masqué aux chaussettes rayées
author: al.jes
url: https://linuxfr.org/users/aljes/journaux/enigmaki-le-retour-du-koala-masque-aux-chaussettes-rayees
feedurl: http://linuxfr.org/journaux.atom
content:
<p>Mon très cher Nal,</p>

<p>Tu te souviendras sans doute de <em>Ned et les Maki</em> ? Mais si, le jeu que nous développions il y a quelques années… Le développement du projet a ralenti jusqu’à être différé pour cause de… raisons personnelles diverses (entre autres, j’étais parti finir mes études en Inde), mais notre koala préféré est de retour !</p>

<p><img src="//img.linuxfr.org/img/687474703a2f2f696d6167696e6172792d667269656e64732d736f63696574792e636f6d2f6173736574732f656e69676d616b692f6d696e692d6f62737461636c65732e706e67/mini-obstacles.png" alt="Ned est de retour !" title="Source : http://imaginary-friends-society.com/assets/enigmaki/mini-obstacles.png"></p>

<p>Pas mal de choses ont changé depuis, entre autres…</p>
<h3 id="un-nouveau-titre">Un nouveau titre</h3>

<p>On vise désormais un public in-ter-na-tio-nal (carrément) ! Du coup, le jeu est renommé <strong><em>Enigmaki</em></strong>. Parce qu’il y a des énigmes et des maki, alors tant qu’à faire…</p>

<p><img src="//img.linuxfr.org/img/687474703a2f2f696d6167696e6172792d667269656e64732d736f63696574792e636f6d2f6173736574732f636f6d2f6c6f676f323031372e706e67/logo2017.png" alt="Enigmaki logo" title="Source : http://imaginary-friends-society.com/assets/com/logo2017.png"></p>
<h3 id="une-nouvelle-équipe">Une nouvelle équipe</h3>

<p>Néd (<a href="//linuxfr.org/users/jymistriel">Jymistriel</a>, pas le koala masqué aux chaussettes rayées) et moi-mème sommes toujours de la partie. Tous les autres sont nouveaux. Du coup, l’équipe se compose désormais comme suit :</p>

<ul>
<li>Néd J. —lore designer et level designer ;</li>
<li>Priyank —game designer, programmeur et level designer ;</li>
<li>Anirban —programmeur et level designer ;</li>
<li>Anirudh —graphiste ;</li>
<li>Gaël —communication manager ;</li>
<li>et moi-même —game designer et CEO.</li>
</ul><p>Au vu des nombreux changements dans l’équipe (et aussi du fait qu’on aimerait bien pouvoir se nourrir et payer le loyer), on a changé aussi la structure. Exit les GGP (association loi 1901), bonjour l’<strong><a href="http://imaginary-friends-society.com/">Imaginary Friends Society</a></strong> (société commerciale estonienne). Pas mal de choses justifient le choix de l’Estonie… entre autres, les visas y sont (relativement) plus faciles à obtenir pour nos amis indiens.</p>
<h3 id="un-gameplay-amélioré">Un gameplay amélioré</h3>

<p>Pour commencer, nous avons de nouveaux éléments de gameplay : un nouveau maki, de nouveaux types d’obstacles, des portails, et j’en passe. Un système de quête fera son entrée pour casser la linéarité, et un système de scores plaira aux plus compétitifs. L’histoire que nous avions prévue commence a pointer le bout de son nez, avec quelques personnages secondaires (notre ami <a href="http://newtonadventure.bci.im/fr/index.html">Newton</a> y fera une apparition, d’ailleurs). Puis nous prévoyons d’autres surprises… ce serait dommage de tout dévoiler maintenant. ;)</p>
<h3 id="de-meilleurs-visuels">De meilleurs visuels</h3>

<p>Quelques images valant plus que mille mots, voici un jeu des sept différences :</p>

<p><img src="//img.linuxfr.org/img/687474703a2f2f696d6167696e6172792d667269656e64732d736f63696574792e636f6d2f6173736574732f636f6d2f6265666f7261667465725f6c696e757866722e706e67/beforafter_linuxfr.png" alt="Comparaison avant/après…" title="Source : http://imaginary-friends-society.com/assets/com/beforafter_linuxfr.png"></p>

<p>Note que ces graphismes ne sont pas définitifs, mais devraient te donner une bonne idée de l’aspect final…</p>
<h3 id="de-nouveaux-niveaux">De nouveaux niveaux</h3>

<p>Nous prévoyons plus d’une centaine d’énigmes ! Si avec ça tu ne trouves pas de quoi t’amuser…</p>

<p><img src="//img.linuxfr.org/img/687474703a2f2f696d6167696e6172792d667269656e64732d736f63696574792e636f6d2f6173736574732f656e69676d616b692f6c6576656c2d73616d706c65732e706e67/level-samples.png" alt="Plein de niveaux !" title="Source : http://imaginary-friends-society.com/assets/enigmaki/level-samples.png"></p>
<h3 id="un-nouveau-moteur">Un nouveau moteur</h3>

<p>Nous avons entièrement réécrit le code source, cette fois-ci à l’aide de <a href="https://godotengine.org">Godot</a>. À terme, ce moteur nous offre un gain de temps et d’énergie non négligeable, et nous pensons nous en servir lors d’éventuels futurs projets —qu’ils soient en 2D ou en 3D.</p>
<h3 id="une-nouvelle-licence">Une nouvelle licence ?</h3>

<p>C’est encore en réflexion, mais nous nous demandons si <em>Enigmaki</em> restera sous licence Art libre, ou si on ne choisirait pas une autre licence (voire le domaine public vivant). Nous nous sommes fixé de prendre cette décision d’ici la version 1.0, mais pas d’inquiétude : c’est uniquement pour cette raison que nous ne mentionnons plus de licence pour le moment !</p>
<h3 id="et-il-a-besoin-de-toi">Et il a besoin de toi !</h3>

<p>Pour continuer à vivre lui-même, Ned le koala nous versera nos salaires (si si) afin que nous ne puissions plus reporter le projet à je-ne-sais-quand (au moins). Le truc, c’est que notre koala vient tout juste d’arriver dans ce nouvel univers peuplé de maki et autres créatures, ce qui fait qu’il n’a pas beaucoup de ronds en poche… Il aimerait beaucoup que tu l’aides à financer <em>Enigmaki</em>.</p>

<p>Pour ce faire, rien de plus simple : rends-toi <s>au restaurant japonais le plus proche</s> sur la page de notre <a href="https://igg.me/at/enigmaki">campagne Indiegogo</a>, clique sur le beau bouton rose ‹ soutenez ce projet › <strong>ou</strong> une contrepartie qui te plaît, et tu auras tous nos remerciements !</p>

<p>Sinon, n’hésite surtout pas à en parler autour de toi et à partager les liens suivants :</p>

<ul>
<li>
<a href="https://igg.me/at/enigmaki">https://igg.me/at/enigmaki</a> (pour la campagne Indiegogo)</li>
<li>
<a href="http://imaginary-friends-society.com">http://imaginary-friends-society.com</a> (notre site officiel)</li>
</ul><p>Merci beaucoup !</p>

<p><img src="//img.linuxfr.org/img/687474703a2f2f696d6167696e6172792d667269656e64732d736f63696574792e636f6d2f6173736574732f636f6d2f7468616e6b66756c5f6d616b692e706e67/thankful_maki.png" alt="Maki cœur" title="Source : http://imaginary-friends-society.com/assets/com/thankful_maki.png"></p><div><a href="https://linuxfr.org/users/aljes/journaux/enigmaki-le-retour-du-koala-masque-aux-chaussettes-rayees.epub">Télécharger ce contenu au format Epub</a></div>    <p><a href="https://linuxfr.org/users/aljes/journaux/enigmaki-le-retour-du-koala-masque-aux-chaussettes-rayees#comments">Lire les commentaires</a></p>


guid: tag:linuxfr.org,2005:Diary/37417
title: Vous avez aimé BSD vs System V ? Vous aimerez systemd vs openRC (et le reste du monde)
author: Maxime Ritter
feedurl: http://linuxfr.org/journaux.atom
url:
https://linuxfr.org/users/airmax/journaux/vous-avez-aime-bsd-vs-system-v-vous-aimerez-systemd-vs-openrc-et-le-reste-du-monde

content:
<p>C'est assez intéressant de prendre les choses avec recul. Comme par exemple systemd. Vous avez tenté de passer de CentOS 6 à CentOS 7 ? Voilà un changement majeur du boot, et même du fonctionnement global des services qui s'opére au sein de Linux. En fait c'est bien simple : en utilisation serveur on a l'impression d'avoir changé de distribution. Or les distributions, voilà un sujet de guerre de religion pour le vendredi ; et quand on sait que dans un passé que je n'ai pas connu, on a déjà eu droit à de long trolls BSD vs System V… Ajoutez à cela la résistance au changement, et le fait que le développeur de systemd se vante d'avoir cassé le son sous Linux dans son précédant projet (Pulse Audio), et s'est fait détesté cela (à juste titre, même si les distributions ne sont pas innocentes). Ça y est nous avons une planche savonneuse pour systemd.</p>

<p>Techniquement, on ne va pas nier qu'il y a des apports. Est-ce le problème ? En fait, systemd n'est pas « que » un simple remplacement de sysvinit que nous connaissions. C'est un <strong>changement de philosophie</strong>.</p>

<p>Alors qu'anciennement sous Linux les différents briques d'une distribution étaient assez indépendants, dans un philosophie KISS, systemd viens englober de plus en plus de fonctionnalités : login, pam, getty, syslog, udev, cryptsetup, cron, at, dbus, acpi, cgroups, gnome-session, autofs, tcpwrappers, audit, chroot, mount… Certaines de ces fonctionnalités pas nécessairement utiles pour un boot (D-BUS au boot ? pour quoi faire ?). Toutes les distributions systemd sont en train de converger pour se ressembler, et bientôt, tout comme freedesktop a tenté d'unifier le desktop, systemd unifiera les distributions entre elles. </p>

<p>Est-ce un mal ? Freedesktop a fait converger KDE et Gnome, mais pour ce qui est du code commun, très peu. En outre rien n'interdit de continuer à utiliser window maker ou enlightment. Au contraire de systemd, qui est en train de bouffer l'univers Linux : dépendance de KDE à systemd, dépendance de Gnome à systemd. Les distributions majeures sont toutes en train de sauter le pas. Se passer de systemd deviends difficile, alors même que le rôle important du logiciel (PID 1) en fait une partie importante, et même essentielle du système. Dans l'univers libre, on s'est toujours vanté de la diversité des approches et des logiciels et des manières de faire (KDE / Gnome, vim/emacs, Linux/BSD, gcc/LLVM, libc/musl, etc…), avec <strong>systemd que désire unifier le boot, c'est aussi la perte de la diversité</strong>. En conséquence, nous avons une centralisation du développement de toutes les distributions Linux chez Red Hat. Certains paranos ne voient pas cela d'un bon oeil. </p>

<p>Pourrons-nous encore nous passer de systemd ? Car en fait, aussi bien ceux qui rêvent que systemd vienne unifier le joyeux bordel que peut être le libre et les distributions que ceux qui en ont peur oublient une chose : la diversité du libre. Au début des années 90 étaient 386BSD, qui a alors forké en Net/Open/Free BSD d'un côté, et GNU/Linux de l'autre. On a pu penser vers 2005 que NetBSD et sa portabilité était mort, que FreeBSD 5 en retard sur Linux 2.6, et OpenBSD se portait bien, mais essentiellement en utilisation sur un système qui a besoin de haute sécurité / un routeur… Et pourtant, NetBSD est aujourd'hui plus actif que jamais, des forks ont eu lieu notamment de FreeBSD (Dragonfly, TrueOS, etc), et ZFS y est supporté nativement, ce qui n'est pas le cas de Linux. Et je ne parle même des distributions Linux de plus en plus nombreuses avec des philosophies différentes qui se sont créés. Et voila où je veux en venir : si par le passé on a pu opposer des distributions KDE à des distributions Gnome (aujourd'hui on peut rajouter XFCE, Mate, LXDE, etc..), bientôt on parlera de deux familles de distributions différentes : les distributions systemd, et les distributions non systemd/openRC. Vous vouliez unifier ? Nous allons forker ! </p>

<p>En réalité, le fork a déjà eu lieu lors de l'inclusion d'udev dans systemd : gentoo a déjà forké udev et travaille sur un système de démarrage moderne restant dans la philosophie traditionnelle : openRC.</p>

<p>Alors allons-y, pour les membres importants de chaque famille :</p>

<p>Famille systemd : RedHat, Centos, Fedora, OpenSüse, Ubuntu et ses dérivés (abandon d'upstart), Mint, Debian (systemd est débrayable, non sans poser des problèmes de dépendance).</p>

<p>Famille non systemd : Gentoo (bien que systemd soit disponible optionnellement, OpenRC est un projet issu de Gentoo), <a href="https://devuan.org/">Devuan</a> (fork de debian sans systemd dont on pourrait bien entendre parler dans les prochains mois), Slackware (on voit mal Patrick Volkerding changer le système d'init particulier de la distribution), PCLinuxOS, Alpine Linux, Puppy Linux (distribution musl), à laquelle on pourra rajouter toute la famille des BSD.</p>

<p>Famille non décidée : Manjaro, Arch Linux. Systemd est un troll très récurrent chez Arch Linux, le choix par défaut est systemd, mais le <a href="http://systemd-free.org/">fonctionnement sans systemd est possible</a>.</p>

<p>Voilà, je suis prêt à parier que dans les mois qui vont venir, certains seront tentés de migrer de distribution, si ce n'est déjà fait.</p><div><a href="https://linuxfr.org/users/airmax/journaux/vous-avez-aime-bsd-vs-system-v-vous-aimerez-systemd-vs-openrc-et-le-reste-du-monde.epub">Télécharger ce contenu au format Epub</a></div>    <p><a href="https://linuxfr.org/users/airmax/journaux/vous-avez-aime-bsd-vs-system-v-vous-aimerez-systemd-vs-openrc-et-le-reste-du-monde#comments">Lire les commentaires</a></p>


guid: tag:linuxfr.org,2005:Diary/37418
title: Interview de Mark Nudelman, auteur de less et mainteneur actif depuis 34 ans
author: Oliver H
feedurl: http://linuxfr.org/journaux.atom
url:
https://linuxfr.org/users/oliver_h/journaux/interview-de-mark-nudelman-auteur-de-less-et-mainteneur-actif-depuis-34-ans

content:
<p>Bonjour,</p>

<p>Vous connaissez <code>less</code>, l'utilitaire à la ligne de commande pour visualiser des fichiers textes ?<br>
--&gt; <a href="https://fr.wikipedia.org/wiki/Less_(Unix)">article sur Wikipédia sur <code>less</code></a></p>

<p>Et bien, voilà une petite histoire sur <code>less</code>.</p>

<p>En voulant configurer aux petits oignons l'utilitaire <code>less</code> j'en suis arrivé à me demander comment définir les variables <code>LESS_TERMCAP_*</code> dans la configuration <code>~/.less</code> avec l'utilitaire <code>lesskey</code>. Et j'ai trouvé que je n'étais pas le seul dans cette situation, avec une question similaire posée par Cyker: <a href="https://unix.stackexchange.com/328597">https://unix.stackexchange.com/328597</a></p>

<p>J'ai donc relevé mes manches et avec l'aide de <a href="https://github.com/cyrus-and/gdb-dashboard">gdb-dashboard</a>, et au bout de nombreuses heures, j'ai fini par cerner que les variables en internes représentant les valeurs de <code>LESS_TERMCAP_*</code> étaient initialisées avant le chargement de la configuration <code>~/.less</code>. J'avais beau les configurer correctement dans <code>~/.less</code>, mes paramètres de configuration <code>LESS_TERMCAP_*</code> ne pouvaient pas être pris en compte !</p>

<p>Je commence par expliquer ma trouvaille :<br><a href="https://unix.stackexchange.com/a/377221">https://unix.stackexchange.com/a/377221</a></p>

<p>Et me vient l'idée de faire un rapport de bug aux mainteneurs de <code>less</code> dont je trouve rapidement la page web:<br><a href="http://greenwoodsoftware.com/less/">http://greenwoodsoftware.com/less/</a></p>

<p>Je contacte son unique mainteneur, Mark Nudelman, qui est aussi son auteur originel depuis 34 ans ! Et commence une collaboration éphémère par e-mail afin de trouver une bonne correction sans régression.</p>

<p>Ce fut pour moi un moment intense en émotions, où non seulement j'ai échangé avec l'auteur du (d'un des) logiciel(s) le(s) plus utilisé(s) de toute l'histoire de l'informatique, mais en plus, Mark Nudelman est un des rares développeurs à continuer de maintenir activement son logiciel après 34 ans <s>d'évolutions</s> de révolutions informatiques, c'est une légende !</p>

<p>Dans notre dernier échange, j'ai demandé timidement s'il serait d'accord d'accorder à LinuxFr.org un entretien. Et voici que Mark Nudelman vient tout juste de donner sa réponse:</p>

<blockquote>
<blockquote>
<p>Do you mind, if I ask you some questions to publish on linuxfr.org?<br>
I hope you agree for the interview.</p>
</blockquote>

<p>Sure, it's fine with me if you want to ask some questions.  But if you ask details about the early days of less, I can't guarantee that I'll remember the details from over 30 years ago!</p>

<p>--Mark</p>
</blockquote>

<p>Donc, c'est oui, Mark est partant.</p>

<p>Ce qui est incroyable, c'est qu'en parcourant le code source de <code>less</code> (et de <code>lesskey</code>) on retourne à l'informatique des années 80 et des années 90. Mark semble prendre soin de garder une compatibilité avec les vieux compilateurs et les vieux systèmes de ces années. </p>

<p>Il y a même des <code>#if OS2</code> ! Mais il paraitrait que <a href="https://fr.wikipedia.org/wiki/OS/2">OS/2</a> soit encore apprécié et utilisé (disponible de nos jours sous le nom de <a href="http://www.ecomstation.com/">eCS/2</a>, mais là c'est une autre histoire).</p>

<p>Très récemment, Mark vient de migrer sur Git. Depuis très très longtemps, Mark utilisait <a href="https://fr.wikipedia.org/wiki/GNU_RCS">RCS</a>. (RCS est aussi une histoire incroyable, publié en 1982, sa <a href="https://www.gnu.org/software/rcs/">version 5.9.4 est sortie en 2015</a>).</p>

<p><strong>Quelles questions avez vous envie de lui demander ?</strong></p><div><a href="https://linuxfr.org/users/oliver_h/journaux/interview-de-mark-nudelman-auteur-de-less-et-mainteneur-actif-depuis-34-ans.epub">Télécharger ce contenu au format Epub</a></div>    <p><a href="https://linuxfr.org/users/oliver_h/journaux/interview-de-mark-nudelman-auteur-de-less-et-mainteneur-actif-depuis-34-ans#comments">Lire les commentaires</a></p>


guid: tag:linuxfr.org,2005:Diary/37419
title: Bookmark: mort de flash officiellement planifiée?
author: freem
url: https://linuxfr.org/users/freem/journaux/bookmark-mort-de-flash-officiellement-planifiee
feedurl: http://linuxfr.org/journaux.atom
content:
<p>Je viens de tomber sur <a href="https://lwn.net/Articles/728790/">ceci</a>, il semblerait qu'adobe planifie officiellement la mort de flash.</p><div><a href="https://linuxfr.org/users/freem/journaux/bookmark-mort-de-flash-officiellement-planifiee.epub">Télécharger ce contenu au format Epub</a></div>    <p><a href="https://linuxfr.org/users/freem/journaux/bookmark-mort-de-flash-officiellement-planifiee#comments">Lire les commentaires</a></p>


guid: tag:linuxfr.org,2005:Diary/37420
title: Openssh, dernières actus
author: J Avd
url: https://linuxfr.org/users/jad/journaux/openssh-dernieres-actus
feedurl: http://linuxfr.org/journaux.atom
content:
<p>Salut journal,</p>

<p><a href="https://fr.wikipedia.org/wiki/OpenSSH">OpenSSH</a> (OpenBSD Secure Shell ou ssh pour les intimes) est un ensemble d'outils informatiques libres permettant des communications sécurisées sur un réseau informatique en utilisant le protocole SSH.</p>

<p>Et cet outil a une actu récente brûlante,<br>
Comme je ne l'ai pas vu ces derniers jours dans linuxfr, je le pose là :<br><a href="https://access.redhat.com/blogs/766093/posts/3051131">https://access.redhat.com/blogs/766093/posts/3051131</a></p>

<p>Attention c'est du sshpr0n - littéralement - au menu :</p>

<ul>
<li>Simplification de la configuration des proxy avec le nouveau paramètre ProxyJump</li>
<li>Forward des Unix socket (oui oui!)</li>
<li>Simplification de la configuration de ssh-agent (fini les scripts pourris)</li>
</ul><p>Plus d'autres trucs trop nerdy (crypto, fingerprint, privileges) pour m'extasier…</p>

<p>Voilà voilà,</p><div><a href="https://linuxfr.org/users/jad/journaux/openssh-dernieres-actus.epub">Télécharger ce contenu au format Epub</a></div>    <p><a href="https://linuxfr.org/users/jad/journaux/openssh-dernieres-actus#comments">Lire les commentaires</a></p>


guid: tag:linuxfr.org,2005:Diary/37421
title: Le taguage des fichiers commence à être pris en compte dans Nautilus
author: Adrien Dorsaz
feedurl: http://linuxfr.org/journaux.atom
url:
https://linuxfr.org/users/trim/journaux/le-taguage-des-fichiers-commence-a-etre-pris-en-compte-dans-nautilus

content:
<p>Les développeurs GNOME <a href="https://alexandrupandelea.wordpress.com/2017/07/26/tags-in-nautilus/">travaillent à ajouter le support des tags</a> dans leur gestionnaire de fichiers Nautilus (sobrement traduit "Fichiers").</p>

<p>Durant le développement, ils se rendent compte que les tags sont une organisation de fichiers à l'opposé de la structure traditionnelle par dossier. Plutôt que de proposer une interface compliquée à intégrer dans l'application à cause de ces natures différentes, ils ont fait le choix très judicieux de restreindre l'utilisation des tags au marquage de fichiers comme « favori ».</p>

<p>C'est une idée très intéressante, car ainsi Nautilus continue d'être une très bonne interface pour une structure de dossier tout en étant capable de profiter des tags pour certaines actions précises à mettre en lumière clairement.</p>

<p>En effet, l'avantage des tags est qu'ils sont directement insérés dans les fichiers et justement le fait d'être favoris est un attribut d'un fichier et non pas d'une structure de dossier.</p>

<p>À voir la <a href="https://www.youtube.com/watch?v=HVI39gUhEbY">vidéo de présentation des favoris</a>, j'ai l'impression que l'équipe a trouvé une intéressante solution à leur problème de création non-intuitive des signets: la colonne "Favoris" est facilement utilisable et l'action du clique est claire directement sans avoir besoin d'animation compliquée qui indique que le signet a été crée dans la barre de gauche.</p>

<p>En y réfléchissant, une autre fonctionnalité intéressante serait d'avoir une colonne "note" qui ajouterait un tag standard pour définir une note de 1 à 5 sur les fichiers. Comme ça, on pourrait noter nos photos, vidéos, musiques directement dans Nautilus. Ensuite, les différentes applications spécialisées pourraient utiliser ces informations ou Nautilus pourrait ajouter un critère de recherche du style "Fichiers dont la note est plus de 3".</p><div><a href="https://linuxfr.org/users/trim/journaux/le-taguage-des-fichiers-commence-a-etre-pris-en-compte-dans-nautilus.epub">Télécharger ce contenu au format Epub</a></div>    <p><a href="https://linuxfr.org/users/trim/journaux/le-taguage-des-fichiers-commence-a-etre-pris-en-compte-dans-nautilus#comments">Lire les commentaires</a></p>


guid: tag:linuxfr.org,2005:Diary/37422
title: L’auto-censure est due au droit d’auteur
author: matthius
url: https://linuxfr.org/users/matthius/journaux/l-auto-censure-est-due-au-droit-d-auteur
feedurl: http://linuxfr.org/journaux.atom
content:
<p>Il semble évident qu’à l’école on veuille nous faire comprendre qu’il n’y a pas de domaine public qui vaille avec les cours. En effet le savoir est si important qu’il s’agit d’écouter le professeur. On fait comprendre qu’il est interdit de copier, alors que les enfants savent qu’il faut recopier le cours pour avoir une bonne note. Notez l’incompréhension de l’enfant face à ce dilemme. Seules les meilleures et les plus mauvaises copies seront lues. Ainsi, celui qui a écrit comme il fallait, c’est à dire en répondant à la question, sans forcément évoluer, là n’est pas la question, sera félicité. La jalousie s’installera donc facilement. Les ricanements seront plus sévères à l’égard des bons. Le mauvais sera moqué par les moyens, qui eux se cacheront en essayant de trouver la bonne réponse. Ainsi l’écolier sera mis contre l’écolier.<br>
On enseigne à l’enfant qu’il faut copier tout en lui disant qu’il ne faut pas le voir. L’invention nouvelle seule permettra à l’élève de se sortir de cette situation. C’est pourquoi nous avons beaucoup d’ingénieurs de génie en France. Seulement le domaine public, avec un brevet de dix ans uniquement, institué partout, permettrait de faire mieux, créer des génies chercheurs. En effet, le copié-collé ça ne fonctionne pas pour apprendre, surtout quand on ne parle pas de quotidien. Même l’histoire peut être dans le quotidien. En effet des humains ont créé notre monde d’aujourd’hui. Cela va de l’antiquité à notre période. Il s’agit en réalité d’une société, pas d’une unique personne, car nous dépendons des autres pour créer le monde de demain. Avec les robots nous pouvons tous être des chercheurs producteurs, dans notre passion. Il suffit de la réveiller.</p>

<p>Il est permis de réutiliser le travail du domaine public. Ne serait-il pas plus saint d’enseigner cela* ? N’est-il pas important pour les autres élèves que l’on trouve une citation pour faire des recherches historiques ensuite* ? N’a-t-on pas le droit de faire comme nos orateurs, qui répètent un discours écrit par quelqu’un d’autre* ? N’est-il pas plus important pour l’enfant d’être heureux en apprenant aux autres, ou en comprenant quelque chose du quotidien* ? N’est-on pas serein lorsqu’on réussit à étonner son papa, plutôt que son professeur* ? N’est-il pas plus intéressant de demander beaucoup aux meilleurs et peu à ceux qui commencent à s’intéresser à l’école* ?</p>

<p>D’après un livre de Johann Friedrich Herbart, le père de la révolution éducative allemande</p><div><a href="https://linuxfr.org/users/matthius/journaux/l-auto-censure-est-due-au-droit-d-auteur.epub">Télécharger ce contenu au format Epub</a></div>    <p><a href="https://linuxfr.org/users/matthius/journaux/l-auto-censure-est-due-au-droit-d-auteur#comments">Lire les commentaires</a></p>


guid: tag:linuxfr.org,2005:Diary/37423
title: Le problème de Wikipedia c’est l’école
author: matthius
url: https://linuxfr.org/users/matthius/journaux/le-probleme-de-wikipedia-c-est-l-ecole
feedurl: http://linuxfr.org/journaux.atom
content:
<p>Wikipedia est une encyclopédie certes colossale. Seulement elle pourrait être 10 fois plus grande… si les internautes possédaient en eux la réflexion scientifique.</p>

<p>Pourtant les enfants possèdent une réflexion scientifique s’ils n’écoutent pas les instituteurs cartésiens. En effet l’enfant, pour apprendre à parler et à marcher, a émis des hypothèses. Puis un jour il s’est dit je parle puis je marche. Ce sont les hypothèses supérieures. Ainsi l’enfant posera souvent des questions étonnantes à ses parents, s’il garde confiance en son enfance. S’il reste un enfant, il a de grandes chances de rester scientifique.</p>

<p>Pour que Wikipedia devienne 10 fois plus grande, cette encyclopédie pourrait débattre sur les hypothèses scientifiques, ce qu’elle fait mais seulement pour les définitions et l’histoire. Au lieu de s’en tenir aux publications autorisées ou aux définitions, on débattrait selon les grecs de l’école d’Athènes. Il y aurait des chats automatiquement accessibles dans le cas d’une page incertaine.</p>

<p>Il faut cependant montrer les efforts conséquents des internautes pour faire respecter la démocratie sur Wikipedia. Cela n’est pas simple. En effet les comptes Wikipedia ou tout compte personnel peuvent être piratés. Il faut donc rendre hommage à cette volonté de permettre l’anonymat, par ailleurs difficile à gérer.</p>

<p>Déjà les démarches des auteurs sont mises en valeur. On ne parle donc pas de formules comme à l’école. Il y a effectivement de véritables recherches sur l’historique de l’auteur, ce que l’école a du mal à faire. Ainsi Wikipedia fait tout de même mieux que l’école, lui insufflant donc des précisions sur les auteurs. L’école s’inspire d’Internet. Les écrivains censurés sont même repris par l’école, nécessitant alors un travail de recherches permettant de défaire la censure.</p><div><a href="https://linuxfr.org/users/matthius/journaux/le-probleme-de-wikipedia-c-est-l-ecole.epub">Télécharger ce contenu au format Epub</a></div>    <p><a href="https://linuxfr.org/users/matthius/journaux/le-probleme-de-wikipedia-c-est-l-ecole#comments">Lire les commentaires</a></p>


guid: tag:linuxfr.org,2005:Diary/37424
title: Le libre et l’économie
author: matthius
url: https://linuxfr.org/users/matthius/journaux/le-libre-et-l-economie
feedurl: http://linuxfr.org/journaux.atom
content:
<p>Pouvoir améliorer puis redistribuer une œuvre permet indéniablement d’avoir exactement ce que l’on veut avec le minimum de temps. Sans le partage un travail peut être perdu.</p>

<p>Vous me direz qu’il faut cependant créer des emplois, et que les entreprises privatives permettent de créer des emplois. C’est une réflexion de Shadock. On a tous compris qu’il ne suffit pas de pomper pour que l’économie tourne. C’est pourtant ce que proposent beaucoup de personnes sensées défendre la valeur travail.</p>

<p>L’économie actuelle ne fonctionne assurément pas sur la création d’emplois virtuels. L’économie actuelle fonctionne d’abord grâce à l’agriculture et les industries améliorées par la science. C’est là qu’interviennent le domaine public et les licences libres.</p>

<p>Pour qu’un pays se développe il faut améliorer le fonctionnement des secteurs agricoles et industriels. Ainsi les trains, en utilisant un seul moteur pour beaucoup de personnes ou de produits, permettent de ne pas utiliser le cheval ou la voiture et son conducteur. L’association scientifique d’éléments va donc permettre d’économiser du travail pour notamment améliorer le secteur agricole. Avec le moteur, le cheval va alors devenir un partenaire plutôt qu’un outil. Le conducteur va lui s’occuper d’autre chose, pour peu que le pays se développe, grâce aux trains par ailleurs. On va par exemple orienter le conducteur vers les métiers scientifiques ou artistiques.</p>

<p>Depuis la privatisation de la monnaie en 1973, on voit ainsi que la perte des lignes ferroviaires crée des bouchons dans les grandes villes tout en appauvrissant les campagnes. En effet les trains faisaient vivre la campagne grâce à cette économie de travail. L’économie de travail est donc la base de notre économie. Les trains ont été créés parce qu’on a pu capter l’énergie du charbon, plus dense que la biomasse. On a remplacé du travail humain par un travail de moteur. Avec le développement des industries et de l’association l’humain devient un esprit, pas une ressource humaine.</p>

<p>Les licences libres, qui sont l’adaptation des bénéfices du domaine public au droit d’auteur, permettent elles aussi l’économie de travail par l’association, de la même manière que le train. La licence libre permet notamment de protéger la diffusion de l’œuvre du droit d’auteur. En effet le droit d’auteur ne permet plus de protéger l’auteur, puisque celui-ci peut signer un contrat d’exclusivité, se terminant le plus souvent par une cession dans le domaine public, 70 ans après la mort de l’auteur en France. Ne parlez surtout pas d’assurance vie à un auteur censuré par l’exclusivité.</p>

<p>Lorsque l’économie se contracte ou lorsque le pays se développe, diffuser largement une œuvre va permettre une réutilisation rapide de l’œuvre. Vous me direz que les œuvres propriétaires peuvent être diffusées aussi très vite, grâce à du marketing et aux industries. Seulement ces œuvres se basent très souvent sur le domaine public ou certaines œuvres libres pour être vite créées. Nous naissons avec un héritage à améliorer. Créer consiste le plus souvent à améliorer. Il est très facile d’améliorer une recette plutôt qu’un plat à consommer. Ainsi les logiciels privatifs contiennent de plus en plus de sources libres, en respect de la licence privative, dit-on.</p>

<p>La licence GPL, demandant à redistribuer les sources, peut d’ailleurs être un piège pour ces entreprises. C’est ainsi qu’une partie du système ANDROID est devenu libre, puisqu’il était devenu entièrement dépendant de LINUX. La concurrence va alors demander à GOOGLE de faire plus de fleurs à l’utilisateur. D’ailleurs le système LINUX exige un haut niveau de sûreté, parce que quiconque peut l’améliorer. Ce haut niveau de sûreté n’était même pas respecté par GOOGLE.</p>

<p>N’essayez pas de créer quelque chose qui a déjà été fait. C’est ce que sont sensées faire les entreprises pour respecter le non partage de la recette d’une œuvre. Les termes anglais sont Reverse Engineering ou Hacking quand on utilise une œuvre pour créer la recette. Le Hacking et son homonyme plus récent et moins connoté sont utilisés pour percer le secret d’une œuvre, afin de pouvoir l’adapter au monde actuel pour utiliser l’œuvre. Tout ceci peut être légal ou illégal, selon le respect du droit d’auteur ou du brevet. Mais il faut aussi respecter l’économie de travail consistant à utiliser ce qui a été produit.</p>

<p>Une entreprise peut d’ailleurs utiliser l’économie de travail pour se défendre face à une entreprise privative. En effet, les licences libres permettent de se protéger du privatif et de son extension l’obsolescence programmée. Sans la recette de l’œuvre impossible de réparer correctement certaines parties de l’œuvre. On peut se tromper et détruire l’œuvre. Il n’y a plus d’économie de travail. Le pays ne se développe pas. L’entreprise corrompue doit alors permettre la réparation, pour peu que la production soit faite dans le pays de vente. Produire et vendre dans le même pays permet de respecter le producteur et donc le consommateur.</p>

<p>LINUX REPLICANT, clone entièrement libre de LINUX ANDROID, permet ainsi de sauver la diffusion d’un matériel privatif, en lui ajoutant d’ailleurs plus de sûreté et de pérennité. Beaucoup d’autres systèmes libres permettent de faire cela. Les libristes vont d’ailleurs adorer installer un LINUX sur un matériel privatif. En faisant cela ils prolongent la durée de vie du matériel et permettent donc l’économie de travail. Ils se protègent et protègent les autres du privatif.</p>

<p>Le domaine public et les licences libres permettent l’économie de travail, notion essentielle de notre économie, grâce à la diffusion rapide, la sûreté du partage, la pérennité. Nous sommes des individus sociaux et créatifs capables de lier de plus en plus vite et et plus en plus d’éléments, grâce à l’association d’idées et de personnes, avec la réflexion scientifique selon Platon.</p><div><a href="https://linuxfr.org/users/matthius/journaux/le-libre-et-l-economie.epub">Télécharger ce contenu au format Epub</a></div>    <p><a href="https://linuxfr.org/users/matthius/journaux/le-libre-et-l-economie#comments">Lire les commentaires</a></p>


guid: tag:linuxfr.org,2005:Diary/37425
title: Let's Encrypt, OVH et la sécurité
author: ted
url: https://linuxfr.org/users/ted/journaux/let-s-encrypt-ovh-et-la-securite
feedurl: http://linuxfr.org/journaux.atom
content:
<p>Bonjour Nal,</p>

<p>Depuis quelques temps, OVH permet à tout leurs clients d'avoir des certificats SSL gratuits grâce à <a href="https://fr.wikipedia.org/wiki/Let's_Encrypt">Let's Encrypt</a>. C'est automatisé, y'a rien à faire, et c'est bien!</p>

<p>Mais quel est l'intérêt si pour envoyer des fichiers sur mon hébergement, je n'ai aucune sécurité? En effet, depuis toujours, les <a href="https://www.ovh.com/fr/hebergement-web/">hébergements Perso</a> n'ont qu'un simple accès FTP, avec mot de passe non chiffré.<br>
Pour Héberger mon blog, je n'ai pas besoin de 250 Go d'espace, ou de 100 comptes mail de 5Go, ou d'une base SQL de 2Go. Mais une connexion sécurisée, c'est juste essentiel, parce que ni mon FAI, ni l'administrateur du MC Donald ou ses clients, ni l’hôtel qui m'héberge, n'ont à connaître mon mot de passe. La sécurité ne devrait pas être une option.</p>

<p>En l'état actuel, n'importe qui pourrait poster n'importe quoi sur mon hébergement, mais ne vous inquiétez pas: la connexion entre le serveur et votre navigateur est chiffrée.</p>

<p>Qu'en pense tu, Nal? Bon trolldi</p><div><a href="https://linuxfr.org/users/ted/journaux/let-s-encrypt-ovh-et-la-securite.epub">Télécharger ce contenu au format Epub</a></div>    <p><a href="https://linuxfr.org/users/ted/journaux/let-s-encrypt-ovh-et-la-securite#comments">Lire les commentaires</a></p>


guid: tag:linuxfr.org,2005:Diary/37426
title: Les BSD sont‐ils tous égaux devant les bugs ?
author: patrick_g
url: https://linuxfr.org/users/patrick_g/journaux/les-bsd-sont-ils-tous-egaux-devant-les-bugs
feedurl: http://linuxfr.org/journaux.atom
content:
<p>J’ai découvert <a href="https://www.tedunangst.com/flak/post/hurray-we-won">via le blog du développeur OpenBSD Ted Unangst</a> (certificat auto‐signé), cette présentation d’Ilja van Sprundel au sujet des bogues noyau des BSD : <a href="https://media.defcon.org/DEF%20CON%2025/DEF%20CON%2025%20presentations/DEFCON-25-Ilja-van-Sprundel-BSD-Kern-Vulns.pdf">https://media.defcon.org/DEF%20CON%2025/DEF%20CON%2025%20presentations/DEFCON-25-Ilja-van-Sprundel-BSD-Kern-Vulns.pdf</a>.</p>

<p>Cela commence par une petite citation de Theo de Raadt (datant de 2005) et qui affirme que les développeurs du noyau Linux ne se préoccupent pas vraiment de la qualité, à la différence des devs OpenBSD.</p>

<p>Si l’on regarde les <a href="https://fr.wikipedia.org/wiki/Common_Vulnerabilities_and_Exposures">CVE</a>, on voit qu’effectivement les vulnérabilités noyau de Linux sont plus nombreuses que celles des BSD. Est‐ce parce que, comme l’affirme Theo, les devs Linux se foutent de la qualité et de la sécurité ? Est‐ce simplement parce qu’il y a beaucoup plus de lignes de code dans Linux ? Est‐ce parce qu’il y a beaucoup plus de relecteurs de code (<em>eyeballs</em>) dans le monde Linux et donc les bogues sont détectés plus facilement ?</p>

<p>Ilja van Sprundel, un spécialiste du <em>pen test</em>, a donc décidé de mettre son nez là‐dedans et d’auditer pendant plusieurs mois les codes des trois grands BSD (juste le noyau, pas le <em>userland</em>) afin d’introduire un peu de rigueur dans le débat.</p>

<p>Je vous laisse lire les diapos, mais voici quelques conclusions qui font réfléchir :</p>

<ul>
<li>quand on audite le code des noyaux BSD, il est facile de trouver plein de bogues ;</li>
<li>trois mois d’audit de code : 30 bogues trouvés sur FreeBSD, 25 bogues trouvés sur OpenBSD, 60 bogues trouvés sur NetBSD ;</li>
<li>il n’y a pas assez de coopération entre les BSD (les bogues corrigés sur l’un existent toujours chez les autres) ;</li>
<li>OpenBSD sort clairement vainqueur (surface d’attaque réduite par rapport aux autres, qualité du code plus constante) ;</li>
<li>NetBSD sort clairement perdant (plein de code <em>legacy</em>, beaucoup de variation de qualité du code) ;</li>
<li>FreeBSD entre les deux.</li>
</ul><p>La conclusion d’Ilja semble donc que la qualité du code BSD n’est pas le facteur qui explique le faible nombre de CVE. C’est plutôt le grand nombre de relecteurs de code dans le monde Linux qui est à l’origine de la différence du nombre de vulnérabilités découvertes.</p><div><a href="https://linuxfr.org/users/patrick_g/journaux/les-bsd-sont-ils-tous-egaux-devant-les-bugs.epub">Télécharger ce contenu au format Epub</a></div>    <p><a href="https://linuxfr.org/users/patrick_g/journaux/les-bsd-sont-ils-tous-egaux-devant-les-bugs#comments">Lire les commentaires</a></p>


guid: tag:linuxfr.org,2005:Diary/37427
title: « Je suis de gauche », le pack de démarrage
author: zurvan
url: https://linuxfr.org/users/zurvan-0/journaux/je-suis-de-gauche-le-pack-de-demarrage
feedurl: http://linuxfr.org/journaux.atom
content:
<p><img src="//img.linuxfr.org/img/68747470733a2f2f6c75742e696d2f477553593849674142632f37565a6a365668493542484258756531/7VZj6VhI5BHBXue1" alt="" title="Source : https://lut.im/GuSY8IgABc/7VZj6VhI5BHBXue1"></p><div><a href="https://linuxfr.org/users/zurvan-0/journaux/je-suis-de-gauche-le-pack-de-demarrage.epub">Télécharger ce contenu au format Epub</a></div>    <p><a href="https://linuxfr.org/users/zurvan-0/journaux/je-suis-de-gauche-le-pack-de-demarrage#comments">Lire les commentaires</a></p>


guid: tag:linuxfr.org,2005:Diary/37428
title: Rififi chez Wikimédia France
author: Zenitram
url: https://linuxfr.org/users/zenitram/journaux/rififi-chez-wikimedia-france
feedurl: http://linuxfr.org/journaux.atom
content:
<p>Je suis tombé sur quelques articles qui me semblent pertinents concernant l’ambiance qu’il y aurait chez Wikimédia France.<br>
Comme c’est du Libre et qu’ici on parle de Libre, je suis étonné de ne pas avoir vu passer un journal sur le sujet, donc je m’y colle, par ordre chronologique des articles (qui copie sur qui ?) :</p>

<ul>
<li>
<a href="http://tempsreel.nouvelobs.com/rue89/rue89-nos-vies-connectees/20170718.OBS2248/exclusions-menaces-budget-recale-c-est-la-crise-chez-wikimedia-france.html"><em>Exclusions, menaces, budget recalé : c’est la crise chez Wikimédia France</em></a> (<em>L’Obs / Rue89</em>) ;</li>
<li>
<a href="http://www.novaplanet.com/radionova/79531/episode-c-est-la-crise-chez-wikimedia"><em>C’est la crise chez Wikimédia</em></a> (<em>NovaPlanet</em>) ;</li>
<li>
<a href="http://www.lemonde.fr/pixels/article/2017/07/29/demissions-subvention-amputee-gouvernance-mise-en-cause-crise-ouverte-chez-wikimedia-france_5166389_4408996.html"><em>Démissions, subvention amputée, gouvernance mise en cause : crise ouverte chez Wikimédia France</em></a> (<em>Le Monde</em>).</li>
</ul><p>Plus <em>bookmark</em> que journal, mais pour résumer ce que j’en ai compris : ça tire entre les membres (les payés et les bénévoles, entre les payés…), la politique s’en est mêlée (mélange des genres), Wikimedia Foundation n’apprécie pas trop tout ce bordel (ça a l’air de pas mal démissionner ou licencier) et diminue (pour la deuxième année consécutive) les subventions, mais ça semble continuer. Une conclusion que j’ai trouvé pertinente est que le mode d’organisation fait que le bordel d’un côté ne pourrit pas trop d’autres côtés (Wikipédia continue de vivre).</p>

<p>Journal, qu’en penses‐tu ?</p>

<hr><p>Note : n’ayant pas de source de première main, j’ai hésité à mettre un « ? » à la fin du titre, mais me suis retenu car les sources sont pour moi assez sérieuses et non <em>fake news</em>, aurais‐je dû ?</p><div><a href="https://linuxfr.org/users/zenitram/journaux/rififi-chez-wikimedia-france.epub">Télécharger ce contenu au format Epub</a></div>    <p><a href="https://linuxfr.org/users/zenitram/journaux/rififi-chez-wikimedia-france#comments">Lire les commentaires</a></p>


guid: https://strak.ch/?p=2995
title: [News] Mon bilan 2015 – Et pour 2016 ?
author: Strik-Strak
url: https://strak.ch/mon-bilan-2015-et-pour-2016/
feedurl: https://strak.ch/feed/
content:
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-3025" src="https://strak.ch/wp-content/uploads/2016/01/Stats-2015-Sheldon.jpg" alt="Stats-2015-Sheldon" width="700" height="357" srcset="https://strak.ch/wp-content/uploads/2016/01/Stats-2015-Sheldon.jpg 700w, https://strak.ch/wp-content/uploads/2016/01/Stats-2015-Sheldon-300x153.jpg 300w, https://strak.ch/wp-content/uploads/2016/01/Stats-2015-Sheldon-50x26.jpg 50w" sizes="(max-width: 700px) 100vw, 700px" /></p>
<p style="text-align: justify;">Salut à toutes et à tous ! J&#8217;espère que vous avez bien commencé 2016 et que les repas de fin d&#8217;année n&#8217;auront pas fait péter trop de boutons à vos pantalons. Comme l&#8217;année passée, il est temps pour moi de regarder brièvement en arrière afin de pouvoir effectuer le traditionnel bilan, exercice auquel bon nombre de mes collègues blogueurs se sont déjà prêtés. Je n&#8217;avais pas trouvé le temps mais oh, j&#8217;avais du champ&#8217; à finir.<span id="more-2995"></span></p>
<p style="text-align: justify;">Pour ce qui est de la fréquentation du blog, je dois dire que je suis plutôt agréablement surpris: malgré une douzaine d&#8217;articles que j&#8217;arrive parfois péniblement à sortir, la fréquentation reste stable et quelques articles tiennent même la pole position dans les résultats de recherche sans que je ne fasse aucun effort de ce côté. Essayez de taper &#8220;<a href="https://www.google.ch/?gws_rd=ssl#q=adblock+killer" target="_blank"><strong>Adblock Killer</strong></a>&#8221; dans votre browser favori&#8230; :)<br />
Comme je n&#8217;ai pas la force de me taper une analyse indigeste qui ne sera de toute manière pas lue, voici quelques screenshots pour l&#8217;année précédente.</p>
<p style="text-align: justify;">Totaux des visites et du nombre de pages vues:</p>
<p style="text-align: justify;"><a href="https://strak.ch/wp-content/uploads/2016/01/Stats-2015.jpg"><img class="aligncenter wp-image-3011 size-full" src="https://strak.ch/wp-content/uploads/2016/01/Stats-2015.jpg" alt="Stats-2015" width="990" height="112" srcset="https://strak.ch/wp-content/uploads/2016/01/Stats-2015.jpg 990w, https://strak.ch/wp-content/uploads/2016/01/Stats-2015-300x34.jpg 300w, https://strak.ch/wp-content/uploads/2016/01/Stats-2015-768x87.jpg 768w" sizes="(max-width: 990px) 100vw, 990px" /></a></p>
<p style="text-align: justify;">La répartition des 27K visites sur l&#8217;année:</p>
<p style="text-align: justify;"><a href="https://strak.ch/wp-content/uploads/2016/01/Stats-2015.png"><img class="aligncenter wp-image-3012 size-full" src="https://strak.ch/wp-content/uploads/2016/01/Stats-2015.png" alt="Stats-2015" width="965" height="170" srcset="https://strak.ch/wp-content/uploads/2016/01/Stats-2015.png 965w, https://strak.ch/wp-content/uploads/2016/01/Stats-2015-300x53.png 300w, https://strak.ch/wp-content/uploads/2016/01/Stats-2015-768x135.png 768w" sizes="(max-width: 965px) 100vw, 965px" /></a></p>
<p style="text-align: justify;">Les sources d&#8217;entrées, on peut voir que Google me ramène la grande majorité de mes visiteurs (80%):</p>
<p style="text-align: justify;"><a href="https://strak.ch/wp-content/uploads/2016/01/Stats-2015-2.jpg"><img class="aligncenter wp-image-3013 size-full" src="https://strak.ch/wp-content/uploads/2016/01/Stats-2015-2.jpg" alt="Stats-2015-2" width="562" height="101" srcset="https://strak.ch/wp-content/uploads/2016/01/Stats-2015-2.jpg 562w, https://strak.ch/wp-content/uploads/2016/01/Stats-2015-2-300x54.jpg 300w" sizes="(max-width: 562px) 100vw, 562px" /></a>Les articles qui ont généré le plus de vues, on en revient à mon article sur Adblock Killer:<a href="https://strak.ch/wp-content/uploads/2016/01/Stats-2015-3.jpg"><img class="aligncenter wp-image-3014 size-full" src="https://strak.ch/wp-content/uploads/2016/01/Stats-2015-3.jpg" alt="Stats-2015-3" width="716" height="467" srcset="https://strak.ch/wp-content/uploads/2016/01/Stats-2015-3.jpg 716w, https://strak.ch/wp-content/uploads/2016/01/Stats-2015-3-300x196.jpg 300w" sizes="(max-width: 716px) 100vw, 716px" /></a></p>
<p style="text-align: justify;">Avec 10 articles en 2015 soit moins d&#8217;un par mois, je suis plutôt satisfait du nombre de visiteurs qui augmente gentiment, sans que je fasse aucun effort particulier niveau SEO ou au niveau de la fréquence de sortie des articles. La veille sur mon Shaarli me prend déjà pas mal de temps et je me force à lire les nouveaux flux au moins une fois par jour, sinon on est vite submergé, même si on sent que la tendance n&#8217;est pas à la quantité mais bien à la retenue chez tout le monde, sauf chez un ou deux comme Xhark ou Cyrille qui arrivent je ne sais comment à sortir très régulièrement des articles, ils ont surement plus de choses à dire que moi.</p>
<p style="text-align: justify;">Pour 2016, j&#8217;aimerai pouvoir tenir la même ligne, avec peut-être un peu plus d&#8217;articles tutos, ça fait un moment que je n&#8217;ai pas balancé d&#8217;astuce pourtant je suis sûr que certaines actions anodines que j&#8217;effectue tous les jours pourraient en intéresser plus d&#8217;un, il me faut encore trouver lesquels.</p>
<p style="text-align: justify;">Dans le registre privé, je me suis payé une nouvelle config&#8217;, l&#8217;ancienne me frustrait par le bruit généré et les capacités des cartes graphiques qui ne pouvaient plus tirer à fond sur tous les jeux, au point que je n&#8217;ai pas joué à certaines titres, préférant attendre que &#8220;ça donne mieux&#8221;. À voir si je sors un article à ce propos, pas de promesse que je ne pourrai pas tenir.</p>
<hr />
<p><small><a href="https://strak.ch/mon-bilan-2015-et-pour-2016/">Article original</a> écrit par Strik-Strak et publié sur <a href="https://strak.ch">Strak.ch</a>.
<br/>
Tags associés: <a href="https://strak.ch/tag/2015/" rel="tag">2015</a>, <a href="https://strak.ch/tag/2016/" rel="tag">2016</a>, <a href="https://strak.ch/tag/bilan/" rel="tag">Bilan</a>, <a href="https://strak.ch/tag/statistiques/" rel="tag">Statistiques</a>, <a href="https://strak.ch/tag/stats/" rel="tag">Stats</a>
<br/><br/>
N'hésitez pas à me suivre sur Twitter: <a href="https://twitter.com/StrikStrak">@StrikStrak</a> 
</small></p>
<hr>Salut à toutes et à tous ! J&#8217;espère que vous avez bien commencé 2016 et que les repas de fin d&#8217;année n&#8217;auront pas fait péter trop de boutons à vos pantalons. Comme l&#8217;année passée, il est temps pour moi de regarder brièvement en arrière afin de pouvoir effectuer le traditionnel bilan, exercice auquel bon nombre [&#8230;]


guid: https://strak.ch/?p=3037
title: [Tuto] Firefox 45: retrouver les groupes d’onglets
author: Strik-Strak
url: https://strak.ch/firefox-45-retrouver-les-groupes-d-onglets/
feedurl: https://strak.ch/feed/
content:
<p style="text-align: justify;">Salut à tous ! Un petit tuto rapide en passant pour les fans du renard de feu. J&#8217;aimerai pouvoir sortir plus d&#8217;articles que ça, j&#8217;ai des brouillons au chaud mais mon rythme actuel m&#8217;empêche de prendre le temps d&#8217;écrire comme je le voudrais. Ma philosophie reste donc la même, mieux vaut sortir peu d&#8217;articles que j&#8217;estime bons plutôt qu&#8217;une myriade d&#8217;articles pour remplir. Quoi qu&#8217;il en soit, je peuple toujours mon Shaarli car la veille est à mon sens indispensable au professionnel de l&#8217;informatique pour se tenir à jour. Voilà pour l&#8217;intro !<span id="more-3037"></span></p>
<p style="text-align: justify;">Ceux qui sont adeptes de Firefox auront notés le récent passage à la <a href="https://www.mozilla.org/en-US/firefox/45.0/releasenotes/" target="_blank"><strong>version 45</strong></a>, qui amène son lot de changements plus ou moins importants. J&#8217;utilisais activement les groupes d&#8217;onglets, principalement au travail, fonctionnalité fort pratique pour garder des recherches tout en commençant un nouveau groupe, sans polluer son navigateur de dizaines d&#8217;onglets qui deviennent rapidement impossibles à démêler. Problème: cette fonctionnalité a été retirée depuis la version 45&#8230; frustration.</p>
<p style="text-align: justify;">Comme je ne peux m&#8217;en passer pour le moment, j&#8217;ai très vite trouvé une extension capable de faire le même job: <strong><a href="https://addons.mozilla.org/fr/firefox/addon/tab-groups-panorama/" target="_blank">Tab Groups</a></strong>, dans sa version 1.0.2 à l&#8217;heure où j&#8217;écris ces lignes, permet de retrouver exactement les mêmes fonctionnalités pour la gestion des groupes d&#8217;onglet. Je ne le teste que depuis deux jours, donc il se peut que je n&#8217;aie pas encore vu ses défauts, je mettrai à jour cet article au besoin.</p>
<p style="text-align: justify;">J&#8217;espère que ce mini-tuto rendra service à quelques-uns d&#8217;entre vous. Portez-vous bien !</p>
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-3038" src="https://strak.ch/wp-content/uploads/2016/03/tabs_firefox.png" alt="tabs_firefox" width="700" height="407" srcset="https://strak.ch/wp-content/uploads/2016/03/tabs_firefox.png 700w, https://strak.ch/wp-content/uploads/2016/03/tabs_firefox-300x174.png 300w, https://strak.ch/wp-content/uploads/2016/03/tabs_firefox-50x29.png 50w" sizes="(max-width: 700px) 100vw, 700px" /></p>
<hr />
<p><small><a href="https://strak.ch/firefox-45-retrouver-les-groupes-d-onglets/">Article original</a> écrit par Strik-Strak et publié sur <a href="https://strak.ch">Strak.ch</a>.
<br/>
Tags associés: <a href="https://strak.ch/tag/extension/" rel="tag">Extension</a>, <a href="https://strak.ch/tag/firefox/" rel="tag">Firefox</a>, <a href="https://strak.ch/tag/onglets/" rel="tag">Onglets</a>
<br/><br/>
N'hésitez pas à me suivre sur Twitter: <a href="https://twitter.com/StrikStrak">@StrikStrak</a> 
</small></p>
<hr>Salut à tous ! Un petit tuto rapide en passant pour les fans du renard de feu. J&#8217;aimerai pouvoir sortir plus d&#8217;articles que ça, j&#8217;ai des brouillons au chaud mais mon rythme actuel m&#8217;empêche de prendre le temps d&#8217;écrire comme je le voudrais. Ma philosophie reste donc la même, mieux vaut sortir peu d&#8217;articles que [&#8230;]


guid: https://strak.ch/?p=3053
title: [Rage] Quand Candy Crush fait bugger Sysprep
author: Strik-Strak
url: https://strak.ch/quand-candy-crush-fait-bugger-sysprep/
feedurl: https://strak.ch/feed/
content:
<p style="text-align: justify;">La petite true story du jour: j&#8217;avais besoin de faire un <a href="https://technet.microsoft.com/fr-fr/library/cc721940%28v=ws.10%29.aspx" target="_blank"><strong>sysprep</strong></a> d&#8217;un Windows 10 afin d&#8217;installer facilement plusieurs machines. Problème, je me prenais un message d&#8217;erreur (voir plus bas). Il s&#8217;est avéré après lecture du log %WINDIR%\System32\Sysprep\Panther\setupact.log, que sysprep était incapable de packager CANDY CRUSH SAGA et TWITTER qui avaient été installés avec un user différent de celui que j&#8217;utilisais présentement.<span id="more-3053"></span></p>
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-3058" src="https://strak.ch/wp-content/uploads/2016/04/sysprep.jpg" alt="sysprep" width="490" height="198" srcset="https://strak.ch/wp-content/uploads/2016/04/sysprep.jpg 490w, https://strak.ch/wp-content/uploads/2016/04/sysprep-300x121.jpg 300w, https://strak.ch/wp-content/uploads/2016/04/sysprep-50x20.jpg 50w" sizes="(max-width: 490px) 100vw, 490px" /></p>
<p>Voici la ligne incriminée:</p>
<pre>SYSPRP Package votre_package_de_merde was installed for a user, but not provisioned for all users. This package will not function properly in the sysprep image.</pre>
<p>Et bien sûr, impossible de désinstaller ces foutues apps depuis mon user local: j&#8217;ai dû rejoindre à nouveau mon domaine Azure, me reconnecter avec mon user Office 365, pour pouvoir désinstaller ces deux apps. Deux manières possibles ici, le vieux clic-droit désinstaller dans le menu démarrer ou <a href="https://technet.microsoft.com/en-us/library/hh856038.aspx" target="_blank"><strong>en Powershell</strong></a>:</p>
<pre>Remove-AppxPackage package1_1.0.0.0_neutral__8wekyb3d8bbwe
</pre>
<p>Une fois ceci fait, le poste délié d&#8217;Azure et sur mon compte local à nouveau, sysprep est enfin passé.</p>
<p style="text-align: justify;">J&#8217;ai appris par la suite que ces apps s&#8217;installent au moment de la première connexion du user en arrière-plan&#8230; franchement Microsoft, empêcher les pros de faire leur travail à cause de petites apps à la con (CANDY CRUSH SAGA et TWITTER, je le remets en majuscules pour que vous compreniez bien l&#8217;aberration de la chose) que sysprep n&#8217;est à priori pas capable de gérer, je trouve ça moyen.<br />
Pourquoi ne pas simplement les ignorer ? Je ne suis pas un sysprep-master mais je pense que c&#8217;est dans le domaine du possible. Dans tous les cas, aujourd&#8217;hui, Microsoft, tu m&#8217;as fait perdre du temps avec tes petites applis futiles.</p>
<p style="text-align: justify;"><strong><a href="https://4sysops.com/archives/windows-10-sysprep-was-not-able-to-validate-your-windows-installation/" target="_blank">Source</a></strong></p>
<hr />
<p><small><a href="https://strak.ch/quand-candy-crush-fait-bugger-sysprep/">Article original</a> écrit par Strik-Strak et publié sur <a href="https://strak.ch">Strak.ch</a>.
<br/>
Tags associés: <a href="https://strak.ch/tag/candycrush/" rel="tag">CandyCrush</a>, <a href="https://strak.ch/tag/deploiement/" rel="tag">Déploiement</a>, <a href="https://strak.ch/tag/microsoft/" rel="tag">Microsoft</a>, <a href="https://strak.ch/tag/powershell/" rel="tag">Powershell</a>, <a href="https://strak.ch/tag/sysprep/" rel="tag">Sysprep</a>, <a href="https://strak.ch/tag/windows10/" rel="tag">Windows10</a>
<br/><br/>
N'hésitez pas à me suivre sur Twitter: <a href="https://twitter.com/StrikStrak">@StrikStrak</a> 
</small></p>
<hr>La petite true story du jour: j&#8217;avais besoin de faire un sysprep d&#8217;un Windows 10 afin d&#8217;installer facilement plusieurs machines. Problème, je me prenais un message d&#8217;erreur (voir plus bas). Il s&#8217;est avéré après lecture du log %WINDIR%\System32\Sysprep\Panther\setupact.log, que sysprep était incapable de packager CANDY CRUSH SAGA et TWITTER qui avaient été installés avec un [&#8230;]


guid: https://strak.ch/?p=3076
title: [Tuto] Lister les permissions NTFS d’une arbo
author: Strik-Strak
url: https://strak.ch/lister-les-permissions-ntfs-d-une-arbo/
feedurl: https://strak.ch/feed/
content:
<p style="text-align: justify;">Salut les geeks ! J&#8217;espère que vous allez bien. Pour ma part, je suis content d&#8217;arriver à l&#8217;été, synonyme de vacances imminentes ! Mais pour le moment, je suis encore au taff, où j&#8217;ai eu la tâche ingrate de devoir déterminer si un groupe de sécurité spécifique était présent dans un arborescence où il est coutume de casser l&#8217;héritage NTFS depuis des années&#8230; beurk, beurk, on n&#8217;aime pas ça, si ce n&#8217;est pas documenté, ça devient très vite le bronx et il n&#8217;est plus possible de savoir comment ont été pensés les droits des différents groupes.</p>
<p style="text-align: justify;">Fort heureusement pour vous, je vais vous présenter deux techniques qui vont vous permettre de lister les permissions NTFS d&#8217;une arborescence, afin que vous ne viviez pas les mêmes mésaventures que moi.<span id="more-3076"></span></p>
<h1 style="text-align: justify;">La méthode logicielle ou lambda</h1>
<p style="text-align: justify;">On n&#8217;a pas toujours le temps ou le besoin de pondre un bout de script pour tout et pour rien, vous en conviendrez. C&#8217;est pourquoi je vous propose d&#8217;utiliser un tool Microsoft, qui doit être conscient de ce manque même dans les versions serveur de Windows: <a href="https://technet.microsoft.com/en-us/sysinternals/bb897332" target="_blank"><strong>AccessEnum</strong></a>.<br />
L&#8217;interface est simple au possible, on donne un répertoire à scanner, il y a 3 options à tout casser dont une bien utile qui permet de comparer deux scans, qu&#8217;il aura préalablement fallu enregistrer au format .txt, ce qui est tout de même bien pratique pour suivre l&#8217;évolution des droits si changements il y a.<br />
Il est aussi possible de ne lister que les éléments dont les permissions sont différentes du dossier root où vous effectuez votre scan.</p>
<figure id="attachment_3078" style="width: 975px" class="wp-caption aligncenter"><img class="wp-image-3078 size-full" src="https://strak.ch/wp-content/uploads/2016/06/AccessEnum.png" alt="AccessEnum" width="975" height="397" srcset="https://strak.ch/wp-content/uploads/2016/06/AccessEnum.png 975w, https://strak.ch/wp-content/uploads/2016/06/AccessEnum-300x122.png 300w, https://strak.ch/wp-content/uploads/2016/06/AccessEnum-768x313.png 768w, https://strak.ch/wp-content/uploads/2016/06/AccessEnum-50x20.png 50w" sizes="(max-width: 975px) 100vw, 975px" /><figcaption class="wp-caption-text">Ici, j&#8217;ai volontairement modifié les droits de &#8220;test.txt&#8221; pour l&#8217;exemple.</figcaption></figure>
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-3079" src="https://strak.ch/wp-content/uploads/2016/06/AccessEnum2.png" alt="AccessEnum2" width="429" height="200" srcset="https://strak.ch/wp-content/uploads/2016/06/AccessEnum2.png 429w, https://strak.ch/wp-content/uploads/2016/06/AccessEnum2-300x140.png 300w, https://strak.ch/wp-content/uploads/2016/06/AccessEnum2-50x23.png 50w" sizes="(max-width: 429px) 100vw, 429px" /></p>
<h1 style="text-align: justify;">La méthode scriptée ou barbue</h1>
<p>Si vous avez besoin d&#8217;inclure cette démarche dans une tâche récurrente ou si simplement vous êtes adepte de la ligne de commande, vous pouvez vous appuyer sur <a href="https://gallery.technet.microsoft.com/scriptcenter/PowerShell-NTFS-Permission-59c03872" target="_blank"><strong>ce script Powershell</strong></a> auquel il faudra donner en argument le dossier ou fichier à scanner, de la manière suivante:</p>
<p><img class="aligncenter size-full wp-image-3080" src="https://strak.ch/wp-content/uploads/2016/06/NTFSPerm.jpg" alt="NTFSPerm" width="495" height="57" srcset="https://strak.ch/wp-content/uploads/2016/06/NTFSPerm.jpg 495w, https://strak.ch/wp-content/uploads/2016/06/NTFSPerm-300x35.jpg 300w, https://strak.ch/wp-content/uploads/2016/06/NTFSPerm-50x6.jpg 50w" sizes="(max-width: 495px) 100vw, 495px" /><br />
Il est censé exporter le fruit de son travail dans un fichier nommé &#8220;NTFSPermission_Report.csv&#8221;, bien que dans mon cas les données ne soient pas formatées correctement, je ne sais pas si c&#8217;est dû au script ou à Excel, mais les données reportées semblent correctes, donc c&#8217;est probablement juste du travail de formatage&#8230;</p>
<p>En bonus, si vous vous prenez des messages d&#8217;erreur quand vous tentez de lancer le script powershell, c&#8217;est probablement que vous devez <a href="https://technet.microsoft.com/fr-ch/library/dd347628.aspx" target="_blank"><strong>modifier la politique d&#8217;exécution</strong></a>.</p>
<p>On se retrouve bientôt pour un nouvel article !</p>
<hr />
<p><small><a href="https://strak.ch/lister-les-permissions-ntfs-d-une-arbo/">Article original</a> écrit par Strik-Strak et publié sur <a href="https://strak.ch">Strak.ch</a>.
<br/>
Tags associés: <a href="https://strak.ch/tag/ntfs/" rel="tag">NTFS</a>, <a href="https://strak.ch/tag/permissions/" rel="tag">Permissions</a>, <a href="https://strak.ch/tag/windows/" rel="tag">Windows</a>
<br/><br/>
N'hésitez pas à me suivre sur Twitter: <a href="https://twitter.com/StrikStrak">@StrikStrak</a> 
</small></p>
<hr>Salut les geeks ! J&#8217;espère que vous allez bien. Pour ma part, je suis content d&#8217;arriver à l&#8217;été, synonyme de vacances imminentes ! Mais pour le moment, je suis encore au taff, où j&#8217;ai eu la tâche ingrate de devoir déterminer si un groupe de sécurité spécifique était présent dans un arborescence où il est [&#8230;]


guid: https://strak.ch/?p=3075
title: [Projet] Monter son serveur de virtualisation, partie 1: choix du matériel
author: Strik-Strak
url: https://strak.ch/monter-son-serveur-de-virtualisation-partie-1-choix-du-materiel/
feedurl: https://strak.ch/feed/
content:
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-3123" src="https://strak.ch/wp-content/uploads/2016/06/hardware.jpg" alt="hardware" width="700" height="438" srcset="https://strak.ch/wp-content/uploads/2016/06/hardware.jpg 700w, https://strak.ch/wp-content/uploads/2016/06/hardware-300x188.jpg 300w, https://strak.ch/wp-content/uploads/2016/06/hardware-50x31.jpg 50w" sizes="(max-width: 700px) 100vw, 700px" /></p>
<p style="text-align: justify;">Salut à tous ! Aujourd&#8217;hui, j&#8217;aimerai vous présenter un petit projet qui me trotte dans la tête depuis quelques temps. En effet, je réfléchis à me monter un petit serveur destiné à la virtualisation. Dans cette première partie, je vais énumérer les options à ma disposition ainsi que le choix, non définitif, de mes composants.<span id="more-3075"></span></p>
<p style="text-align: justify;">Je m&#8217;explique: je dispose d&#8217;un PC, format tour, qui ne contient aucune de mes données sensibles. J&#8217;entends par là que s&#8217;il crame demain, je ne pleurerai pas pour les données qu&#8217;il contenait, il n&#8217;y en a pas. Toutes mes données sont stockées dans mon Qnap, qui fait aussi office de mediacenter et qui est connecté à ma TV. Ces données sont backupées de diverses manières, mais ce n&#8217;est pas l&#8217;objet de cet article. J&#8217;ai bien tenté de jouer un peu avec la virtualisation du Qnap, qui dispose de pas moins de 8GB de RAM ce qui n&#8217;est pas rien pour ce type d&#8217;appareil. Cela reste anecdotique et ne représente pas une solution viable pour tous mes besoins en virtualisation, bien que j&#8217;aie pu y faire tourner, pour le fun, un Windows Server 2012 R2 sans trop de mal.</p>
<p style="text-align: justify;">De plus, j&#8217;aime compartimenter les besoins tant que possible: le PC est dédié à la bureautique et au gaming, le Qnap à la centralisation des données. Aucune de ces deux machines n&#8217;est donc apte à accueillir plusieurs VMs, potentiellement gourmandes, qui devront peut-être tourner H24. J&#8217;envisage ce serveur comme une machine modulaire, évolutive si possible, où je puisse monter des VMs à la volée sans avoir à me soucier de l&#8217;impact sur l&#8217;hôte et les autres VMs.</p>
<h1 style="text-align: justify;">L&#8217;option tout-en-un</h1>
<p><a href="https://strak.ch/wp-content/uploads/2016/06/hp-microserver-g8.jpg"><img class="aligncenter wp-image-3132" src="https://strak.ch/wp-content/uploads/2016/06/hp-microserver-g8.jpg" alt="hp-microserver-g8" width="300" height="300" srcset="https://strak.ch/wp-content/uploads/2016/06/hp-microserver-g8.jpg 500w, https://strak.ch/wp-content/uploads/2016/06/hp-microserver-g8-150x150.jpg 150w, https://strak.ch/wp-content/uploads/2016/06/hp-microserver-g8-300x300.jpg 300w, https://strak.ch/wp-content/uploads/2016/06/hp-microserver-g8-60x60.jpg 60w, https://strak.ch/wp-content/uploads/2016/06/hp-microserver-g8-50x50.jpg 50w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p style="text-align: justify;">J&#8217;ai d&#8217;abord envisagé de partir sur un serveur tout-en-un, ce qui comporte des avantages, et bien sûr des inconvénients. Il faut savoir que ce serveur sera accueilli dans mon salon, donc le <a href="https://fr.wikipedia.org/wiki/Facteur_d%27acceptation_f%C3%A9minine" target="_blank"><strong>WAF</strong></a> est un des aspects à prendre en compte dans cette démarche. En premier lieu, je me suis tourné vers les <a href="http://www8.hp.com/h20195/v2/GetPDF.aspx/c04123182.pdf" target="_blank"><strong>ProLiant MicroServer Gen8 de chez HP</strong></a>. Il est décliné en plusieurs versions, allant du Celeron au Pentium en passant par un i3, pour finir par un XEON E3-1220Lv2 pour la plus musclée, qu&#8217;on trouve à un peu plus de 600 CHF actuellement. Cette version dispose de 8GB de RAM et peut en accueillir 16 au maximum. Seuls les <span class="highlight selected">RAID</span> 0/1/10 sont possibles, sur 4 disques de 3,5&#8243; une fois plein. Enfin, il est livré avec iLO, ce qui permet de prendre le contrôle au niveau matériel du hardware, et ceci à distance. Plus besoin d&#8217;un écran et d&#8217;un clavier dédiés à la machine, il est possible de tout faire via un navigateur.</p>
<p style="text-align: justify;">Voici une liste non-exhaustive des avantages et inconvénients que j&#8217;y vois personnellement.</p>
<p style="text-align: justify;">Avantages</p>
<ul style="text-align: justify;">
<li>Prix plutôt correct (n&#8217;oublions pas qu&#8217;il est livré sans disque)</li>
<li>Prêt à l&#8217;emploi à la sortie du carton</li>
<li>Garantie chez un seul fabriquant (2 avec les disques)</li>
<li>Facilité de mise en place</li>
<li>Solutions professionnelles (RAID, iLO) incluses</li>
</ul>
<p style="text-align: justify;">Inconvénients</p>
<ul style="text-align: justify;">
<li>Solution vite limitée</li>
<li>Pas de choix des composants</li>
<li>Pas de modularité ni d’évolutivité</li>
<li>Restrictions techniques (RAID, nombre de disques, RAM, etc.)</li>
</ul>
<h1 style="text-align: justify;">L&#8217;option home-made</h1>
<p style="text-align: justify;">Vous l&#8217;aurez compris, c&#8217;est vers cette option que je compte me tourner, à moins qu&#8217;un nouveau produit ne sorte soudainement sur le marché.<br />
À l&#8217;heure actuelle, je suis encore en train de réfléchir si j&#8217;ai envie de partir sur de l&#8217;Hyper-V, de l&#8217;ESXi, voire même du Proxmox si je me sens l&#8217;âme aventureuse. Dans tous les cas, mon NAS actuel servira d&#8217;espace de backup si certaines devaient devenir critiques.<br />
Je ne cherche absolument pas à proposer une solution ultime, mais un bon compromis performances-prix. Comme tout un chacun, j&#8217;ai des restrictions budgétaires, non mais sans blague.<br />
Je reste bien sûr ouvert à tout critique constructive et si vous voyez quelque chose de possiblement améliorable, je vous serai très reconnaissant de m&#8217;en informer avant que je commande quoique ce soit ! :)</p>
<h2 style="text-align: justify;">Boitier &#8211; <a href="http://www.fractal-design.com/home/product/cases/node-series/node-804" target="_blank"><strong>FRACTAL DESIGN Node 804</strong></a></h2>
<p style="text-align: justify;"><a href="https://strak.ch/wp-content/uploads/2016/06/fd-ca-node-804-bl1000x10001.jpg"><img class="aligncenter wp-image-3109" src="https://strak.ch/wp-content/uploads/2016/06/fd-ca-node-804-bl1000x10001.jpg" alt="fd-ca-node-804-bl1000x10001" width="364" height="334" srcset="https://strak.ch/wp-content/uploads/2016/06/fd-ca-node-804-bl1000x10001.jpg 794w, https://strak.ch/wp-content/uploads/2016/06/fd-ca-node-804-bl1000x10001-300x275.jpg 300w, https://strak.ch/wp-content/uploads/2016/06/fd-ca-node-804-bl1000x10001-768x703.jpg 768w, https://strak.ch/wp-content/uploads/2016/06/fd-ca-node-804-bl1000x10001-50x46.jpg 50w" sizes="(max-width: 364px) 100vw, 364px" /></a></p>
<p style="text-align: justify;">Le Fractal Design Node 804 est un boitier qui peut accueillir une carte mère format mini ITX ou micro ATX, et jusqu&#8217;à 12 disques durs et SSD en mixant les 2,5&#8243; et 3,5&#8243;. Le format est intéressant, il pourrait assez facilement entrer dans un meuble de taille convenable, souvenez-vous que le <a href="https://fr.wikipedia.org/wiki/Facteur_d%27acceptation_f%C3%A9minine" target="_blank"><strong>WAF</strong> </a>me guette. Les tests que j&#8217;ai pu lire le déclarent silencieux, de toute manière je pourrai toujours changer les ventilos au besoin. Il peut s&#8217;enfiler une alim&#8217; format ATX sans broncher et des cages amovibles sont disponibles pour l&#8217;agencement.</p>
<h2 style="text-align: justify;">Carte mère &#8211; <a href="http://www.supermicro.com/products/motherboard/Xeon/C220/X10SLL-F.cfm" target="_blank"><strong>SUPERMICRO X10SLL-F</strong></a></h2>
<p style="text-align: justify;"><a href="https://strak.ch/wp-content/uploads/2016/06/X10SLL-F_spec_features.jpg"><img class="aligncenter wp-image-3108" src="https://strak.ch/wp-content/uploads/2016/06/X10SLL-F_spec_features.jpg" alt="X10SLL-F_spec_features" width="504" height="385" srcset="https://strak.ch/wp-content/uploads/2016/06/X10SLL-F_spec_features.jpg 950w, https://strak.ch/wp-content/uploads/2016/06/X10SLL-F_spec_features-300x229.jpg 300w, https://strak.ch/wp-content/uploads/2016/06/X10SLL-F_spec_features-768x586.jpg 768w, https://strak.ch/wp-content/uploads/2016/06/X10SLL-F_spec_features-50x38.jpg 50w" sizes="(max-width: 504px) 100vw, 504px" /></a></p>
<p style="text-align: justify;">La colonne vertébrale de ce projet ! J&#8217;avais d&#8217;abord voulu partir sur sa grande sœur, la <a href="http://www.supermicro.com/products/motherboard/Xeon/C220/X10SL7-F.cfm" target="_blank"><strong>X10SL7-F</strong></a>, intégrant 8 ports SAS, mais son prix m&#8217;a vite calmé, j&#8217;ai jugé que ce n&#8217;en valait pas la peine.<br />
Cette carte peut accueillir un XEON de socket LGA 1150, parfait pour le travail qui l&#8217;attend. Elle peut gérer jusqu&#8217;à 32GB de RAM ECC (j&#8217;y reviens ci-dessous), dispose d&#8217;un port RJ45 dédié à IPMI (Intelligent Platform Management Interface), qui je le rappelle permet une prise de contrôle bas niveau du hardware, offrant la possibilité de surveiller le matériel mais aussi de le redémarrer ou de le contrôler à distance. Enfin, elle permet de mettre en place du RAID 0, 1, 10 ou 5, sur les 6 ports SATA disponibles.</p>
<h2 style="text-align: justify;">Processeur &#8211; <strong><a href="http://ark.intel.com/fr/products/80910/Intel-Xeon-Processor-E3-1231-v3-8M-Cache-3_40-GHz" target="_blank">INTEL Xeon E3-1231 v3</a></strong></h2>
<p style="text-align: justify;">Selon mes recherches, un bon rapport qualité-prix. Sa fréquence est de 3,4 Ghz, il embarque 4 cœurs physiques et prend en charge la RAM de type ECC. Il est en outre tout à fait indiqué pour un usage dans un serveur de virtualisation.<br />
Je ne vous mets pas la photo du processeur, c&#8217;est plutôt naze&#8230;</p>
<h2 style="text-align: justify;">Ventirad &#8211; <a href="http://noctua.at/fr/nh-l12.html" target="_blank"><strong>NOCTUA NH-L12</strong></a></h2>
<p style="text-align: justify;"><a href="https://strak.ch/wp-content/uploads/2016/06/NOCTUA-NH-L12.jpg"><img class="aligncenter wp-image-3116" src="https://strak.ch/wp-content/uploads/2016/06/NOCTUA-NH-L12.jpg" alt="NOCTUA NH-L12" width="348" height="289" srcset="https://strak.ch/wp-content/uploads/2016/06/NOCTUA-NH-L12.jpg 601w, https://strak.ch/wp-content/uploads/2016/06/NOCTUA-NH-L12-300x250.jpg 300w, https://strak.ch/wp-content/uploads/2016/06/NOCTUA-NH-L12-50x42.jpg 50w" sizes="(max-width: 348px) 100vw, 348px" /></a></p>
<p style="text-align: justify;">J&#8217;ai fait quelques expérimentations avec un Waterblock AIO, je ne sais pas si je suis tombé sur le seul produit ou modèle défectueux, mais j&#8217;avais l&#8217;impression d&#8217;avoir une turbine à côté de moi en permanence, donc je l&#8217;ai viré. Je suis retourné aux sources, mon premier ventirad a été un Noctua, quand cet AIO m&#8217;a déçu j&#8217;ai racheté un Noctua, aucun souci depuis. C&#8217;est donc sans crainte que je me tourne à nouveau vers Noctua pour ce ventirad spécialement conçu pour les machines limitées en place. Il est livré avec les excellents ventilateurs, Noctua eux aussi, qui trouvent toujours une bonne place dans les tests.</p>
<h2 style="text-align: justify;">Mémoire vive &#8211; <a href="http://www.kingston.com/dataSheets/KVR16E11K4_32.pdf" target="_blank"><strong>KINGSTON ValueRAM 32GB</strong></a></h2>
<p style="text-align: justify;">Que dire sur la RAM, à part que c&#8217;est le maximum que peut embarquer cette config&#8217; en l&#8217;état. Ah oui, elle est <a href="https://fr.wikipedia.org/wiki/M%C3%A9moire_%C3%A0_code_correcteur_d%27erreurs" target="_blank"><strong>ECC</strong></a>.</p>
<h2 style="text-align: justify;">Alimentation &#8211; <a href="http://www.bequiet.com/fr/powersupply/694" target="_blank"><strong>BE QUIET! Pure Power 9 300 Watts</strong></a></h2>
<p style="text-align: justify;">D&#8217;après les puissantes additions que j&#8217;ai effectuées sur divers sites de calculs de watts nécessaires comme <a href="http://outervision.com/power-supply-calculator" target="_blank"><strong>celui-ci</strong></a>, une alimentation 300W devrait tout à fait convenir à cette machine. Cette alim&#8217; a l&#8217;avantage d&#8217;être semi-modulaire, c&#8217;est-à-dire qu&#8217;une partie des câbles est amovible, on peut les brancher selon les besoins. Elle a l’avantage selon les tests que j&#8217;ai pu lire d&#8217;être quasi-inaudible même en charge, un excellent point.</p>
<h2 style="text-align: justify;">SSD &#8211; <a href="http://www.samsung.com/us/computer/memory-storage/MZ-75E120B/AM" target="_blank"><strong>SAMSUNG 850 Evo Series SSD, 120GB</strong></a></h2>
<p style="text-align: justify;">Pour ce point, ça aurait pu être n&#8217;importe quel SSD, il se trouve que j&#8217;ai eu de plutôt bonnes expériences avec les SSD Samsung, en tout cas pas de mauvaises. L&#8217;idée étant de profiter des deux ports SATA 3 de la carte mère pour mettre en place un <a href="https://fr.wikipedia.org/wiki/RAID_(informatique)#RAID_1_:_Disques_en_miroir" target="_blank"><strong>RAID 1</strong></a> (disques en miroir) pour l&#8217;hyperviseur, qui je vous le rappelle, n&#8217;est pas encore fixé à l&#8217;heure où j&#8217;écris ces lignes. Je réfléchis aussi à installer l’hyperviseur (par exemple ESXi) sur une clé USB, bien que sans que je sache pourquoi, cette perspective ne m&#8217;enchante guère.</p>
<h2 style="text-align: justify;">HDD &#8211; <a href="http://www.wdc.com/wdproducts/library/SpecSheet/FRA/2879-800002.pdf" target="_blank"><strong>WESTERN DIGITAL Red WD30EFRX, 3.0TB</strong></a></h2>
<p style="text-align: justify;">Ce sera des WD30EFRX ou ce ne sera pas. Pourquoi une telle affirmation me demanderez-vous ? Et bien, pour plusieurs raisons. D&#8217;abord, ces disques durs sont, je cite, &#8220;conçus et testés de façon très complète pour assurer leur compatibilité dans des environnements fonctionnant 24 h/24 et 7 j/7 et répondre aux exigences des systèmes NAS des particuliers et des petites entreprises.&#8221; Ce sont ces disques qui peuplent mon NAS actuellement et j&#8217;en suis très content. Par ailleurs, il se trouve que ce disque délivre un niveau sonore de 24 dBA en moyenne, ce qui est tout à fait acceptable pour ma part. C&#8217;est totalement subjectif mais cela repose sur une expérience vécue (encore):  Vous l&#8217;avez lu, mon NAS dispose des mêmes disques. Il se trouve que j&#8217;avais d&#8217;abord acheté des <a href="http://www.wdc.com/wdproducts/library/SpecSheet/ENG/2879-800022.pdf" target="_blank"><strong>WD Red Pro</strong></a>, cousin des WD Red. Problème, le WD Red Pro délivre un niveau sonore de 34 dBA en moyenne, ce qui correspond à une <a href="http://couleur-science.eu/?d=2014/08/07/18/30/15-lechelle-logarithmique-des-decibels" target="_blank"><strong>augmentation par 6 de l’intensité sonore initiale de 24 dBA</strong></a> (sous réserve que mes calculs soient justes, merci à Timo pour les explications) ! Ce qui est sûr, c&#8217;est que dans un salon, 34 dBA ce n&#8217;est pas acceptable.</p>
<h1 style="text-align: justify;">Le mot de la fin</h1>
<p style="text-align: justify;">Voilà, j&#8217;ai fini cet article que m&#8217;a pris pas mal de temps, que ce soit pour mes recherches ainsi que pour son écriture. J&#8217;espère que cela vous a donné envie de vous lancer dans la conception d&#8217;une petite machine de virtualisation sans prétention, mais qui répond tout de même à certains critères. Je me tâte encore, mais je risque bien de finir par monter cette machine, plus probablement après l&#8217;été.<br />
Dans tous les cas, j&#8217;attends vos retours par rapport à ceci. N&#8217;hésitez d&#8217;ailleurs pas à balancer vos propres configs et expériences, et à la prochaine !</p>
<p style="text-align: justify;">Strik-Strak</p>
<p>&nbsp;</p>
<hr />
<p><small><a href="https://strak.ch/monter-son-serveur-de-virtualisation-partie-1-choix-du-materiel/">Article original</a> écrit par Strik-Strak et publié sur <a href="https://strak.ch">Strak.ch</a>.
<br/>
Tags associés: <a href="https://strak.ch/tag/diy/" rel="tag">DIY</a>, <a href="https://strak.ch/tag/homemade/" rel="tag">HomeMade</a>, <a href="https://strak.ch/tag/serveur/" rel="tag">Serveur</a>, <a href="https://strak.ch/tag/virtualisation/" rel="tag">Virtualisation</a>
<br/><br/>
N'hésitez pas à me suivre sur Twitter: <a href="https://twitter.com/StrikStrak">@StrikStrak</a> 
</small></p>
<hr>Salut à tous ! Aujourd&#8217;hui, j&#8217;aimerai vous présenter un petit projet qui me trotte dans la tête depuis quelques temps. En effet, je réfléchis à me monter un petit serveur destiné à la virtualisation. Dans cette première partie, je vais énumérer les options à ma disposition ainsi que le choix, non définitif, de mes composants. [&#8230;]


guid: https://strak.ch/?p=3150
title: [Rage] Loi renseignement Suisse: le vote du geek
author: Strik-Strak
url: https://strak.ch/loi-renseignement-suisse-le-vote-du-geek/
feedurl: https://strak.ch/feed/
content:
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-3155" src="https://strak.ch/wp-content/uploads/2016/09/non_etat_fouineur.jpg" alt="non_etat_fouineur" width="700" height="350" srcset="https://strak.ch/wp-content/uploads/2016/09/non_etat_fouineur.jpg 700w, https://strak.ch/wp-content/uploads/2016/09/non_etat_fouineur-300x150.jpg 300w, https://strak.ch/wp-content/uploads/2016/09/non_etat_fouineur-50x25.jpg 50w" sizes="(max-width: 700px) 100vw, 700px" /></p>
<p style="text-align: justify;">Salut les amis, ça fait une paye dites donc ! J&#8217;espère que vous avez pu partir loin du stress comme j&#8217;ai eu la chance de le faire, c&#8217;était vraiment top: pas de mail ni de téléphone pendant quelques temps, ça fait vraiment du bien. Maintenant que je suis rentré, je préfère utiliser mes moments de répit sur autre chose que l&#8217;écriture, comme par exemple la bêta de Battelfield One pour ceux qui l&#8217;auraient loupée, l&#8217;excellent Rocket League ou encore le dernier Batman Arkham Night qui me vident bien la tête après une journée de boulot. Mais si je me force (un peu) à prendre mon clavier &#8211; neuf au passage &#8211; c&#8217;est parce qu&#8217;il y a urgence: vous n&#8217;avez pas rêvé, l&#8217;état va tenter de nous la faire à l&#8217;envers, comme en France, aux USA ou en Grande-Bretagne, en essayant de faire passer une loi qui bafoue à mon sens plusieurs de nos droits les plus élémentaires contre un faux sentiment de sécurité&#8230; je vais essayer de rester le plus calme possible: cet article est classé dans la catégorie <strong>[Rage]</strong>, mais de telles extrémités méritent que l&#8217;on énumère calmement les arguments de ceux qui ne voient pas d&#8217;un bon œil la surveillance de masse, dont je fais partie.<span id="more-3150"></span></p>
<h1 style="text-align: justify;">LRens ? Ça sent l&#8217;rance</h1>
<p style="text-align: justify;">Si vous avez lu dans les journaux &#8220;LRens&#8221;, détrompez-vous: ce n&#8217;est pas un village bucolique schwytzois. Derrière cette appellation se cache le projet de &#8220;Loi Renseignement&#8221;, vous remarquerez l&#8217;originalité (coucou la France). Cette nouvelle loi a pour objectif de donner plus de pouvoirs au Service de renseignement de la Confédération (SRC), qui est censé &#8220;se renseigner sur la situation politique et sécuritaire de la Suisse&#8221;, comme un attentat ou une attaque informatique, puis d&#8217;avertir les autorités compétentes. Pour le moment, le SRC ne peut se renseigner qu&#8217;à deux conditions:</p>
<ul style="text-align: justify;">
<li>Des soupçons concrets visent la personne surveillée,</li>
<li>Les informations recueillies sont soit publiques, soit émanent d&#8217;une autre autorité.</li>
</ul>
<p style="text-align: justify;">C&#8217;est déjà pas mal, non ? Le problème, c&#8217;est que cette loi tente de faire passer <strong>absolument tout ce qu&#8217;il est possible de surveiller et de fouiller</strong>, à tel point que ça en ferait couiner d&#8217;envie un membre de la Gestapo:</p>
<ul>
<li style="text-align: justify;">la surveillance du courrier, du téléphone et d’Internet d’une personne ;</li>
<li style="text-align: justify;">la localisation et la surveillance à l’aide d’appareils ;</li>
<li style="text-align: justify;">l’infiltration dans des réseaux informatiques ; (Rien que ça ? Ça vous dit un bon petit cheval de Troie made in CH ?)</li>
<li style="text-align: justify;">la fouille de locaux ou de véhicules.</li>
</ul>
<h1>Dangereux et contre-productif</h1>
<p style="text-align: justify;">C&#8217;est bon, ça commence à piquer ? Quoi, j&#8217;entends que certains n&#8217;ont rien à cacher ? Fort bien, donc vous ne voyez pas de problème à ce qu&#8217;on lise vos messages Facebook ? Vos mails ? Vos SMS ? Qu&#8217;on surveille vos appels ? De plus, même si actuellement votre activité n&#8217;est pas suspecte ou répréhensible, que se passera-t-il si la Suisse cessait d&#8217;être un état démocratique et devenait un régime totalitaire ? Et bien le gouvernement aurait déjà tous les moyens à disposition pour fliquer ses citoyens, et pourrait ressortir, par exemple, les tendances politiques passées d&#8217;un tel pour l&#8217;enfermer. Ce n&#8217;est qu&#8217;un exemple parmi tant d&#8217;autre.</p>
<p style="text-align: justify;">Bien sûr, on peut naïvement croire que <strong>plus de surveillance = plus de sécurité mais c&#8217;est faux</strong>, l&#8217;exemple français est triste mais révélateur: ont-ils pu déjouer les attentats grâces à la surveillance ? Non. Il serait absurde de penser que la modèle suisse fonctionnerait de manière plus efficace. De plus, la masse d&#8217;informations sera telle qu&#8217;il sera difficile voire impossible d&#8217;en sortir des informations pertinentes.</p>
<p style="text-align: justify;">Enfin, les opposants ont oublié (sauf erreur) un argument qui me semble primordial, il est <strong>économique</strong>: la Suisse attire énormément d&#8217;investisseurs, d&#8217;entreprises qui s&#8217;accordent à dire que la neutralité du pays et les opportunités qu&#8217;il offre sont des facteurs décisifs. Pensez-vous qu&#8217;une surveillance massive des flux par la fibre optique va encourager les compagnies à s&#8217;implanter en Suisse ? Je ne pense pas.</p>
<h1>Le vote du geek</h1>
<p>Pour toutes ces raisons, vous aurez compris quelle sera ma réponse à la LRens, et j&#8217;espère que nous serons assez nombreux pour enterrer définitivement un tel projet. S&#8217;il vous plait, allez voter, pas seulement pour cette votation mais en général, car une fois que les lois sont passées et appliquées, il est trop tard pour ouvrir sa gueule. Nous avons la chance de vivre dans un pays où le peuple a son mot à dire, ce serait bien dommage qu&#8217;on n&#8217;ose finalement plus dire ce qu&#8217;on pense réellement à cause de projets orwelliens tels que celui-ci.</p>
<p>Pour aller plus loin ou vous faire votre propre idée sur la question, je vous invite à visiter ces quelques liens: <a href="http://etat-fouineur.ch/" target="_blank">etat-fouineur.ch</a>, <a href="https://www.easyvote.ch/permalink/v/135-1" target="_blank">easyvote.ch</a> et <a href="https://www.amnesty.ch/fr/pays/europe-asie-centrale/suisse/docs/2016/la-nouvelle-loi-sur-le-renseignement-est-disproportionnee" target="_blank">amnesty.ch</a>.</p>
<p><img class="aligncenter wp-image-3163 size-full" src="https://strak.ch/wp-content/uploads/2016/09/lrens_non-1.jpg" alt="lrens_non" width="700" height="543" srcset="https://strak.ch/wp-content/uploads/2016/09/lrens_non-1.jpg 700w, https://strak.ch/wp-content/uploads/2016/09/lrens_non-1-300x233.jpg 300w, https://strak.ch/wp-content/uploads/2016/09/lrens_non-1-50x39.jpg 50w" sizes="(max-width: 700px) 100vw, 700px" /></p>
<hr />
<p><small><a href="https://strak.ch/loi-renseignement-suisse-le-vote-du-geek/">Article original</a> écrit par Strik-Strak et publié sur <a href="https://strak.ch">Strak.ch</a>.
<br/>
Tags associés: <a href="https://strak.ch/tag/confidentialite/" rel="tag">Confidentialité</a>, <a href="https://strak.ch/tag/loi/" rel="tag">Loi</a>, <a href="https://strak.ch/tag/suisse/" rel="tag">Suisse</a>, <a href="https://strak.ch/tag/surveillance/" rel="tag">Surveillance</a>, <a href="https://strak.ch/tag/vieprivee/" rel="tag">ViePrivée</a>
<br/><br/>
N'hésitez pas à me suivre sur Twitter: <a href="https://twitter.com/StrikStrak">@StrikStrak</a> 
</small></p>
<hr>Salut les amis, ça fait une paye dites donc ! J&#8217;espère que vous avez pu partir loin du stress comme j&#8217;ai eu la chance de le faire, c&#8217;était vraiment top: pas de mail ni de téléphone pendant quelques temps, ça fait vraiment du bien. Maintenant que je suis rentré, je préfère utiliser mes moments de [&#8230;]


guid: https://strak.ch/?p=3224
title: [Test] Daredevil: insuffler la terreur aux méchants
author: Strik-Strak
url: https://strak.ch/daredevil-insuffler-la-terreur-aux-mechants/
feedurl: https://strak.ch/feed/
content:
<p style="text-align: justify;">Si vous êtes un vrai fan de l’<strong><a href="http://marvel.com/universe/Main_Page" target="_blank">univers Marvel</a></strong>, vous connaissez forcément Daredevil, le héros au costume rouge affublé d’oreilles de diablotin. Comme pas mal de héros Marvel, son histoire est sombre et démarre plutôt mal. En effet, son enfance est difficile: il est élevé par son père, qui l’encourage à entreprendre des études d’avocat. Un beau jour, en tentant de sauver un homme, il est bombardé par des déchets radioactifs (tient, ça ne vous rappelle pas Hulk?) qui lui retirent la vue mais qui vont augmenter tous ses autres sens à un niveau surhumain (tient, ça ne vous rappelle pas Spiderman?). Par la suite, son père meurt et il jure d’œuvrer pour la justice en tant qu’avocat le jour, mais aussi en tant que superhéros la nuit. C’est bien connu, on ne combat correctement le crime que la nuit !<span id="more-3224"></span></p>
<p style="text-align: justify;">Saviez-vous qu’en anglais, « Daredevil » signifie « tenter le diable » ? Ce sont souvent les cascadeurs et autres acrobates qui en sont qualifiés. Par ailleurs, ce héros est surnommé « l’homme sans peur »… une partie du background tourne donc autour de la Justice, de la Peur, ce qui rappelle curieusement Batman, avec qui les similarités sont nombreuses. De plus, Batman est sous licence DC tandis que <strong><a href="http://marvel.com/characters/11/daredevil" target="_blank">Daredevil</a></strong> est sous licences Marvel. Il y a d’ailleurs eu un cross over : Batman – Daredevil: King of New York, dans lequel nos deux héros s’allient contre l’Épouvantail, ennemi de la chauve-souris et le Caïd, qui lui a affaire à son collègue aveugle.</p>
<p>D’ailleurs, en parlant de tenter le diable, pourquoi ne pas se plonger dans cet univers et tenter sa propre chance en y intégrant un côté ludique ? C’est ce que propose la machine à sous Daredevil, qui dévoile une version pour le moins inattendue. En effet, les combinaisons possibles sont différentes de celles qu’on trouve d’habitude sur ce type de jeu. De nombreux multiplicateurs viendront pimenter votre expérience de jeu et vous permettront d’augmenter vos gains, pour autant que la chance soit avec vous ! De plus, comme Daredevil lui-même, ce jeu de <strong><a href="http://www.casino.com/ch/fr/" target="_blank">casino en ligne</a></strong> propose d’utiliser le « bull’s eye », une cible à placer en début de chaque partie. Si le symbole que vous avez défini au départ se retrouve sous la cible, vous gagnez un bonus supplémentaire ! Vous pouvez en outre stopper les rouleaux à tout moment, comme sur une machine à sous classique. Que la chance soit avec vous !</p>
<hr />
<p><small><a href="https://strak.ch/daredevil-insuffler-la-terreur-aux-mechants/">Article original</a> écrit par Strik-Strak et publié sur <a href="https://strak.ch">Strak.ch</a>.
<br/>
Tags associés: 
<br/><br/>
N'hésitez pas à me suivre sur Twitter: <a href="https://twitter.com/StrikStrak">@StrikStrak</a> 
</small></p>
<hr>Si vous êtes un vrai fan de l’univers Marvel, vous connaissez forcément Daredevil, le héros au costume rouge affublé d’oreilles de diablotin. Comme pas mal de héros Marvel, son histoire est sombre et démarre plutôt mal. En effet, son enfance est difficile: il est élevé par son père, qui l’encourage à entreprendre des études d’avocat. [&#8230;]


guid: https://strak.ch/?p=3243
title: [News] Premier article de 2017 – en vrac
author: Strik-Strak
url: https://strak.ch/premier-article-de-2017-en-vrac/
feedurl: https://strak.ch/feed/
content:
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-3250" src="https://strak.ch/wp-content/uploads/2017/02/pcmasterrace.png" alt="" width="700" height="432" srcset="https://strak.ch/wp-content/uploads/2017/02/pcmasterrace.png 700w, https://strak.ch/wp-content/uploads/2017/02/pcmasterrace-300x185.png 300w" sizes="(max-width: 700px) 100vw, 700px" /></p>
<p style="text-align: justify;">Salut la compagnie ! C&#8217;est fou ce que le temps passe vite, on a déjà plus que bien entamé 2017 et je ne vous écris officiellement que maintenant&#8230; que voulez-vous, on a tous une vie bien remplie avec plein de projets qui ne gravitent pas forcément autour de l&#8217;informatique ! Comme je trouve qu&#8217;il est important de faire le point de temps en temps, même si ce n&#8217;est que pour soi-même, j&#8217;ai pris mon courage à deux mains pour pondre cet article afin de conserver un état des lieux en ce qui concerne ce début d&#8217;année.<span id="more-3243"></span></p>
<h1>Quoi de neuf pour le blog</h1>
<p style="text-align: justify;">On va commencer par le sujet principal, ce blog. J&#8217;ai dit plus haut que je ne vous ai pas encore écrit officiellement mais ce n&#8217;est qu&#8217;à moitié vrai: en effet, mon <strong><a href="http://liens.strak.ch" target="_blank">Shaarli</a></strong>, qui fête d&#8217;ailleurs ses 4 ans tout juste est régulièrement alimenté. Ce ne sont pas loin de 2500 liens que j&#8217;ai indexé pendant ces quatre années. Il reste ma source principale de référencement. Je l&#8217;utilise quasiment tous les jours, que ce soit pour y ajouter du contenu ou en rechercher: se souvenir d&#8217;autant de liens, c&#8217;est juste impossible. La fonction de recherche est hautement appréciable dans ce cas.<br />
C&#8217;est aussi un journal de bord de ce que je peux être en train d&#8217;effectuer au boulot: quand plusieurs liens concernant <a href="http://liens.strak.ch/?searchtags=SBS2011" target="_blank"><strong>SBS 2011</strong></a> et la virtualisation dans Hyper-V apparaissent, il y a de grandes chances pour que je sois en train de virtualiser une machine physique d&#8217;un client dans une instance Hyper-V&#8230; pour des raisons de temps, d&#8217;envie et d&#8217;intérêt éditorial, je choisis généralement de ne pas écrire sur ces sujets qui sont très spécifiques. Je devrais essayer une fois ou deux, histoire de voir si ça peut servir à quelqu&#8217;un, même une personne, ce sera déjà pas mal. C&#8217;est malheureusement toujours une histoire de temps et de courage pour se lancer.</p>
<p style="text-align: justify;">Les plus fidèles d&#8217;entre vous auront remarqué que j&#8217;ai réussi à monétiser de manière plus ou moins discrète le blog récemment&#8230; que celui qui n&#8217;a jamais pensé à rentrer quelques sous me jette la première pierre: héberger un blog, ça coûte de l&#8217;argent, j&#8217;ai pu me payer quelques mois d’hébergement, ça fait plaisir. J&#8217;estime que ça ne pollue pas trop le contenu général du site car on reste sur un blog clean, sans pub ni tracker invasif. En parlant de tracker, j&#8217;ai désactivé Piwik il y a deux jours, un peu par lubie, pour voir si je peux m&#8217;en passer. J&#8217;ai toujours Awstats qui m&#8217;est fourni par mon hébergeur et ce n&#8217;est pas comme si je générais 10&#8217;000 visites par jour non plus. Ça a le mérite d&#8217;accélérer les temps de chargement et de rendre le site plus clean d&#8217;un point de vue tracker, d&#8217;ailleurs je vous jure que je ne vendais pas vos informations personnelles à un grand groupe pharmaceutique.</p>
<p style="text-align: justify;">2017 sera <a href="https://chiffrer.info/" target="_blank"><strong><del>crypté</del> chiffré</strong></a> ou ne sera pas: j&#8217;espère pouvoir enfin amener un certificat signé par Let&#8217;s encrypt sans trop me prendre la tête. Tous les hébergeurs même les plus modestes le proposent, Web4All si tu me lis cette pique cordiale t&#8217;es destinée.</p>
<p style="text-align: justify;">P:S: on peut avoir un blog et des habitudes à la con depuis des années, la preuve c&#8217;est que je viens de découvrir que le raccourci clavier Shift+Alt+J permettait de justifier le texte dans WordPress. Amazing !</p>
<h1>Matos perso</h1>
<p style="text-align: justify;">Quelques changements pour mon matos entre fin 2016 et 2017. Le premier, ça a été l&#8217;achat d&#8217;un <a href="http://www.gearbest.com/cell-phones/pp_308841.html" target="_blank"><strong>XIAOMI Redmi Note 3 Pro</strong></a> qui remplace un quasi-éternel Samsung Galaxy Note 2 forcé à prendre sa retraite. La rom custom qui l&#8217;animait commençait à donner des signes de faiblesse, quand la voix de ton correspondant ressemble à celle d&#8217;un alien tu sais que tu dois soit changer de rom soit changer de téléphone. Je n&#8217;ai pas pondu d&#8217;article à ce sujet, c&#8217;est plutôt barbant et encore une fois je n&#8217;en avais pas l&#8217;envie. Pour résumer, ce téléphone me satisfait entièrement: il n&#8217;est vraiment pas cher (normal quand on achète directement à l&#8217;usine), la batterie tient jusqu&#8217;à deux jours et demi en utilisation moyenne, la coque est en alu (coucou Samsung et ton plastique), la surcouche Xiaomi est tout à fait acceptable: que du bon. Foncez.</p>
<p style="text-align: justify;">Dans la rubrique IT interne, j&#8217;ai du renvoyer mon Qnap en garantie, suite à un problème matériel. Rien de grave, juste l&#8217;horloge interne qui déconnait complètement. J&#8217;y ai quand même passé 3 mois avec le support par mail et heureusement, car j&#8217;ai ouvert le cas avant la fin de garantie, ce qui m&#8217;a permis de le renvoyer. Ça s&#8217;appelle avoir de la chance dans son malheur. En attendant, un Raspberry Pi 2 propulsé par OpenELEC fait office de mediacenter et de centre de téléchargements. Ça se configure quasiment tout seul et très rapidement, vraiment top.</p>
<p style="text-align: justify;">Comme je me suis soucié récemment de mes petits yeux et que ceux d&#8217;un informaticien sont soumis &#8211; vous vous en doutez &#8211; à rude épreuve, j&#8217;ai lorgné du côté des lunettes anti-lumière bleue que proposent par exemple Steichen ou Gunnar. Comme ça coûte une blinde, j&#8217;ai opté pour des premiers prix chinoises à 3$ histoire de tester et le résultat est plutôt satisfaisant. Je me tâte encore pour me payer une &#8220;vraie&#8221; paire, n&#8217;hésitez pas si vous avez une expérience personnelle à partager à ce propos.</p>
<p style="text-align: justify;">Point de vue gaming, je n&#8217;ai jamais détaillé ma config&#8217; pc qui est assez musclée, je dirais juste que depuis que je dispose d&#8217;une <a href="https://www.asus.com/Graphics-Cards/ROG-STRIX-GTX1070-O8G-GAMING/" target="_blank"><strong>Asus Strix GTX 1070</strong></a>, je suis vraiment à l&#8217;aise. Si vous hésitez, je vous la recommande chaudement. Il est vrai que pas mal d&#8217;heures y passent, heures qui pourraient être consacrées à l&#8217;écriture mais que voulez-vous&#8230; mettre la branlée à des noobs sur Rocket League en 4K à 60FPS, ça n&#8217;a pas de prix. #PCMasterRace.</p>
<p style="text-align: justify;">Allez, la bise les geeks!</p>
<p style="text-align: justify;">Strik-Strak</p>
<hr />
<p><small><a href="https://strak.ch/premier-article-de-2017-en-vrac/">Article original</a> écrit par Strik-Strak et publié sur <a href="https://strak.ch">Strak.ch</a>.
<br/>
Tags associés: 
<br/><br/>
N'hésitez pas à me suivre sur Twitter: <a href="https://twitter.com/StrikStrak">@StrikStrak</a> 
</small></p>
<hr>Salut la compagnie ! C&#8217;est fou ce que le temps passe vite, on a déjà plus que bien entamé 2017 et je ne vous écris officiellement que maintenant&#8230; que voulez-vous, on a tous une vie bien remplie avec plein de projets qui ne gravitent pas forcément autour de l&#8217;informatique ! Comme je trouve qu&#8217;il est [&#8230;]


guid: https://strak.ch/?p=3261
title: [News] Passage en HTTPS et changement d’hébergeur
author: Strik-Strak
url: https://strak.ch/passage-en-https-et-changement-d-hebergeur/
feedurl: https://strak.ch/feed/
content:
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-3267" src="https://strak.ch/wp-content/uploads/2017/03/lets-encrypt.jpg" alt="" width="700" height="279" srcset="https://strak.ch/wp-content/uploads/2017/03/lets-encrypt.jpg 700w, https://strak.ch/wp-content/uploads/2017/03/lets-encrypt-300x120.jpg 300w" sizes="(max-width: 700px) 100vw, 700px" /></p>
<p style="text-align: justify;">Vous l&#8217;aurez compris, le titre laisse peu de place au suspense, le blog ainsi que mon Shaarli bénéficient à présent du fameux petit cadenas vert !<span id="more-3261"></span></p>
<p style="text-align: justify;">Cela signifie donc que dorénavant, une connexion chiffrée est en place entre votre ordinateur et ce présent site.<br />
Ça fait un moment que j&#8217;avais envie de mettre un certificat signé par Let&#8217;s Encrypt en place: en 2017, j&#8217;ai envie de dire que c&#8217;est le moment !<br />
Ce n&#8217;était malheureusement pas possible avec mon ancien hébergeur qui ne proposait pas cette fonctionnalité dans son panel, dommage.</p>
<p style="text-align: justify;">En guise de préambule, je racontais <a href="https://cyrille-borne.com/article3893/statistiques-ou-la-confirmation-que-tout-le-monde-s-en-fout#c3893-3610" target="_blank"><strong>chez Cyrille</strong></a> que j&#8217;allais prochainement lui montrer ô combien j&#8217;aime qu&#8217;il me cite, une seule action raisonnable possible: signer chez <a href="http://www.o2switch.fr/" target="_blank"><strong>le même hébergeur que lui</strong></a>.<br />
Hasard, délire passager d&#8217;un blogueur en mal de reconnaissance ou calcul purement financier ? Je vous laisse faire votre choix&#8230;</p>
<p style="text-align: justify;">Revenons-en au fait: les deux changements majeurs qui peuvent potentiellement vous affecter sont les changements d&#8217;adresse des flux RSS, quoique la redirection devrait faire son job.</p>
<p style="text-align: justify;"><a href="https://strak.ch/feed" target="_blank"><strong>https://strak.ch/feed</strong></a> pour le blog<br />
<a href="https://liens.strak.ch/?do=rss" target="_blank"><strong>https://liens.strak.ch/?do=rss</strong></a> pour le Shaarli</p>
<p style="text-align: justify;">Vous pouvez donc les remplacer dans vos lecteurs de flux préférés.<br />
Je vous remercie grandement d&#8217;avance de me signaler tout bug qui pourrait subsister !</p>
<p style="text-align: justify;">Par ailleurs, la simplicité de mise en place de Let&#8217;s Encrypt avec cPanel est déconcertante, on clique pas plus de 3 fois et le tour est (presque) joué:<br />
On force ensuite l&#8217;utilisation de https, je me suis appuyé sur l&#8217;excellent plugin <a href="https://srd.wordpress.org/plugins/really-simple-ssl/" target="_blank"><strong>Really Simple SSL</strong></a> pour WordPress, conseillé d&#8217;ailleurs par Infomaniak, un sinon le plus gros hébergeur web de Suisse.<br />
Encore quelques bidouilles sont nécessaires dans les menus, notamment pour forcer l’utilisation dans le back-end, côté administratif. Là, j&#8217;ai tapé dans iThemes Security que j&#8217;utilise depuis longtemps, mais je pense qu&#8217;il ne fait qu&#8217;éditer le fichier wp-config.php pour le coup.</p>
<p style="text-align: justify;">Pour Shaarli, je me suis contenté d&#8217;un bon vieux .htaccess des familles dont voici le contenu:</p>
<pre style="text-align: justify;">RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]</pre>
<p>En gros, si le visiteur arrive via le port 80, soit http, le .htaccess corrige et renvoie vers la même page en https.</p>
<p>C&#8217;est tout pour le moment, je vous dis à très vite pour de nouveaux articles !</p>
<hr />
<p><small><a href="https://strak.ch/passage-en-https-et-changement-d-hebergeur/">Article original</a> écrit par Strik-Strak et publié sur <a href="https://strak.ch">Strak.ch</a>.
<br/>
Tags associés: 
<br/><br/>
N'hésitez pas à me suivre sur Twitter: <a href="https://twitter.com/StrikStrak">@StrikStrak</a> 
</small></p>
<hr>Vous l&#8217;aurez compris, le titre laisse peu de place au suspense, le blog ainsi que mon Shaarli bénéficient à présent du fameux petit cadenas vert ! Cela signifie donc que dorénavant, une connexion chiffrée est en place entre votre ordinateur et ce présent site. Ça fait un moment que j&#8217;avais envie de mettre un certificat [&#8230;]


guid: https://strak.ch/?p=3278
title: [News] Google et Bing cherchent à enterrer le contenu piraté
author: Strik-Strak
url: https://strak.ch/google-et-bing-cherchent-a-enterrer-le-contenu-pirate/
feedurl: https://strak.ch/feed/
content:
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-3284" src="https://strak.ch/wp-content/uploads/2017/04/pirate_kb.jpg" alt="" width="885" height="440" srcset="https://strak.ch/wp-content/uploads/2017/04/pirate_kb.jpg 885w, https://strak.ch/wp-content/uploads/2017/04/pirate_kb-300x149.jpg 300w, https://strak.ch/wp-content/uploads/2017/04/pirate_kb-768x382.jpg 768w" sizes="(max-width: 885px) 100vw, 885px" /></p>
<p style="text-align: justify;">Un nouveau code de pratique volontaire contre la piraterie entre les moteurs de recherche Google et Bing pourrait assurer le filtrage des sites Web proposant des films piratés, de la musique et du sport illégalement diffusé. L&#8217;initiative se déroulera parallèlement aux mesures anti-piratage existantes.<span id="more-3278"></span></p>
<h2 style="text-align: justify;">Quel était le problème ?</h2>
<p style="text-align: justify;">En ce moment, le filtrage des moteurs de recherche n&#8217;est pas en place au point où les utilisateurs des moteurs de recherche qui cliquent sur les résultats de haut rang ne finissent pas par ouvrir des sites Web qui présentent un risque de sécurité possible et/ou offrent un contenu illicite/piraté.</p>
<p style="text-align: justify;">Le piratage en ligne signifie que les fournisseurs de contenu (par exemple, les films ou le sport) perdent actuellement des quantités importantes de revenus potentiels, ainsi que gaspillent une partie de leurs dépenses de marketing et perdent leur contrôle sur la qualité.</p>
<p style="text-align: justify;">Vous pourriez soutenir les fournisseurs de contenu, en refusant du contenu piraté et en visitant des sites comme <strong><a href="http://www.casinoenlignesuisse.info/" target="_blank" rel="noopener noreferrer">casino en ligne suisse</a></strong>, c’est-à-dire ceux qui sont absolument légaux.</p>
<p style="text-align: justify;">En ce qui concerne les actions anti-piratage actuellement prises par et pour le compte des fournisseurs de contenu suisses, des ordres judiciaires peuvent être utilisés pour bloquer certains sites; outre cela, on peut restreindre la publicité sur des sites Web illégaux:</p>
<h2 style="text-align: justify;">Google a déjà certaines mesures en place</h2>
<p style="text-align: justify;">Google prend déjà certaines mesures anti-piratage, telles que la suppression des liens des résultats des moteurs de recherche quand les titulaires de droits peuvent fournir la preuve que leur droit d&#8217;auteur a été violé.</p>
<h2 style="text-align: justify;">Que signifie le code dans la pratique?</h2>
<p style="text-align: justify;">Les commentateurs de contenu semblent largement d&#8217;accord qu&#8217;une approche conjointe qui tienne compte des intérêts de plusieurs parties est une étape positive. On pense que l&#8217;adoption du code par Google et Bing, qui semble commencer cette année, entraînera moins de risques pour la sécurité des consommateurs en ligne et une plus grande probabilité que les consommateurs puissent accéder plus rapidement à un contenu de qualité sur des sites plus justes et éviter tout risque juridique associé au téléchargement de contenu enfreignant le droit d&#8217;auteur.</p>
<p style="text-align: justify;">Eddy Leviten, directeur général du Trade Body, l&#8217;Alliance pour la propriété intellectuelle, a déclaré: &#8220;Parfois, les gens vont chercher quelque chose et ils finiront par tomber involontairement sur un contenu piraté. Ce que nous voulons garantir, c&#8217;est que les résultats au sommet des moteurs de recherche sont les plus authentiques.&#8221;</p>
<h2 style="text-align: justify;">Qu&#8217;est-ce que cela signifie pour votre entreprise?</h2>
<p style="text-align: justify;">Cela ne peut être qu&#8217;une bonne nouvelle pour les entreprises qui investissent et fournissent une qualité et un contenu original. Bien qu&#8217;il ne s&#8217;agisse pas d&#8217;un dépistage exclusif du piratage, il semble que la vie soit plus difficile pour ceux qui cherchent à bénéficier financièrement du travail et de l&#8217;investissement de fournisseurs de contenu légitimes.</p>
<p style="text-align: justify;">Les entreprises devront maintenant être plus méthodiques en vérifiant que tout contenu qu&#8217;ils publient en ligne ne porte pas atteinte aux droits d&#8217;auteur.</p>
<hr />
<p><small><a href="https://strak.ch/google-et-bing-cherchent-a-enterrer-le-contenu-pirate/">Article original</a> écrit par Strik-Strak et publié sur <a href="https://strak.ch">Strak.ch</a>.
<br/>
Tags associés: 
<br/><br/>
N'hésitez pas à me suivre sur Twitter: <a href="https://twitter.com/StrikStrak">@StrikStrak</a> 
</small></p>
<hr>Un nouveau code de pratique volontaire contre la piraterie entre les moteurs de recherche Google et Bing pourrait assurer le filtrage des sites Web proposant des films piratés, de la musique et du sport illégalement diffusé. L&#8217;initiative se déroulera parallèlement aux mesures anti-piratage existantes. Quel était le problème ? En ce moment, le filtrage des [&#8230;]


guid: https://liens.strak.ch/?w584ZA
title: PowerShell/Get-WannaCryPatchState.ps1 at master · kieranwalsh/PowerShell · GitHub
feedurl: https://liens.strak.ch/?do=rss
url:
https://github.com/kieranwalsh/PowerShell/blob/master/Get-WannaCryPatchState/Get-WannaCryPatchState.ps1

content:
<div class="markdown"><p>Get-WannaCryPatchState - Scans an AD domain to find all Windows Computers, try to connect to them, get the installed hotfixes and sees if one of 'KB4012212', 'KB4012213', 'KB4012214', 'KB4012215', 'KB4012216', 'KB4012217', 'KB4012598', 'KB4013429', 'KB4015217', 'KB4015438', 'KB4015549', 'KB4015550', 'KB4015551', 'KB4015552', 'KB4015553', 'KB4016635', 'KB4019215', 'KB4019216', 'KB4019264', 'KB4019472' are installed. The status of each machine is output to a log in the user's My Documents and a full summary is given at the end.<br />
&#8212; <a href="https://liens.strak.ch/?w584ZA" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?d765uA
title: WannaCry : comment détecter la faille sur vos machines (nmap)
url: http://blogmotion.fr/systeme/nmap-scan-nse-resultat-15987
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>1) nmap pour Windows: <a href="https://nmap.org/download.html#windows">https://nmap.org/download.html#windows</a><br />
2) coller le script <a href="https://raw.githubusercontent.com/cldrn/nmap-nse-scripts/master/scripts/smb-vuln-ms17-010.nse">https://raw.githubusercontent.com/cldrn/nmap-nse-scripts/master/scripts/smb-vuln-ms17-010.nse</a> dans C:\Program Files (x86)\Nmap\scripts\<br />
3) Exemple de commande dans un CMD: nmap -sC -p 445 -max-hostgroup 3 -open --script smb-vuln-ms17-010.nse 172.24.1.0/24 -oN resultat.txt</p>
<p>Testé et approuvé !<br />
&#8212; <a href="https://liens.strak.ch/?d765uA" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?MsUI4Q
title: Battlegrounds: stats après 100 parties
url: https://strak.ch/wp-content/uploads/2017/05/Battlegrounds_stats.jpg
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Une seule victoire après toutes ces parties, 13% de Top10, et toi ? :)<br />
&#8212; <a href="https://liens.strak.ch/?MsUI4Q" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?qysyCg
title: WordPress 4.8 “Evans”
url: https://wordpress.org/news/2017/06/evans/
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Mettez à jour !<br />
&#8212; <a href="https://liens.strak.ch/?qysyCg" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?rzJlqA
title: E3 2017 : Des animations et la météo à venir dans Battlegrounds
url: http://www.nofrag.com/2017/jun/13/50706/
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Faut que je m'y remette d'ailleurs ! :)<br />
&#8212; <a href="https://liens.strak.ch/?rzJlqA" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?cWcaFw
title: Comment j'ai tué mon libre - Le Blog de Cyrille BORNE
url: https://www.cyrille-borne.com/article4079/comment-j-ai-tue-mon-libre
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Vacances obligent, j'ai raté (en live s'entend) la transition de Cyrille vers Windows 10 !<br />
Quand je pense que je garde mon PC perso sur 8.1, par peur du changement et de l'update foireux, alors qu'au boulot je suis en 10, sans souci... ^^'<br />
&#8212; <a href="https://liens.strak.ch/?cWcaFw" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?SPN8Lg
title: Mon infrastructure pour 2017
url: https://www.abyssproject.net/2017/06/mon-infrastructure-pour-2017/
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>TL;DR. Curiosité !<br />
&#8212; <a href="https://liens.strak.ch/?SPN8Lg" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?H9jmRw
title: Buttercup
url: https://buttercup.pw/
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Un autre gestionnaire de mot de passe.<br />
&#8212; <a href="https://liens.strak.ch/?H9jmRw" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?lNR_WA
title: Hygiène numérique pour l’administrateur système
url: https://confs.imirhil.fr/20170513_root66_securite-admin-sys/#1
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>TL;DR.<br />
&#8212; <a href="https://liens.strak.ch/?lNR_WA" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?xMy6LA
title: Windows Server 2016 Essentials : Présentation et Installation
url: https://www.tech2tech.fr/windows-server-2016-essentials-presentation-et-installation/
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Tiens, je ne connaissais pas du tout le remplaçant de l'ancêtre Windows SBS, le bien-nommé Windows server 2016 Essentials.<br />
Attention: comme SBS, il y a bien sûr des limitations, qui se justifient par un prix bien inférieur, une absence des CAL et une vente par socket !<br />
&#8212; <a href="https://liens.strak.ch/?xMy6LA" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?9QT0uQ
title: KrISS feed 8.7 - Tontof
url: http://tontof.net/index.php?2017/06/02/14/17/15-kriss-feed-8-7
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Cool, une update pour KrISS feed, mon lecteur de flux RSS préféré !!</p>
<p>via <a href="http://sebsauvage.net/links/?KO76fg">http://sebsauvage.net/links/?KO76fg</a><br />
&#8212; <a href="https://liens.strak.ch/?9QT0uQ" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?kWptRw
title: Veeam Agent 2.0 : Plus puissant et toujours gratuit !
url: https://www.tech2tech.fr/veeam-agent-2-0-plus-puissant-et-toujours-gratuit/
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Pas mal de nouveautés pour la version gratuite de Veeam, nice !<br />
&#8212; <a href="https://liens.strak.ch/?kWptRw" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?OYsjLg
title: Mes yeux sont plus haut
url: https://cereales.lapin.org/strips2/1473952176-20160915.png
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>^^<br />
&#8212; <a href="https://liens.strak.ch/?OYsjLg" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?VM3SqQ
title: Panne du système de paiement 3D Secure : à cause du nom de domaine - ZDNet
feedurl: https://liens.strak.ch/?do=rss
url:
http://www.zdnet.fr/blogs/infra-net/panne-du-systeme-de-paiement-3d-secure-a-cause-du-nom-de-domaine-39853696.htm#link_time=1497516681

content:
<div class="markdown"><p>Quand on gère un NDD où plusieurs centaines de millions de personnes se connectent chaque mois, on se met au moins un rappel dans Outlook ! :)<br />
&#8212; <a href="https://liens.strak.ch/?VM3SqQ" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?oyqH0g
title: Framavox : faites encore mieux entendre votre voix !
url: https://framablog.org/2017/06/16/framavox-faites-encore-mieux-entendre-votre-voix/
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>&quot;Le principe est simple : vous vous créez un compte, une équipe, vous y invitez vos collaborateurs et collaboratrices et vous discutez de vos projets. À n’importe quel moment, chacun·e peut proposer un vote (avec une date de fin de vote) pour savoir où l’équipe en est.&quot;<br />
&#8212; <a href="https://liens.strak.ch/?oyqH0g" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?ubOAIw
title: O2switch, je t'aime d'amour \o/
url: http://www.warriordudimanche.net/article642/o2switch-je-t-aime-d-amour-o
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Étant passé à O2switch il y a maintenant 3 mois, je ne peux que plussoyer: réponses rapides, équipe compétente, offre bon marché et fonctionnelle: le top ! :)<br />
&#8212; <a href="https://liens.strak.ch/?ubOAIw" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?5zsEHg
title: How to change/reset HP ILO password from Operating System
url: http://techibee.com/sysadmins/how-to-changereset-hp-ilo-password-from-operating-system/2048
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Titre.<br />
&#8212; <a href="https://liens.strak.ch/?5zsEHg" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?WMz0nw
title: Avec ProtonVPN, ProtonMail se lance dans les VPN - Tech - Numerama
url: http://www.numerama.com/tech/268762-avec-protonvpn-protonmail-se-lance-dans-les-vpn.html
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Aucune news sur un site Suisse qui en parle pour le moment, dommage.<br />
Une formule gratuite est dispo.<br />
&#8212; <a href="https://liens.strak.ch/?WMz0nw" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?FZ0XBg
title: Ressources pour les débutants
url: https://libretgeek.wordpress.com/2017/04/17/ressources-pour-les-debutants/
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Pratique pour occuper un éventuel stagiaire, sait-on jamais...<br />
&#8212; <a href="https://liens.strak.ch/?FZ0XBg" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?IEw2sg
title: Les mods pour GTA V c'est fini et la communauté Steam n'aime pas ça - Le comptoir du hardware
feedurl: https://liens.strak.ch/?do=rss
url:
http://www.comptoir-hardware.com/actus/jeux-video/34397-les-mods-pour-gta-v-cest-fini-et-la-communaute-steam-naime-pas-ca.html

content:
<div class="markdown"><ol>
<li>Take Two décide de sommer le créateur de OpenIV (l'outil de modding le plus utilisé) de le retirer du marché sous peine de poursuites: <a href="http://openiv.com/?p=1324">http://openiv.com/?p=1324</a>, et afin de promouvoir leurs micro-transactions à la place.</li>
<li>La communauté réagit et fait passer la note du jeu de &quot;très positif&quot; à &quot;extrêmement négatif&quot;, tout en dégueulant dans les commentaires.</li>
</ol>
<p>Take Two a vraiment décidé de faire de la merde.<br />
&#8212; <a href="https://liens.strak.ch/?IEw2sg" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?D0wofQ
title: Sorebrect : Découverte d'un redoutable ransomware sans fichier | UnderNews
feedurl: https://liens.strak.ch/?do=rss
url:
https://www.undernews.fr/malwares-virus-antivirus/sorebrect-decouverte-dun-redoutable-ransomware-sans-fichier.html

content:
<div class="markdown"><p>Balaise...<br />
&#8212; <a href="https://liens.strak.ch/?D0wofQ" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?w8cMOA
title: NeverSSL - helping you get online
url: http://neverssl.com/
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Un site, le plus minimaliste possible d'un point de vue sécuritaire, ceci afin de forcer l'apparition des portails captifs sur les Wi-Fi publics. À retenir par cœur du coup !<br />
&#8212; <a href="https://liens.strak.ch/?w8cMOA" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?FbXKNA
title: Panaustik – Détectection automatique de doublons et de panoramas
url: https://www.panaustik.com/
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Génial, j'ai justement un GROS stock de photos persos à trier, merci ! :)</p>
<p>via <a href="http://sebsauvage.net/links/?JCTV3w">http://sebsauvage.net/links/?JCTV3w</a></p>
<p>Edit: voir aussi : <a href="http://www.visipics.info">http://www.visipics.info</a>, merci à Liandri !<br />
&#8212; <a href="https://liens.strak.ch/?FbXKNA" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?euMvEQ
title: Refresh Types
url: https://imgs.xkcd.com/comics/refresh_types.png
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>&#8212; <a href="https://liens.strak.ch/?euMvEQ" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?dIgqiA
title: Google lira encore vos emails, et SnapChat montre aux autres où vous vous trouvez
url: https://francoischarlet.ch/2017/google-lit-emails-snapchat-geolocalise/
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Ça tombe sous le sens: ne soyez pas crédules !<br />
&#8212; <a href="https://liens.strak.ch/?dIgqiA" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?Pr8r-A
title: T411 fermé après une opération de police en France et en Suède
url: https://www.nextinpact.com/news/104671-t411-ferme-apres-operation-police-en-france-et-en-suede.htm
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>La &quot;terrible&quot; nouvelle du jour, c'est certainement celle-ci: la fermeture de l'éminent T411, mine d'or francophone parmi les sites de torrent...<br />
Du coup, attention aux sites de phishing qui fleurissent, prévenez votre voisin kissikoné.<br />
Mais bon, si on a survécu à la fin de MegaUpload, ça devrait à nouveau bien se passer, non ? :)<br />
&#8212; <a href="https://liens.strak.ch/?Pr8r-A" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?W9RjnA
title: Practical waterholing through DNS typosquatting
feedurl: https://liens.strak.ch/?do=rss
url:
https://blog.0day.rocks/practical-waterholing-through-dns-typosquatting-e252e6a2f99e?source=rss----6beb88197afc---4

content:
<div class="markdown"><p>Article HowTo sur le typosquatting, ou typosquattage en français.<br />
&#8212; <a href="https://liens.strak.ch/?W9RjnA" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?oj9ziw
title: Royal Navy's new £3.5bn aircraft carrier runs on Windows XP - Software - News - HEXUS.net
url: http://hexus.net/tech/news/software/107389-royal-navys-new-35bn-aircraft-carrier-runs-windows-xp/
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Un porte-avions neuf qui tourne sur Windows XP, GÉ-NIAL ! 8)</p>
<p>via <a href="https://www.ecirtam.net/links/?p3dOeA">https://www.ecirtam.net/links/?p3dOeA</a><br />
&#8212; <a href="https://liens.strak.ch/?oj9ziw" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?CUpZdg
title: 5 alternatives à T411
url: http://www.funinformatique.com/alternative-t411/
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p><a href="http://www.torrent9.cc/">http://www.torrent9.cc/</a><br />
<a href="https://www.omgtorrent.me/">https://www.omgtorrent.me/</a><br />
<a href="http://www.lien-torrent.com/">http://www.lien-torrent.com/</a><br />
<a href="https://zone-torrent.fr/">https://zone-torrent.fr/</a><br />
<a href="https://elite-tracker.net/">https://elite-tracker.net/</a></p>
<p>Aussi:<br />
<a href="https://1337x.to/home/">https://1337x.to/home/</a><br />
<a href="https://btdb.in/">https://btdb.in/</a><br />
<a href="http://www.digbt.org/">http://www.digbt.org/</a><br />
<a href="https://www.btsay.org">https://www.btsay.org</a><br />
<a href="https://t411.si">https://t411.si</a><br />
<a href="http://www.torrent9.cc/">http://www.torrent9.cc/</a><br />
<a href="https://torrentproject.se/">https://torrentproject.se/</a><br />
<a href="https://www.omgtorrent.me/">https://www.omgtorrent.me/</a><br />
<a href="http://www.lien-torrent.com/">http://www.lien-torrent.com/</a><br />
<a href="https://zone-torrent.fr/">https://zone-torrent.fr/</a><br />
<a href="https://elite-tracker.net/">https://elite-tracker.net/</a><br />
<a href="https://idope.se/">https://idope.se/</a><br />
<a href="https://thepiratebayz.org/">https://thepiratebayz.org/</a><br />
<a href="https://eztv.ag/">https://eztv.ag/</a><br />
<a href="https://rarbg.to/index8.php">https://rarbg.to/index8.php</a><br />
<a href="https://katcr.co/new/">https://katcr.co/new/</a><br />
<a href="https://yts.ag/">https://yts.ag/</a><br />
<a href="https://www.torlock.com/">https://www.torlock.com/</a><br />
<a href="https://www.torrentdownloads.me/">https://www.torrentdownloads.me/</a><br />
<a href="https://yggtorrent.com">https://yggtorrent.com</a></p>
<p>Rien à ajouter...<br />
&#8212; <a href="https://liens.strak.ch/?CUpZdg" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?I88aPA
title: Un record d’écriture et de vie sur un SSD Samsung
url: https://computerz.solutions/record-decriture-de-vie-ssd-samsung/
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>9100 Tb en écriture ! Oo<br />
&#8212; <a href="https://liens.strak.ch/?I88aPA" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?LILN5Q
title: Le coup de barre | CommitStrip
url: http://www.commitstrip.com/fr/2017/06/29/the-post-lunch-dip/
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Dodo !<br />
&#8212; <a href="https://liens.strak.ch/?LILN5Q" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?x3HlYg
title: Crytek présente Hunt: Showdown, des chasseurs dans les bayous
url: http://www.nofrag.com/2017/jul/03/50774/
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>«Non, Crytek n'est pas mort». La seule info pertinente de cette nouvelle.</p>
<p>&#8212; <a href="https://liens.strak.ch/?x3HlYg" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?ietIBQ
title: Déplacements et vie privée : l'EPFL et l'UNIL créent ORide
url: https://francoischarlet.ch/2017/deplacements-vie-privee-epfl-unil-oride/
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>TL;DR<br />
&#8212; <a href="https://liens.strak.ch/?ietIBQ" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?QNE6gg
title: Debian 9 : retrouver les noms des interfaces réseaux eth
url: https://memo-linux.com/debian-9-retrouver-les-noms-des-interfaces-reseaux-eth/
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Vécu par un collègue récemment sur une Debian, il a fait une drôle de gueule ! :)<br />
&#8212; <a href="https://liens.strak.ch/?QNE6gg" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?eG7KaQ
title: Déploiement de Proxmox VE 5 sur un serveur dédié – part 1
url: https://blog.zwindler.fr/2017/07/02/deploiment-de-proxmox-ve-5-sur-un-serveur-dedie-part-1/
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>TL;DR de la mort, puissant article qui va me faire souffler du nez et sentir mal, si vous voyez ce que je veux dire...<br />
&#8212; <a href="https://liens.strak.ch/?eG7KaQ" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?d6IUOw
title: Disable SMB v1 in Managed Environments with Group Policy – "Stay Safe" Cyber Security Blog
feedurl: https://liens.strak.ch/?do=rss
url:
https://blogs.technet.microsoft.com/staysafe/2017/05/17/disable-smb-v1-in-managed-environments-with-ad-group-policy/

content:
<div class="markdown"><p>Coudé.<br />
&#8212; <a href="https://liens.strak.ch/?d6IUOw" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?gjeTvA
feedurl: https://liens.strak.ch/?do=rss
title:
Comment vérifier si votre ordinateur est vulnérable à la faille SMBv1 utilisée par WannaCry et Petya ?

url:
https://www.tech2tech.fr/comment-verifier-si-votre-ordinateur-est-vulnerable-a-la-faille-smbv1-utilisee-par-wannacry-et-petya/

content:
<div class="markdown"><p>À tester.<br />
&#8212; <a href="https://liens.strak.ch/?gjeTvA" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?A8yYTQ
title: Yggtorrent, le "T411 bis" ??
url: http://yggtorrent.com
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Se dit être une version &quot;bis&quot; de T411, l'équipe originale doit certainement avoir d'autres soucis actuellement mais pourquoi pas, ça peut être prometteur. À surveiller du coin de l’œil tout en se méfiant...</p>
<p>Le Twitter: <a href="https://twitter.com/T411_2">https://twitter.com/T411_2</a><br />
&#8212; <a href="https://liens.strak.ch/?A8yYTQ" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?TYk09Q
title: Battlegrounds montre son terrain de jeu désertique
url: http://www.nofrag.com/2017/jul/04/50777/
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Vivement ! :)<br />
&#8212; <a href="https://liens.strak.ch/?TYk09Q" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?oo8xTg
title: CryptPad: Zero Knowledge, Collaborative Real Time Editing
url: https://cryptpad.fr/
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Titre.<br />
&#8212; <a href="https://liens.strak.ch/?oo8xTg" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?Xm0tVQ
title: FREE wildcard HTTPS certs from Let's Encrypt for every reader*
feedurl: https://liens.strak.ch/?do=rss
url:
http://go.theregister.com/feed/www.theregister.co.uk/2017/07/06/free_wildcard_ssl_certs_lets_encrypt/

content:
<div class="markdown"><p>Let's Encrypt proposera des certificats de type wildcard dès janvier 2018 !<br />
&#8212; <a href="https://liens.strak.ch/?Xm0tVQ" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?EWsPpw
title: How to defend your website with ZIP bombs
url: https://blog.haschek.at/post/f2fda
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Mise en place d'une &quot;bombe&quot; compressée qui fait crasher les navigateurs et autres outils de potentiels attaquants.</p>
<p>via <a href="http://bookmarks.ecyseo.net/?5s_S7A">http://bookmarks.ecyseo.net/?5s_S7A</a><br />
&#8212; <a href="https://liens.strak.ch/?EWsPpw" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?q2v3GA
title: Ma lecture cybersecurité, informatique et divers du mois n°8
url: https://www.kanjian.fr/lecture-cybersecurite-informatique-divers-mois-n8.html
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Des liens à checker. J'en profite pour indexer ce blog que je ne connaissais pas !<br />
&#8212; <a href="https://liens.strak.ch/?q2v3GA" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?KVgjnQ
title: How to upgrade to Linux Mint 17.3
url: http://blog.linuxmint.com/?p=2955
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Si comme moi vous avez une machine qui n'est même pas encore en 17.3..!<br />
Puis voir <a href="https://memo-linux.com/linux-mint-mettre-a-jour-la-distribution-vers-la-version-18-sarah/">https://memo-linux.com/linux-mint-mettre-a-jour-la-distribution-vers-la-version-18-sarah/</a><br />
&#8212; <a href="https://liens.strak.ch/?KVgjnQ" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?IjMbYA
title: WPForce - Brute Force Attack Tool WordPress | Security Hack3r
url: https://securityhack3r.info/wpforce-brute-force-attack-tool-wordpress/
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>WPForce, le cousin de WPScan qui se concentre sur l'API de WordPress. </p>
<p>via <a href="https://links.angristan.fr/?mawpBg">https://links.angristan.fr/?mawpBg</a><br />
&#8212; <a href="https://liens.strak.ch/?IjMbYA" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?WqzehA
title: File Converter - Convert & compress everything in 2 clicks!
url: http://file-converter.org/
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Un convertisseur de fichiers libre qui a plu à Orangina Rouge.</p>
<p>via <a href="http://orangina-rouge.org/shaarli/?p9s-1Q">http://orangina-rouge.org/shaarli/?p9s-1Q</a><br />
&#8212; <a href="https://liens.strak.ch/?WqzehA" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?b5UNdA
title: How to create a SAN certificate request in 2012 R2 - YouTube
url: https://www.youtube.com/watch?v=vzHtJ33cIng
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Si Exchange est installé, autant passer par la console ECP pour générer ses certificats, je trouve le procédé nettement plus simple.<br />
&#8212; <a href="https://liens.strak.ch/?b5UNdA" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?o-K7dA
title: Avast buys Piriform, maker of CCleaner - Liliputing
url: https://liliputing.com/2017/07/avast-buys-piriform-maker-ccleaner.html
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Chiasse, Avast a racheté Piriform, l'éditeur de CCleaner... :(</p>
<p>via <a href="https://links.angristan.fr/?fJZdlQ">https://links.angristan.fr/?fJZdlQ</a><br />
&#8212; <a href="https://liens.strak.ch/?o-K7dA" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?LjNktg
title: T411 - Torrent 411 - Indexeur Torrent Français
url: https://t411.si/
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Une éventuelle résurrection de T411 ? Qui sait...</p>
<p>via <a href="https://www.ecirtam.net/links/?cRELTw">https://www.ecirtam.net/links/?cRELTw</a><br />
&#8212; <a href="https://liens.strak.ch/?LjNktg" title="Permalink">Permalink</a></p></div>


guid: https://liens.strak.ch/?MCM0kw
title: T411 - Torrent 411 - Indexeur Torrent Français - Strak.ch | Actu et liens en vrac - Oros links
url: https://www.ecirtam.net/links/?WxV0Ag
feedurl: https://liens.strak.ch/?do=rss
content:
<div class="markdown"><p>Déjà fait, t'inquiète ! ;) -&gt; <a href="https://liens.strak.ch/?A8yYTQ">https://liens.strak.ch/?A8yYTQ</a><br />
&#8212; <a href="https://liens.strak.ch/?MCM0kw" title="Permalink">Permalink</a></p></div>


guid: http://tkpx.wordpress.com/?p=1326
title: J’ai quitté Twitter !
author: takopix
url: https://tkpx.wordpress.com/2017/05/05/jai-quitte-twitter/
feedurl: https://tkpx.wordpress.com/feed/
content:
<p style="text-align:justify;">Depuis un moment déjà (vous l&rsquo;avez lu sur mon blog), je me posais la question de Twitter. Faut-il rester ? Pourquoi continuer ? Est-il vraiment &laquo;&nbsp;moins pire&nbsp;&raquo; que les autres services des géants du web ? Plein de questions qui me tournaient dans la tête depuis longtemps. Et puis il y a un peu plus d&rsquo;un mois j&rsquo;ai découvert Mastodon!</p>
<p><span id="more-1326"></span></p>
<p style="text-align:justify;">J&rsquo;ai présenté rapidement <strong>Mastodon</strong> dans un <a href="https://tkpx.wordpress.com/2017/04/01/mastodon-social/">billet précédent</a> donc je ne vous refais pas le topo complet. Mais depuis que j&rsquo;utilise ce nouveau réseau, j&rsquo;ai comme l&rsquo;impression d&rsquo;être revenu au début du web, comme si j&rsquo;avais fais un bond de vingt ans en arrière et que j&rsquo;étais de nouveau sur Caramail (coup de vieux !). Le service est encore jeune mais nous sommes déjà plus de 600 000 utilisateurs répartis sur un grand nombre d&rsquo;instances. Pour ma part, je suis inscrit sur plusieurs instances mais suis vraiment actif sur <a href="https://mamot.fr" target="_blank" rel="noopener noreferrer">Mamot.fr</a>, l&rsquo;instance gérée par <a href="https://www.laquadrature.net/" target="_blank" rel="noopener noreferrer">La Quadrature du Net</a>. J&rsquo;ai trouvé dans Mastodon ce que j&rsquo;attends vraiment d&rsquo;un réseau social et je trouve les interactions beaucoup plus &laquo;&nbsp;humaines&nbsp;&raquo;.</p>
<p style="text-align:justify;">&#8211; C&rsquo;est pourquoi j&rsquo;ai décidé il y a quelques jours de fermer mon compte Twitter &#8211;</p>
<p style="text-align:justify;">Je m&rsquo;étais inscrit en juin 2008 mais n&rsquo;ai vraiment été actif&nbsp; qu&rsquo;il y a quelques années. Avant, ça me servait surtout à faire suivre ce que je postais sur Facebook, notamment lorsque j&rsquo;étais à mon compte. Ce n&rsquo;était qu&rsquo;un canal de diffusion.</p>
<p style="text-align:justify;">Puis je m&rsquo;y suis vraiment mis, j&rsquo;ai commencé à suivre des gens, à écrire et partager des articles. J&rsquo;ai commencé également à avoir un petit groupe de &laquo;&nbsp;followers&nbsp;&raquo;. C&rsquo;était devenu assez pratique pour échanger sur mon travail (médiathèque / fablab), pour échanger avec des collègues et pour faire de la veille (diy, informatique).</p>
<p style="text-align:justify;">Vient ensuite le moment où j&rsquo;ai commencé à m’intéresser sérieusement au libre et à la protection de la vie privée, ce qui a entraîné plusieurs changements dans mes habitudes : changement d&rsquo;appareils et de systèmes, début du blog, vague de <a href="https://tkpx.wordpress.com/2016/10/12/au-revoir-les-reseaux-sociaux/" target="_blank" rel="noopener noreferrer">suppression de mes différents comptes</a> Facebook, Linkedin et compagnie, etc.</p>
<p style="text-align:justify;"><strong>Mais alors qu&rsquo;est ce qui m&rsquo;a décidé à quitter Twitter ?</strong></p>
<p style="text-align:justify;">Eh bien c&rsquo;est un ensemble de choses, qu&rsquo;il s&rsquo;agisse de la publicité et des contenus sponsorisés, de la censure ou au contraire du manque de réaction de l&rsquo;entreprise face à des tweets répréhensibles. Twitter est devenu un lieu de propagande. Je ne retrouve plus la source mais j&rsquo;ai lu dans un article quelque chose qui me semble très juste : Être sur Twitter, c&rsquo;est comme être à une manifestation, avec son panneau, sa banderole avec ses revendications, sur une place publique entourée de panneaux publicitaires. (la phrase d&rsquo;origine était sûrement mieux tournée que ça). J&rsquo;ai l&rsquo;impression que nous sommes nombreux à avoir cette réflexion, surtout en ce moment. Je vous invite également à lire <a href="https://blog.genma.fr/?Au-revoir-Twitter" target="_blank" rel="noopener noreferrer">l&rsquo;article de Genma</a> sur le sujet.</p>
<p style="text-align:justify;">Je me suis quand même demandé si ça valait le coup, si Mastodon allait rester attractif, si ce n&rsquo;était pas dommage de perdre les quelques 800 followers que j&rsquo;avais sur mon compte Twitter. Et puis au final, à quoi ça sert ? Je ne veux pas faire la course aux likes, aux retweets ou aux abonnés.</p>
<p style="text-align:justify;">Mastodon aura donc été le dernier coup de pouce pour m&rsquo;inciter à tourner la page et fermer mon compte.</p>
<p style="text-align:center;"><strong>Pouet !</strong></p>
<p><a href="https://tkpx.files.wordpress.com/2017/05/https_blueprint-api-production-s3-amazonaws-com_uploads_story_thumbnail_41840_009793fe-1b36-46f0-bb1e-00fd2b89563e.png"><img data-attachment-id="1329" data-permalink="https://tkpx.wordpress.com/2017/05/05/jai-quitte-twitter/https_blueprint-api-production-s3-amazonaws-com_uploads_story_thumbnail_41840_009793fe-1b36-46f0-bb1e-00fd2b89563e/" data-orig-file="https://tkpx.files.wordpress.com/2017/05/https_blueprint-api-production-s3-amazonaws-com_uploads_story_thumbnail_41840_009793fe-1b36-46f0-bb1e-00fd2b89563e.png?w=581&#038;h=327" data-orig-size="950,534" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="https:_blueprint-api-production.s3.amazonaws.com_uploads_story_thumbnail_41840_009793fe-1b36-46f0-bb1e-00fd2b89563e" data-image-description="" data-medium-file="https://tkpx.files.wordpress.com/2017/05/https_blueprint-api-production-s3-amazonaws-com_uploads_story_thumbnail_41840_009793fe-1b36-46f0-bb1e-00fd2b89563e.png?w=581&#038;h=327?w=300" data-large-file="https://tkpx.files.wordpress.com/2017/05/https_blueprint-api-production-s3-amazonaws-com_uploads_story_thumbnail_41840_009793fe-1b36-46f0-bb1e-00fd2b89563e.png?w=581&#038;h=327?w=809" class="wp-image-1329 aligncenter" src="https://tkpx.files.wordpress.com/2017/05/https_blueprint-api-production-s3-amazonaws-com_uploads_story_thumbnail_41840_009793fe-1b36-46f0-bb1e-00fd2b89563e.png?w=581&#038;h=327" alt="" width="581" height="327" srcset="https://tkpx.files.wordpress.com/2017/05/https_blueprint-api-production-s3-amazonaws-com_uploads_story_thumbnail_41840_009793fe-1b36-46f0-bb1e-00fd2b89563e.png?w=581&amp;h=327 581w, https://tkpx.files.wordpress.com/2017/05/https_blueprint-api-production-s3-amazonaws-com_uploads_story_thumbnail_41840_009793fe-1b36-46f0-bb1e-00fd2b89563e.png?w=150&amp;h=84 150w, https://tkpx.files.wordpress.com/2017/05/https_blueprint-api-production-s3-amazonaws-com_uploads_story_thumbnail_41840_009793fe-1b36-46f0-bb1e-00fd2b89563e.png?w=300&amp;h=169 300w, https://tkpx.files.wordpress.com/2017/05/https_blueprint-api-production-s3-amazonaws-com_uploads_story_thumbnail_41840_009793fe-1b36-46f0-bb1e-00fd2b89563e.png?w=768&amp;h=432 768w, https://tkpx.files.wordpress.com/2017/05/https_blueprint-api-production-s3-amazonaws-com_uploads_story_thumbnail_41840_009793fe-1b36-46f0-bb1e-00fd2b89563e.png 950w" sizes="(max-width: 581px) 100vw, 581px"></a></p><br />Classé dans:<a href='https://tkpx.wordpress.com/category/life/'>Life</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tkpx.wordpress.com/1326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tkpx.wordpress.com/1326/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tkpx.wordpress.com/1326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tkpx.wordpress.com/1326/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tkpx.wordpress.com/1326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tkpx.wordpress.com/1326/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tkpx.wordpress.com/1326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tkpx.wordpress.com/1326/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tkpx.wordpress.com/1326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tkpx.wordpress.com/1326/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tkpx.wordpress.com/1326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tkpx.wordpress.com/1326/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tkpx.wordpress.com/1326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tkpx.wordpress.com/1326/" /></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=tkpx.wordpress.com&#038;blog=44759582&#038;post=1326&#038;subd=tkpx&#038;ref=&#038;feed=1" width="1" height="1" /><hr>Depuis un moment déjà (vous l&#8217;avez lu sur mon blog), je me posais la question de Twitter. Faut-il rester ? Pourquoi continuer ? Est-il vraiment &#171;&#160;moins pire&#160;&#187; que les autres services des géants du web ? Plein de questions qui me tournaient dans la tête depuis longtemps. Et puis il y a un peu plus [&#8230;]<img alt="" border="0" src="https://pixel.wp.com/b.gif?host=tkpx.wordpress.com&#038;blog=44759582&#038;post=1326&#038;subd=tkpx&#038;ref=&#038;feed=1" width="1" height="1" />

enclosure_url:
http://tkpx.files.wordpress.com/2017/05/https_blueprint-api-production-s3-amazonaws-com_uploads_story_thumbnail_41840_009793fe-1b36-46f0-bb1e-00fd2b89563e.png


guid: http://tkpx.wordpress.com/?p=1339
title: Aaron Swartz
author: takopix
url: https://tkpx.wordpress.com/2017/05/24/aaron-swartz/
feedurl: https://tkpx.wordpress.com/feed/
enclosure_url: http://1.gravatar.com/avatar/dbd3511cb14376aaddba40db734b3df5?s=96&d=&r=G
content:
<p style="text-align:justify;">Je vous ai parlé de culture libre, de partage de fichiers, de licences, de droit d&rsquo;auteur, des moyens d&rsquo;accès à la connaissance, mais je réalise que je n&rsquo;ai jamais évoqué Aaron Swartz. Je vais réparer cette erreur.<span id="more-1339"></span></p>
<p style="text-align:justify;"><strong>Aaron Hillel Swartz</strong> (né le 8 novembre 1986 à Chicago, mort le 11 janvier 2013 à New York) était un informaticien, écrivain, meneur politique et hacktiviste américain. Il a joué un rôle décisif durant une période d&rsquo;essor de l&rsquo;Internet (1991-2004) aussi bien d&rsquo;un point de vue technique (il a notamment contribué à la création du format RSS et au développement du site communautaire Reddit)  que juridique et politique (il a participé à la mise en place des licences <a href="https://tkpx.wordpress.com/2016/12/03/licence-et-droit-dauteur/">Creative Commons</a> et s&rsquo;est battu contre le projet de loi SOPA). Pour plus de détails, je vous invite à lire <a href="https://fr.wikipedia.org/wiki/Aaron_Swartz" target="_blank" rel="noopener noreferrer">sa page wikipédia</a>.</p>
<p id="title" class="a-size-large a-spacing-none" style="text-align:justify;">Si je vous parle d&rsquo;Aaron Swartz aujourd&rsquo;hui, c&rsquo;est parce que les <a href="http://editions-b42.com/books/celui-qui-pourrait-changer-le-monde/" target="_blank" rel="noopener noreferrer">éditions B42</a> ont sorti en mars dernier un livre rassemblant ses écrits : <em><strong><span id="productTitle" class="a-size-large">&laquo;&nbsp;Celui qui pourrait changer le monde&nbsp;&raquo;. </span></strong></em><span id="productTitle" class="a-size-large">Voilà un livre à ajouter à votre collection !</span><em><span id="productTitle" class="a-size-large"></span><strong><span id="productTitle" class="a-size-large"><br />
</span></strong></em><span id="productTitle" class="a-size-large"></span></p>
<p class="a-size-large a-spacing-none"> Je vous invite également, si ce n&rsquo;est pas déjà fait, à regarder <strong><em>The Internet&rsquo;s Own Boy,</em></strong> le documentaire réalisé par Brian Knappenberger en 2014.</p>
<p style="text-align:center;"><div class="jetpack-video-wrapper"><iframe class='youtube-player' type='text/html' width='809' height='486' src='https://www.youtube.com/embed/7ZBe1VFy0gc?version=3&#038;rel=1&#038;fs=1&#038;autohide=2&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' allowfullscreen='true' style='border:0;'></iframe></div></p>
<p style="text-align:justify;">Si vous souhaitez en apprendre davantage sur ce personnage et son histoire, vous pouvez aussi écouter l&rsquo;émission &laquo;&nbsp;Les nouvelles vagues&nbsp;&raquo; diffusée sur <a href="https://www.franceculture.fr/emissions/les-nouvelles-vagues/regler-nos-dettes-3-ce-que-lon-doit-aaron-swartz" target="_blank" rel="noopener noreferrer">France Culture</a>. Parmi les invités, on retrouve notamment <strong>Flore Vasseur</strong>, réalisatrice du film <em>Meeting Snowden, </em>qui sera diffusé prochainement sur Arte.</p><br />Classé dans:<a href='https://tkpx.wordpress.com/category/cc-drm/'>CC / DRM</a>, <a href='https://tkpx.wordpress.com/category/life/'>Life</a>, <a href='https://tkpx.wordpress.com/category/politics/'>Politics</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tkpx.wordpress.com/1339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tkpx.wordpress.com/1339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tkpx.wordpress.com/1339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tkpx.wordpress.com/1339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tkpx.wordpress.com/1339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tkpx.wordpress.com/1339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tkpx.wordpress.com/1339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tkpx.wordpress.com/1339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tkpx.wordpress.com/1339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tkpx.wordpress.com/1339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tkpx.wordpress.com/1339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tkpx.wordpress.com/1339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tkpx.wordpress.com/1339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tkpx.wordpress.com/1339/" /></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=tkpx.wordpress.com&#038;blog=44759582&#038;post=1339&#038;subd=tkpx&#038;ref=&#038;feed=1" width="1" height="1" /><hr>Je vous ai parlé de culture libre, de partage de fichiers, de licences, de droit d&#8217;auteur, des moyens d&#8217;accès à la connaissance, mais je réalise que je n&#8217;ai jamais évoqué Aaron Swartz. Je vais réparer cette erreur. Aaron Hillel Swartz (né le 8 novembre 1986 à Chicago, mort le 11 janvier 2013 à New York) [&#8230;]<img alt="" border="0" src="https://pixel.wp.com/b.gif?host=tkpx.wordpress.com&#038;blog=44759582&#038;post=1339&#038;subd=tkpx&#038;ref=&#038;feed=1" width="1" height="1" />


guid: http://tkpx.wordpress.com/?p=1352
title: 63e congrès de l’ABF
author: takopix
url: https://tkpx.wordpress.com/2017/05/30/63e-congres-de-labf/
feedurl: https://tkpx.wordpress.com/feed/
enclosure_url: http://tkpx.files.wordpress.com/2016/09/logo_abf1.png
content:
<p style="text-align:justify;">Je vous ai expliqué il y a quelques mois que j&rsquo;avais rejoint la <a href="https://tkpx.wordpress.com/2017/02/09/fablab-et-makerspace-en-bibliotheques/" target="_blank" rel="noopener noreferrer">commission Labenbib</a> de l&rsquo;ABF (association des bibliothécaires de France), espace de sensibilisation à la fabrication numérique personnelle, aux fablab et aux ateliers de créations et de bidouilles. Je serai donc présent sur le stand, avec mes collègues, pendant ce 63e congrès.<span id="more-1352"></span></p>
<p>Le thème de cette année : <em><strong>Bibliothèques : Inégalités territoriales et égalité des chances</strong></em></p>
<p>&laquo;&nbsp;Comment identifier les inégalités territoriales ? Comment y faire face ? Quel est le rôle joué par les bibliothèques dans cette quête de l’égalité ?&nbsp;&raquo;</p>
<p>Cela se passe du <span style="color:#ff0000;">15 au 17 juin 2017</span> à Paris / Porte de Versailles Hall 5.</p>
<p>Pendant le congrès, la commission Labenbib propose 4 ateliers sur 3 séances : jeudi 14h30 et vendredi à 9h et à 14h30.</p>
<ul>
<li>ATELIER FABRICATION NUMÉRIQUE : Mise à disposition de machines à commande numérique (imprimante 3D, découpeuse vinyle&#8230;) pour prototype rapide.</li>
<li>ATELIER PROGRAMMATION/ÉLECTRONIQUE : Mise à disposition de composants et de cartes de programmation, pour la réalisation de prototypes.</li>
<li>ATELIER AUDIO/VIDÉO : Utilisation d’un fond vert, montage vidéo, enregistrement de voix: pour des supports de promotion/documentation mais également pour alimenter certains dispositifs.</li>
<li>ATELIER DÉMOS : Machine à lire, à poème, Box Gaming&#8230;</li>
</ul>
<p style="text-align:justify;">
<p><a href="http://www.abf.asso.fr/" target="_blank" rel="noopener noreferrer"><img data-attachment-id="358" data-permalink="https://tkpx.wordpress.com/2017/02/09/fablab-et-makerspace-en-bibliotheques/logo_abf-2/" data-orig-file="https://tkpx.files.wordpress.com/2016/09/logo_abf1.png?w=316&#038;h=125" data-orig-size="230,91" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="logo_abf" data-image-description="" data-medium-file="https://tkpx.files.wordpress.com/2016/09/logo_abf1.png?w=316&#038;h=125?w=230" data-large-file="https://tkpx.files.wordpress.com/2016/09/logo_abf1.png?w=316&#038;h=125?w=230" class=" wp-image-358 aligncenter" src="https://tkpx.files.wordpress.com/2016/09/logo_abf1.png?w=316&#038;h=125" alt="" width="316" height="125" srcset="https://tkpx.files.wordpress.com/2016/09/logo_abf1.png 230w, https://tkpx.files.wordpress.com/2016/09/logo_abf1.png?w=150&amp;h=59 150w" sizes="(max-width: 316px) 100vw, 316px" /></a></p><br />Classé dans:<a href='https://tkpx.wordpress.com/category/life/'>Life</a>, <a href='https://tkpx.wordpress.com/category/maker-diy/'>Maker / DIY</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tkpx.wordpress.com/1352/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tkpx.wordpress.com/1352/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tkpx.wordpress.com/1352/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tkpx.wordpress.com/1352/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tkpx.wordpress.com/1352/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tkpx.wordpress.com/1352/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tkpx.wordpress.com/1352/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tkpx.wordpress.com/1352/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tkpx.wordpress.com/1352/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tkpx.wordpress.com/1352/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tkpx.wordpress.com/1352/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tkpx.wordpress.com/1352/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tkpx.wordpress.com/1352/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tkpx.wordpress.com/1352/" /></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=tkpx.wordpress.com&#038;blog=44759582&#038;post=1352&#038;subd=tkpx&#038;ref=&#038;feed=1" width="1" height="1" /><hr>Je vous ai expliqué il y a quelques mois que j&#8217;avais rejoint la commission Labenbib de l&#8217;ABF (association des bibliothécaires de France), espace de sensibilisation à la fabrication numérique personnelle, aux fablab et aux ateliers de créations et de bidouilles. Je serai donc présent sur le stand, avec mes collègues, pendant ce 63e congrès. Le [&#8230;]<img alt="" border="0" src="https://pixel.wp.com/b.gif?host=tkpx.wordpress.com&#038;blog=44759582&#038;post=1352&#038;subd=tkpx&#038;ref=&#038;feed=1" width="1" height="1" />


guid: http://tkpx.wordpress.com/?p=1358
title: Petit bilan de parcours
author: takopix
url: https://tkpx.wordpress.com/2017/06/06/petit-bilan-de-parcours/
feedurl: https://tkpx.wordpress.com/feed/
enclosure_url: http://tkpx.files.wordpress.com/2017/06/logo-gnupg-light-purple-bg.png
content:
<p style="text-align:justify;">Voilà maintenant 9 mois que j&rsquo;ai démarré ce blog. J&rsquo;avais fait un état des lieux de mon évolution il y a quelque temps mais des petites choses ont encore changé et je dois mettre à jour tout ça.</p>
<p><span id="more-1358"></span></p>
<ul>
<li>Système d&rsquo;exploitation : Manjaro sur l&rsquo;ordinateur / Lineage Os sur le téléphone</li>
<li>Navigateur internet : Mozilla Firefox (+ https everythere, Calomel SSL, Decentraleyes, Privacy Badger, uBlock Origin, Disable WebRTC, Random Agent Spoofer)</li>
<li>Moteur de recherche : Qwant</li>
<li>VPN : Private Internet Access / FAImaison (brique)</li>
<li>Logiciel de gestion d&#8217;email : Thunderbird (+ enigmail) sur l&rsquo;ordinateur / K-9&nbsp; (+ openkeychain) sur le téléphone</li>
<li>Synchronisation de mes fichiers : Nextcloud (brique + disroot)</li>
<li>Logiciel de discussions : Gajim et Conversation pour XMPP / Telegram / Silence (sms)</li>
</ul>
<p style="text-align:justify;"><a href="https://tkpx.files.wordpress.com/2017/06/3802c26758c6fad5.png"><img data-attachment-id="1359" data-permalink="https://tkpx.wordpress.com/2017/06/06/petit-bilan-de-parcours/3802c26758c6fad5/" data-orig-file="https://tkpx.files.wordpress.com/2017/06/3802c26758c6fad5.png?w=217&#038;h=209" data-orig-size="755,727" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="3802c26758c6fad5" data-image-description="" data-medium-file="https://tkpx.files.wordpress.com/2017/06/3802c26758c6fad5.png?w=217&#038;h=209?w=300" data-large-file="https://tkpx.files.wordpress.com/2017/06/3802c26758c6fad5.png?w=217&#038;h=209?w=755" class="wp-image-1359 alignleft" src="https://tkpx.files.wordpress.com/2017/06/3802c26758c6fad5.png?w=217&#038;h=209" alt="" width="217" height="209" srcset="https://tkpx.files.wordpress.com/2017/06/3802c26758c6fad5.png?w=217&amp;h=209 217w, https://tkpx.files.wordpress.com/2017/06/3802c26758c6fad5.png?w=434&amp;h=418 434w, https://tkpx.files.wordpress.com/2017/06/3802c26758c6fad5.png?w=150&amp;h=144 150w, https://tkpx.files.wordpress.com/2017/06/3802c26758c6fad5.png?w=300&amp;h=289 300w" sizes="(max-width: 217px) 100vw, 217px"></a>En plus de ces quelques ajustements logiciels, j&rsquo;ai continué de réduire mon empreinte numérique notamment en supprimant mon compte Twitter &#8211; j&rsquo;en ai parlé longuement dans un <a href="https://tkpx.wordpress.com/2017/05/05/jai-quitte-twitter/" target="_blank" rel="noopener">précédent article</a>. Comme cela fait plus d&rsquo;un mois, ce dernier n&rsquo;est plus ré activable.</p>
<p style="text-align:justify;">J&rsquo;ai trouvé en <a href="https://tkpx.wordpress.com/2017/04/01/mastodon-social/" target="_blank" rel="noopener">Mastodon</a> le réseau social qui me convient le mieux. Et en plus de ça, j&rsquo;ai eu la chance de tomber sur le POUET (ou TOOT) qui a eu un impact important dans ma carrière professionnelle &#8211; ce qui fera l&rsquo;objet d&rsquo;un futur article. En effet, nous ne sommes &laquo;&nbsp;que&nbsp;&raquo; 700 000 sur Mastodon, mais cela permet d&rsquo;avoir accès plus facilement aux informations (pour peu qu&rsquo;on suive les bonnes personnes) et les interactions entre les utilisateurs sont bien plus efficaces et humaines/sincères qu&rsquo;un simple retweet comme on pouvait le faire avant.</p>
<hr>
<p>Et puis j&rsquo;en profite pour parler d&rsquo;autre chose !</p>
<p>Vous savez sûrement que je fais des dons réguliers aux associations qui défendent la vie privée (sur internet) et le libre en général. Ce mois-ci, j&rsquo;ai choisi <a href="https://www.gnupg.org/donate/index.fr.html" target="_blank" rel="noopener">GnuPG</a>.</p>
<p style="text-align:justify;">GnuPG (ou GPG, de l&rsquo;anglais <i><span class="lang-en" lang="en">GNU Privacy Guard</span></i>) est l&rsquo;implémentation GNU du standard OpenPGP, logiciel permet la transmission de messages électroniques signés et chiffrés, garantissant ainsi leur authenticité, intégrité et confidentialité. En gros, si vous envoyez des mails chiffrés via <strong>Enigmail</strong>, alors vous utilisez GnuPG. Si vous êtes contents de pouvoir chiffrer vos mails et préserver ainsi votre vie privée, vous devriez aider les développeurs à maintenir le logiciel à jour et à implémenter de nouvelles fonctions.</p>
<p><a href="https://www.gnupg.org/donate/index.fr.html" target="_blank" rel="noopener"><img data-attachment-id="1362" data-permalink="https://tkpx.wordpress.com/2017/06/06/petit-bilan-de-parcours/logo-gnupg-light-purple-bg/" data-orig-file="https://tkpx.files.wordpress.com/2017/06/logo-gnupg-light-purple-bg.png?w=809" data-orig-size="356,120" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="logo-gnupg-light-purple-bg" data-image-description="" data-medium-file="https://tkpx.files.wordpress.com/2017/06/logo-gnupg-light-purple-bg.png?w=809?w=300" data-large-file="https://tkpx.files.wordpress.com/2017/06/logo-gnupg-light-purple-bg.png?w=809?w=356" class="size-full wp-image-1362 aligncenter" src="https://tkpx.files.wordpress.com/2017/06/logo-gnupg-light-purple-bg.png?w=809" alt="" srcset="https://tkpx.files.wordpress.com/2017/06/logo-gnupg-light-purple-bg.png 356w, https://tkpx.files.wordpress.com/2017/06/logo-gnupg-light-purple-bg.png?w=150 150w, https://tkpx.files.wordpress.com/2017/06/logo-gnupg-light-purple-bg.png?w=300 300w" sizes="(max-width: 356px) 100vw, 356px"  ></a></p><br />Classé dans:<a href='https://tkpx.wordpress.com/category/free-software/'>Free Software</a>, <a href='https://tkpx.wordpress.com/category/life/'>Life</a>, <a href='https://tkpx.wordpress.com/category/privacy/'>Privacy</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tkpx.wordpress.com/1358/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tkpx.wordpress.com/1358/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tkpx.wordpress.com/1358/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tkpx.wordpress.com/1358/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tkpx.wordpress.com/1358/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tkpx.wordpress.com/1358/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tkpx.wordpress.com/1358/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tkpx.wordpress.com/1358/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tkpx.wordpress.com/1358/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tkpx.wordpress.com/1358/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tkpx.wordpress.com/1358/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tkpx.wordpress.com/1358/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tkpx.wordpress.com/1358/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tkpx.wordpress.com/1358/" /></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=tkpx.wordpress.com&#038;blog=44759582&#038;post=1358&#038;subd=tkpx&#038;ref=&#038;feed=1" width="1" height="1" /><hr>Voilà maintenant 9 mois que j&#8217;ai démarré ce blog. J&#8217;avais fait un état des lieux de mon évolution il y a quelque temps mais des petites choses ont encore changé et je dois mettre à jour tout ça. Système d&#8217;exploitation : Manjaro sur l&#8217;ordinateur / Lineage Os sur le téléphone Navigateur internet : Mozilla Firefox [&#8230;]<img alt="" border="0" src="https://pixel.wp.com/b.gif?host=tkpx.wordpress.com&#038;blog=44759582&#038;post=1358&#038;subd=tkpx&#038;ref=&#038;feed=1" width="1" height="1" />


guid: http://tkpx.wordpress.com/?p=1376
title: Grammalecte sur Ulule
author: takopix
url: https://tkpx.wordpress.com/2017/06/12/ulule/
feedurl: https://tkpx.wordpress.com/feed/
enclosure_url: http://tkpx.files.wordpress.com/2017/06/logo280.png
content:
<p style="text-align:justify;">Je refais un point rapide sur Ulule, un site web de financement participatif créé en 2010. Depuis son lancement, Ulule a permis le financement de plusieurs milliers de projets dans des domaines très variés, de l&rsquo;audiovisuel à la création musicale en passant par le patrimoine, la solidarité ou l&rsquo;entrepreneuriat. <span id="more-1376"></span><img data-attachment-id="65" data-permalink="https://tkpx.wordpress.com/2016/09/04/financements-participatifs-et-dons/ulule_logo/" data-orig-file="https://tkpx.files.wordpress.com/2016/09/ulule_logo.gif?w=153&#038;h=153" data-orig-size="500,500" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Ulule_logo" data-image-description="" data-medium-file="https://tkpx.files.wordpress.com/2016/09/ulule_logo.gif?w=153&#038;h=153?w=300" data-large-file="https://tkpx.files.wordpress.com/2016/09/ulule_logo.gif?w=153&#038;h=153?w=500" class=" wp-image-65 aligncenter" src="https://tkpx.files.wordpress.com/2016/09/ulule_logo.gif?w=153&#038;h=153" alt="" width="153" height="153" />Je fais partie des 50 000 premiers inscrits sur la plate-forme et j&rsquo;ai récemment obtenu le statut &laquo;&nbsp;Ambassadeurs&nbsp;&raquo; (et reçu des goodies bien sympas). J&rsquo;ai à ce jour soutenu <a href="https://fr.ulule.com/takopix/" target="_blank" rel="noopener">34 projets</a> via leur site, pour la plupart en rapport avec le jeu vidéo, le cinéma ou la littérature.</p>
<p style="text-align:justify;">J&rsquo;ai déjà expliqué que je voulais ralentir la cadence sur le financement participatif mais certains projets sortent néanmoins du lot. J&rsquo;ai donc soutenu le projet <a href="https://fr.ulule.com/grammalecte-2/" target="_blank" rel="noopener">Grammalecte</a>. Comme son nom l&rsquo;indique, il s&rsquo;agit d&rsquo;un correcteur grammatical <em>open source</em> pour Firefox, Thunderbird et LibreOffice. Il possède de nombreuses fonctionnalités intéressantes. Grammalecte essaie d’apporter une aide à l’écriture du français sans parasiter l’attention des utilisateurs avec de fausses alertes.</p>
<p style="text-align:justify;">J&rsquo;ai la chance d&rsquo;avoir des lecteurs (dont une lectrice en particulier) qui m&rsquo;aident à corriger mes textes. Mais c&rsquo;est loin d&rsquo;être le cas pour tout le monde. C&rsquo;est donc le genre d&rsquo;initiative qui doit être soutenu.</p>
<p><a href="https://www.dicollecte.org/grammalecte/" target="_blank" rel="noopener"><img data-attachment-id="1375" data-permalink="https://tkpx.wordpress.com/2017/06/12/meeting-snowden/logo280/" data-orig-file="https://tkpx.files.wordpress.com/2017/06/logo280.png?w=113&#038;h=113" data-orig-size="280,280" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="logo280" data-image-description="" data-medium-file="https://tkpx.files.wordpress.com/2017/06/logo280.png?w=113&#038;h=113?w=280" data-large-file="https://tkpx.files.wordpress.com/2017/06/logo280.png?w=113&#038;h=113?w=280" class="wp-image-1375 aligncenter" src="https://tkpx.files.wordpress.com/2017/06/logo280.png?w=113&#038;h=113" alt="" width="113" height="113" srcset="https://tkpx.files.wordpress.com/2017/06/logo280.png?w=113&amp;h=113 113w, https://tkpx.files.wordpress.com/2017/06/logo280.png?w=226&amp;h=226 226w, https://tkpx.files.wordpress.com/2017/06/logo280.png?w=150&amp;h=150 150w" sizes="(max-width: 113px) 100vw, 113px" /></a></p><br />Classé dans:<a href='https://tkpx.wordpress.com/category/crowdfunding/'>Crowdfunding</a>, <a href='https://tkpx.wordpress.com/category/life/'>Life</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tkpx.wordpress.com/1376/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tkpx.wordpress.com/1376/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tkpx.wordpress.com/1376/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tkpx.wordpress.com/1376/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tkpx.wordpress.com/1376/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tkpx.wordpress.com/1376/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tkpx.wordpress.com/1376/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tkpx.wordpress.com/1376/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tkpx.wordpress.com/1376/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tkpx.wordpress.com/1376/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tkpx.wordpress.com/1376/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tkpx.wordpress.com/1376/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tkpx.wordpress.com/1376/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tkpx.wordpress.com/1376/" /></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=tkpx.wordpress.com&#038;blog=44759582&#038;post=1376&#038;subd=tkpx&#038;ref=&#038;feed=1" width="1" height="1" /><hr>Je refais un point rapide sur Ulule, un site web de financement participatif créé en 2010. Depuis son lancement, Ulule a permis le financement de plusieurs milliers de projets dans des domaines très variés, de l&#8217;audiovisuel à la création musicale en passant par le patrimoine, la solidarité ou l&#8217;entrepreneuriat. Je fais partie des 50 000 premiers [&#8230;]<img alt="" border="0" src="https://pixel.wp.com/b.gif?host=tkpx.wordpress.com&#038;blog=44759582&#038;post=1376&#038;subd=tkpx&#038;ref=&#038;feed=1" width="1" height="1" />


guid: http://tkpx.wordpress.com/?p=1121
title: Meeting Snowden
author: takopix
url: https://tkpx.wordpress.com/2017/06/12/meeting-snowden/
feedurl: https://tkpx.wordpress.com/feed/
enclosure_url: http://1.gravatar.com/avatar/dbd3511cb14376aaddba40db734b3df5?s=96&d=&r=G
content:
<p style="text-align:justify;">&laquo;&nbsp;Le temps d&rsquo;une rencontre inédite, Edward Snowden, Lawrence Lassig et Birgitta Jónsdóttir, figures de la lutte pour les libertés, s&rsquo;interrogent sur l&rsquo;avenir de la démocratie.&nbsp;&raquo;<span id="more-1121"></span></p>
<p style="text-align:justify;">&laquo;&nbsp;Figures de proue d&rsquo;un mouvement mondial de défense des libertés, ces trois compagnons de lutte, qui s&rsquo;estiment et s&rsquo;entraident à distance sur Internet, se sont rencontrés pour la première fois en secret à Moscou, à la veille de Noël. Ils ont autorisé les caméras de Flore Vasseur à capter cette conversation hors norme, au fil de laquelle émergent des questionnements essentiels : comment sauver la démocratie ? Qu&rsquo;est-ce que l&rsquo;échec ? Qui écrit l&rsquo;histoire ?&nbsp;&raquo;</p>
<p style="text-align:center;"><div class="jetpack-video-wrapper"><iframe class='youtube-player' type='text/html' width='809' height='486' src='https://www.youtube.com/embed/X41LxKbS9K0?version=3&#038;rel=1&#038;fs=1&#038;autohide=2&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' allowfullscreen='true' style='border:0;'></iframe></div></p>
<p>La version complète est disponible gratuitement sur le site d&rsquo;<a href="http://www.arte.tv/fr/videos/072258-000-A/square-idee-meeting-snowden" target="_blank" rel="noopener">Arte</a> jusqu&rsquo;à la mi-juillet.</p>
<p style="text-align:justify;">Je pense que ce documentaire est d&rsquo;intérêt général et qu&rsquo;il devrait être diffusé dans les écoles &#8211; et que globalement tout le monde devrait s’intéresser à ces sujets. Et je trouve qu&rsquo;il a une double raisonnance ; comme expliqué dans le documentaire, il a été tourné juste avant l&rsquo;investiture de Donald Trump aux États-Unis, et il sort en France la veille du premier tour des élections législatives (qui enregistre un taux d’abstention record).</p>
<p style="text-align:justify;">Et il y a quelques jours, plusieurs organisations (Human Rights Watch, Amnesty International, la Quadrature du Net, le Syndicat de la Magistrature, etc) ont pris position contre l&rsquo;avant-projet de loi destiné à renforcer la lutte contre le terrorisme et la sécurité intérieure, qui consiste à introduire dans le droit commun les dispositions exceptionnelles de l&rsquo;état d&rsquo;urgence. (je vous invite à lire l&rsquo;<a href="http://www.numerama.com/politique/265565-etat-durgence-levee-de-boucliers-chez-les-organisations-de-defense-des-droits.html" target="_blank" rel="noopener">article complet de Numerama</a> sur le sujet).</p>
<p style="text-align:justify;">Vous ne serez pas étonnés si je vous disais que de nombreuses lois (en rapport avec la protection de la vie privée, ou le droit d&rsquo;auteur par exemple) sont d&rsquo;une part obsolètes, et d&rsquo;autre part constamment attaquées et affaiblies par des &laquo;&nbsp;mesures d&rsquo;urgence&nbsp;&raquo; ou par la pression des lobbies. Et que par dessus tout ça, les citoyens n&rsquo;ont pas forcément le pouvoir pour changer les choses. Tout simplement car notre système actuel ne fonctionne pas/plus. Et il s&rsquo;agit là d&rsquo;une réflexion que j&rsquo;ai depuis que je suis petit, depuis les premiers cours d&rsquo;histoire et d&rsquo;éducation civique.</p>
<p>Dans le documentaire <em>Meeting Snowden</em>, il y a une phrase tout particulière qui m&rsquo;a marqué :</p>
<blockquote><p><strong> &laquo;&nbsp;Aujourd&rsquo;hui, en n&rsquo;autorisant pas l&rsquo;échec, nous n&rsquo;autorisons pas le progrès&nbsp;&raquo; </strong></p>
<p>E. Snowden</p></blockquote>
<p style="text-align:justify;">Cela peut s&rsquo;appliquer à la politique et à la façon de diriger un pays, mais évidemment à de nombreux autres domaines. Je serais même tenté de dire qu&rsquo;il faut appliquer cette doctrine dans son travail, à l&rsquo;école (on peut penser à la pédagogie Montessori), dans sa vie personnelle, partout.</p>
<p style="text-align:justify;">Et chose assez amusante ; si vous avez lu mes précédents articles, vous savez que je vais prochainement changer de travail. Pour être un peu plus précis, je vais travailler dans un fablab. Dans ces lieux de fabrications (hackerspace, makerspace, fablab, etc&#8230;), on apprend par l’échec, on essaie, on expérimente, on s&rsquo;appuie sur les connaissances des autres, et au final on progresse.</p>
<p>En plus de ce documentaire, je vous invite à regarder les récentes interventions et interviews de <a href="http://florevasseur.com/" target="_blank" rel="noopener">Flore Vasseur</a>, notamment <a href="http://www.agoravox.tv/tribune-libre/article/meeting-snowden-sur-arte-le-10-73601" target="_blank" rel="noopener">ici,</a> <a href="https://www.youtube.com/watch?v=9Z7RtpG7lhE" target="_blank" rel="noopener">ici</a> ou encore <a href="https://www.youtube.com/watch?v=Hqm0gyHx1cs" target="_blank" rel="noopener">là</a>.</p><br />Classé dans:<a href='https://tkpx.wordpress.com/category/life/'>Life</a>, <a href='https://tkpx.wordpress.com/category/politics/'>Politics</a>, <a href='https://tkpx.wordpress.com/category/privacy/'>Privacy</a>, <a href='https://tkpx.wordpress.com/category/security/'>Security</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tkpx.wordpress.com/1121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tkpx.wordpress.com/1121/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tkpx.wordpress.com/1121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tkpx.wordpress.com/1121/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tkpx.wordpress.com/1121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tkpx.wordpress.com/1121/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tkpx.wordpress.com/1121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tkpx.wordpress.com/1121/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tkpx.wordpress.com/1121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tkpx.wordpress.com/1121/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tkpx.wordpress.com/1121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tkpx.wordpress.com/1121/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tkpx.wordpress.com/1121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tkpx.wordpress.com/1121/" /></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=tkpx.wordpress.com&#038;blog=44759582&#038;post=1121&#038;subd=tkpx&#038;ref=&#038;feed=1" width="1" height="1" /><hr>&#171;&#160;Le temps d&#8217;une rencontre inédite, Edward Snowden, Lawrence Lassig et Birgitta Jónsdóttir, figures de la lutte pour les libertés, s&#8217;interrogent sur l&#8217;avenir de la démocratie.&#160;&#187; &#171;&#160;Figures de proue d&#8217;un mouvement mondial de défense des libertés, ces trois compagnons de lutte, qui s&#8217;estiment et s&#8217;entraident à distance sur Internet, se sont rencontrés pour la première fois [&#8230;]<img alt="" border="0" src="https://pixel.wp.com/b.gif?host=tkpx.wordpress.com&#038;blog=44759582&#038;post=1121&#038;subd=tkpx&#038;ref=&#038;feed=1" width="1" height="1" />


guid: http://tkpx.wordpress.com/?p=1391
title: Des cartes, des cartes, oui mais d’OpenStreetMap
author: takopix
url: https://tkpx.wordpress.com/2017/06/26/des-cartes-des-cartes-oui-mais-dopenstreetmap/
feedurl: https://tkpx.wordpress.com/feed/
enclosure_url: http://tkpx.files.wordpress.com/2017/06/jb.png
content:
<p style="text-align:justify;">Vous connaissez OpenStreetMap ? Vous savez, ce projet international qui a pour but de créer une carte libre du monde. Et bien il existe pléthore de projets et d&rsquo;applications qui utilisent ses cartes et qui y contribuent.<span id="more-1391"></span></p>
<p style="text-align:justify;">Il est bon de rappeler que cet outil est né parce que la plupart des cartes que vous pensez libres ont des restrictions légales ou techniques qui nous empêchent de les utiliser de façon créative, productive ou innovante.</p>
<p style="text-align:justify;">OpenStreetMap est un ensemble de <i>données ouvertes (open data)</i>, disponibles sous licence libre <a href="http://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database License</a> (ODbL). Vous êtes donc libre de copier, distribuer, transmettre et adapter les données, à condition que vous créditiez, OpenStreetMap et ses contributeurs.</p>
<p>&nbsp;</p>
<p>Voilà donc quelques applications que j&rsquo;utilise:</p>
<p><strong>MAPS.ME</strong></p>
<p><a href="https://tkpx.files.wordpress.com/2017/06/mapsme.png"><img data-attachment-id="1395" data-permalink="https://tkpx.wordpress.com/2017/06/26/des-cartes-des-cartes-oui-mais-dopenstreetmap/mapsme/" data-orig-file="https://tkpx.files.wordpress.com/2017/06/mapsme.png?w=126&#038;h=126" data-orig-size="300,300" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="mapsme" data-image-description="" data-medium-file="https://tkpx.files.wordpress.com/2017/06/mapsme.png?w=126&#038;h=126?w=300" data-large-file="https://tkpx.files.wordpress.com/2017/06/mapsme.png?w=126&#038;h=126?w=300" class="wp-image-1395 alignleft" src="https://tkpx.files.wordpress.com/2017/06/mapsme.png?w=126&#038;h=126" alt="" width="126" height="126" srcset="https://tkpx.files.wordpress.com/2017/06/mapsme.png?w=126&amp;h=126 126w, https://tkpx.files.wordpress.com/2017/06/mapsme.png?w=252&amp;h=252 252w, https://tkpx.files.wordpress.com/2017/06/mapsme.png?w=150&amp;h=150 150w" sizes="(max-width: 126px) 100vw, 126px" /></a>J&rsquo;utilise <a href="https://maps.me/en/home" target="_blank" rel="noopener">MAPS.ME</a> à place de Google Maps depuis que j&rsquo;ai arrêté d&rsquo;utiliser les services et applications de Google. L&rsquo;application fonctionne dans 345 pays, y compris les îles, et s&rsquo;appuie sur les cartes très détaillées et précises qui proviennent de <a class="wp-links-icon" href="http://openstreetmap.fr/" target="_blank" rel="external nofollow noopener">OpenStreetMap.</a></p>
<p style="text-align:justify;">On peut utiliser l&rsquo;application en mode hors ligne (idéal lorsqu&rsquo;on se trouve à l&rsquo;étranger) à partir du moment où l&rsquo;appareil est équipé d&rsquo;un système GPS. On y trouve les nombreux points d’intérêts proches de votre position : restaurants, musées, stations-services, distributeurs de billets, bouches de métro, etc.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>OpenStreetCam</strong></p>
<p style="text-align:justify;"><a href="https://tkpx.files.wordpress.com/2017/06/200px-openstreetview-logo-camera.png"><img data-attachment-id="1396" data-permalink="https://tkpx.wordpress.com/2017/06/26/des-cartes-des-cartes-oui-mais-dopenstreetmap/200px-openstreetview-logo-camera/" data-orig-file="https://tkpx.files.wordpress.com/2017/06/200px-openstreetview-logo-camera.png?w=115&#038;h=115" data-orig-size="200,200" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="200px-Openstreetview-logo-camera" data-image-description="" data-medium-file="https://tkpx.files.wordpress.com/2017/06/200px-openstreetview-logo-camera.png?w=115&#038;h=115?w=200" data-large-file="https://tkpx.files.wordpress.com/2017/06/200px-openstreetview-logo-camera.png?w=115&#038;h=115?w=200" class="wp-image-1396 alignleft" src="https://tkpx.files.wordpress.com/2017/06/200px-openstreetview-logo-camera.png?w=115&#038;h=115" alt="" width="115" height="115" srcset="https://tkpx.files.wordpress.com/2017/06/200px-openstreetview-logo-camera.png?w=115&amp;h=115 115w, https://tkpx.files.wordpress.com/2017/06/200px-openstreetview-logo-camera.png?w=150&amp;h=150 150w, https://tkpx.files.wordpress.com/2017/06/200px-openstreetview-logo-camera.png 200w" sizes="(max-width: 115px) 100vw, 115px" /></a>L&rsquo;application <a href="https://www.openstreetcam.org/map/" target="_blank" rel="noopener">OpenStreetCam</a> est une plateforme pour collecter et rendre disponibles des images des voies de circulation. L’application est optimisée pour la conduite automobile, mais peut également être utilisée à vélo et à pied. Avec cette application, vous pouvez donc contribuer et fournir des images afin de compléter la carte (façon GoogleStreetView).</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>StreetComplete</strong></p>
<p style="text-align:justify;"><a href="https://tkpx.files.wordpress.com/2017/06/streetcompletelogo.png"><img data-attachment-id="1397" data-permalink="https://tkpx.wordpress.com/2017/06/26/des-cartes-des-cartes-oui-mais-dopenstreetmap/streetcompletelogo/" data-orig-file="https://tkpx.files.wordpress.com/2017/06/streetcompletelogo.png?w=114&#038;h=114" data-orig-size="300,300" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="StreetCompleteLogo" data-image-description="" data-medium-file="https://tkpx.files.wordpress.com/2017/06/streetcompletelogo.png?w=114&#038;h=114?w=300" data-large-file="https://tkpx.files.wordpress.com/2017/06/streetcompletelogo.png?w=114&#038;h=114?w=300" class="wp-image-1397 alignleft" src="https://tkpx.files.wordpress.com/2017/06/streetcompletelogo.png?w=114&#038;h=114" alt="" width="114" height="114" srcset="https://tkpx.files.wordpress.com/2017/06/streetcompletelogo.png?w=114&amp;h=114 114w, https://tkpx.files.wordpress.com/2017/06/streetcompletelogo.png?w=228&amp;h=228 228w, https://tkpx.files.wordpress.com/2017/06/streetcompletelogo.png?w=150&amp;h=150 150w" sizes="(max-width: 114px) 100vw, 114px" /></a>Vous êtes fan de PokemonGo ? Eh bien <a href="https://github.com/westnordost/StreetComplete" target="_blank" rel="noopener">StreetComplete</a> vous permet de contribuer au projet OpenStreetMap en effectuant des &laquo;&nbsp;quêtes&nbsp;&raquo;. Vous pourrez ainsi renseigner le nom de rue/voie, le type de revêtement de la voie, les horaires des commerces et lieux autour de vous, etc. Vos contributions seront directement transmises à <a href="https://framalibre.org/content/openstreetmap">OpenStreetMap</a> à condition que vous ayez un compte.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Pour aller plus loin, vous pouvez aussi parcourir le <a href="https://framablog.org/tag/openstreetmap/" target="_blank" rel="noopener">framablog dédié à OpenStreetMap</a>.</p>
<p>&nbsp;</p>
<p>Et puis il y a le projet <a href="https://junglebus.io/" target="_blank" rel="noopener">Jungle Bus</a> qui est actuellement en recherche de financement via la plate-forme Ulule.</p>
<p style="text-align:justify;">Les transports sont bien souvent gérés par des entreprises privées (Ratp, Sncf, Ouibus, Phebus, Traverciel etc&#8230;) qui ont chacune leur propre carte. Mais il n&rsquo;existe pas d&rsquo;outil regroupant toutes ces informations en un seul endroit. C&rsquo;est l&rsquo;un des objectifs de Jungle Bus.</p>
<p style="text-align:justify;">Les outils produits par Jungle Bus permettront à une équipe réduite de collecter, vérifier et partager les données de transport en commun à l’échelle d’une ville. L&rsquo;application est disponible en version bêta si vous souhaitez commencer à contribuer. Je vous invite aussi à <a href="https://fr.ulule.com/jungle-bus/" target="_blank" rel="noopener">soutenir le projet</a> et à regarder l&rsquo;<a href="https://www.youtube.com/watch?v=OdTnsOi3PZM" target="_blank" rel="noopener">émission 56Kast</a> qui en parle.</p>
<p>&nbsp;</p>
<blockquote>
<p style="text-align:center;"><strong>&laquo;&nbsp;Plus de 60% de villes dans le monde ne disposent pas de plan de transport public&nbsp;&raquo;</strong></p>
</blockquote>
<p>&nbsp;</p>
<p><a href="https://fr.ulule.com/jungle-bus/" target="_blank" rel="noopener"><img data-attachment-id="1392" data-permalink="https://tkpx.wordpress.com/2017/06/26/des-cartes-des-cartes-oui-mais-dopenstreetmap/jb/" data-orig-file="https://tkpx.files.wordpress.com/2017/06/jb.png?w=196&#038;h=196" data-orig-size="300,300" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="jb" data-image-description="" data-medium-file="https://tkpx.files.wordpress.com/2017/06/jb.png?w=196&#038;h=196?w=300" data-large-file="https://tkpx.files.wordpress.com/2017/06/jb.png?w=196&#038;h=196?w=300" class="wp-image-1392 aligncenter" src="https://tkpx.files.wordpress.com/2017/06/jb.png?w=196&#038;h=196" alt="" width="196" height="196" srcset="https://tkpx.files.wordpress.com/2017/06/jb.png?w=196&amp;h=196 196w, https://tkpx.files.wordpress.com/2017/06/jb.png?w=150&amp;h=150 150w, https://tkpx.files.wordpress.com/2017/06/jb.png 300w" sizes="(max-width: 196px) 100vw, 196px" /></a></p><br />Classé dans:<a href='https://tkpx.wordpress.com/category/cc-drm/'>CC / DRM</a>, <a href='https://tkpx.wordpress.com/category/crowdfunding/'>Crowdfunding</a>, <a href='https://tkpx.wordpress.com/category/free-software/'>Free Software</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tkpx.wordpress.com/1391/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tkpx.wordpress.com/1391/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tkpx.wordpress.com/1391/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tkpx.wordpress.com/1391/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tkpx.wordpress.com/1391/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tkpx.wordpress.com/1391/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tkpx.wordpress.com/1391/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tkpx.wordpress.com/1391/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tkpx.wordpress.com/1391/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tkpx.wordpress.com/1391/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tkpx.wordpress.com/1391/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tkpx.wordpress.com/1391/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tkpx.wordpress.com/1391/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tkpx.wordpress.com/1391/" /></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=tkpx.wordpress.com&#038;blog=44759582&#038;post=1391&#038;subd=tkpx&#038;ref=&#038;feed=1" width="1" height="1" /><hr>Vous connaissez OpenStreetMap ? Vous savez, ce projet international qui a pour but de créer une carte libre du monde. Et bien il existe pléthore de projets et d&#8217;applications qui utilisent ses cartes et qui y contribuent. Il est bon de rappeler que cet outil est né parce que la plupart des cartes que vous [&#8230;]<img alt="" border="0" src="https://pixel.wp.com/b.gif?host=tkpx.wordpress.com&#038;blog=44759582&#038;post=1391&#038;subd=tkpx&#038;ref=&#038;feed=1" width="1" height="1" />


guid: http://tkpx.wordpress.com/?p=1373
title: Projet Arcadie
author: takopix
url: https://tkpx.wordpress.com/2017/07/07/projet-arcadie/
feedurl: https://tkpx.wordpress.com/feed/
enclosure_url: http://tkpx.files.wordpress.com/2017/07/logo_0.png
content:
<p style="text-align:justify;">Pour changer, je ne vais pas parler de logiciels libres ou d&rsquo;informatique mais plutôt de POLITIQUE. Enfin, je vais surtout vous présenter rapidement <a href="https://projetarcadie.com" target="_blank" rel="noopener">le Projet Arcadie</a>. Il s&rsquo;agit d&rsquo;une plateforme de cartographie et de centralisation des informations concernant les députés et les sénateurs français. Le but est de permettre à tout le monde d&rsquo;avoir accès à un ensemble d&rsquo;informations de façon neutre et modulaire.<span id="more-1373"></span></p>
<p style="text-align:justify;"><a href="https://projetarcadie.com/" target="_blank" rel="noopener"><img data-attachment-id="1412" data-permalink="https://tkpx.wordpress.com/2017/07/07/projet-arcadie/logo_0/" data-orig-file="https://tkpx.files.wordpress.com/2017/07/logo_0.png?w=348&#038;h=211" data-orig-size="1200,728" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="logo_0" data-image-description="" data-medium-file="https://tkpx.files.wordpress.com/2017/07/logo_0.png?w=348&#038;h=211?w=300" data-large-file="https://tkpx.files.wordpress.com/2017/07/logo_0.png?w=348&#038;h=211?w=809" class="wp-image-1412 aligncenter" src="https://tkpx.files.wordpress.com/2017/07/logo_0.png?w=348&#038;h=211" alt="" width="348" height="211" srcset="https://tkpx.files.wordpress.com/2017/07/logo_0.png?w=348&amp;h=211 348w, https://tkpx.files.wordpress.com/2017/07/logo_0.png?w=696&amp;h=422 696w, https://tkpx.files.wordpress.com/2017/07/logo_0.png?w=150&amp;h=91 150w, https://tkpx.files.wordpress.com/2017/07/logo_0.png?w=300&amp;h=182 300w" sizes="(max-width: 348px) 100vw, 348px" /></a>Toutes les informations proviennent de sources officielles &#8211; telle que l&rsquo;Assemblée Nationale, le Sénat, l&rsquo;INSEE, le ministère de l&rsquo;Intérieur &#8211; ou du parlementaire lui-même. En effet, l’ouverture des données liées à nos collectivités et à nos représentants a commencé en 2002. On parle ici d&rsquo;<strong><em>Open Data</em></strong>. Mais la masse de toutes ces données n&rsquo;est pas utilisable directement. Il faut avant tout les classer et les analyser, et évidemment cela demande un temps phénoménal.</p>
<p style="text-align:justify;">Vous vous demandez peut-être combien d’anciens banquiers sont présents parmi les députés français ? Ou encore s&rsquo;il est normal d&#8217;embaucher un membre de sa famille ?  Bon&#8230;je ne vais pas rentrer dans les détails mais j&rsquo;ai l&rsquo;impression qu&rsquo;il y a toujours eu de la &laquo;&nbsp;magouille&nbsp;&raquo; et des conflits d&rsquo;intérêts&#8230;Et ce n&rsquo;est pas l&rsquo;actualité qui pourra me faire dire le contraire. Et bien c’est ici que le Projet Arcadie intervient : le site créé par Tris Acatrinei  &#8211; juriste et ancienne collaboratrice parlementaire (et qui donc connaît très bien le fonctionnement interne des institutions) &#8211; utilise ces données ouvertes pour en faire des fiches d’informations sur chacun des parlementaires et donne accès à un outil de recherche multi-critères.</p>
<p>Si vous souhaitez soutenir Tris Acatrinei  dans ce projet, n&rsquo;hésitez pas à faire un don. Je vous invite également à regarder son intervention au festival <strong>Pas Sage En Seine</strong>. Et pour information, c&rsquo;est également Tris qui est derrière le site <a href="http://hackersrepublic.org" target="_blank" rel="noopener">Hackers Republic</a>. On peut donc travailler dans la sécurité informatique et s&rsquo;y connaître en droit ! Combo !</p>
<p style="text-align:center;"><div class="jetpack-video-wrapper"><iframe class='youtube-player' type='text/html' width='809' height='486' src='https://www.youtube.com/embed/HVSwc7efXqw?version=3&#038;rel=1&#038;fs=1&#038;autohide=2&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' allowfullscreen='true' style='border:0;'></iframe></div></p><br />Classé dans:<a href='https://tkpx.wordpress.com/category/life/'>Life</a>, <a href='https://tkpx.wordpress.com/category/politics/'>Politics</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tkpx.wordpress.com/1373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tkpx.wordpress.com/1373/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tkpx.wordpress.com/1373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tkpx.wordpress.com/1373/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tkpx.wordpress.com/1373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tkpx.wordpress.com/1373/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tkpx.wordpress.com/1373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tkpx.wordpress.com/1373/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tkpx.wordpress.com/1373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tkpx.wordpress.com/1373/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tkpx.wordpress.com/1373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tkpx.wordpress.com/1373/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tkpx.wordpress.com/1373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tkpx.wordpress.com/1373/" /></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=tkpx.wordpress.com&#038;blog=44759582&#038;post=1373&#038;subd=tkpx&#038;ref=&#038;feed=1" width="1" height="1" /><hr>Pour changer, je ne vais pas parler de logiciels libres ou d&#8217;informatique mais plutôt de POLITIQUE. Enfin, je vais surtout vous présenter rapidement le Projet Arcadie. Il s&#8217;agit d&#8217;une plateforme de cartographie et de centralisation des informations concernant les députés et les sénateurs français. Le but est de permettre à tout le monde d&#8217;avoir accès [&#8230;]<img alt="" border="0" src="https://pixel.wp.com/b.gif?host=tkpx.wordpress.com&#038;blog=44759582&#038;post=1373&#038;subd=tkpx&#038;ref=&#038;feed=1" width="1" height="1" />


guid: http://tkpx.wordpress.com/?p=1419
title: Demand Progress
author: takopix
url: https://tkpx.wordpress.com/2017/07/13/demand-progress/
feedurl: https://tkpx.wordpress.com/feed/
enclosure_url: http://tkpx.files.wordpress.com/2017/07/demandprog.jpg
content:
<p style="text-align:justify;">Aujourd&rsquo;hui, je vous présente <em>Demand Progress</em>, une organisation américaine spécialisée dans la lutte contre la censure d&rsquo;internet, et qui fait pression sur le monde politique notamment au moyen de pétitions et manifestations. <span id="more-1419"></span>Co-fondée par Aaron Swartz et David Segal en 2009, le groupe s&rsquo;implique dans plusieurs campagnes : refus de la mise hors-la-loi de Wikileaks, soutien de l&rsquo;action des lanceurs d&rsquo;alerte, demande d&rsquo;abrogation du Patriot Act, appel à réduire les nouvelles prérogatives de l&rsquo;exécutif américain sur Internet, opposition à la censure sur Facebook et contre le projet de loi <a class="mw-redirect" title="SOPA" href="https://fr.wikipedia.org/wiki/SOPA">SOPA</a>.</p>
<p style="text-align:justify;">Aaron Swartz a notamment mis en place une plateforme qui permet à des millions de gens de contacter le Congrès et de signer des pétitions. La mobilisation aboutit et le projet de loi SOPA est retiré en janvier 2012. à titre de comparaison, La Quadrature du Net a mis en place le <a href="https://piphone.lqdn.fr/" target="_blank" rel="noopener">Piphone</a> qui fonctionne de la même manière.</p>
<p style="text-align:justify;">Sur de nombreux projets, Demand Progress a travaillé avec des organisations similaires, telles que Electronic Frontier Foundation et Fight for the Future dont j&rsquo;ai déjà parlé par le passé. L&rsquo;organisation continue sa lutte et compte plus d&rsquo;un million de membres, d&rsquo;après une estimation datant de début 2013.</p>
<p>Si vous pensez que tout ce qui se passe aux États-Unis ne nous concerne pas, je tiens à rappeler que nombreuses sont les personnes à utiliser des services basés là-bas (les GAFAM par exemple) et qui de fait ne s&rsquo;appuient pas sur la réglementation française en matière de droit, de vie privée, de protection des données etc.</p>
<p>Je peux également ajouter que la France a pour habitude de copier ce qui se fait aux États-Unis, les bonnes et surtout les mauvaises pratiques&#8230; Je vous invite à regarder la dernière vidéo d&rsquo;<a href="https://www.youtube.com/watch?v=hamaJ40-GeM" target="_blank" rel="noopener">Amnesty Internationale France</a>.</p>
<p><a href="https://demandprogress.org/" target="_blank" rel="noopener"><img data-attachment-id="1420" data-permalink="https://tkpx.wordpress.com/2017/07/13/demand-progress/demandprog/" data-orig-file="https://tkpx.files.wordpress.com/2017/07/demandprog.jpg?w=809" data-orig-size="420,123" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="demandprog" data-image-description="" data-medium-file="https://tkpx.files.wordpress.com/2017/07/demandprog.jpg?w=809?w=300" data-large-file="https://tkpx.files.wordpress.com/2017/07/demandprog.jpg?w=809?w=420" class="size-full wp-image-1420 aligncenter" src="https://tkpx.files.wordpress.com/2017/07/demandprog.jpg?w=809" alt="" srcset="https://tkpx.files.wordpress.com/2017/07/demandprog.jpg 420w, https://tkpx.files.wordpress.com/2017/07/demandprog.jpg?w=150 150w, https://tkpx.files.wordpress.com/2017/07/demandprog.jpg?w=300 300w" sizes="(max-width: 420px) 100vw, 420px"   /></a></p><br />Classé dans:<a href='https://tkpx.wordpress.com/category/politics/'>Politics</a>, <a href='https://tkpx.wordpress.com/category/privacy/'>Privacy</a>, <a href='https://tkpx.wordpress.com/category/security/'>Security</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tkpx.wordpress.com/1419/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tkpx.wordpress.com/1419/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tkpx.wordpress.com/1419/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tkpx.wordpress.com/1419/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tkpx.wordpress.com/1419/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tkpx.wordpress.com/1419/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tkpx.wordpress.com/1419/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tkpx.wordpress.com/1419/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tkpx.wordpress.com/1419/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tkpx.wordpress.com/1419/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tkpx.wordpress.com/1419/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tkpx.wordpress.com/1419/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tkpx.wordpress.com/1419/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tkpx.wordpress.com/1419/" /></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=tkpx.wordpress.com&#038;blog=44759582&#038;post=1419&#038;subd=tkpx&#038;ref=&#038;feed=1" width="1" height="1" /><hr>Aujourd&#8217;hui, je vous présente Demand Progress, une organisation américaine spécialisée dans la lutte contre la censure d&#8217;internet, et qui fait pression sur le monde politique notamment au moyen de pétitions et manifestations. Co-fondée par Aaron Swartz et David Segal en 2009, le groupe s&#8217;implique dans plusieurs campagnes : refus de la mise hors-la-loi de Wikileaks, soutien [&#8230;]<img alt="" border="0" src="https://pixel.wp.com/b.gif?host=tkpx.wordpress.com&#038;blog=44759582&#038;post=1419&#038;subd=tkpx&#038;ref=&#038;feed=1" width="1" height="1" />


guid: http://tkpx.wordpress.com/?p=1430
title: 4 mois avec un mammouth
author: takopix
url: https://tkpx.wordpress.com/2017/07/23/4-mois-avec-un-mammouth/
feedurl: https://tkpx.wordpress.com/feed/
enclosure_url: http://tkpx.files.wordpress.com/2017/07/elephant-friend-curious.png
content:
<p style="text-align:justify;">Voilà donc 4 mois que j&rsquo;ai rejoint Mastodon, ce réseau fédéré et décentralisé qui fait partie du Fediverse (avec GNU Social et Friendica), et pour moi tout va bien ! Faisons le point ensemble.</p>
<p><span id="more-1430"></span></p>
<p style="text-align:justify;"><a href="https://tkpx.files.wordpress.com/2017/07/instance_badges2-8db89c2c.png"><img data-attachment-id="1434" data-permalink="https://tkpx.wordpress.com/2017/07/23/4-mois-avec-un-mammouth/instance_badges2-8db89c2c/" data-orig-file="https://tkpx.files.wordpress.com/2017/07/instance_badges2-8db89c2c.png?w=223&#038;h=197" data-orig-size="506,446" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="instance_badges2.8db89c2c" data-image-description="" data-medium-file="https://tkpx.files.wordpress.com/2017/07/instance_badges2-8db89c2c.png?w=223&#038;h=197?w=300" data-large-file="https://tkpx.files.wordpress.com/2017/07/instance_badges2-8db89c2c.png?w=223&#038;h=197?w=506" class="wp-image-1434 alignleft" src="https://tkpx.files.wordpress.com/2017/07/instance_badges2-8db89c2c.png?w=223&#038;h=197" alt="" width="223" height="197" srcset="https://tkpx.files.wordpress.com/2017/07/instance_badges2-8db89c2c.png?w=223&amp;h=197 223w, https://tkpx.files.wordpress.com/2017/07/instance_badges2-8db89c2c.png?w=446&amp;h=394 446w, https://tkpx.files.wordpress.com/2017/07/instance_badges2-8db89c2c.png?w=150&amp;h=132 150w, https://tkpx.files.wordpress.com/2017/07/instance_badges2-8db89c2c.png?w=300&amp;h=264 300w" sizes="(max-width: 223px) 100vw, 223px" /> </a>Je suis arrivé fin mars sur le réseau, d&rsquo;abord sur l&rsquo;instance principale mastodon.social avant de migrer sur celle de la Quadrature du Net &#8211; mise en place quelques jours après &#8211; mamot.fr. Si j&rsquo;avais attendu un peu plus, j&rsquo;aurais pu aller sur Framapiaf.org, l&rsquo;instance de Framasoft, mais étant donné que les instances communiquent entre elles, cela ne change pas grand chose au final et je suis bien là où je suis (et mes données aussi).</p>
<p style="text-align:justify;">J&rsquo;ai retrouvé une bonne partie des contacts que j&rsquo;avais sur Twitter et évidemment rencontré de nouveaux. Je parle globalement de sujets en tous genres, même s&rsquo;il est vrai que les conversations tournent souvent autour des thèmes vie privée / logiciels libres / surveillance / informatique / numérique, ce qui n&rsquo;est pas pour me déplaire. Je trouve que l&rsquo;ambiance est plus calme que sur Twitter et il est plus facile de suivre une conversation (en remontant le flux) et d&rsquo;y participer. Et généralement, je tombe sur des personnes sympas !</p>
<p>Il existe déjà des petits rituels, comme le #MercrediFiction ou encore le #TeamVieux. Et parfois je joue au cadavre exquis. Bonne ambiance, beaucoup d&rsquo;échanges, et les utilisateurs n&rsquo;hésitent pas à &laquo;&nbsp;booster&nbsp;&raquo; les <em>pouets</em> pour faire remonter les informations (demande de stage, recherche de logement, etc&#8230;)</p>
<p>Je suis donc bien content de cette migration (installation sur Mastodon et départ de Twitter) et c&rsquo;est en partie grâce à Mastodon que j&rsquo;ai trouvé mon nouveau job. En effet, je suis tombé sur le <em>pouet</em> qui fallait et j&rsquo;ai rapidement contacté la personne en question. Discussion, CV, candidature, entretien et hop !</p>
<p>Si toi aussi tu viens sur le mammouth, tu peux me trouver à <a href="https://mamot.fr/@tkpx" target="_blank" rel="noopener">@tkpx@mamot.fr </a></p>
<p><a href="https://tkpx.files.wordpress.com/2017/07/elephant-friend-curious.png"><img data-attachment-id="1433" data-permalink="https://tkpx.wordpress.com/2017/07/23/4-mois-avec-un-mammouth/elephant-friend-curious/" data-orig-file="https://tkpx.files.wordpress.com/2017/07/elephant-friend-curious.png?w=187&#038;h=241" data-orig-size="339,437" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Elephant Friend (Curious)" data-image-description="" data-medium-file="https://tkpx.files.wordpress.com/2017/07/elephant-friend-curious.png?w=187&#038;h=241?w=233" data-large-file="https://tkpx.files.wordpress.com/2017/07/elephant-friend-curious.png?w=187&#038;h=241?w=339" class="wp-image-1433 aligncenter" src="https://tkpx.files.wordpress.com/2017/07/elephant-friend-curious.png?w=187&#038;h=241" alt="" width="187" height="241" srcset="https://tkpx.files.wordpress.com/2017/07/elephant-friend-curious.png?w=187&amp;h=241 187w, https://tkpx.files.wordpress.com/2017/07/elephant-friend-curious.png?w=116&amp;h=150 116w, https://tkpx.files.wordpress.com/2017/07/elephant-friend-curious.png?w=233&amp;h=300 233w, https://tkpx.files.wordpress.com/2017/07/elephant-friend-curious.png 339w" sizes="(max-width: 187px) 100vw, 187px" /></a></p><br />Classé dans:<a href='https://tkpx.wordpress.com/category/free-software/'>Free Software</a>, <a href='https://tkpx.wordpress.com/category/life/'>Life</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tkpx.wordpress.com/1430/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tkpx.wordpress.com/1430/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tkpx.wordpress.com/1430/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tkpx.wordpress.com/1430/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tkpx.wordpress.com/1430/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tkpx.wordpress.com/1430/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tkpx.wordpress.com/1430/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tkpx.wordpress.com/1430/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tkpx.wordpress.com/1430/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tkpx.wordpress.com/1430/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tkpx.wordpress.com/1430/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tkpx.wordpress.com/1430/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tkpx.wordpress.com/1430/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tkpx.wordpress.com/1430/" /></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=tkpx.wordpress.com&#038;blog=44759582&#038;post=1430&#038;subd=tkpx&#038;ref=&#038;feed=1" width="1" height="1" /><hr>Voilà donc 4 mois que j&#8217;ai rejoint Mastodon, ce réseau fédéré et décentralisé qui fait partie du Fediverse (avec GNU Social et Friendica), et pour moi tout va bien ! Faisons le point ensemble. Je suis arrivé fin mars sur le réseau, d&#8217;abord sur l&#8217;instance principale mastodon.social avant de migrer sur celle de la Quadrature [&#8230;]<img alt="" border="0" src="https://pixel.wp.com/b.gif?host=tkpx.wordpress.com&#038;blog=44759582&#038;post=1430&#038;subd=tkpx&#038;ref=&#038;feed=1" width="1" height="1" />


guid: http://blog.rom1v.com/2014/10/aimageview-composant-android
title: AImageView (composant Android)
url: http://blog.rom1v.com/2014/10/aimageview-composant-android/
feedurl: http://blog.rom1v.com/feed/
content:
<p>Pour afficher une image sur <em>Android</em>, le SDK contient un composant
<a href="http://developer.android.com/reference/android/widget/ImageView.html"><code class="highlighter-rouge">ImageView</code></a>.</p>

<p>Cependant, son mécanisme de configuration du redimensionnement de l’image
(<a href="http://developer.android.com/reference/android/widget/ImageView.ScaleType.html"><code class="highlighter-rouge">ScaleType</code></a>) me semble déficient :</p>

<ul>
  <li>il ne gère pas tous les cas courants ;</li>
  <li>le choix de la bonne constante (si elle existe) n’est pas toujours très
intuitif.</li>
</ul>

<p>J’ai donc écrit un composant <code class="highlighter-rouge">AImageView</code> (qui hérite d’<code class="highlighter-rouge">ImageView</code>) avec un
mécanisme alternatif au <em>scale type</em>.</p>

<h2 id="principes">Principes</h2>

<p><code class="highlighter-rouge">AImageView</code> propose 4 paramètres :</p>

<ul>
  <li><code class="highlighter-rouge">xWeight</code> et <code class="highlighter-rouge">yWeight</code> (des <code class="highlighter-rouge">float</code>s entre <code class="highlighter-rouge">0</code> et <code class="highlighter-rouge">1</code>) indiquent à quel
endroit lier l’image au conteneur ;</li>
  <li><code class="highlighter-rouge">fit</code> indique si l’image doit s’adapter à l’<em>intérieur</em> du composant (en
ajoutant des marges), à l’<em>extérieur</em> du composant (en croppant), toujours
<em>horizontalement</em> ou toujours <em>verticalement</em>.</li>
  <li><code class="highlighter-rouge">scale</code> indique si l’on accepte de <em>downscaler</em> (réduire) et/ou d’<em>upscaler</em>
(agrandir) l’image ;</li>
</ul>

<p>Actuellement, il préserve toujours le <a href="https://fr.wikipedia.org/wiki/Format_d%27image">format d’image</a> (aspect ratio).</p>

<h2 id="exemple-dutilisation">Exemple d’utilisation</h2>

<figure class="highlight"><pre><code class="language-xml" data-lang="xml"><span class="nt">&lt;com.rom1v.aimageview.AImageView</span>
    <span class="na">android:layout_width=</span><span class="s">"match_parent"</span>
    <span class="na">android:layout_height=</span><span class="s">"match_parent"</span>
    <span class="na">android:src=</span><span class="s">"@drawable/myimage"</span>
    <span class="na">app:xWeight=</span><span class="s">"0.5"</span>
    <span class="na">app:yWeight=</span><span class="s">"0.5"</span>
    <span class="na">app:fit=</span><span class="s">"inside"</span>
    <span class="na">app:scale=</span><span class="s">"downscale|upscale"</span> <span class="nt">/&gt;</span></code></pre></figure>

<p>Ici, l’image va s’adapter à l’intérieur (<code class="highlighter-rouge">inside</code>) du composant (des marges
seront ajoutées si nécessaires), exactement (l’image peut être réduite
– <code class="highlighter-rouge">downscale</code> – ou agrandie – <code class="highlighter-rouge">upscale</code> – pour s’adapter) et sera centrée
(<code class="highlighter-rouge">0.5</code>, <code class="highlighter-rouge">0.5</code>).</p>

<h2 id="quivalences-des-scale-types">Équivalences des <em>scale types</em></h2>

<p>Les constantes de <a href="http://developer.android.com/reference/android/widget/ImageView.ScaleType.html"><code class="highlighter-rouge">ScaleType</code></a> du composant standard <code class="highlighter-rouge">ImageView</code>
correspondent en fait à des valeurs particulières de ces paramètres. Comme vous
pourrez le constater, elles ne couvrent pas toutes les combinaisons, et ne sont
pas toujours explicites…</p>

<h3 id="scaletypecenter"><code class="highlighter-rouge">ScaleType.CENTER</code></h3>

<figure class="highlight"><pre><code class="language-xml" data-lang="xml"><span class="nt">&lt;com.rom1v.aimageview.AImageView</span>
    <span class="na">app:xWeight=</span><span class="s">"0.5"</span>
    <span class="na">app:yWeight=</span><span class="s">"0.5"</span>
    <span class="na">app:scale=</span><span class="s">"disabled"</span> <span class="nt">/&gt;</span>
<span class="c">&lt;!-- app:fit ne fait rien quand scale vaut "disabled" --&gt;</span></code></pre></figure>

<h3 id="scaletypecentercrop"><code class="highlighter-rouge">ScaleType.CENTER_CROP</code></h3>

<figure class="highlight"><pre><code class="language-xml" data-lang="xml"><span class="nt">&lt;com.rom1v.aimageview.AImageView</span>
    <span class="na">app:xWeight=</span><span class="s">"0.5"</span>
    <span class="na">app:yWeight=</span><span class="s">"0.5"</span>
    <span class="na">app:fit=</span><span class="s">"outside"</span>
    <span class="na">app:scale=</span><span class="s">"downscale|upscale"</span> <span class="nt">/&gt;</span></code></pre></figure>

<h3 id="scaletypecenterinside"><code class="highlighter-rouge">ScaleType.CENTER_INSIDE</code></h3>

<figure class="highlight"><pre><code class="language-xml" data-lang="xml"><span class="nt">&lt;com.rom1v.aimageview.AImageView</span>
    <span class="na">app:xWeight=</span><span class="s">"0.5"</span>
    <span class="na">app:yWeight=</span><span class="s">"0.5"</span>
    <span class="na">app:fit=</span><span class="s">"inside"</span>
    <span class="na">app:scale=</span><span class="s">"downscale"</span> <span class="nt">/&gt;</span></code></pre></figure>

<h3 id="scaletypefitcenter"><code class="highlighter-rouge">ScaleType.FIT_CENTER</code></h3>

<figure class="highlight"><pre><code class="language-xml" data-lang="xml"><span class="nt">&lt;com.rom1v.aimageview.AImageView</span>
    <span class="na">app:xWeight=</span><span class="s">"0.5"</span>
    <span class="na">app:yWeight=</span><span class="s">"0.5"</span>
    <span class="na">app:fit=</span><span class="s">"inside"</span>
    <span class="na">app:scale=</span><span class="s">"downscale|upscale"</span> <span class="nt">/&gt;</span></code></pre></figure>

<h3 id="scaletypefitend"><code class="highlighter-rouge">ScaleType.FIT_END</code></h3>

<figure class="highlight"><pre><code class="language-xml" data-lang="xml"><span class="nt">&lt;com.rom1v.aimageview.AImageView</span>
    <span class="na">app:xWeight=</span><span class="s">"1"</span>
    <span class="na">app:yWeight=</span><span class="s">"1"</span>
    <span class="na">app:fit=</span><span class="s">"inside"</span>
    <span class="na">app:scale=</span><span class="s">"downscale|upscale"</span> <span class="nt">/&gt;</span></code></pre></figure>

<h3 id="scaletypefitstart"><code class="highlighter-rouge">ScaleType.FIT_START</code></h3>

<figure class="highlight"><pre><code class="language-xml" data-lang="xml"><span class="nt">&lt;com.rom1v.aimageview.AImageView</span>
    <span class="na">app:xWeight=</span><span class="s">"0"</span>
    <span class="na">app:yWeight=</span><span class="s">"0"</span>
    <span class="na">app:fit=</span><span class="s">"inside"</span>
    <span class="na">app:scale=</span><span class="s">"downscale|upscale"</span> <span class="nt">/&gt;</span></code></pre></figure>

<h3 id="scaletypefitxy"><code class="highlighter-rouge">ScaleType.FIT_XY</code></h3>

<p>Cette configuration ne peut pas être reproduite en utilisant les paramètres
d’<code class="highlighter-rouge">AImageView</code>, car ce composant préserve toujours l’aspect ratio.</p>

<h3 id="scaletypematrix"><code class="highlighter-rouge">ScaleType.MATRIX</code></h3>

<p><code class="highlighter-rouge">AImageView</code> hérite d’<code class="highlighter-rouge">ImageView</code> et force le <code class="highlighter-rouge">scaleType</code> à <code class="highlighter-rouge">ScaleType.MATRIX</code>
(pour redimensionner et déplacer l’image). Par conséquent, il n’y a pas
d’équivalent, <code class="highlighter-rouge">AImageView</code> est basé dessus.</p>

<h2 id="composant">Composant</h2>

<p>Le composant est disponible sous la forme d’un <em>project library</em> (sous licence
<del><a href="https://fr.wikipedia.org/wiki/Licence_publique_g%C3%A9n%C3%A9rale_limit%C3%A9e_GNU">GNU/LGPLv3</a></del> (<a href="https://github.com/rom1v/AImageView/commit/436d3085c0219495899616089918b1ddf2063307">plus maintenant</a>) <a href="https://fr.wikipedia.org/wiki/Licence_MIT">MIT</a>):</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">git clone http://git.rom1v.com/AImageView.git</code></pre></figure>

<p>(miroir sur <a href="https://github.com/rom1v/AImageView.git">github</a>)</p>

<p>Vous pouvez le <a href="https://github.com/rom1v/AImageView#build">compiler</a> en fichier <code class="highlighter-rouge">.aar</code> grâce à la commande :</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nb">cd </span>AImageView
./gradlew assembleRelease</code></pre></figure>

<p>Il sera généré dans <code class="highlighter-rouge">library/build/outputs/aar/aimageview.aar</code>.</p>

<p>J’ai aussi écrit une application de démo l’utilisant (avec tous les fichiers
<a href="https://en.wikipedia.org/wiki/Gradle">Gradle</a> qui-vont-bien) :</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">git clone --recursive http://git.rom1v.com/AImageViewSample.git</code></pre></figure>

<p>(miroir sur <a href="https://github.com/rom1v/AImageViewSample.git">github</a>)</p>

<p class="center"><img src="/assets/aimageview/AImageViewSample.jpg" alt="AImageViewSample" /></p>

<p>Pour compiler un <code class="highlighter-rouge">apk</code> de debug (par exemple) :</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nb">cd </span>AImageViewSample
./gradlew assembleDebug</code></pre></figure>

<p>Pour ceux que le code intéresse, la classe principale est
<a href="https://github.com/rom1v/AImageView/blob/master/library/src/main/java/com/rom1v/aimageview/AImageView.java"><code class="highlighter-rouge">AImageView</code></a>. Pour l’utiliser, la partie importante est dans
<a href="https://github.com/rom1v/AImageViewSample/blob/master/app/src/main/res/layout/activity_main.xml"><code class="highlighter-rouge">activity_main.xml</code></a>.</p>

<p>N’hésitez pas à critiquer ou à remonter des bugs.</p>


guid: http://blog.rom1v.com/2014/10/comportement-indefini-et-optimisation
title: Comportement indéfini et optimisation
url: http://blog.rom1v.com/2014/10/comportement-indefini-et-optimisation/
feedurl: http://blog.rom1v.com/feed/
content:
<p>Dans certains langages (typiquement <a href="https://fr.wikipedia.org/wiki/C_%28langage%29">C</a> et <a href="https://fr.wikipedia.org/wiki/C%2B%2B">C++</a>), la sémantique de
certaines opérations est <a href="https://en.wikipedia.org/wiki/Undefined_behavior"><em>indéfinie</em></a>. Cela permet au
compilateur de ne s’intéresser qu’aux cas qui sont définis (et donc de les
optimiser) sans s’occuper des effets produits sur les cas indéfinis.</p>

<p>C’est un concept très précieux pour améliorer sensiblement les performances.
Mais cela peut avoir des effets surprenants. Si le résultat de votre programme
dépend d’un <em>comportement indéfini</em> (undefined behavior) particulier, alors
votre programme complet n’a pas de sens, et le compilateur a le droit de faire
ce qu’il veut. Et il ne s’en prive pas !</p>

<h2 id="programme-indfini">Programme indéfini</h2>

<p>Par exemple, <a href="https://en.wikipedia.org/wiki/Pointer_%28computer_programming%29#cite_ref-7">déréférencer un pointeur NULL</a>) est un
<em>comportement indéfini</em>. En effet, contrairement à ce que beaucoup pensent,
l’exécution du programme ne va pas forcément provoquer une <a href="https://fr.wikipedia.org/wiki/Erreur_de_segmentation">erreur de
segmentation</a>.</p>

<p>J’ai écrit un petit programme tout simple (<code class="highlighter-rouge">undefined.c</code>) :</p>

<figure class="highlight"><pre><code class="language-c" data-lang="c"><span class="cp">#include &lt;stdio.h&gt;
#include &lt;malloc.h&gt;
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="o">*</span><span class="n">i</span> <span class="o">=</span> <span class="n">argc</span> <span class="o">==</span> <span class="mi">1</span> <span class="o">?</span> <span class="nb">NULL</span> <span class="o">:</span> <span class="n">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="kt">int</span><span class="p">));</span>
    <span class="o">*</span><span class="n">i</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">i</span><span class="p">)</span>
        <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"pwnd %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="o">*</span><span class="n">i</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span></code></pre></figure>

<p>Si <code class="highlighter-rouge">argc</code> vaut <code class="highlighter-rouge">1</code> (c’est-à-dire si nous appelons l’exécutable sans passer
d’arguments de la ligne de commande), alors le pointeur <code class="highlighter-rouge">i</code> est <code class="highlighter-rouge">NULL</code> (ligne
5).</p>

<p>Cette ligne peut paraître étrange, mais elle permet de faire dépendre <code class="highlighter-rouge">i</code> d’une
valeur connue uniquement à l’exécution (<code class="highlighter-rouge">argc</code>), ce qui évite au compilateur de
savoir à l’avance que <code class="highlighter-rouge">i</code> est <code class="highlighter-rouge">NULL</code>.</p>

<p>La ligne 6 (<code class="highlighter-rouge">*i = 42</code>) est donc incorrecte : nous n’avons pas le droit de
déréférencer un pointeur <code class="highlighter-rouge">NULL</code>. Nous nous attendons donc souvent à une erreur
de segmentation.</p>

<p>Mais suite à ce que je viens de vous dire, admettons que ce ne soit pas le cas,
et que nous arrivions quand même sur la ligne suivante (7). Ici, si <code class="highlighter-rouge">i</code> est
<code class="highlighter-rouge">NULL</code>, la fonction se termine (en retournant <code class="highlighter-rouge">1</code>, ligne 8).</p>

<p>Donc il n’y a donc aucun moyen d’afficher le contenu du <code class="highlighter-rouge">printf</code> ligne 9.</p>

<p>Et bien… en fait, si !</p>

<h2 id="excution">Exécution</h2>

<p>Essayons (j’utilise <code class="highlighter-rouge">gcc 4.7.2</code> packagé dans <em>Debian Wheezy</em> en <em>amd64</em>, les
résultats peuvent différer avec un autre compilateur ou une autre version de
<code class="highlighter-rouge">gcc</code>) :</p>

<div class="highlighter-rouge"><pre class="codehilite"><code>$ gcc -Wall undefined.c
$ ./a.out          # argc == 1
Erreur de segmentation
$ ./a.out hello    # argc == 2
pwnd 42
</code></pre></div>

<p>Jusqu’ici, tout va bien. Maintenant, activons des optimisations de compilation :</p>

<div class="highlighter-rouge"><pre class="codehilite"><code>$ gcc -Wall -O2 undefined.c
$ ./a.out          # argc == 1
pwnd 42
</code></pre></div>

<p>Voilà, nous avons réussi à exécuter le <code class="highlighter-rouge">printf</code> alors que <code class="highlighter-rouge">argc == 1</code>.</p>

<p>Que s’est-il passé ?</p>

<h2 id="assembleur">Assembleur</h2>

<p>Pour le comprendre, il faut regarder le code généré en assembleur, sans et avec
optimisations.</p>

<h3 id="sans-optimisation">Sans optimisation</h3>

<p>Pour générer le résultat de la compilation sans assembler (et donc obtenir un fichier source assembleur <code class="highlighter-rouge">undefined.s</code>) :</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">gcc -S undefined.c</code></pre></figure>

<p>J’ai commenté les parties importantes :</p>

<figure class="highlight"><pre><code class="language-nasm" data-lang="nasm">    <span class="p">.</span><span class="n">file</span>   <span class="s">"undefined.c"</span>
    <span class="p">.</span><span class="kr">section</span>    <span class="p">.</span><span class="n">rodata</span>
<span class="p">.</span><span class="n">LC0</span><span class="o">:</span>
    <span class="p">.</span><span class="n">string</span> <span class="s">"pwnd %d</span><span class="se">\n</span><span class="s">"</span>
    <span class="p">.</span><span class="n">text</span>
    <span class="p">.</span><span class="n">globl</span>  <span class="n">main</span>
    <span class="p">.</span><span class="n">type</span>   <span class="n">main</span><span class="p">,</span> <span class="err">@</span><span class="n">function</span>
<span class="n">main</span><span class="o">:</span>
<span class="p">.</span><span class="n">LFB0</span><span class="o">:</span>
    <span class="p">.</span><span class="n">cfi_startproc</span>
    <span class="n">pushq</span>   <span class="err">%</span><span class="n">rbp</span>
    <span class="p">.</span><span class="n">cfi_def_cfa_offset</span> <span class="mi">16</span>
    <span class="p">.</span><span class="n">cfi_offset</span> <span class="mi">6</span><span class="p">,</span> <span class="o">-</span><span class="mi">16</span>
    <span class="k">movq</span>    <span class="err">%</span><span class="n">rsp</span><span class="p">,</span> <span class="err">%</span><span class="n">rbp</span>
    <span class="p">.</span><span class="n">cfi_def_cfa_register</span> <span class="mi">6</span>
    <span class="n">subq</span>    <span class="err">$</span><span class="mi">32</span><span class="p">,</span> <span class="err">%</span><span class="n">rsp</span>
    <span class="n">movl</span>    <span class="err">%</span><span class="n">edi</span><span class="p">,</span> <span class="o">-</span><span class="mi">20</span><span class="p">(</span><span class="err">%</span><span class="n">rbp</span><span class="p">)</span>
    <span class="k">movq</span>    <span class="err">%</span><span class="n">rsi</span><span class="p">,</span> <span class="o">-</span><span class="mi">32</span><span class="p">(</span><span class="err">%</span><span class="n">rbp</span><span class="p">)</span>
    <span class="n">cmpl</span>    <span class="err">$</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">20</span><span class="p">(</span><span class="err">%</span><span class="n">rbp</span><span class="p">)</span>     <span class="c">; if (argc == 1)</span>
    <span class="k">je</span>  <span class="p">.</span><span class="n">L2</span>                   <span class="c">;     goto .L2</span>
    <span class="n">movl</span>    <span class="err">$</span><span class="mi">4</span><span class="p">,</span> <span class="err">%</span><span class="n">edi</span>          <span class="c">; arg0 = 4  // sizeof(int)</span>
    <span class="k">call</span>    <span class="n">malloc</span>            <span class="c">; tmp = malloc(4)</span>
    <span class="k">jmp</span> <span class="p">.</span><span class="n">L3</span>                   <span class="c">; goto .L3</span>
<span class="p">.</span><span class="n">L2</span><span class="o">:</span>
    <span class="n">movl</span>    <span class="err">$</span><span class="mi">0</span><span class="p">,</span> <span class="err">%</span><span class="n">eax</span>
<span class="p">.</span><span class="n">L3</span><span class="o">:</span>
    <span class="k">movq</span>    <span class="err">%</span><span class="n">rax</span><span class="p">,</span> <span class="o">-</span><span class="mi">8</span><span class="p">(</span><span class="err">%</span><span class="n">rbp</span><span class="p">)</span>    <span class="c">; i = tmp</span>
    <span class="k">movq</span>    <span class="o">-</span><span class="mi">8</span><span class="p">(</span><span class="err">%</span><span class="n">rbp</span><span class="p">),</span> <span class="err">%</span><span class="n">rax</span>
    <span class="n">movl</span>    <span class="err">$</span><span class="mi">42</span><span class="p">,</span> <span class="p">(</span><span class="err">%</span><span class="n">rax</span><span class="p">)</span>       <span class="c">; *i = 42</span>
    <span class="n">cmpq</span>    <span class="err">$</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">8</span><span class="p">(</span><span class="err">%</span><span class="n">rbp</span><span class="p">)</span>      <span class="c">; if (!i)</span>
    <span class="k">jne</span> <span class="p">.</span><span class="n">L4</span>                   <span class="c">;    goto .L4</span>
    <span class="n">movl</span>    <span class="err">$</span><span class="mi">1</span><span class="p">,</span> <span class="err">%</span><span class="n">eax</span>          <span class="c">; ret = 1</span>
    <span class="k">jmp</span> <span class="p">.</span><span class="n">L5</span>
<span class="p">.</span><span class="n">L4</span><span class="o">:</span>
    <span class="k">movq</span>    <span class="o">-</span><span class="mi">8</span><span class="p">(</span><span class="err">%</span><span class="n">rbp</span><span class="p">),</span> <span class="err">%</span><span class="n">rax</span>
    <span class="n">movl</span>    <span class="p">(</span><span class="err">%</span><span class="n">rax</span><span class="p">),</span> <span class="err">%</span><span class="n">eax</span>
    <span class="n">movl</span>    <span class="err">%</span><span class="n">eax</span><span class="p">,</span> <span class="err">%</span><span class="n">esi</span>        <span class="c">; arg1 = *i</span>
    <span class="n">movl</span>    <span class="err">$</span><span class="p">.</span><span class="n">LC0</span><span class="p">,</span> <span class="err">%</span><span class="n">edi</span>       <span class="c">; arg0 points to "pwnd %d\n"</span>
    <span class="n">movl</span>    <span class="err">$</span><span class="mi">0</span><span class="p">,</span> <span class="err">%</span><span class="n">eax</span>
    <span class="k">call</span>    <span class="n">printf</span>            <span class="c">; printf("pwnd %d\n", *i)</span>
    <span class="n">movl</span>    <span class="err">$</span><span class="mi">0</span><span class="p">,</span> <span class="err">%</span><span class="n">eax</span>          <span class="c">; ret = 0</span>
<span class="p">.</span><span class="n">L5</span><span class="o">:</span>
    <span class="k">leave</span>
    <span class="p">.</span><span class="n">cfi_def_cfa</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">8</span>
    <span class="k">ret</span>                       <span class="c">; return ret</span>
    <span class="p">.</span><span class="n">cfi_endproc</span>
<span class="p">.</span><span class="n">LFE0</span><span class="o">:</span>
    <span class="p">.</span><span class="n">size</span>   <span class="n">main</span><span class="p">,</span> <span class="p">.</span><span class="o">-</span><span class="n">main</span>
    <span class="p">.</span><span class="n">ident</span>  <span class="s">"GCC: (Debian 4.7.2-5) 4.7.2"</span>
    <span class="p">.</span><span class="kr">section</span>    <span class="p">.</span><span class="n">note</span><span class="p">.</span><span class="n">GNU</span><span class="o">-</span><span class="n">stack</span><span class="p">,</span><span class="s">""</span><span class="p">,</span><span class="err">@</span><span class="n">progbits</span></code></pre></figure>

<p>Le code généré est très fidèle au code source C.</p>

<h3 id="avec-gcc--o">Avec <code class="highlighter-rouge">gcc -O</code></h3>

<p>Maintenant, activons certaines optimisations :</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">gcc -O -S undefined.c</code></pre></figure>

<p>Ce qui donne :</p>

<figure class="highlight"><pre><code class="language-nasm" data-lang="nasm">    <span class="p">.</span><span class="n">file</span>   <span class="s">"undefined.c"</span>
    <span class="p">.</span><span class="kr">section</span>    <span class="p">.</span><span class="n">rodata</span><span class="p">.</span><span class="n">str1</span><span class="p">.</span><span class="mi">1</span><span class="p">,</span><span class="s">"aMS"</span><span class="p">,</span><span class="err">@</span><span class="n">progbits</span><span class="p">,</span><span class="mi">1</span>
<span class="p">.</span><span class="n">LC0</span><span class="o">:</span>
    <span class="p">.</span><span class="n">string</span> <span class="s">"pwnd %d</span><span class="se">\n</span><span class="s">"</span>
    <span class="p">.</span><span class="n">text</span>
    <span class="p">.</span><span class="n">globl</span>  <span class="n">main</span>
    <span class="p">.</span><span class="n">type</span>   <span class="n">main</span><span class="p">,</span> <span class="err">@</span><span class="n">function</span>
<span class="n">main</span><span class="o">:</span>
<span class="p">.</span><span class="n">LFB11</span><span class="o">:</span>
    <span class="p">.</span><span class="n">cfi_startproc</span>
    <span class="n">cmpl</span>    <span class="err">$</span><span class="mi">1</span><span class="p">,</span> <span class="err">%</span><span class="n">edi</span>          <span class="c">; if (argc == 1)</span>
    <span class="k">je</span>  <span class="p">.</span><span class="n">L2</span>                   <span class="c">;    goto .L2</span>
    <span class="n">subq</span>    <span class="err">$</span><span class="mi">8</span><span class="p">,</span> <span class="err">%</span><span class="n">rsp</span>
    <span class="p">.</span><span class="n">cfi_def_cfa_offset</span> <span class="mi">16</span>
    <span class="n">movl</span>    <span class="err">$</span><span class="mi">4</span><span class="p">,</span> <span class="err">%</span><span class="n">edi</span>          <span class="c">; arg0 = 4  // sizeof(int)</span>
    <span class="k">call</span>    <span class="n">malloc</span>            <span class="c">; tmp = malloc(4)</span>
    <span class="k">movq</span>    <span class="err">%</span><span class="n">rax</span><span class="p">,</span> <span class="err">%</span><span class="n">rdx</span>        <span class="c">; i = tmp</span>
    <span class="n">movl</span>    <span class="err">$</span><span class="mi">42</span><span class="p">,</span> <span class="p">(</span><span class="err">%</span><span class="n">rax</span><span class="p">)</span>       <span class="c">; *i = 42</span>
    <span class="n">movl</span>    <span class="err">$</span><span class="mi">1</span><span class="p">,</span> <span class="err">%</span><span class="n">eax</span>          <span class="c">; ret = 1</span>
    <span class="n">testq</span>   <span class="err">%</span><span class="n">rdx</span><span class="p">,</span> <span class="err">%</span><span class="n">rdx</span>        <span class="c">; if (!i)</span>
    <span class="k">je</span>  <span class="p">.</span><span class="n">L5</span>                   <span class="c">;    goto .L5</span>
    <span class="n">movl</span>    <span class="err">$</span><span class="mi">42</span><span class="p">,</span> <span class="err">%</span><span class="n">esi</span>         <span class="c">; arg1 = 42</span>
    <span class="n">movl</span>    <span class="err">$</span><span class="p">.</span><span class="n">LC0</span><span class="p">,</span> <span class="err">%</span><span class="n">edi</span>       <span class="c">; arg0 points to "pwnd %d\n"</span>
    <span class="n">movl</span>    <span class="err">$</span><span class="mi">0</span><span class="p">,</span> <span class="err">%</span><span class="n">eax</span>
    <span class="k">call</span>    <span class="n">printf</span>            <span class="c">; printf("pwnd %d\n", 42)</span>
    <span class="n">movl</span>    <span class="err">$</span><span class="mi">0</span><span class="p">,</span> <span class="err">%</span><span class="n">eax</span>          <span class="c">; ret = 0</span>
    <span class="k">jmp</span> <span class="p">.</span><span class="n">L5</span>                   <span class="c">; goto .L5</span>
<span class="p">.</span><span class="n">L2</span><span class="o">:</span>
    <span class="p">.</span><span class="n">cfi_def_cfa_offset</span> <span class="mi">8</span>
    <span class="n">movl</span>    <span class="err">$</span><span class="mi">42</span><span class="p">,</span> <span class="mi">0</span>            <span class="c">; segfault (dereference addr 0)</span>
    <span class="n">movl</span>    <span class="err">$</span><span class="mi">1</span><span class="p">,</span> <span class="err">%</span><span class="n">eax</span>          <span class="c">; ret = 1</span>
    <span class="k">ret</span>
<span class="p">.</span><span class="n">L5</span><span class="o">:</span>
    <span class="p">.</span><span class="n">cfi_def_cfa_offset</span> <span class="mi">16</span>
    <span class="n">addq</span>    <span class="err">$</span><span class="mi">8</span><span class="p">,</span> <span class="err">%</span><span class="n">rsp</span>
    <span class="p">.</span><span class="n">cfi_def_cfa_offset</span> <span class="mi">8</span>
    <span class="k">ret</span>                       <span class="c">; return ret</span>
    <span class="p">.</span><span class="n">cfi_endproc</span>
<span class="p">.</span><span class="n">LFE11</span><span class="o">:</span>
    <span class="p">.</span><span class="n">size</span>   <span class="n">main</span><span class="p">,</span> <span class="p">.</span><span class="o">-</span><span class="n">main</span>
    <span class="p">.</span><span class="n">ident</span>  <span class="s">"GCC: (Debian 4.7.2-5) 4.7.2"</span>
    <span class="p">.</span><span class="kr">section</span>    <span class="p">.</span><span class="n">note</span><span class="p">.</span><span class="n">GNU</span><span class="o">-</span><span class="n">stack</span><span class="p">,</span><span class="s">""</span><span class="p">,</span><span class="err">@</span><span class="n">progbits</span></code></pre></figure>

<p>Là, le compilateur a réorganisé le code. Si je devais le retraduire en C,
j’écrirais ceci :</p>

<figure class="highlight"><pre><code class="language-c" data-lang="c"><span class="cp">#include &lt;stdio.h&gt;
#include &lt;malloc.h&gt;
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">argc</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span>
        <span class="o">*</span><span class="p">((</span><span class="kt">int</span> <span class="o">*</span><span class="p">)</span> <span class="nb">NULL</span><span class="p">)</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
    <span class="kt">int</span> <span class="o">*</span><span class="n">i</span> <span class="o">=</span> <span class="n">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="kt">int</span><span class="p">));</span>
    <span class="o">*</span><span class="n">i</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">i</span><span class="p">)</span>
        <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"pwnd %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="mi">42</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span></code></pre></figure>

<p>Ce qui est amusant, c’est qu’il alloue de la mémoire pour stocker <code class="highlighter-rouge">i</code>, il lui
affecte la valeur <code class="highlighter-rouge">42</code>… mais ne la lit jamais. En effet, il a décidé de recoder
en dur <code class="highlighter-rouge">42</code> pour le paramètre du <code class="highlighter-rouge">printf</code>.</p>

<p>Mais avec ce résultat, impossible d’atteindre le <code class="highlighter-rouge">printf</code> si <code class="highlighter-rouge">argc == 1</code>.</p>

<h3 id="avec-gcc--o2">Avec <code class="highlighter-rouge">gcc -O2</code></h3>

<p>Optimisons davantage :</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">gcc -O2 -S undefined.c</code></pre></figure>

<p>Ou, plus précisément (avec <code class="highlighter-rouge">gcc 4.9.1</code> par exemple, l’option <code class="highlighter-rouge">-O2</code> ne suffit
pas) :</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">gcc -O -ftree-vrp -fdelete-null-pointer-checks -S undefined.c</code></pre></figure>

<p>(les options d’optimisation sont décrites dans la <a href="https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html">doc</a>).</p>

<figure class="highlight"><pre><code class="language-nasm" data-lang="nasm">    <span class="p">.</span><span class="n">file</span>   <span class="s">"undefined.c"</span>
    <span class="p">.</span><span class="kr">section</span>    <span class="p">.</span><span class="n">rodata</span><span class="p">.</span><span class="n">str1</span><span class="p">.</span><span class="mi">1</span><span class="p">,</span><span class="s">"aMS"</span><span class="p">,</span><span class="err">@</span><span class="n">progbits</span><span class="p">,</span><span class="mi">1</span>
<span class="p">.</span><span class="n">LC0</span><span class="o">:</span>
    <span class="p">.</span><span class="n">string</span> <span class="s">"pwnd %d</span><span class="se">\n</span><span class="s">"</span>
    <span class="p">.</span><span class="kr">section</span>    <span class="p">.</span><span class="n">text</span><span class="p">.</span><span class="n">startup</span><span class="p">,</span><span class="s">"ax"</span><span class="p">,</span><span class="err">@</span><span class="n">progbits</span>
    <span class="p">.</span><span class="n">p2align</span> <span class="mi">4</span><span class="p">,,</span><span class="mi">15</span>
    <span class="p">.</span><span class="n">globl</span>  <span class="n">main</span>
    <span class="p">.</span><span class="n">type</span>   <span class="n">main</span><span class="p">,</span> <span class="err">@</span><span class="n">function</span>
<span class="n">main</span><span class="o">:</span>
<span class="p">.</span><span class="n">LFB11</span><span class="o">:</span>
    <span class="p">.</span><span class="n">cfi_startproc</span>
    <span class="n">subq</span>    <span class="err">$</span><span class="mi">8</span><span class="p">,</span> <span class="err">%</span><span class="n">rsp</span>
    <span class="p">.</span><span class="n">cfi_def_cfa_offset</span> <span class="mi">16</span>
    <span class="n">movl</span>    <span class="err">$</span><span class="mi">42</span><span class="p">,</span> <span class="err">%</span><span class="n">esi</span>         <span class="c">; arg1 = 42</span>
    <span class="n">movl</span>    <span class="err">$</span><span class="p">.</span><span class="n">LC0</span><span class="p">,</span> <span class="err">%</span><span class="n">edi</span>       <span class="c">; arg2 points to "pwnd %d\n"</span>
    <span class="n">xorl</span>    <span class="err">%</span><span class="n">eax</span><span class="p">,</span> <span class="err">%</span><span class="n">eax</span>
    <span class="k">call</span>    <span class="n">printf</span>            <span class="c">; printf("pwnd %d\n", 42)</span>
    <span class="n">xorl</span>    <span class="err">%</span><span class="n">eax</span><span class="p">,</span> <span class="err">%</span><span class="n">eax</span>        <span class="c">; ret = 0</span>
    <span class="n">addq</span>    <span class="err">$</span><span class="mi">8</span><span class="p">,</span> <span class="err">%</span><span class="n">rsp</span>
    <span class="p">.</span><span class="n">cfi_def_cfa_offset</span> <span class="mi">8</span>
    <span class="k">ret</span>                       <span class="c">; return ret</span>
    <span class="p">.</span><span class="n">cfi_endproc</span>
<span class="p">.</span><span class="n">LFE11</span><span class="o">:</span>
    <span class="p">.</span><span class="n">size</span>   <span class="n">main</span><span class="p">,</span> <span class="p">.</span><span class="o">-</span><span class="n">main</span>
    <span class="p">.</span><span class="n">ident</span>  <span class="s">"GCC: (Debian 4.7.2-5) 4.7.2"</span>
    <span class="p">.</span><span class="kr">section</span>    <span class="p">.</span><span class="n">note</span><span class="p">.</span><span class="n">GNU</span><span class="o">-</span><span class="n">stack</span><span class="p">,</span><span class="s">""</span><span class="p">,</span><span class="err">@</span><span class="n">progbits</span></code></pre></figure>

<p>Là, l’optimisation donne un résultat beaucoup plus direct :</p>

<figure class="highlight"><pre><code class="language-c" data-lang="c"><span class="cp">#include &lt;stdio.h&gt;
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"pwnd %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="mi">42</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span></code></pre></figure>

<p>Quel raisonnement a-t-il pu suivre pour obtenir ce résultat ? Par exemple le
suivant.</p>

<p>Lorsqu’il rencontre la ligne 6 de <code class="highlighter-rouge">undefined.c</code>, soit <code class="highlighter-rouge">i</code> est <code class="highlighter-rouge">NULL</code>, soit <code class="highlighter-rouge">i</code>
n’est pas <code class="highlighter-rouge">NULL</code>. Le compilateur sait que déréférencer un pointeur <code class="highlighter-rouge">NULL</code> est
<em>indéfini</em>. Il n’a donc pas à gérer ce cas. Il considère donc que <code class="highlighter-rouge">i</code> est
forcément non-<code class="highlighter-rouge">NULL</code>.</p>

<p>Mais alors, à quoi bon tester si <code class="highlighter-rouge">i</code> est non-<code class="highlighter-rouge">NULL</code> ligne 7 ? Le test ne sert à
rien. Donc il le supprime.</p>

<p>Ce raisonnement permet de transformer le code ainsi :</p>

<figure class="highlight"><pre><code class="language-c" data-lang="c"><span class="cp">#include &lt;stdio.h&gt;
#include &lt;malloc.h&gt;
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="o">*</span><span class="n">i</span> <span class="o">=</span> <span class="n">argc</span> <span class="o">==</span> <span class="mi">1</span> <span class="o">?</span> <span class="nb">NULL</span> <span class="o">:</span> <span class="n">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="kt">int</span><span class="p">));</span>
    <span class="o">*</span><span class="n">i</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"pwnd %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="o">*</span><span class="n">i</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span></code></pre></figure>

<p>Mais ce n’est pas tout. Le compilateur sait que <code class="highlighter-rouge">i</code> n’est pas <code class="highlighter-rouge">NULL</code>, donc il
peut considérer que le <code class="highlighter-rouge">malloc</code> a lieu. Et allouer un entier en mémoire, écrire
<code class="highlighter-rouge">42</code> dedans, puis lire la valeur cet entier plus tard, ça se simplifie
beaucoup : juste lire <code class="highlighter-rouge">42</code>, sans allouer de mémoire.</p>

<p>Ce qu’il simplifie en :</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nb">printf</span><span class="o">(</span><span class="s2">"pwnd %d</span><span class="se">\n</span><span class="s2">"</span>, 42<span class="o">)</span>;</code></pre></figure>

<p>CQFD.</p>

<h3 id="avec-clang--02">Avec <code class="highlighter-rouge">clang -02</code></h3>

<p>Il est intéressant d’observer ce que produit un autre compilateur : <a href="https://fr.wikipedia.org/wiki/Clang">Clang</a>.</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">clang -O2 -S undefined.c</code></pre></figure>

<p>Voici le résultat :</p>

<figure class="highlight"><pre><code class="language-nasm" data-lang="nasm">    <span class="p">.</span><span class="n">file</span>   <span class="s">"undefined.c"</span>
    <span class="p">.</span><span class="n">text</span>
    <span class="p">.</span><span class="n">globl</span>  <span class="n">main</span>
    <span class="p">.</span><span class="n">align</span>  <span class="mi">16</span><span class="p">,</span> <span class="mh">0x90</span>
    <span class="p">.</span><span class="n">type</span>   <span class="n">main</span><span class="p">,</span><span class="err">@</span><span class="n">function</span>
<span class="n">main</span><span class="o">:</span>                                   <span class="err">#</span> <span class="err">@</span><span class="n">main</span>
<span class="p">.</span><span class="n">Ltmp2</span><span class="o">:</span>
    <span class="p">.</span><span class="n">cfi_startproc</span>
<span class="err">#</span> <span class="n">BB</span><span class="err">#</span><span class="mi">0</span><span class="o">:</span>
    <span class="n">pushq</span>   <span class="err">%</span><span class="n">rbp</span>
<span class="p">.</span><span class="n">Ltmp3</span><span class="o">:</span>
    <span class="p">.</span><span class="n">cfi_def_cfa_offset</span> <span class="mi">16</span>
<span class="p">.</span><span class="n">Ltmp4</span><span class="o">:</span>
    <span class="p">.</span><span class="n">cfi_offset</span> <span class="err">%</span><span class="n">rbp</span><span class="p">,</span> <span class="o">-</span><span class="mi">16</span>
    <span class="k">movq</span>    <span class="err">%</span><span class="n">rsp</span><span class="p">,</span> <span class="err">%</span><span class="n">rbp</span>
<span class="p">.</span><span class="n">Ltmp5</span><span class="o">:</span>
    <span class="p">.</span><span class="n">cfi_def_cfa_register</span> <span class="err">%</span><span class="n">rbp</span>
    <span class="n">cmpl</span>    <span class="err">$</span><span class="mi">1</span><span class="p">,</span> <span class="err">%</span><span class="n">edi</span>          <span class="c">; if (argc == 1)</span>
    <span class="k">je</span>  <span class="p">.</span><span class="n">LBB0_4</span>               <span class="c">;     goto .LBB0_4</span>
<span class="err">#</span> <span class="n">BB</span><span class="err">#</span><span class="mi">1</span><span class="o">:</span>
    <span class="n">movl</span>    <span class="err">$</span><span class="mi">4</span><span class="p">,</span> <span class="err">%</span><span class="n">edi</span>          <span class="c">; arg0 = 4  //sizeof(int)</span>
    <span class="n">callq</span>   <span class="n">malloc</span>            <span class="c">; tmp = malloc(4)</span>
    <span class="k">movq</span>    <span class="err">%</span><span class="n">rax</span><span class="p">,</span> <span class="err">%</span><span class="n">rcx</span>        <span class="c">; i = tmp</span>
    <span class="n">movl</span>    <span class="err">$</span><span class="mi">42</span><span class="p">,</span> <span class="p">(</span><span class="err">%</span><span class="n">rcx</span><span class="p">)</span>       <span class="c">; *i = 42</span>
    <span class="n">movl</span>    <span class="err">$</span><span class="mi">1</span><span class="p">,</span> <span class="err">%</span><span class="n">eax</span>          <span class="c">; ret = 1</span>
    <span class="n">testq</span>   <span class="err">%</span><span class="n">rcx</span><span class="p">,</span> <span class="err">%</span><span class="n">rcx</span>        <span class="c">; if (!i)</span>
    <span class="k">je</span>  <span class="p">.</span><span class="n">LBB0_3</span>               <span class="c">;     goto .LBB0_3</span>
<span class="err">#</span> <span class="n">BB</span><span class="err">#</span><span class="mi">2</span><span class="o">:</span>
    <span class="n">movl</span>    <span class="err">$</span><span class="p">.</span><span class="n">L</span><span class="p">.</span><span class="k">str</span><span class="p">,</span> <span class="err">%</span><span class="n">edi</span>     <span class="c">; arg0 points to "pwnd %d\n"</span>
    <span class="n">movl</span>    <span class="err">$</span><span class="mi">42</span><span class="p">,</span> <span class="err">%</span><span class="n">esi</span>         <span class="c">; arg1 = 42</span>
    <span class="n">xorb</span>    <span class="err">%</span><span class="n">al</span><span class="p">,</span> <span class="err">%</span><span class="n">al</span>
    <span class="n">callq</span>   <span class="n">printf</span>            <span class="c">; printf("pwnd %d\n", *i)</span>
    <span class="n">xorl</span>    <span class="err">%</span><span class="n">eax</span><span class="p">,</span> <span class="err">%</span><span class="n">eax</span>        <span class="c">; ret = 0</span>
<span class="p">.</span><span class="n">LBB0_3</span><span class="o">:</span>
    <span class="n">popq</span>    <span class="err">%</span><span class="n">rbp</span>
    <span class="k">ret</span>                       <span class="c">; return ret</span>
<span class="p">.</span><span class="n">LBB0_4</span><span class="o">:</span>                                <span class="err">#</span> <span class="err">%</span><span class="p">.</span><span class="n">thread</span>
    <span class="k">ud2</span>                       <span class="c">; undefined instruction</span>
<span class="p">.</span><span class="n">Ltmp6</span><span class="o">:</span>
    <span class="p">.</span><span class="n">size</span>   <span class="n">main</span><span class="p">,</span> <span class="p">.</span><span class="n">Ltmp6</span><span class="o">-</span><span class="n">main</span>
<span class="p">.</span><span class="n">Ltmp7</span><span class="o">:</span>
    <span class="p">.</span><span class="n">cfi_endproc</span>
<span class="p">.</span><span class="n">Leh_func_end0</span><span class="o">:</span>

    <span class="p">.</span><span class="n">type</span>   <span class="p">.</span><span class="n">L</span><span class="p">.</span><span class="k">str</span><span class="p">,</span><span class="err">@</span><span class="n">object</span>          <span class="err">#</span> <span class="err">@</span><span class="p">.</span><span class="k">str</span>
    <span class="p">.</span><span class="kr">section</span>    <span class="p">.</span><span class="n">rodata</span><span class="p">.</span><span class="n">str1</span><span class="p">.</span><span class="mi">1</span><span class="p">,</span><span class="s">"aMS"</span><span class="p">,</span><span class="err">@</span><span class="n">progbits</span><span class="p">,</span><span class="mi">1</span>
<span class="p">.</span><span class="n">L</span><span class="p">.</span><span class="k">str</span><span class="o">:</span>
    <span class="p">.</span><span class="n">asciz</span>   <span class="s">"pwnd %d</span><span class="se">\n</span><span class="s">"</span>
    <span class="p">.</span><span class="n">size</span>   <span class="p">.</span><span class="n">L</span><span class="p">.</span><span class="k">str</span><span class="p">,</span> <span class="mi">9</span>


    <span class="p">.</span><span class="kr">section</span>    <span class="s">".note.GNU-stack"</span><span class="p">,</span><span class="s">""</span><span class="p">,</span><span class="err">@</span><span class="n">progbits</span></code></pre></figure>

<p>Il réalise les mêmes optimisations que <code class="highlighter-rouge">gcc -O</code>, sauf qu’il génère une erreur
explicite grâce à l’instruction machine
<a href="https://en.wikipedia.org/wiki/X86_instruction_listings#Added_with_Pentium_Pro"><code class="highlighter-rouge">ud2</code></a>.</p>

<figure class="highlight"><pre><code class="language-c" data-lang="c"><span class="cp">#include &lt;stdio.h&gt;
#include &lt;malloc.h&gt;
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">argc</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span>
        <span class="n">ud2</span><span class="p">();</span> <span class="cm">/* hardware undefined instruction */</span>
    <span class="kt">int</span> <span class="o">*</span><span class="n">i</span> <span class="o">=</span> <span class="n">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="kt">int</span><span class="p">));</span>
    <span class="o">*</span><span class="n">i</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">i</span><span class="p">)</span>
        <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"pwnd %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="mi">42</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span></code></pre></figure>

<p>Étonnamment, <em>Clang</em> ne prend jamais la décision de supprimer le <code class="highlighter-rouge">malloc</code>.</p>

<p>Par contre, avec une version suffisamment récente (ça marche avec <em>Clang
3.5.0</em>), il est possible d’ajouter des <a href="http://clang.llvm.org/docs/UsersManual.html#controlling-code-generation">vérifications lors de
l’exécution</a> :</p>

<div class="highlighter-rouge"><pre class="codehilite"><code>$ clang -fsanitize=null undefined.c &amp;&amp; ./a.out
undefined.c:6:5: runtime error: store to null pointer of type 'int'
Erreur de segmentation
</code></pre></div>

<p>Ça peut être pratique pour détecter des problèmes. Et puis des
<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/NullPointerException.html"><code class="highlighter-rouge">NullPointerException</code></a>s en C, ça fait rêver, non ?</p>

<h2 id="retenir">À retenir</h2>

<p>Si un programme contient un <em>comportement indéfini</em>, alors son comportement
<strong>est</strong> <em>indéfini</em>. Pas juste la ligne en question. Pas juste les lignes qui
suivent la ligne en question. Le programme. Même s’il fonctionne maintenant sur
votre machine avec votre version de compilateur.</p>

<blockquote>
  <p>Somebody once told me that in basketball you can’t hold the ball and run. I
got a basketball and tried it and it worked just fine. He obviously didn’t
understand basketball.</p>
</blockquote>

<p>(<a href="http://www.eskimo.com/~scs/readings/undef.950311.html">source</a>)</p>

<p>Pour aller plus loin et étudier d’autres exemples, je vous recommande la lecture
des articles suivants (en anglais) :</p>

<ul>
  <li><a href="http://blog.regehr.org/archives/213">A Guide to Undefined Behavior in C and C++</a> | <a href="http://blog.regehr.org/archives/226">2</a> |
<a href="http://blog.regehr.org/archives/232">3</a></li>
  <li><a href="http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html">What Every C Programmer Should Know About Undefined Behavior</a> |
<a href="http://blog.llvm.org/2011/05/what-every-c-programmer-should-know_14.html">2</a> | <a href="http://blog.llvm.org/2011/05/what-every-c-programmer-should-know_21.html">3</a></li>
  <li><a href="http://pdos.csail.mit.edu/papers/ub:apsys12.pdf">Undefined Behavior: What Happened to My Code?</a> (pdf)</li>
</ul>

<h2 id="optimisations-multi-threades">Optimisations multi-threadées</h2>

<p>Les <em>comportements indéfinis</em> font partie intégrante du <em>C</em> et du <em>C++</em>. Mais
même dans des langages de plus haut niveau, il existe des comportements
<em>indéfinis</em> (pas de même nature, je vous l’accorde), notamment lorsque plusieurs
<a href="https://fr.wikipedia.org/wiki/Thread_%28informatique%29">threads</a> s’exécutent en parallèle.</p>

<p>Pour garantir certains comportements, il faut utiliser des mécanismes de
<a href="https://en.wikipedia.org/wiki/Synchronization_%28computer_science%29">synchronisation</a>. Dans une vie antérieure, j’avais
<a href="http://rom.developpez.com/java-synchronisation/">présenté</a> certains de ces mécanismes en <a href="https://fr.wikipedia.org/wiki/Java_%28langage%29">Java</a>.</p>

<p>Mais une erreur courante est de penser que la synchronisation ne fait que
garantir l’<a href="https://fr.wikipedia.org/wiki/Atomicit%C3%A9_%28informatique%29">atomicité</a> avec des <a href="https://fr.wikipedia.org/wiki/Section_critique">sections critiques</a>. En réalité, c’est plus
complexe que cela. D’une part, elle ajoute des <a href="https://en.wikipedia.org/wiki/Memory_barrier">barrières mémoire</a> empêchant
certaines réorganisations des instructions (ce qui explique pourquoi le
<a href="https://fr.wikipedia.org/wiki/Double-checked_locking">double-checked locking</a> pour écrire des <a href="https://fr.wikipedia.org/wiki/Singleton_%28patron_de_conception%29">singletons</a> est <a href="http://www.javamex.com/tutorials/double_checked_locking.shtml">faux</a>).
D’autre part, elle permet de synchroniser les caches locaux des threads, sans
quoi l’exemple suivant (inspiré d’<a href="http://stackoverflow.com/questions/5022100/when-does-java-thread-cache-refresh-happens/5022188#5022188">ici</a>) est incorrect :</p>

<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">VisibilityTest</span> <span class="kd">extends</span> <span class="n">Thread</span> <span class="o">{</span>

    <span class="kt">boolean</span> <span class="n">keepRunning</span> <span class="o">=</span> <span class="kc">true</span><span class="o">;</span>

    <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">...</span> <span class="n">args</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
        <span class="n">VisibilityTest</span> <span class="n">thread</span> <span class="o">=</span> <span class="k">new</span> <span class="n">VisibilityTest</span><span class="o">();</span>
        <span class="n">thread</span><span class="o">.</span><span class="na">start</span><span class="o">();</span>
        <span class="n">Thread</span><span class="o">.</span><span class="na">sleep</span><span class="o">(</span><span class="mi">1000</span><span class="o">);</span>
        <span class="n">thread</span><span class="o">.</span><span class="na">keepRunning</span> <span class="o">=</span> <span class="kc">false</span><span class="o">;</span>
        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">System</span><span class="o">.</span><span class="na">currentTimeMillis</span><span class="o">()</span> <span class="o">+</span>
                           <span class="s">": keepRunning false"</span><span class="o">);</span>
    <span class="o">}</span>

    <span class="nd">@Override</span>
    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">run</span><span class="o">()</span> <span class="o">{</span>
        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">System</span><span class="o">.</span><span class="na">currentTimeMillis</span><span class="o">()</span> <span class="o">+</span> <span class="s">": start"</span><span class="o">);</span>
        <span class="k">while</span> <span class="o">(</span><span class="n">keepRunning</span><span class="o">);</span>
        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">System</span><span class="o">.</span><span class="na">currentTimeMillis</span><span class="o">()</span> <span class="o">+</span> <span class="s">": end"</span><span class="o">);</span>
    <span class="o">}</span>
<span class="o">}</span></code></pre></figure>

<p>Pour le compiler et l’exécuter :</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">javac VisibilityTest.java <span class="o">&amp;&amp;</span> java VisibilityTest</code></pre></figure>

<p>Sans synchronisation, il est très fort probable que le <em>thread</em> démarré ne se
termine jamais, voyant toujours <code class="highlighter-rouge">keepRunning</code> à <code class="highlighter-rouge">true</code>, même si le thread
principal lui a donné la valeur <code class="highlighter-rouge">false</code>.</p>

<p>Là encore, c’est une optimisation (la mise en cache d’une variable) qui provoque
ce comportement “inattendu” sans <a href="http://www.javamex.com/tutorials/synchronization_concurrency_synchronized2.shtml">synchronisation</a>.</p>

<p><em>Déclarer <code class="highlighter-rouge">keepRunning</code> <a href="http://www.javamex.com/tutorials/synchronization_volatile.shtml"><code class="highlighter-rouge">volatile</code></a> suffit à résoudre le problème.</em></p>

<h2 id="conclusion">Conclusion</h2>

<p>La notion de <em>comportement indéfini</em> est très importante pour améliorer la
performance des programmes. Mais elle est source de bugs parfois difficiles à</p>

<p><code class="highlighter-rouge">Erreur de segmentation</code></p>


guid: http://blog.rom1v.com/2015/03/executer-un-algorithme-lors-de-la-compilation-templates-c
title: Exécuter un algorithme lors de la compilation (templates C++)
url: http://blog.rom1v.com/2015/03/executer-un-algorithme-lors-de-la-compilation-templates-c/
feedurl: http://blog.rom1v.com/feed/
content:
<p class="center"><img src="/assets/metahanoi/hanoi.jpg" alt="hanoi" /></p>

<p>En général, pour résoudre un problème donné, nous écrivons un algorithme dans un
langage source, puis nous le compilons (dans le cas d’un langage compilé). La
compilation consiste à traduire le code source en un code exécutable par une
machine cible. C’est lors de l’exécution de ce fichier que l’algorithme est
déroulé.</p>

<p>Mais certains langages, en l’occurrence C++, proposent des mécanismes permettant
un certain contrôle sur la phase de compilation, tellement expressifs qu’ils
permettent la <a href="https://fr.wikipedia.org/wiki/M%C3%A9taprogrammation">métaprogrammation</a>. Nous pouvons alors faire exécuter un
algorithme directement par le compilateur, qui se contente de produire un
fichier exécutable affichant le résultat.</p>

<p>À titre d’exemple, je vais présenter dans ce billet comment résoudre le problème
des <a href="https://fr.wikipedia.org/wiki/Tours_de_Hano%C3%AF">tours de Hanoï</a> (généralisé, c’est-à-dire quelque soit la position
initiale des disques) lors de la phase de compilation.</p>

<p>Les programmes complets décrits dans ce billet sont <em>gittés</em> :</p>

<div class="highlighter-rouge"><pre class="codehilite"><code>git clone http://git.rom1v.com/metahanoi.git
</code></pre></div>

<p>(ou sur <a href="https://github.com/rom1v/metahanoi.git">github</a>)</p>

<h2 id="problme-des-tours-de-hano-gnralis">Problème des tours de Hanoï généralisé</h2>

<p>La résolution naturelle du problème <a href="https://fr.wikipedia.org/wiki/Tours_de_Hano%C3%AF#Algorithme_g.C3.A9n.C3.A9ralis.C3.A9_.C3.A0_une_position_quelconque">généralisé</a> des tours de Hanoï est
récursive.</p>

<p>Pour déplacer <em>n</em> disques vers la tour <em>T</em>, il faut:</p>

<ol>
  <li>déterminer sur quelle tour <em>S</em> se trouve le plus grand des <em>n</em> disques ;</li>
  <li>déplacer les <em>n-1</em> premiers disques sur la tour intermédiaire <em>I</em> (ni <em>S</em> ni
<em>T</em>) ;</li>
  <li>déplacer le plus grand disque de <em>S</em> vers <em>T</em> ;</li>
  <li>redéplacer les <em>n-1</em> premiers disques vers <em>I</em> vers <em>T</em>.</li>
</ol>

<p>En voici une implémentation <em>classique</em> en C++ (le compilateur va générer le code permettant d’exécuter l’algorithme) :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="cp">#include &lt;iterator&gt;
#include &lt;iostream&gt;
#include &lt;vector&gt;
</span>
<span class="k">class</span> <span class="nc">Hanoi</span> <span class="p">{</span>
    <span class="k">using</span> <span class="n">tower</span> <span class="o">=</span> <span class="kt">unsigned</span> <span class="kt">int</span><span class="p">;</span>
    <span class="k">using</span> <span class="n">size</span> <span class="o">=</span> <span class="kt">unsigned</span> <span class="kt">int</span><span class="p">;</span>

    <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">tower</span><span class="o">&gt;</span> <span class="n">state</span><span class="p">;</span> <span class="c1">// disk number i is on tower state[i]
</span>
<span class="k">public</span><span class="o">:</span>
    <span class="n">Hanoi</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">initializer_list</span><span class="o">&lt;</span><span class="n">tower</span><span class="o">&gt;</span> <span class="n">init</span><span class="p">)</span> <span class="o">:</span> <span class="n">state</span><span class="p">(</span><span class="n">init</span><span class="p">)</span> <span class="p">{}</span>

    <span class="kt">void</span> <span class="n">solve</span><span class="p">(</span><span class="n">tower</span> <span class="n">target</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">printState</span><span class="p">();</span> <span class="c1">// initial state
</span>        <span class="n">solveRec</span><span class="p">(</span><span class="n">state</span><span class="p">.</span><span class="n">size</span><span class="p">(),</span> <span class="n">target</span><span class="p">);</span>
    <span class="p">}</span>

<span class="k">private</span><span class="o">:</span>
    <span class="kt">void</span> <span class="n">solveRec</span><span class="p">(</span><span class="n">size</span> <span class="n">disks</span><span class="p">,</span> <span class="n">tower</span> <span class="n">target</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">disks</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">return</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="c1">// the tower of the largest disk at this depth of recursion
</span>        <span class="n">tower</span> <span class="o">&amp;</span><span class="n">largest</span> <span class="o">=</span> <span class="n">state</span><span class="p">[</span><span class="n">state</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">-</span> <span class="n">disks</span><span class="p">];</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">largest</span> <span class="o">==</span> <span class="n">target</span><span class="p">)</span> <span class="p">{</span>
            <span class="c1">// the largest disk is already on the target tower
</span>            <span class="n">solveRec</span><span class="p">(</span><span class="n">disks</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">target</span><span class="p">);</span>
        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
            <span class="c1">// move disks above the largest to the intermediate tower
</span>            <span class="n">solveRec</span><span class="p">(</span><span class="n">disks</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">other</span><span class="p">(</span><span class="n">largest</span><span class="p">,</span> <span class="n">target</span><span class="p">));</span>
            <span class="c1">// move the largest disk to the target
</span>            <span class="n">largest</span> <span class="o">=</span> <span class="n">target</span><span class="p">;</span>
            <span class="n">printState</span><span class="p">();</span>
            <span class="c1">// move back the disks on the largest
</span>            <span class="n">solveRec</span><span class="p">(</span><span class="n">disks</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">target</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="kt">void</span> <span class="n">printState</span><span class="p">()</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">copy</span><span class="p">(</span><span class="n">state</span><span class="p">.</span><span class="n">cbegin</span><span class="p">(),</span> <span class="n">state</span><span class="p">.</span><span class="n">cend</span><span class="p">(),</span>
                  <span class="n">std</span><span class="o">::</span><span class="n">ostream_iterator</span><span class="o">&lt;</span><span class="n">tower</span><span class="o">&gt;</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="p">));</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">static</span> <span class="kr">inline</span> <span class="n">tower</span> <span class="n">other</span><span class="p">(</span><span class="n">tower</span> <span class="n">t1</span><span class="p">,</span> <span class="n">tower</span> <span class="n">t2</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">return</span> <span class="mi">3</span> <span class="o">-</span> <span class="n">t1</span> <span class="o">-</span> <span class="n">t2</span><span class="p">;</span>
    <span class="p">}</span>

<span class="p">};</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">Hanoi</span><span class="p">{</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span> <span class="p">}.</span><span class="n">solve</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span></code></pre></figure>

<p>(<a href="https://github.com/rom1v/metahanoi/blob/runtime/hanoi.cpp">source</a> – <a href="https://github.com/rom1v/metahanoi/commit/runtime">commit</a> – tag <code class="highlighter-rouge">runtime</code>)</p>

<p>À compiler avec :</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">g++ -std<span class="o">=</span>c++11 hanoi.cpp -o hanoi</code></pre></figure>

<p>L’algorithme utilise un simple vecteur de positions des disques, indexés du plus
grand au plus petit, pour stocker l’état courant.</p>

<p>Par exemple, l’état <code class="highlighter-rouge"><span class="p">{</span><span class="w"> </span><span class="err">0,</span><span class="w"> </span><span class="err">0,</span><span class="w"> </span><span class="err">0,</span><span class="w"> </span><span class="err">0</span><span class="w"> </span><span class="p">}</span></code> représente 4 disques sur la tour 0 :</p>

<div class="highlighter-rouge"><pre class="codehilite"><code>state = { 0, 0, 0, 0 };

    0         1         2

    |         |         |
   -+-        |         |
  --+--       |         |
 ---+---      |         |
----+----     |         |
</code></pre></div>

<p>L’état <code class="highlighter-rouge"><span class="p">{</span><span class="w"> </span><span class="err">1,</span><span class="w"> </span><span class="err">1,</span><span class="w"> </span><span class="err">0,</span><span class="w"> </span><span class="err">2</span><span class="w"> </span><span class="p">}</span></code>, quant-à lui, représente ces positions:</p>

<div class="highlighter-rouge"><pre class="codehilite"><code>state = { 1, 1, 2, 1 };

    0         1         2

    |         |         |
    |         |         |
    |        -+-        |
    |      ---+---      |
    |     ----+----   --+--
</code></pre></div>

<p>Dans cette version, pour déplacer le disque <code class="highlighter-rouge">i</code>, il suffit alors de changer la
valeur de <code class="highlighter-rouge">state[i]</code>.</p>

<p>Il serait possible d’utiliser une structure de données différente, comme un
vecteur par tour stockant les numéros des disques présents, mais celle que j’ai
choisie sera beaucoup plus adaptée pour la suite.</p>

<p>Étant données 2 tours <em>T1</em> et <em>T2</em>, il est très facile d’en déduire la 3e : <em>3 -
T1 - T2</em>. Ce calcul est extrait dans la fonction <em>inlinée</em> <code class="highlighter-rouge">other(…)</code>.</p>

<p>Le contexte étant présenté, essayons maintenant d’implémenter le même algorithme
pour le faire exécuter par le compilateur.</p>

<h2 id="structure-de-donnes-constante">Structure de données constante</h2>

<p><code class="highlighter-rouge">std::vector</code> est une structure de données utilisable uniquement à l’exécution :
il n’est pas possible d’en créer ou d’en utiliser une instance lors de la
compilation. Même l’utilisation d’un simple tableau d’entiers nous poserait des
problèmes par la suite.</p>

<p>Nous allons donc grandement simplifier le stockage des positions des disques,
<strong>en utilisant un seul entier</strong>. En effet, à chaque disque est associée une tour
qui peut être 0, 1 ou 2. Par conséquent, un chiffre en <a href="https://fr.wikipedia.org/wiki/Syst%C3%A8me_trinaire">base 3</a> (un <em>trit</em>)
suffit pour stocker la position d’une tour.</p>

<p>Ainsi, nous pouvons représenter l’état <code class="highlighter-rouge"><span class="p">{</span><span class="w"> </span><span class="err">1,</span><span class="w"> </span><span class="err">2,</span><span class="w"> </span><span class="err">1,</span><span class="w"> </span><span class="err">0,</span><span class="w"> </span><span class="err">2</span><span class="w"> </span><span class="p">}</span></code> par l’entier 146
<em>(1×81 + 2×27 + 1×9 + 0×3 + 2×1)</em> :</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">3<sup>4</sup></th>
      <th style="text-align: center">3<sup>3</sup></th>
      <th style="text-align: center">3<sup>2</sup></th>
      <th style="text-align: center">3<sup>1</sup></th>
      <th style="text-align: center">3<sup>0</sup></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">2</td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">2</td>
    </tr>
  </tbody>
</table>

<p>Au passage, voici comment convertir rapidement un nombre dans une autre base en
<em>shell</em> (pratique pour débugger) :</p>

<div class="highlighter-rouge"><pre class="codehilite"><code>$ echo 'ibase=3; 12102' | bc
146
$ echo 'obase=3; 146' | bc
12102
</code></pre></div>

<p>Nous allons utiliser le type entier le plus long, à savoir <a href="https://fr.wikipedia.org/wiki/C_%28langage%29#Types"><code class="highlighter-rouge">unsigned long
long</code></a>, stockant au minimum 64 bits, soit 64 digits en base 2. En base
3, cela représente <em>64 × ln(2)/ln(3) ≃</em> 40 digits : nous pouvons donc stocker la
position de 40 disques dans un seul entier.</p>

<p>Pour cela, définissons un type <code class="highlighter-rouge">state</code> :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="k">using</span> <span class="n">state</span> <span class="o">=</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">;</span></code></pre></figure>

<h2 id="expressions-constantes-gnralises">Expressions constantes généralisées</h2>

<p>Nous allons écrire une première ébauche n’utilisant que des <a href="http://www.cprogramming.com/c++11/c++11-compile-time-processing-with-constexpr.html">expressions
constantes</a>, clairement indiquées et vérifiées depuis C++11 grâce au mot-clé
<a href="http://en.cppreference.com/w/cpp/language/constexpr"><code class="highlighter-rouge">constexpr</code></a>. Une fonction
<code class="highlighter-rouge">constexpr</code> doit, en gros, n’être composé que d’une instruction <code class="highlighter-rouge">return</code>.</p>

<p>C’est le cas à l’évidence pour notre fonction <code class="highlighter-rouge">other(…)</code> :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="k">constexpr</span> <span class="n">tower</span> <span class="nf">other</span><span class="p">(</span><span class="n">tower</span> <span class="n">t1</span><span class="p">,</span> <span class="n">tower</span> <span class="n">t2</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="mi">3</span> <span class="o">-</span> <span class="n">t1</span> <span class="o">-</span> <span class="n">t2</span><span class="p">;</span>
<span class="p">}</span></code></pre></figure>

<p>Grâce à l’<a href="https://en.wikipedia.org/wiki/%3F:">opérateur ternaire</a> et à la <a href="https://fr.wikipedia.org/wiki/R%C3%A9cursivit%C3%A9#R.C3.A9cursivit.C3.A9_en_informatique_et_en_logique">récursivité</a>, nous pouvons cependant
en écrire de plus complexes.</p>

<p>Dans notre programme classique, le déplacement d’un disque <em>i</em> se résumait à
changer la valeur de <code class="highlighter-rouge">state[i]</code>. Maintenant que l’état du système est compacté
dans un seul entier, l’opération est moins directe.</p>

<p>Soit l’état courant <code class="highlighter-rouge"><span class="p">{</span><span class="w"> </span><span class="err">0,</span><span class="w"> </span><span class="err">1,</span><span class="w"> </span><span class="err">2,</span><span class="w"> </span><span class="err">0,</span><span class="w"> </span><span class="err">0</span><span class="w"> </span><span class="p">}</span></code> (ou plus simplement <code class="highlighter-rouge">01200</code>). Supposons
que nous souhaitions déplacer le disque au sommet de la tour 2 vers la tour 1.
Cela consiste, en fait, à remplacer le dernier <code class="highlighter-rouge">2</code> par un <code class="highlighter-rouge">1</code> (rappelez-vous,
les disques sont indexés du plus grand au plus petit). Le résultat attendu est
donc <code class="highlighter-rouge">01100</code>.</p>

<p>Notez que ce déplacement n’est pas toujours autorisé. Par exemple, le disque au
sommet de la tour 2 est plus grand (i.e. a un plus petit index) que celui au
sommet de la tour 0, il n’est donc pas possible de le déplacer vers la tour 0.
C’est à l’algorithme que revient la responsabilité de n’effectuer que des
déplacements <em>légaux</em>.</p>

<p>Remplacer le dernier digit <em>x</em> de la représentation d’un nombre <em>N</em> (dans une
base quelconque) par <em>y</em> peut s’implémenter récursivement :</p>

<ul>
  <li>si le dernier digit <em>d</em> de <em>N</em> vaut <em>x</em>, le remplacer par <em>y</em> ;</li>
  <li>sinon, remplacer <em>x</em> par <em>y</em> dans <em>N</em> privé de son dernier digit, puis
<em>recoller</em> le dernier digit à la fin.</li>
</ul>

<p>Concrètement :</p>

<div class="highlighter-rouge"><pre class="codehilite"><code>      N   N\d d    { x=2, y=1 }
  01200  0120 0    // d != x : remplacer x par y dans N\d
   0120   012 0    //   d != x : remplacer x par y dans N\d
    012    01 2    //     d == x : remplacer x par y
    011    01 1    //     d = y
   0110   011 0    //   recoller d au résultat
  01100  0110 0    // recoller d au résultat
</code></pre></div>

<p>Il reste à expliciter l’étape du remplacement du digit. De manière générale,
remplacer par un chiffre <em>d</em> le dernier digit d’un nombre <em>N</em> exprimé dans une
base <em>b</em> consiste à calculer, soit <code class="highlighter-rouge">N / b * b + d</code>, soit de manière équivalente
<code class="highlighter-rouge">N - N % b + d</code> (<code class="highlighter-rouge">/</code> représentant la <a href="https://fr.wikipedia.org/wiki/Division_euclidienne">division entière</a> et <code class="highlighter-rouge">%</code> le
<a href="https://fr.wikipedia.org/wiki/Modulo_%28op%C3%A9ration%29">modulo</a>). Dans les deux cas, l’opération annule le dernier digit puis ajoute
son remplaçant.</p>

<p class="center"><a href="http://cowbirdsinlove.com/43"><img src="/assets/metahanoi/base10.png" alt="base10" /></a></p>

<p>Sur un exemple en base 10, c’est évident. Remplaçons le dernier chiffre de 125
par 7 selon les deux méthodes :</p>

<div class="highlighter-rouge"><pre class="codehilite"><code>     N /  b *  b + v         N -   N %  b + d
   125 / 10 * 10 + 7       125 - 125 % 10 + 7
         12 * 10 + 7       125 -        5 + 7
             120 + 7                  120 + 7
                 127                      127
</code></pre></div>

<p>Arbitrairement, nous utiliserons la première méthode pour implémenter notre
fonction <code class="highlighter-rouge">constexpr</code> <code class="highlighter-rouge">move(…)</code> :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="k">constexpr</span> <span class="n">state</span> <span class="nf">move</span><span class="p">(</span><span class="n">state</span> <span class="n">s</span><span class="p">,</span> <span class="n">tower</span> <span class="n">src</span><span class="p">,</span> <span class="n">tower</span> <span class="n">target</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">s</span> <span class="o">%</span> <span class="mi">3</span> <span class="o">==</span> <span class="n">src</span>
        <span class="o">?</span> <span class="n">s</span> <span class="o">/</span> <span class="mi">3</span> <span class="o">*</span> <span class="mi">3</span> <span class="o">+</span> <span class="n">target</span>
        <span class="o">:</span> <span class="n">move</span><span class="p">(</span><span class="n">s</span> <span class="o">/</span> <span class="mi">3</span><span class="p">,</span> <span class="n">src</span><span class="p">,</span> <span class="n">target</span><span class="p">)</span> <span class="o">*</span> <span class="mi">3</span> <span class="o">+</span> <span class="n">s</span> <span class="o">%</span> <span class="mi">3</span><span class="p">;</span>
<span class="p">}</span></code></pre></figure>

<p>De la même manière, définissons une fonction <code class="highlighter-rouge">getTower(s, i)</code> qui retourne la
tour sur laquelle se trouve le _i_ème plus petit disque :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="k">constexpr</span> <span class="n">tower</span> <span class="nf">getTower</span><span class="p">(</span><span class="n">state</span> <span class="n">s</span><span class="p">,</span> <span class="n">size</span> <span class="n">disk</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">disk</span> <span class="o">==</span> <span class="mi">1</span>
        <span class="o">?</span> <span class="n">s</span> <span class="o">%</span> <span class="mi">3</span>
        <span class="o">:</span> <span class="n">getTower</span><span class="p">(</span><span class="n">s</span> <span class="o">/</span> <span class="mi">3</span><span class="p">,</span> <span class="n">disk</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
<span class="p">}</span></code></pre></figure>

<p>Attaquons-nous maintenant à la conversion de la fonction <code class="highlighter-rouge">solveRec(…)</code>. Elle
contenait deux branchements (<code class="highlighter-rouge">if</code>) et plusieurs instructions séquentielles, que
nous allons devoir transformer en une seule instruction <code class="highlighter-rouge">return</code>.</p>

<p>Pour cela, nous allons remplacer les branchements par des opérateurs ternaires :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="k">if</span> <span class="p">(</span><span class="n">C</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">X</span> <span class="o">=</span> <span class="n">A</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
    <span class="n">X</span> <span class="o">=</span> <span class="n">B</span><span class="p">;</span>
<span class="p">}</span></code></pre></figure>

<p>devient :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="n">X</span> <span class="o">=</span> <span class="n">C</span> <span class="o">?</span> <span class="n">A</span> <span class="o">:</span> <span class="n">B</span><span class="p">;</span></code></pre></figure>

<p>Notez que contrairement à la version <code class="highlighter-rouge">if</code>/<code class="highlighter-rouge">else</code>, cela implique que les
expressions retournent une valeur. Cela tombe bien, comme une fonction
<code class="highlighter-rouge">constexpr</code> ne peut pas modifier une variable, notre fonction va retourner
l’état résultant de la transformation.</p>

<p>Concernant les instructions séquentielles, remarquons qu’elles dépendent
successivement les unes des autres. De manière générale, nous pouvons
remplacer :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="n">A</span> <span class="o">=</span> <span class="n">f</span><span class="p">();</span>
<span class="n">B</span> <span class="o">=</span> <span class="n">g</span><span class="p">(</span><span class="n">A</span><span class="p">);</span>
<span class="n">X</span> <span class="o">=</span> <span class="n">h</span><span class="p">(</span><span class="n">B</span><span class="p">);</span></code></pre></figure>

<p>par:</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="n">X</span> <span class="o">=</span> <span class="n">h</span><span class="p">(</span><span class="n">g</span><span class="p">(</span><span class="n">f</span><span class="p">()));</span></code></pre></figure>

<p>En combinant ces principes, la méthode <code class="highlighter-rouge">solve(…)</code> peut être écrite ainsi (afin
de bien voir l’imbrication des appels, je ne la découpe volontairement pas en
plusieurs méthodes) :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="k">constexpr</span> <span class="n">state</span> <span class="nf">solve</span><span class="p">(</span><span class="n">size</span> <span class="n">disks</span><span class="p">,</span> <span class="n">state</span> <span class="n">s</span><span class="p">,</span> <span class="n">tower</span> <span class="n">target</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">disks</span> <span class="o">==</span> <span class="mi">0</span>
        <span class="o">?</span> <span class="n">s</span>
        <span class="o">:</span> <span class="n">getTower</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">disks</span><span class="p">)</span> <span class="o">==</span> <span class="n">target</span>
            <span class="o">?</span> <span class="n">solve</span><span class="p">(</span><span class="n">disks</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="n">target</span><span class="p">)</span>
            <span class="o">:</span> <span class="n">solve</span><span class="p">(</span><span class="n">disks</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span>
                    <span class="n">move</span><span class="p">(</span><span class="n">solve</span><span class="p">(</span><span class="n">disks</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span>
                               <span class="n">s</span><span class="p">,</span>
                               <span class="n">other</span><span class="p">(</span><span class="n">getTower</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">disks</span><span class="p">),</span> <span class="n">target</span><span class="p">)),</span>
                         <span class="n">getTower</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">disks</span><span class="p">),</span>
                         <span class="n">target</span><span class="p">),</span>
                    <span class="n">target</span><span class="p">);</span>
<span class="p">}</span></code></pre></figure>

<p>Les appels les plus <em>profonds</em> sont effectués en premier.</p>

<p>Ajoutons une méthode d’affichage pour obtenir la représentation de l’état du
système en base 3 :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="n">std</span><span class="o">::</span><span class="n">ostream</span> <span class="o">&amp;</span><span class="n">print_state</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">ostream</span> <span class="o">&amp;</span><span class="n">os</span><span class="p">,</span> <span class="n">size</span> <span class="n">ndisks</span><span class="p">,</span> <span class="n">state</span> <span class="n">s</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">ndisks</span> <span class="o">?</span> <span class="n">print_state</span><span class="p">(</span><span class="n">os</span><span class="p">,</span> <span class="n">ndisks</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">s</span> <span class="o">/</span> <span class="mi">3</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="n">s</span> <span class="o">%</span> <span class="mi">3</span> <span class="o">:</span> <span class="n">os</span><span class="p">;</span>
<span class="p">}</span></code></pre></figure>

<p>(<a href="https://github.com/rom1v/metahanoi/blob/constexpr/metahanoi.cpp">source</a> – <a href="https://github.com/rom1v/metahanoi/commit/constexpr">commit</a> – tag
<code class="highlighter-rouge">constexpr</code>)</p>

<p>Compilons et exécutons le programme :</p>

<div class="highlighter-rouge"><pre class="codehilite"><code>$ g++ -std=c++11 metahanoi.cpp &amp;&amp; ./metahanoi
22222
</code></pre></div>

<p>L’état <code class="highlighter-rouge">22222</code> (soit l’entier <em>242</em>) est bien écrit en dur dans le binaire
généré :</p>

<div class="highlighter-rouge"><pre class="codehilite"><code>$ g++ -std=c++11 -S metahanoi.cpp &amp;&amp; grep 242 metahanoi.s
    movq    $242, -16(%rbp)
    movl    $242, %edx
</code></pre></div>

<p>Le compilateur est donc bien parvenu à la solution.</p>

<p>Mais avouons que le résultat est un peu décevant : l’état final, nous le
connaissions déjà ; ce qui nous intéresse, c’est le cheminement pour y parvenir.
Nous souhaiterions donc qu’en plus, le compilateur nous indique, d’une manière
ou d’une autre, les étapes intermédiaires décrivant la solution du problème.</p>

<h2 id="templates">Templates</h2>

<p>Pour cela, nous allons utiliser les <a href="https://fr.wikipedia.org/wiki/Template_%28programmation%29">templates</a>.</p>

<p>Pour comprendre comment les templates vont nous aider, commençons par quelques
précisions.</p>

<p>Les <a href="http://en.cppreference.com/w/cpp/language/class_template">classes template</a> sont souvent utilisées avec des paramètres
<a href="http://en.cppreference.com/w/cpp/language/template_parameters#Template_type_arguments"><em>types</em></a>. Par exemple, <code class="highlighter-rouge">std::vector&lt;int&gt;</code> définit un
nouveau type paramétré par le type <code class="highlighter-rouge">int</code>. Mais il est également possible de
passer des paramètres <a href="http://en.cppreference.com/w/cpp/language/template_parameters#Template_non-type_arguments"><em>non-types</em></a>, qui sont alors
des valeurs “simples”.</p>

<p>Une <em>classe template</em> ne définit pas un type, mais permet de générer des types
selon les paramètres qui lui sont affectés. Concrètement, <code class="highlighter-rouge">std::vector&lt;int&gt;</code> et
<code class="highlighter-rouge">std::vector&lt;double&gt;</code> sont des types totalement différents, comme s’ils étaient
implémentés par deux classes écrites séparément.</p>

<p>Dit autrement, <strong>la classe est au template ce que l’objet est à la classe : une
instance</strong>. Mais c’est une <em>instance</em> qui existe lors de la phase de
compilation !</p>

<div class="highlighter-rouge"><pre class="codehilite"><code>     +----------------+
     | CLASS TEMPLATE |
     +----------------+
          | template
          | instantiation
          v                     COMPILE TIME
     +----------------+
     |  CLASS / TYPE  |    -----------------------
     +----------------+
          | class                 RUNTIME
          | instantiation
          v
     +----------------+
     |     OBJECT     |
     +----------------+
</code></pre></div>

<p>De la même manière qu’une variable d’instance existe pour chaque objet (instance
de classe), une variable <code class="highlighter-rouge">static</code> existe pour chaque classe (instance de
template).</p>

<p>Pour conserver les états successifs de la résolution du problème des tours de
Hanoï, nous allons donc créer une classe par étape, dans laquelle nous allons
pouvoir y stocker un état <code class="highlighter-rouge">static</code>. Nous voulons donc remplacer notre fonction
<code class="highlighter-rouge">solve(…)</code> par des <em>classes template</em>.</p>

<p>Pour illustrer comment, commençons par un template simple effectuant la somme de
deux entiers :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="k">template</span> <span class="o">&lt;</span><span class="kt">int</span> <span class="n">I</span><span class="p">,</span> <span class="kt">int</span> <span class="n">J</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">Sum</span> <span class="p">{</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="kt">int</span> <span class="n">result</span> <span class="o">=</span> <span class="n">I</span> <span class="o">+</span> <span class="n">J</span><span class="p">;</span>
<span class="p">};</span></code></pre></figure>

<p>Ainsi, l’expression :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="n">Sum</span><span class="o">&lt;</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="o">&gt;::</span><span class="n">result</span></code></pre></figure>

<p>est calculée à la compilation et vaut 7.</p>

<p>Prenons maintenant l’exemple d’un calcul récursif : la <a href="https://fr.wikipedia.org/wiki/Factorielle">factorielle</a> d’un
entier. Il nous faut implémenter à la fois le cas général et la condition
d’arrêt. Nous pourrions penser à utiliser l’opérateur ternaire ainsi :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="k">template</span> <span class="o">&lt;</span><span class="kt">int</span> <span class="n">N</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">Fact</span> <span class="p">{</span>
    <span class="c1">// does not work!
</span>    <span class="k">static</span> <span class="k">constexpr</span> <span class="kt">int</span> <span class="n">result</span> <span class="o">=</span> <span class="n">N</span> <span class="o">==</span> <span class="mi">0</span> <span class="o">?</span> <span class="mi">1</span> <span class="o">:</span> <span class="n">N</span> <span class="o">*</span> <span class="n">Fact</span><span class="o">&lt;</span><span class="n">N</span> <span class="o">-</span> <span class="mi">1</span><span class="o">&gt;::</span><span class="n">result</span><span class="p">;</span>
<span class="p">};</span></code></pre></figure>

<p>Malheureusement, ceci ne peut pas fonctionner, car pour calculer la valeur d’une
expression, le compilateur doit d’abord calculer le type de chacun des
opérandes. Par conséquent, <code class="highlighter-rouge">Fact&lt;N - 1&gt;</code> sera généré même si <code class="highlighter-rouge">N == 0</code>. La
récursivité ne s’arrête donc jamais, provoquant une erreur à la compilation :</p>

<div class="highlighter-rouge"><pre class="codehilite"><code>error: template instantiation depth exceeds maximum of 900
</code></pre></div>

<p>Comment faire alors ? La clé réside dans la <a href="http://www.cprogramming.com/tutorial/template_specialization.html">spécialisation de templates</a>, qui
permet de sélectionner l’implémentation de la classe en fonction des
paramètres :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="k">template</span> <span class="o">&lt;</span><span class="kt">int</span> <span class="n">N</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">Fact</span> <span class="p">{</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="kt">int</span> <span class="n">result</span> <span class="o">=</span> <span class="n">N</span> <span class="o">*</span> <span class="n">Fact</span><span class="o">&lt;</span><span class="n">N</span><span class="o">-</span><span class="mi">1</span><span class="o">&gt;::</span><span class="n">result</span><span class="p">;</span>
<span class="p">};</span>

<span class="k">template</span> <span class="o">&lt;&gt;</span>
<span class="k">struct</span> <span class="n">Fact</span><span class="o">&lt;</span><span class="mi">0</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="kt">int</span> <span class="n">result</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">};</span></code></pre></figure>

<p>Lorsque <code class="highlighter-rouge">Fact</code> est instancié avec le paramètre <code class="highlighter-rouge">0</code>, la classe est générée à
partir du template spécialisé, stoppant ainsi la récursivité.</p>

<p>Appliquons ce principe à notre algorithme des tours de Hanoï. Nous allons
définir une classe template <code class="highlighter-rouge">Solver</code> avec 3 paramètres de template, les mêmes
que notre fonction <code class="highlighter-rouge">solve(…)</code> :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="k">template</span> <span class="o">&lt;</span><span class="n">size</span> <span class="n">DISKS</span><span class="p">,</span> <span class="n">state</span> <span class="n">S</span><span class="p">,</span> <span class="n">tower</span> <span class="n">TARGET</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">SolverRec</span> <span class="p">{</span> <span class="cm">/* … */</span> <span class="p">};</span></code></pre></figure>

<p>Puis nous allons en définir une spécialisation pour le cas où <code class="highlighter-rouge">DISKS</code> vaut 0 :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="k">template</span> <span class="o">&lt;</span><span class="n">state</span> <span class="n">S</span><span class="p">,</span> <span class="n">tower</span> <span class="n">TARGET</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="mi">0</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">TARGET</span><span class="o">&gt;</span> <span class="p">{</span> <span class="cm">/* … */</span> <span class="p">};</span></code></pre></figure>

<p>Nous avons ainsi implémenté le premier branchement sur la condition <code class="highlighter-rouge">DISKS ==
0</code>.</p>

<p>Un second branchement reste à réaliser : le calcul à effectuer est différent
selon si le plus grand disque parmi les <code class="highlighter-rouge">DISKS</code> derniers est déjà sur la tour
cible ou non. Celui-ci est plus compliqué, car les paramètres de template
présents ne permettent pas d’évaluer sa condition.</p>

<p>Nous allons donc devoir ajouter en paramètre la position du disque <code class="highlighter-rouge">SRC</code> afin de
pouvoir sélectionner la bonne implémentation en fonction de la condition <code class="highlighter-rouge">SRC ==
TARGET</code>. Sa valeur étant déterminée par celle des autres paramètres, l’ajout de
<code class="highlighter-rouge">SRC</code> ne va pas entraîner la création de nouveaux types. Par contre, il
multiplie les cas à implémenter :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="c1">// cas général
</span><span class="k">template</span> <span class="o">&lt;</span><span class="n">size</span> <span class="n">DISKS</span><span class="p">,</span> <span class="n">state</span> <span class="n">S</span><span class="p">,</span> <span class="n">tower</span> <span class="n">SRC</span><span class="p">,</span> <span class="n">tower</span> <span class="n">TARGET</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">SolverRec</span> <span class="p">{</span> <span class="cm">/* … */</span> <span class="p">};</span>

<span class="c1">// quand SRC == TARGET (le disque est déjà bien placé)
</span><span class="k">template</span> <span class="o">&lt;</span><span class="n">size</span> <span class="n">DISKS</span><span class="p">,</span> <span class="n">state</span> <span class="n">S</span><span class="p">,</span> <span class="n">tower</span> <span class="n">TOWER</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="n">DISKS</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">TOWER</span><span class="p">,</span> <span class="n">TOWER</span><span class="o">&gt;</span> <span class="p">{</span> <span class="cm">/* … */</span> <span class="p">};</span>

<span class="c1">// quand il ne reste plus qu'un seul disque, mal placé
</span><span class="k">template</span> <span class="o">&lt;</span><span class="n">state</span> <span class="n">S</span><span class="p">,</span> <span class="n">tower</span> <span class="n">SRC</span><span class="p">,</span> <span class="n">tower</span> <span class="n">TARGET</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="mi">1</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">SRC</span><span class="p">,</span> <span class="n">TARGET</span><span class="o">&gt;</span> <span class="p">{</span> <span class="cm">/* … */</span> <span class="p">};</span>

<span class="c1">// quand il ne reste plus qu'un seul disque, déjà bien placé
</span><span class="k">template</span> <span class="o">&lt;</span><span class="n">state</span> <span class="n">S</span><span class="p">,</span> <span class="n">tower</span> <span class="n">TOWER</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="mi">1</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">TOWER</span><span class="p">,</span> <span class="n">TOWER</span><span class="o">&gt;</span> <span class="p">{</span> <span class="cm">/* … */</span> <span class="p">};</span></code></pre></figure>

<p>Les plus observateurs auront remarqué que désormais, la récursivité s’arrête à 1
disque, et non plus 0 comme précédemment. En effet, maintenant que le paramètre
<code class="highlighter-rouge">SRC</code> est ajouté, il va falloir le calculer (grâce à <code class="highlighter-rouge">getTower(…)</code>) avant
d’utiliser le type. Or, cela n’a pas de sens de récupérer la position d’un
disque lorsque nous n’avons pas de disques. D’ailleurs, l’exécution de
<code class="highlighter-rouge">getTower(…)</code> avec <code class="highlighter-rouge">disk == 0</code> provoquerait une erreur… de compilation (vu que
l’exécution se déroule à la compilation).</p>

<p>Nous avons maintenant 4 versions de la classe template <code class="highlighter-rouge">SolverRec</code> à écrire.
Chacune devra contenir l’état final résultant du déplacement de <code class="highlighter-rouge">DISKS</code> disques
de la tour <code class="highlighter-rouge">SRC</code> vers la tour <code class="highlighter-rouge">TARGET</code> à partir de l’état <code class="highlighter-rouge">S</code>. Cet état sera
stocké dans une constante <code class="highlighter-rouge">final_state</code>, présente dans chacune des
spécialisations.</p>

<p>Voici mon implémentation :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="k">template</span> <span class="o">&lt;</span><span class="n">size</span> <span class="n">DISKS</span><span class="p">,</span> <span class="n">state</span> <span class="n">S</span><span class="p">,</span> <span class="n">tower</span> <span class="n">SRC</span><span class="p">,</span> <span class="n">tower</span> <span class="n">TARGET</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">SolverRec</span> <span class="p">{</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">tower</span> <span class="n">nextSrc</span> <span class="o">=</span> <span class="n">getTower</span><span class="p">(</span><span class="n">S</span><span class="p">,</span> <span class="n">DISKS</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">tower</span> <span class="n">inter</span> <span class="o">=</span> <span class="n">other</span><span class="p">(</span><span class="n">SRC</span><span class="p">,</span> <span class="n">TARGET</span><span class="p">);</span>
    <span class="k">using</span> <span class="n">rec1</span> <span class="o">=</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="n">DISKS</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">nextSrc</span><span class="p">,</span> <span class="n">inter</span><span class="o">&gt;</span><span class="p">;</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="n">value</span> <span class="o">=</span> <span class="n">move</span><span class="p">(</span><span class="n">rec1</span><span class="o">::</span><span class="n">final_state</span><span class="p">,</span> <span class="n">SRC</span><span class="p">,</span> <span class="n">TARGET</span><span class="p">);</span>
    <span class="k">using</span> <span class="n">rec2</span> <span class="o">=</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="n">DISKS</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">inter</span><span class="p">,</span> <span class="n">TARGET</span><span class="o">&gt;</span><span class="p">;</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="n">final_state</span> <span class="o">=</span> <span class="n">rec2</span><span class="o">::</span><span class="n">final_state</span><span class="p">;</span>
<span class="p">};</span>

<span class="k">template</span> <span class="o">&lt;</span><span class="n">size</span> <span class="n">DISKS</span><span class="p">,</span> <span class="n">state</span> <span class="n">S</span><span class="p">,</span> <span class="n">tower</span> <span class="n">TOWER</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="n">DISKS</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">TOWER</span><span class="p">,</span> <span class="n">TOWER</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">tower</span> <span class="n">nextSrc</span> <span class="o">=</span> <span class="n">getTower</span><span class="p">(</span><span class="n">S</span><span class="p">,</span> <span class="n">DISKS</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
    <span class="k">using</span> <span class="n">rec</span> <span class="o">=</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="n">DISKS</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">nextSrc</span><span class="p">,</span> <span class="n">TOWER</span><span class="o">&gt;</span><span class="p">;</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="n">final_state</span> <span class="o">=</span> <span class="n">rec</span><span class="o">::</span><span class="n">final_state</span><span class="p">;</span>
<span class="p">};</span>

<span class="k">template</span> <span class="o">&lt;</span><span class="n">state</span> <span class="n">S</span><span class="p">,</span> <span class="n">tower</span> <span class="n">SRC</span><span class="p">,</span> <span class="n">tower</span> <span class="n">TARGET</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="mi">1</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">SRC</span><span class="p">,</span> <span class="n">TARGET</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="n">final_state</span> <span class="o">=</span> <span class="n">move</span><span class="p">(</span><span class="n">S</span><span class="p">,</span> <span class="n">SRC</span><span class="p">,</span> <span class="n">TARGET</span><span class="p">);</span>
<span class="p">};</span>

<span class="k">template</span> <span class="o">&lt;</span><span class="n">state</span> <span class="n">S</span><span class="p">,</span> <span class="n">tower</span> <span class="n">TOWER</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="mi">1</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">TOWER</span><span class="p">,</span> <span class="n">TOWER</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="n">final_state</span> <span class="o">=</span> <span class="n">S</span><span class="p">;</span>
<span class="p">};</span></code></pre></figure>

<p>Le type (déterminé par les arguments des templates) correspondant aux appels
récursifs dépend des valeurs <code class="highlighter-rouge">constexpr</code> calculées dans la classe. C’est à
l’appelant de calculer la tour source pour renseigner la valeur du paramètre
<code class="highlighter-rouge">SRC</code>.</p>

<p>Par commodité, nous pouvons aussi ajouter une <em>classe template</em> <code class="highlighter-rouge">Solver</code>, qui
calcule elle-même la tour <code class="highlighter-rouge">SRC</code> du plus grand disque lors du démarrage.</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="k">template</span> <span class="o">&lt;</span><span class="n">size</span> <span class="n">DISKS</span><span class="p">,</span> <span class="n">state</span> <span class="n">S</span><span class="p">,</span> <span class="n">tower</span> <span class="n">TARGET</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">Solver</span> <span class="p">{</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">tower</span> <span class="n">src</span> <span class="o">=</span> <span class="n">getTower</span><span class="p">(</span><span class="n">S</span><span class="p">,</span> <span class="n">DISKS</span><span class="p">);</span>
    <span class="k">using</span> <span class="n">start</span> <span class="o">=</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="n">DISKS</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">src</span><span class="p">,</span> <span class="n">TARGET</span><span class="o">&gt;</span><span class="p">;</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="n">final_state</span> <span class="o">=</span> <span class="n">start</span><span class="o">::</span><span class="n">final_state</span><span class="p">;</span>
<span class="p">};</span></code></pre></figure>

<p>(<a href="https://github.com/rom1v/metahanoi/blob/templates/metahanoi.cpp">source</a> – <a href="https://github.com/rom1v/metahanoi/commit/templates">commit</a> – tag <code class="highlighter-rouge">templates</code>)</p>

<p>De cette manière, pour calculer l’état résultant du déplacement de 5 disques à
l’état <code class="highlighter-rouge">00000</code> (l’entier 0) vers la tour 2, il suffit de lire la variable :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="n">Solver</span><span class="o">&lt;</span><span class="mi">5</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="o">&gt;::</span><span class="n">final_state</span></code></pre></figure>

<p>Nous avons donc converti notre implementation d’une simple fonction <code class="highlighter-rouge">constexpr</code>
en <em>classes template</em>. Fonctionnellement équivalente pour l’instant, cette
nouvelle version met en place les fondations pour récupérer, à l’exécution, les
étapes de la résolution du problème calculées à la compilation.</p>

<h2 id="tat-initial">État initial</h2>

<p>Mais avant cela, dotons-nous d’un outil pour décrire l’état initial facilement,
qui pour l’instant doit être exprimé grâce à un <code class="highlighter-rouge">state</code>, c’est-à-dire un entier.</p>

<p>L’idée serait que l’état et le nombre de disques soit calculé automatiquement à
la compilation à partir de la liste des positions des disques :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="n">Disks</span><span class="o">&lt;</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="o">&gt;</span></code></pre></figure>

<p>Contrairement à précedemment, ici, nous avons besoin d’un nombre indéterminé de
paramètres. Nous allons donc utiliser les <a href="https://en.wikipedia.org/wiki/Variadic_template">variadic templates</a> :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="k">template</span> <span class="o">&lt;</span><span class="n">tower</span> <span class="p">...</span><span class="n">T</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">Disks</span><span class="p">;</span></code></pre></figure>

<p>Remarquez que ce template est juste <em>déclaré</em> et non <em>défini</em>.</p>

<p>Pour parcourir les paramètres, nous avons besoin de deux spécialisations (une
pour la récursion et une pour la condition d’arrêt) :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="k">template</span> <span class="o">&lt;</span><span class="n">tower</span> <span class="n">H</span><span class="p">,</span> <span class="n">tower</span> <span class="p">...</span><span class="n">T</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">Disks</span><span class="o">&lt;</span><span class="n">H</span><span class="p">,</span> <span class="n">T</span><span class="p">...</span><span class="o">&gt;</span> <span class="p">{</span> <span class="cm">/* … */</span> <span class="p">};</span>

<span class="k">template</span> <span class="o">&lt;&gt;</span>
<span class="k">struct</span> <span class="n">Disks</span><span class="o">&lt;&gt;</span> <span class="p">{</span> <span class="cm">/* … */</span> <span class="p">};</span></code></pre></figure>

<p>Chacune des deux spécialisent le template déclaré, mais remarquez que l’une
n’est pas une spécialisation de l’autre. C’est la raison pour laquelle nous
avons besoin de déclarer un template (sans le définir) dont ces deux définitions
sont une spécialisation.</p>

<p>Voici l’implémentation :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="k">template</span> <span class="o">&lt;</span><span class="n">tower</span> <span class="n">H</span><span class="p">,</span> <span class="n">tower</span> <span class="p">...</span><span class="n">T</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">Disks</span><span class="o">&lt;</span><span class="n">H</span><span class="p">,</span> <span class="n">T</span><span class="p">...</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="n">count</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">+</span> <span class="k">sizeof</span><span class="p">...(</span><span class="n">T</span><span class="p">);</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="nf">pack</span><span class="p">(</span><span class="n">state</span> <span class="n">tmp</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">return</span> <span class="n">Disks</span><span class="o">&lt;</span><span class="n">T</span><span class="p">...</span><span class="o">&gt;::</span><span class="n">pack</span><span class="p">(</span><span class="n">tmp</span> <span class="o">*</span> <span class="mi">3</span> <span class="o">+</span> <span class="n">H</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="n">packed</span> <span class="o">=</span> <span class="n">pack</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
<span class="p">};</span>

<span class="k">template</span> <span class="o">&lt;&gt;</span>
<span class="k">struct</span> <span class="n">Disks</span><span class="o">&lt;&gt;</span> <span class="p">{</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="nf">pack</span><span class="p">(</span><span class="n">state</span> <span class="n">tmp</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">tmp</span><span class="p">;</span> <span class="p">};</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="n">packed</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">};</span></code></pre></figure>

<p>Le nombre de disques est initialisé en comptant les paramètres grâce à
l’opérateur <a href="http://en.cppreference.com/w/cpp/language/sizeof..."><code class="highlighter-rouge">sizeof...</code></a>.</p>

<p>L’état compacté est stocké dans la variable <code class="highlighter-rouge">packed</code>. Étant donné que les
premiers paramètres traités seront les digits <em>de poids fort</em>, la multiplication
devra être effectuée par les appels récursifs plus profonds. C’est la raison
pour laquelle j’utilise une fonction temporaire qui permet d’initialiser
<code class="highlighter-rouge">packed</code>.</p>

<p>Nous pouvons maintenant initialiser notre <code class="highlighter-rouge">solver</code> ainsi :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="k">using</span> <span class="n">disks</span> <span class="o">=</span> <span class="n">Disks</span><span class="o">&lt;</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="o">&gt;</span><span class="p">;</span>
<span class="k">using</span> <span class="n">solver</span> <span class="o">=</span> <span class="n">Solver</span><span class="o">&lt;</span><span class="n">disks</span><span class="o">::</span><span class="n">count</span><span class="p">,</span> <span class="n">disks</span><span class="o">::</span><span class="n">packed</span><span class="p">,</span> <span class="mi">2</span><span class="o">&gt;</span><span class="p">;</span></code></pre></figure>

<p>(<a href="https://github.com/rom1v/metahanoi/blob/disks/metahanoi.cpp">source</a> – <a href="https://github.com/rom1v/metahanoi/commit/disks">commit</a> – tag <code class="highlighter-rouge">disks</code>)</p>

<h2 id="affichage-rcursif">Affichage récursif</h2>

<p>Attaquons-nous maintenant à l’affichage des états successifs.</p>

<p>Le plus simple consiste à implémenter une méthode <code class="highlighter-rouge">print(…)</code> dans chacune des
classes <code class="highlighter-rouge">SolverRec</code>, affichant l’état associé et/ou appellant récursivement les
méthodes <code class="highlighter-rouge">print(…)</code> sur les instances de <code class="highlighter-rouge">SolverRec</code> utilisées pour la
résolution du problème.</p>

<p>Pour cela, nous devons auparavant déterminer, pour chaque template instancié,
quel état afficher. Par exemple, pour les classes crées à partir de
l’implémentation du template non spécialisé, il y a plusieurs états
accessibles :</p>

<ul>
  <li>l’état initial (<code class="highlighter-rouge">S</code>) ;</li>
  <li>l’état après le premier appel récursif (<code class="highlighter-rouge">rec1::final_state</code>) ;</li>
  <li>l’état après le déplacement (<code class="highlighter-rouge">value</code>) ;</li>
  <li>l’état après le second appel récursif (<code class="highlighter-rouge">final_state</code>).</li>
</ul>

<p>C’est en fait l’état <code class="highlighter-rouge">value</code> qu’il faut afficher :</p>

<ul>
  <li>c’est le seul endroit où le déplacement du disque entre les deux appels
récursif est connu ;</li>
  <li>les états correspondant aux appels récursifs seront gérés par leurs classes
correspondantes.</li>
</ul>

<p>Il est important de différencier, pour chaque <code class="highlighter-rouge">SolverRec</code>, l’état final,
représentant l’état après l’application de tous les déplacements demandés, de
l’état suivant le seul déplacement unitaire (s’il existe) associé à la classe.
C’est ce dernier que nous voulons afficher.</p>

<p>Nous allons donc ajouter dans les 4 versions du template <code class="highlighter-rouge">SolverRec</code> une
méthode :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="k">static</span> <span class="n">std</span><span class="o">::</span><span class="n">ostream</span> <span class="o">&amp;</span><span class="n">print</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">ostream</span> <span class="o">&amp;</span><span class="n">os</span><span class="p">,</span> <span class="n">size</span> <span class="n">ndisks</span><span class="p">);</span></code></pre></figure>

<p>Le paramètre <code class="highlighter-rouge">std::ostream &amp;os</code> permet juste de préciser sur quel flux écrire
(<code class="highlighter-rouge">std::cout</code> par exemple) ; il est retourné pour pouvoir le chaîner avec
d’autres écritures (comme <code class="highlighter-rouge">&lt;&lt; std::endl</code>).</p>

<p>Cette méthode a besoin de connaître le nombre total de disques, afin d’afficher
le bon nombre de digits. Notez que cette valeur est différente du paramètre de
template <code class="highlighter-rouge">DISKS</code>, qui correspond au nombre de disques à déplacer pour le niveau
de récursivité courant.</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="k">template</span> <span class="o">&lt;</span><span class="n">size</span> <span class="n">DISKS</span><span class="p">,</span> <span class="n">state</span> <span class="n">S</span><span class="p">,</span> <span class="n">tower</span> <span class="n">SRC</span><span class="p">,</span> <span class="n">tower</span> <span class="n">TARGET</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">SolverRec</span> <span class="p">{</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">tower</span> <span class="n">nextSrc</span> <span class="o">=</span> <span class="n">getTower</span><span class="p">(</span><span class="n">S</span><span class="p">,</span> <span class="n">DISKS</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">tower</span> <span class="n">inter</span> <span class="o">=</span> <span class="n">other</span><span class="p">(</span><span class="n">SRC</span><span class="p">,</span> <span class="n">TARGET</span><span class="p">);</span>
    <span class="k">using</span> <span class="n">rec1</span> <span class="o">=</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="n">DISKS</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">nextSrc</span><span class="p">,</span> <span class="n">inter</span><span class="o">&gt;</span><span class="p">;</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="n">value</span> <span class="o">=</span> <span class="n">move</span><span class="p">(</span><span class="n">rec1</span><span class="o">::</span><span class="n">final_state</span><span class="p">,</span> <span class="n">SRC</span><span class="p">,</span> <span class="n">TARGET</span><span class="p">);</span>
    <span class="k">using</span> <span class="n">rec2</span> <span class="o">=</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="n">DISKS</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">inter</span><span class="p">,</span> <span class="n">TARGET</span><span class="o">&gt;</span><span class="p">;</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="n">final_state</span> <span class="o">=</span> <span class="n">rec2</span><span class="o">::</span><span class="n">final_state</span><span class="p">;</span>

    <span class="k">static</span> <span class="n">std</span><span class="o">::</span><span class="n">ostream</span> <span class="o">&amp;</span><span class="n">print</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">ostream</span> <span class="o">&amp;</span><span class="n">os</span><span class="p">,</span> <span class="n">size</span> <span class="n">ndisks</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">rec1</span><span class="o">::</span><span class="n">print</span><span class="p">(</span><span class="n">os</span><span class="p">,</span> <span class="n">ndisks</span><span class="p">);</span>
        <span class="n">print_state</span><span class="p">(</span><span class="n">os</span><span class="p">,</span> <span class="n">ndisks</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
        <span class="n">rec2</span><span class="o">::</span><span class="n">print</span><span class="p">(</span><span class="n">os</span><span class="p">,</span> <span class="n">ndisks</span><span class="p">);</span>
        <span class="k">return</span> <span class="n">os</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>

<span class="k">template</span> <span class="o">&lt;</span><span class="n">size</span> <span class="n">DISKS</span><span class="p">,</span> <span class="n">state</span> <span class="n">S</span><span class="p">,</span> <span class="n">tower</span> <span class="n">TOWER</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="n">DISKS</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">TOWER</span><span class="p">,</span> <span class="n">TOWER</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">tower</span> <span class="n">nextSrc</span> <span class="o">=</span> <span class="n">getTower</span><span class="p">(</span><span class="n">S</span><span class="p">,</span> <span class="n">DISKS</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
    <span class="k">using</span> <span class="n">rec</span> <span class="o">=</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="n">DISKS</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">nextSrc</span><span class="p">,</span> <span class="n">TOWER</span><span class="o">&gt;</span><span class="p">;</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="n">final_state</span> <span class="o">=</span> <span class="n">rec</span><span class="o">::</span><span class="n">final_state</span><span class="p">;</span>

    <span class="k">static</span> <span class="n">std</span><span class="o">::</span><span class="n">ostream</span> <span class="o">&amp;</span><span class="n">print</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">ostream</span> <span class="o">&amp;</span><span class="n">os</span><span class="p">,</span> <span class="n">size</span> <span class="n">ndisks</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">rec</span><span class="o">::</span><span class="n">print</span><span class="p">(</span><span class="n">os</span><span class="p">,</span> <span class="n">ndisks</span><span class="p">);</span>
        <span class="k">return</span> <span class="n">os</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>

<span class="k">template</span> <span class="o">&lt;</span><span class="n">state</span> <span class="n">S</span><span class="p">,</span> <span class="n">tower</span> <span class="n">SRC</span><span class="p">,</span> <span class="n">tower</span> <span class="n">TARGET</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="mi">1</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">SRC</span><span class="p">,</span> <span class="n">TARGET</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="n">value</span> <span class="o">=</span> <span class="n">move</span><span class="p">(</span><span class="n">S</span><span class="p">,</span> <span class="n">SRC</span><span class="p">,</span> <span class="n">TARGET</span><span class="p">);</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="n">final_state</span> <span class="o">=</span> <span class="n">value</span><span class="p">;</span>

    <span class="k">static</span> <span class="n">std</span><span class="o">::</span><span class="n">ostream</span> <span class="o">&amp;</span><span class="n">print</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">ostream</span> <span class="o">&amp;</span><span class="n">os</span><span class="p">,</span> <span class="n">size</span> <span class="n">ndisks</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">print_state</span><span class="p">(</span><span class="n">os</span><span class="p">,</span> <span class="n">ndisks</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
        <span class="k">return</span> <span class="n">os</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>

<span class="k">template</span> <span class="o">&lt;</span><span class="n">state</span> <span class="n">S</span><span class="p">,</span> <span class="n">tower</span> <span class="n">TOWER</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="mi">1</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">TOWER</span><span class="p">,</span> <span class="n">TOWER</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="n">value</span> <span class="o">=</span> <span class="n">S</span><span class="p">;</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="n">final_state</span> <span class="o">=</span> <span class="n">value</span><span class="p">;</span>

    <span class="k">static</span> <span class="n">std</span><span class="o">::</span><span class="n">ostream</span> <span class="o">&amp;</span><span class="n">print</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">ostream</span> <span class="o">&amp;</span><span class="n">os</span><span class="p">,</span> <span class="n">size</span> <span class="n">ndisks</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">return</span> <span class="n">os</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span></code></pre></figure>

<p>Seules les versions du template pour lesquelles <code class="highlighter-rouge">SRC != TARGET</code> affichent un
état. Les autres n’ont rien à afficher directement.</p>

<p>Ajoutons également, par commodité, une méthode similaire dans le template
<code class="highlighter-rouge">Solver</code> (sans le paramètre <code class="highlighter-rouge">ndisks</code>, car ici il est toujours égal à <code class="highlighter-rouge">DISKS</code>) :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="k">template</span> <span class="o">&lt;</span><span class="n">size</span> <span class="n">DISKS</span><span class="p">,</span> <span class="n">state</span> <span class="n">S</span><span class="p">,</span> <span class="n">tower</span> <span class="n">TARGET</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">Solver</span> <span class="p">{</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">tower</span> <span class="n">src</span> <span class="o">=</span> <span class="n">getTower</span><span class="p">(</span><span class="n">S</span><span class="p">,</span> <span class="n">DISKS</span><span class="p">);</span>
    <span class="k">using</span> <span class="n">start</span> <span class="o">=</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="n">DISKS</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">src</span><span class="p">,</span> <span class="n">TARGET</span><span class="o">&gt;</span><span class="p">;</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="n">final_state</span> <span class="o">=</span> <span class="n">start</span><span class="o">::</span><span class="n">final_state</span><span class="p">;</span>

    <span class="k">static</span> <span class="n">std</span><span class="o">::</span><span class="n">ostream</span> <span class="o">&amp;</span><span class="n">print</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">ostream</span> <span class="o">&amp;</span><span class="n">os</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">print_state</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="p">,</span> <span class="n">DISKS</span><span class="p">,</span> <span class="n">S</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span> <span class="c1">// initial state
</span>        <span class="k">return</span> <span class="n">start</span><span class="o">::</span><span class="n">print</span><span class="p">(</span><span class="n">os</span><span class="p">,</span> <span class="n">DISKS</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">};</span></code></pre></figure>

<p>(<a href="https://github.com/rom1v/metahanoi/blob/print/metahanoi.cpp">source</a> – <a href="https://github.com/rom1v/metahanoi/commit/print">commit</a> – tag <code class="highlighter-rouge">print</code>)</p>

<p>Cette nouvelle version affiche bien lors de l’exécution les états calculés lors
de la compilation.</p>

<p>Cependant, les appels récursifs nécessaires à la résolution du problème ne sont
pas supprimés : ils sont nécessaires à l’affichage des résultats. Il est dommage
de résoudre le problème à la compilation si c’est pour que l’exécution repasse
par chacune des étapes de la résolution pour l’affichage.</p>

<h2 id="liste-chane">Liste chaînée</h2>

<p>Pour éviter cela, nous allons générer à la compilation une liste chaînée des
étapes qu’il ne restera plus qu’à parcourir à l’exécution. Chaque classe qui
<em>affichait</em> un état va désormais <em>stocker</em> un nœud de la liste chainée,
implémenté ainsi :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="k">struct</span> <span class="n">ResultNode</span> <span class="p">{</span>
    <span class="n">state</span> <span class="n">value</span><span class="p">;</span>
    <span class="n">ResultNode</span> <span class="o">*</span><span class="n">next</span><span class="p">;</span>
<span class="p">};</span></code></pre></figure>

<p>Le défi est maintenant d’initialiser les champs <code class="highlighter-rouge">next</code> de chacun des nœuds à
l’adresse du nœud suivant dans l’ordre de résolution du problème des tours de
Hanoï, et non dans l’ordre des appels récursifs, qui est différent. Par exemple,
l’état (<code class="highlighter-rouge">value</code>) associé à une instance du template <code class="highlighter-rouge">SolverRec</code> non spécialisé
(correspondant au cas général) devra succéder à tous les états générés par
l’appel récursif <code class="highlighter-rouge">rec1</code>, pourtant appelé après.</p>

<p>Pour cela, chaque classe doit être capable d’indiquer à son appelant quel est le
premier nœud qu’elle peut atteindre (<code class="highlighter-rouge">first</code>) et passer à chaque classe appelée
le nœud qui devra suivre son nœud final (<code class="highlighter-rouge">AFTER</code>). Ces informations suffisent à
déterminer dans tous les cas le nœud suivant d’une classe donnée, ce qui permet
de constituer la liste chaînée complète en mémoire :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="k">template</span> <span class="o">&lt;</span><span class="n">size</span> <span class="n">DISKS</span><span class="p">,</span> <span class="n">state</span> <span class="n">S</span><span class="p">,</span> <span class="n">tower</span> <span class="n">SRC</span><span class="p">,</span> <span class="n">tower</span> <span class="n">TARGET</span><span class="p">,</span> <span class="n">ResultNode</span> <span class="o">*</span><span class="n">AFTER</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">SolverRec</span> <span class="p">{</span>
    <span class="k">static</span> <span class="n">ResultNode</span> <span class="n">node</span><span class="p">;</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">tower</span> <span class="n">nextSrc</span> <span class="o">=</span> <span class="n">getTower</span><span class="p">(</span><span class="n">S</span><span class="p">,</span> <span class="n">DISKS</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">tower</span> <span class="n">inter</span> <span class="o">=</span> <span class="n">other</span><span class="p">(</span><span class="n">SRC</span><span class="p">,</span> <span class="n">TARGET</span><span class="p">);</span>
    <span class="k">using</span> <span class="n">rec1</span> <span class="o">=</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="n">DISKS</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">nextSrc</span><span class="p">,</span> <span class="n">inter</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">node</span><span class="o">&gt;</span><span class="p">;</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="n">value</span> <span class="o">=</span> <span class="n">move</span><span class="p">(</span><span class="n">rec1</span><span class="o">::</span><span class="n">final_state</span><span class="p">,</span> <span class="n">SRC</span><span class="p">,</span> <span class="n">TARGET</span><span class="p">);</span>
    <span class="k">using</span> <span class="n">rec2</span> <span class="o">=</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="n">DISKS</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">inter</span><span class="p">,</span> <span class="n">TARGET</span><span class="p">,</span> <span class="n">AFTER</span><span class="o">&gt;</span><span class="p">;</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="n">final_state</span> <span class="o">=</span> <span class="n">rec2</span><span class="o">::</span><span class="n">final_state</span><span class="p">;</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">ResultNode</span> <span class="o">*</span><span class="n">first</span> <span class="o">=</span> <span class="n">rec1</span><span class="o">::</span><span class="n">first</span><span class="p">;</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">ResultNode</span> <span class="o">*</span><span class="n">next</span> <span class="o">=</span> <span class="n">rec2</span><span class="o">::</span><span class="n">first</span><span class="p">;</span>
<span class="p">};</span>

<span class="k">template</span> <span class="o">&lt;</span><span class="n">size</span> <span class="n">DISKS</span><span class="p">,</span> <span class="n">state</span> <span class="n">S</span><span class="p">,</span> <span class="n">tower</span> <span class="n">SRC</span><span class="p">,</span> <span class="n">tower</span> <span class="n">TARGET</span><span class="p">,</span> <span class="n">ResultNode</span> <span class="o">*</span><span class="n">AFTER</span><span class="o">&gt;</span>
<span class="n">ResultNode</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="n">DISKS</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">SRC</span><span class="p">,</span> <span class="n">TARGET</span><span class="p">,</span> <span class="n">AFTER</span><span class="o">&gt;::</span><span class="n">node</span> <span class="o">=</span> <span class="p">{</span> <span class="n">value</span><span class="p">,</span> <span class="n">next</span> <span class="p">};</span>

<span class="k">template</span> <span class="o">&lt;</span><span class="n">size</span> <span class="n">DISKS</span><span class="p">,</span> <span class="n">state</span> <span class="n">S</span><span class="p">,</span> <span class="n">tower</span> <span class="n">TOWER</span><span class="p">,</span> <span class="n">ResultNode</span> <span class="o">*</span><span class="n">AFTER</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="n">DISKS</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">TOWER</span><span class="p">,</span> <span class="n">TOWER</span><span class="p">,</span> <span class="n">AFTER</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">tower</span> <span class="n">nextSrc</span> <span class="o">=</span> <span class="n">getTower</span><span class="p">(</span><span class="n">S</span><span class="p">,</span> <span class="n">DISKS</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
    <span class="k">using</span> <span class="n">rec</span> <span class="o">=</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="n">DISKS</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">nextSrc</span><span class="p">,</span> <span class="n">TOWER</span><span class="p">,</span> <span class="n">AFTER</span><span class="o">&gt;</span><span class="p">;</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="n">final_state</span> <span class="o">=</span> <span class="n">rec</span><span class="o">::</span><span class="n">final_state</span><span class="p">;</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">ResultNode</span> <span class="o">*</span><span class="n">first</span> <span class="o">=</span> <span class="n">rec</span><span class="o">::</span><span class="n">first</span><span class="p">;</span>
<span class="p">};</span>

<span class="k">template</span> <span class="o">&lt;</span><span class="n">state</span> <span class="n">S</span><span class="p">,</span> <span class="n">tower</span> <span class="n">SRC</span><span class="p">,</span> <span class="n">tower</span> <span class="n">TARGET</span><span class="p">,</span> <span class="n">ResultNode</span> <span class="o">*</span><span class="n">AFTER</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="mi">1</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">SRC</span><span class="p">,</span> <span class="n">TARGET</span><span class="p">,</span> <span class="n">AFTER</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="k">static</span> <span class="n">ResultNode</span> <span class="n">node</span><span class="p">;</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="n">value</span> <span class="o">=</span> <span class="n">move</span><span class="p">(</span><span class="n">S</span><span class="p">,</span> <span class="n">SRC</span><span class="p">,</span> <span class="n">TARGET</span><span class="p">);</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="n">final_state</span> <span class="o">=</span> <span class="n">value</span><span class="p">;</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">ResultNode</span> <span class="o">*</span><span class="n">first</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">node</span><span class="p">;</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">ResultNode</span> <span class="o">*</span><span class="n">next</span> <span class="o">=</span> <span class="n">AFTER</span><span class="p">;</span>
<span class="p">};</span>

<span class="k">template</span> <span class="o">&lt;</span><span class="n">state</span> <span class="n">S</span><span class="p">,</span> <span class="n">tower</span> <span class="n">SRC</span><span class="p">,</span> <span class="n">tower</span> <span class="n">TARGET</span><span class="p">,</span> <span class="n">ResultNode</span> <span class="o">*</span><span class="n">AFTER</span><span class="o">&gt;</span>
<span class="n">ResultNode</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="mi">1</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">SRC</span><span class="p">,</span> <span class="n">TARGET</span><span class="p">,</span> <span class="n">AFTER</span><span class="o">&gt;::</span><span class="n">node</span> <span class="o">=</span> <span class="p">{</span> <span class="n">value</span><span class="p">,</span> <span class="n">next</span> <span class="p">};</span>

<span class="k">template</span> <span class="o">&lt;</span><span class="n">state</span> <span class="n">S</span><span class="p">,</span> <span class="n">tower</span> <span class="n">TOWER</span><span class="p">,</span> <span class="n">ResultNode</span> <span class="o">*</span><span class="n">AFTER</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="mi">1</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">TOWER</span><span class="p">,</span> <span class="n">TOWER</span><span class="p">,</span> <span class="n">AFTER</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="n">value</span> <span class="o">=</span> <span class="n">S</span><span class="p">;</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">state</span> <span class="n">final_state</span> <span class="o">=</span> <span class="n">value</span><span class="p">;</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">ResultNode</span> <span class="o">*</span><span class="n">first</span> <span class="o">=</span> <span class="n">AFTER</span><span class="p">;</span>
<span class="p">};</span>

<span class="k">template</span> <span class="o">&lt;</span><span class="n">size</span> <span class="n">DISKS</span><span class="p">,</span> <span class="n">state</span> <span class="n">S</span><span class="p">,</span> <span class="n">tower</span> <span class="n">TARGET</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="n">Solver</span> <span class="p">{</span>
    <span class="k">static</span> <span class="n">ResultNode</span> <span class="n">list</span><span class="p">;</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="n">tower</span> <span class="n">src</span> <span class="o">=</span> <span class="n">getTower</span><span class="p">(</span><span class="n">S</span><span class="p">,</span> <span class="n">DISKS</span><span class="p">);</span>
    <span class="k">using</span> <span class="n">start</span> <span class="o">=</span> <span class="n">SolverRec</span><span class="o">&lt;</span><span class="n">DISKS</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">src</span><span class="p">,</span> <span class="n">TARGET</span><span class="p">,</span> <span class="nb">nullptr</span><span class="o">&gt;</span><span class="p">;</span>
<span class="p">};</span>

<span class="k">template</span> <span class="o">&lt;</span><span class="n">size</span> <span class="n">DISKS</span><span class="p">,</span> <span class="n">state</span> <span class="n">S</span><span class="p">,</span> <span class="n">tower</span> <span class="n">TARGET</span><span class="o">&gt;</span>
<span class="n">ResultNode</span> <span class="n">Solver</span><span class="o">&lt;</span><span class="n">DISKS</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">TARGET</span><span class="o">&gt;::</span><span class="n">list</span> <span class="o">=</span> <span class="p">{</span> <span class="n">S</span><span class="p">,</span> <span class="n">start</span><span class="o">::</span><span class="n">first</span> <span class="p">};</span></code></pre></figure>

<p>La variable <code class="highlighter-rouge">static</code> <code class="highlighter-rouge">node</code> n’étant pas <code class="highlighter-rouge">constexpr</code> (elle doit être adressable à
l’exécution pour former la liste chaînée), elle doit être initialisée en dehors
de la classe.</p>

<p>Pour parcourir simplement la liste chaînée, rendons <code class="highlighter-rouge">ResultNode</code> itérable
(j’implémente ici uniquement le strict minimum pour que l’<em>iterator</em>
fonctionne) :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="k">struct</span> <span class="n">ResultNode</span> <span class="p">{</span>
    <span class="n">state</span> <span class="n">value</span><span class="p">;</span>
    <span class="n">ResultNode</span> <span class="o">*</span><span class="n">next</span><span class="p">;</span>

    <span class="k">class</span> <span class="nc">iterator</span> <span class="p">{</span>
        <span class="k">const</span> <span class="n">ResultNode</span> <span class="o">*</span><span class="n">current</span><span class="p">;</span>
    <span class="k">public</span><span class="o">:</span>
        <span class="n">iterator</span><span class="p">(</span><span class="k">const</span> <span class="n">ResultNode</span> <span class="o">*</span><span class="n">current</span><span class="p">)</span> <span class="o">:</span> <span class="n">current</span><span class="p">(</span><span class="n">current</span><span class="p">)</span> <span class="p">{};</span>
        <span class="n">iterator</span> <span class="o">&amp;</span><span class="k">operator</span><span class="o">++</span><span class="p">()</span> <span class="p">{</span> <span class="n">current</span> <span class="o">=</span> <span class="n">current</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">;</span> <span class="k">return</span> <span class="o">*</span><span class="k">this</span><span class="p">;</span> <span class="p">}</span>
        <span class="n">state</span> <span class="k">operator</span><span class="o">*</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="n">current</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">;</span> <span class="p">}</span>
        <span class="kt">bool</span> <span class="k">operator</span><span class="o">==</span><span class="p">(</span><span class="k">const</span> <span class="n">iterator</span> <span class="o">&amp;</span><span class="n">o</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">current</span> <span class="o">==</span> <span class="n">o</span><span class="p">.</span><span class="n">current</span><span class="p">;</span> <span class="p">}</span>
        <span class="kt">bool</span> <span class="k">operator</span><span class="o">!=</span><span class="p">(</span><span class="k">const</span> <span class="n">iterator</span> <span class="o">&amp;</span><span class="n">o</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="o">!</span><span class="p">(</span><span class="o">*</span><span class="k">this</span> <span class="o">==</span> <span class="n">o</span><span class="p">);</span> <span class="p">}</span>
    <span class="p">};</span>

    <span class="n">iterator</span> <span class="n">begin</span><span class="p">()</span> <span class="k">const</span> <span class="p">{</span> <span class="k">return</span> <span class="n">iterator</span><span class="p">(</span><span class="k">this</span><span class="p">);</span> <span class="p">}</span>
    <span class="n">iterator</span> <span class="n">end</span><span class="p">()</span> <span class="k">const</span> <span class="p">{</span> <span class="k">return</span> <span class="n">iterator</span><span class="p">(</span><span class="nb">nullptr</span><span class="p">);</span> <span class="p">}</span>
<span class="p">};</span></code></pre></figure>

<p>La liste peut être parcourue ainsi :</p>

<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="k">using</span> <span class="n">disks</span> <span class="o">=</span> <span class="n">Disks</span><span class="o">&lt;</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="o">&gt;</span><span class="p">;</span>
<span class="k">using</span> <span class="n">solver</span> <span class="o">=</span> <span class="n">Solver</span><span class="o">&lt;</span><span class="n">disks</span><span class="o">::</span><span class="n">count</span><span class="p">,</span> <span class="n">disks</span><span class="o">::</span><span class="n">packed</span><span class="p">,</span> <span class="mi">2</span><span class="o">&gt;</span><span class="p">;</span> 
<span class="k">for</span> <span class="p">(</span><span class="n">state</span> <span class="n">s</span> <span class="o">:</span> <span class="n">solver</span><span class="o">::</span><span class="n">list</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">print_state</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="p">,</span> <span class="n">disks</span><span class="o">::</span><span class="n">count</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span></code></pre></figure>

<p>(<a href="https://github.com/rom1v/metahanoi/blob/nodes/metahanoi.cpp">source</a> – <a href="https://github.com/rom1v/metahanoi/commit/nodes">commit</a> – tag <code class="highlighter-rouge">nodes</code>)</p>

<p>En observant le binaire généré, la liste chaînée est directement visible (ici
les octets sont en <a href="https://fr.wikipedia.org/wiki/Endianness#Little_endian">little endian</a>) :</p>

<div class="highlighter-rouge"><pre class="codehilite"><code>$ objdump -sj .data metahanoi

metahanoi:     file format elf64-x86-64

Contents of section .data:
 6012a0 00000000 00000000 00000000 00000000
 6012b0 00000000 00000000 00136000 00000000    n00: { 00000, &amp;n05 }
 6012c0 ca000000 00000000 f0136000 00000000    n01: { 21111, &amp;n20 }
 6012d0 35000000 00000000 70136000 00000000    n02: { 01222, &amp;n12 }
 6012e0 16000000 00000000 30136000 00000000    n03: { 00211, &amp;n08 }
 6012f0 05000000 00000000 10136000 00000000    n04: { 00012, &amp;n06 }
 601300 02000000 00000000 f0126000 00000000    n05: { 00002, &amp;n04 }
 601310 04000000 00000000 e0126000 00000000    n06: { 00011, &amp;n03 }
 601320 18000000 00000000 40136000 00000000    n07: { 00220, &amp;n09 }
 601330 15000000 00000000 20136000 00000000    n08: { 00210, &amp;n07 }
 601340 1a000000 00000000 d0126000 00000000    n09: { 00222, &amp;n02 }
 601350 24000000 00000000 a0136000 00000000    n10: { 01100, &amp;n15 }
 601360 2e000000 00000000 80136000 00000000    n11: { 01201, &amp;n13 }
 601370 34000000 00000000 60136000 00000000    n12: { 01221, &amp;n11 }
 601380 2d000000 00000000 50136000 00000000    n13: { 01200, &amp;n10 }
 601390 29000000 00000000 b0136000 00000000    n14: { 01112, &amp;n16 }
 6013a0 26000000 00000000 90136000 00000000    n15: { 01102, &amp;n14 }
 6013b0 28000000 00000000 c0126000 00000000    n16: { 01111, &amp;n01 }
 6013c0 d8000000 00000000 60146000 00000000    n17: { 22000, &amp;n27 }
 6013d0 c5000000 00000000 20146000 00000000    n18: { 21022, &amp;n23 }
 6013e0 cc000000 00000000 00146000 00000000    n19: { 21120, &amp;n21 }
 6013f0 c9000000 00000000 e0136000 00000000    n20: { 21110, &amp;n19 }
 601400 ce000000 00000000 d0136000 00000000    n21: { 21122, &amp;n18 }
 601410 be000000 00000000 30146000 00000000    n22: { 21001, &amp;n24 }
 601420 c4000000 00000000 10146000 00000000    n23: { 21021, &amp;n22 }
 601430 bd000000 00000000 c0136000 00000000    n24: { 21000, &amp;n17 }
 601440 ee000000 00000000 90146000 00000000    n25: { 22211, &amp;n30 }
 601450 dd000000 00000000 70146000 00000000    n26: { 22012, &amp;n28 }
 601460 da000000 00000000 50146000 00000000    n27: { 22002, &amp;n26 }
 601470 dc000000 00000000 40146000 00000000    n28: { 22011, &amp;n25 }
 601480 f0000000 00000000 a0146000 00000000    n29: { 22220, &amp;n31 }
 601490 ed000000 00000000 80146000 00000000    n30: { 22210, &amp;n29 }
 6014a0 f2000000 00000000 00000000 00000000    n31: { 22222, nullptr }
</code></pre></div>

<p>La colonne de gauche correspond aux adresses des données. Les 4 colonnes
suivantes contiennent des blocs de 4 octets, les deux premiers de chaque ligne
représentant le champ <code class="highlighter-rouge">value</code> et les deux suivants le champ <code class="highlighter-rouge">next</code> de
<code class="highlighter-rouge">ResultNode</code>, que j’ai réécrits de manière plus lisible à droite.</p>

<h2 id="possible">Possible ?</h2>

<p>Cette représentation interpelle : pourquoi ne pas stocker plus simplement les
différents états dans l’ordre, plutôt que d’utiliser des indirections pour
former une liste chaînée ?</p>

<p>Malheureusement, je n’ai pas trouvé de solution pour stocker les états ordonnés
dans un seul tableau d’entiers dès la compilation.</p>

<p>Si quelqu’un y parvient, ça m’intéresse !</p>


guid: http://blog.rom1v.com/2015/07/challenge-reverse-engineering
title: Challenge reverse engineering
url: http://blog.rom1v.com/2015/07/challenge-reverse-engineering/
feedurl: http://blog.rom1v.com/feed/
content:
<p>Un collègue m’a envoyé récemment le lien vers <a href="http://www.nerd.nintendo.com/files/HireMe.cpp">ce challenge</a>, utilisé
pour recruter chez <a href="http://www.nerd.nintendo.com/">NERD</a> (que je ne connais pas).</p>

<p>Je vous le partage car je l’ai trouvé très intéressant. Le but est de trouver un
<em>input</em> qui donne l’<em>output</em> attendu.</p>

<p>Pour info, entre le moment où j’ai eu connaissance du problème et le moment où
je l’ai résolu, il s’est écoulé 6 jours. Je n’ai pas travaillé dessus à plein
temps, mais ne comptez pas le résoudre en 20 minutes ;-)</p>

<p>Je ne publie ni ma réponse au résultat attendu, ni les explications (ce serait
incorrect vis-à-vis des auteurs du challenge). Je fournis par contre à la fin
l’<em>input</em> qui donne comme <em>output</em> mon e-mail, ce qui suffit à prouver que j’ai
résolu le problème.</p>

<p>Amusez-vous bien !</p>

<figure class="highlight"><pre><code class="language-c" data-lang="c"><span class="cp">#include &lt;string.h&gt;
</span>
<span class="k">typedef</span> <span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">u8</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">u32</span><span class="p">;</span>

<span class="n">u8</span> <span class="n">confusion</span><span class="p">[</span><span class="mi">512</span><span class="p">]</span><span class="o">=</span><span class="p">{</span>
<span class="mh">0xac</span><span class="p">,</span><span class="mh">0xd1</span><span class="p">,</span><span class="mh">0x25</span><span class="p">,</span><span class="mh">0x94</span><span class="p">,</span><span class="mh">0x1f</span><span class="p">,</span><span class="mh">0xb3</span><span class="p">,</span><span class="mh">0x33</span><span class="p">,</span><span class="mh">0x28</span><span class="p">,</span><span class="mh">0x7c</span><span class="p">,</span><span class="mh">0x2b</span><span class="p">,</span><span class="mh">0x17</span><span class="p">,</span><span class="mh">0xbc</span><span class="p">,</span><span class="mh">0xf6</span><span class="p">,</span><span class="mh">0xb0</span><span class="p">,</span><span class="mh">0x55</span><span class="p">,</span><span class="mh">0x5d</span><span class="p">,</span>
<span class="mh">0x8f</span><span class="p">,</span><span class="mh">0xd2</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xd3</span><span class="p">,</span><span class="mh">0x78</span><span class="p">,</span><span class="mh">0x62</span><span class="p">,</span><span class="mh">0x1a</span><span class="p">,</span><span class="mh">0x02</span><span class="p">,</span><span class="mh">0xf2</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0xaa</span><span class="p">,</span><span class="mh">0xf0</span><span class="p">,</span><span class="mh">0x83</span><span class="p">,</span><span class="mh">0x71</span><span class="p">,</span>
<span class="mh">0x72</span><span class="p">,</span><span class="mh">0x4b</span><span class="p">,</span><span class="mh">0x6a</span><span class="p">,</span><span class="mh">0xe8</span><span class="p">,</span><span class="mh">0xe9</span><span class="p">,</span><span class="mh">0x42</span><span class="p">,</span><span class="mh">0xc0</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x63</span><span class="p">,</span><span class="mh">0x66</span><span class="p">,</span><span class="mh">0x13</span><span class="p">,</span><span class="mh">0x4a</span><span class="p">,</span><span class="mh">0xc1</span><span class="p">,</span><span class="mh">0x85</span><span class="p">,</span><span class="mh">0xcf</span><span class="p">,</span><span class="mh">0x0c</span><span class="p">,</span>
<span class="mh">0x24</span><span class="p">,</span><span class="mh">0x76</span><span class="p">,</span><span class="mh">0xa5</span><span class="p">,</span><span class="mh">0x6e</span><span class="p">,</span><span class="mh">0xd7</span><span class="p">,</span><span class="mh">0xa1</span><span class="p">,</span><span class="mh">0xec</span><span class="p">,</span><span class="mh">0xc6</span><span class="p">,</span><span class="mh">0x04</span><span class="p">,</span><span class="mh">0xc2</span><span class="p">,</span><span class="mh">0xa2</span><span class="p">,</span><span class="mh">0x5c</span><span class="p">,</span><span class="mh">0x81</span><span class="p">,</span><span class="mh">0x92</span><span class="p">,</span><span class="mh">0x6c</span><span class="p">,</span><span class="mh">0xda</span><span class="p">,</span>
<span class="mh">0xc6</span><span class="p">,</span><span class="mh">0x86</span><span class="p">,</span><span class="mh">0xba</span><span class="p">,</span><span class="mh">0x4d</span><span class="p">,</span><span class="mh">0x39</span><span class="p">,</span><span class="mh">0xa0</span><span class="p">,</span><span class="mh">0x0e</span><span class="p">,</span><span class="mh">0x8c</span><span class="p">,</span><span class="mh">0x8a</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0xfe</span><span class="p">,</span><span class="mh">0x59</span><span class="p">,</span><span class="mh">0x96</span><span class="p">,</span><span class="mh">0x49</span><span class="p">,</span><span class="mh">0xe6</span><span class="p">,</span><span class="mh">0xea</span><span class="p">,</span>
<span class="mh">0x69</span><span class="p">,</span><span class="mh">0x30</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x1c</span><span class="p">,</span><span class="mh">0xe0</span><span class="p">,</span><span class="mh">0xb2</span><span class="p">,</span><span class="mh">0x05</span><span class="p">,</span><span class="mh">0x9b</span><span class="p">,</span><span class="mh">0x10</span><span class="p">,</span><span class="mh">0x03</span><span class="p">,</span><span class="mh">0xa8</span><span class="p">,</span><span class="mh">0x64</span><span class="p">,</span><span class="mh">0x51</span><span class="p">,</span><span class="mh">0x97</span><span class="p">,</span><span class="mh">0x02</span><span class="p">,</span><span class="mh">0x09</span><span class="p">,</span>
<span class="mh">0x8e</span><span class="p">,</span><span class="mh">0xad</span><span class="p">,</span><span class="mh">0xf7</span><span class="p">,</span><span class="mh">0x36</span><span class="p">,</span><span class="mh">0x47</span><span class="p">,</span><span class="mh">0xab</span><span class="p">,</span><span class="mh">0xce</span><span class="p">,</span><span class="mh">0x7f</span><span class="p">,</span><span class="mh">0x56</span><span class="p">,</span><span class="mh">0xca</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0xe3</span><span class="p">,</span><span class="mh">0xed</span><span class="p">,</span><span class="mh">0xf1</span><span class="p">,</span><span class="mh">0x38</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span>
<span class="mh">0x26</span><span class="p">,</span><span class="mh">0x1c</span><span class="p">,</span><span class="mh">0xdc</span><span class="p">,</span><span class="mh">0x35</span><span class="p">,</span><span class="mh">0x91</span><span class="p">,</span><span class="mh">0x43</span><span class="p">,</span><span class="mh">0x2c</span><span class="p">,</span><span class="mh">0x74</span><span class="p">,</span><span class="mh">0xb4</span><span class="p">,</span><span class="mh">0x61</span><span class="p">,</span><span class="mh">0x9d</span><span class="p">,</span><span class="mh">0x5e</span><span class="p">,</span><span class="mh">0xe9</span><span class="p">,</span><span class="mh">0x4c</span><span class="p">,</span><span class="mh">0xbf</span><span class="p">,</span><span class="mh">0x77</span><span class="p">,</span>
<span class="mh">0x16</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0x21</span><span class="p">,</span><span class="mh">0x1d</span><span class="p">,</span><span class="mh">0x2d</span><span class="p">,</span><span class="mh">0xa9</span><span class="p">,</span><span class="mh">0x95</span><span class="p">,</span><span class="mh">0xb8</span><span class="p">,</span><span class="mh">0xc3</span><span class="p">,</span><span class="mh">0x8d</span><span class="p">,</span><span class="mh">0xf8</span><span class="p">,</span><span class="mh">0xdb</span><span class="p">,</span><span class="mh">0x34</span><span class="p">,</span><span class="mh">0xe1</span><span class="p">,</span><span class="mh">0x84</span><span class="p">,</span><span class="mh">0xd6</span><span class="p">,</span>
<span class="mh">0x0b</span><span class="p">,</span><span class="mh">0x23</span><span class="p">,</span><span class="mh">0x4e</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0x3c</span><span class="p">,</span><span class="mh">0x54</span><span class="p">,</span><span class="mh">0xa7</span><span class="p">,</span><span class="mh">0x78</span><span class="p">,</span><span class="mh">0xa4</span><span class="p">,</span><span class="mh">0x89</span><span class="p">,</span><span class="mh">0x33</span><span class="p">,</span><span class="mh">0x6d</span><span class="p">,</span><span class="mh">0xfb</span><span class="p">,</span><span class="mh">0x79</span><span class="p">,</span><span class="mh">0x27</span><span class="p">,</span><span class="mh">0xc4</span><span class="p">,</span>
<span class="mh">0xf9</span><span class="p">,</span><span class="mh">0x40</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0xdf</span><span class="p">,</span><span class="mh">0xc5</span><span class="p">,</span><span class="mh">0x82</span><span class="p">,</span><span class="mh">0x93</span><span class="p">,</span><span class="mh">0xdd</span><span class="p">,</span><span class="mh">0xa6</span><span class="p">,</span><span class="mh">0xef</span><span class="p">,</span><span class="mh">0xcd</span><span class="p">,</span><span class="mh">0x8d</span><span class="p">,</span><span class="mh">0xa3</span><span class="p">,</span><span class="mh">0xae</span><span class="p">,</span><span class="mh">0x7a</span><span class="p">,</span><span class="mh">0xb6</span><span class="p">,</span>
<span class="mh">0x2f</span><span class="p">,</span><span class="mh">0xfd</span><span class="p">,</span><span class="mh">0xbd</span><span class="p">,</span><span class="mh">0xe5</span><span class="p">,</span><span class="mh">0x98</span><span class="p">,</span><span class="mh">0x66</span><span class="p">,</span><span class="mh">0xf3</span><span class="p">,</span><span class="mh">0x4f</span><span class="p">,</span><span class="mh">0x57</span><span class="p">,</span><span class="mh">0x88</span><span class="p">,</span><span class="mh">0x90</span><span class="p">,</span><span class="mh">0x9c</span><span class="p">,</span><span class="mh">0x0a</span><span class="p">,</span><span class="mh">0x50</span><span class="p">,</span><span class="mh">0xe7</span><span class="p">,</span><span class="mh">0x15</span><span class="p">,</span>
<span class="mh">0x7b</span><span class="p">,</span><span class="mh">0x58</span><span class="p">,</span><span class="mh">0xbc</span><span class="p">,</span><span class="mh">0x07</span><span class="p">,</span><span class="mh">0x68</span><span class="p">,</span><span class="mh">0x3a</span><span class="p">,</span><span class="mh">0x5f</span><span class="p">,</span><span class="mh">0xee</span><span class="p">,</span><span class="mh">0x32</span><span class="p">,</span><span class="mh">0x9f</span><span class="p">,</span><span class="mh">0xeb</span><span class="p">,</span><span class="mh">0xcc</span><span class="p">,</span><span class="mh">0x18</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0xe2</span><span class="p">,</span><span class="mh">0x57</span><span class="p">,</span>
<span class="mh">0xb7</span><span class="p">,</span><span class="mh">0x49</span><span class="p">,</span><span class="mh">0x37</span><span class="p">,</span><span class="mh">0xde</span><span class="p">,</span><span class="mh">0xf5</span><span class="p">,</span><span class="mh">0x99</span><span class="p">,</span><span class="mh">0x67</span><span class="p">,</span><span class="mh">0x5b</span><span class="p">,</span><span class="mh">0x3b</span><span class="p">,</span><span class="mh">0xbb</span><span class="p">,</span><span class="mh">0x3d</span><span class="p">,</span><span class="mh">0xb5</span><span class="p">,</span><span class="mh">0x2d</span><span class="p">,</span><span class="mh">0x19</span><span class="p">,</span><span class="mh">0x2e</span><span class="p">,</span><span class="mh">0x0d</span><span class="p">,</span>
<span class="mh">0x93</span><span class="p">,</span><span class="mh">0xfc</span><span class="p">,</span><span class="mh">0x7e</span><span class="p">,</span><span class="mh">0x06</span><span class="p">,</span><span class="mh">0x08</span><span class="p">,</span><span class="mh">0xbe</span><span class="p">,</span><span class="mh">0x3f</span><span class="p">,</span><span class="mh">0xd9</span><span class="p">,</span><span class="mh">0x2a</span><span class="p">,</span><span class="mh">0x70</span><span class="p">,</span><span class="mh">0x9a</span><span class="p">,</span><span class="mh">0xc8</span><span class="p">,</span><span class="mh">0x7d</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span><span class="mh">0x46</span><span class="p">,</span><span class="mh">0x65</span><span class="p">,</span>
<span class="mh">0x22</span><span class="p">,</span><span class="mh">0xf4</span><span class="p">,</span><span class="mh">0xb9</span><span class="p">,</span><span class="mh">0xa2</span><span class="p">,</span><span class="mh">0x6f</span><span class="p">,</span><span class="mh">0x12</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0x14</span><span class="p">,</span><span class="mh">0x45</span><span class="p">,</span><span class="mh">0xc7</span><span class="p">,</span><span class="mh">0x87</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0x60</span><span class="p">,</span><span class="mh">0x29</span><span class="p">,</span><span class="mh">0xf7</span><span class="p">,</span><span class="mh">0x73</span><span class="p">,</span>
<span class="mh">0x2c</span><span class="p">,</span><span class="mh">0x97</span><span class="p">,</span><span class="mh">0x72</span><span class="p">,</span><span class="mh">0xcd</span><span class="p">,</span><span class="mh">0x89</span><span class="p">,</span><span class="mh">0xa6</span><span class="p">,</span><span class="mh">0x88</span><span class="p">,</span><span class="mh">0x4c</span><span class="p">,</span><span class="mh">0xe8</span><span class="p">,</span><span class="mh">0x83</span><span class="p">,</span><span class="mh">0xeb</span><span class="p">,</span><span class="mh">0x59</span><span class="p">,</span><span class="mh">0xca</span><span class="p">,</span><span class="mh">0x50</span><span class="p">,</span><span class="mh">0x3f</span><span class="p">,</span><span class="mh">0x27</span><span class="p">,</span>
<span class="mh">0x4e</span><span class="p">,</span><span class="mh">0xae</span><span class="p">,</span><span class="mh">0x43</span><span class="p">,</span><span class="mh">0xd5</span><span class="p">,</span><span class="mh">0x6e</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0x99</span><span class="p">,</span><span class="mh">0x7b</span><span class="p">,</span><span class="mh">0x7c</span><span class="p">,</span><span class="mh">0x40</span><span class="p">,</span><span class="mh">0x0c</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x86</span><span class="p">,</span><span class="mh">0xc1</span><span class="p">,</span><span class="mh">0x46</span><span class="p">,</span><span class="mh">0x12</span><span class="p">,</span>
<span class="mh">0x5a</span><span class="p">,</span><span class="mh">0x28</span><span class="p">,</span><span class="mh">0xa8</span><span class="p">,</span><span class="mh">0xbb</span><span class="p">,</span><span class="mh">0xcb</span><span class="p">,</span><span class="mh">0xf0</span><span class="p">,</span><span class="mh">0x11</span><span class="p">,</span><span class="mh">0x95</span><span class="p">,</span><span class="mh">0x26</span><span class="p">,</span><span class="mh">0x0d</span><span class="p">,</span><span class="mh">0x34</span><span class="p">,</span><span class="mh">0x66</span><span class="p">,</span><span class="mh">0x22</span><span class="p">,</span><span class="mh">0x18</span><span class="p">,</span><span class="mh">0x6f</span><span class="p">,</span><span class="mh">0x51</span><span class="p">,</span>
<span class="mh">0x9b</span><span class="p">,</span><span class="mh">0x3b</span><span class="p">,</span><span class="mh">0xda</span><span class="p">,</span><span class="mh">0xec</span><span class="p">,</span><span class="mh">0x5e</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x2a</span><span class="p">,</span><span class="mh">0xf5</span><span class="p">,</span><span class="mh">0x8f</span><span class="p">,</span><span class="mh">0x61</span><span class="p">,</span><span class="mh">0xba</span><span class="p">,</span><span class="mh">0x96</span><span class="p">,</span><span class="mh">0xb3</span><span class="p">,</span><span class="mh">0xd1</span><span class="p">,</span><span class="mh">0x30</span><span class="p">,</span><span class="mh">0xdc</span><span class="p">,</span>
<span class="mh">0x33</span><span class="p">,</span><span class="mh">0x75</span><span class="p">,</span><span class="mh">0xe9</span><span class="p">,</span><span class="mh">0x6d</span><span class="p">,</span><span class="mh">0xc8</span><span class="p">,</span><span class="mh">0xa1</span><span class="p">,</span><span class="mh">0x3a</span><span class="p">,</span><span class="mh">0x3e</span><span class="p">,</span><span class="mh">0x5f</span><span class="p">,</span><span class="mh">0x9d</span><span class="p">,</span><span class="mh">0xfd</span><span class="p">,</span><span class="mh">0xa9</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0x9f</span><span class="p">,</span><span class="mh">0xaa</span><span class="p">,</span><span class="mh">0x85</span><span class="p">,</span>
<span class="mh">0x2f</span><span class="p">,</span><span class="mh">0x92</span><span class="p">,</span><span class="mh">0xaf</span><span class="p">,</span><span class="mh">0x67</span><span class="p">,</span><span class="mh">0x78</span><span class="p">,</span><span class="mh">0xa5</span><span class="p">,</span><span class="mh">0xab</span><span class="p">,</span><span class="mh">0x03</span><span class="p">,</span><span class="mh">0x21</span><span class="p">,</span><span class="mh">0x4f</span><span class="p">,</span><span class="mh">0xb9</span><span class="p">,</span><span class="mh">0xad</span><span class="p">,</span><span class="mh">0xfe</span><span class="p">,</span><span class="mh">0xf3</span><span class="p">,</span><span class="mh">0x42</span><span class="p">,</span><span class="mh">0xfc</span><span class="p">,</span>
<span class="mh">0x17</span><span class="p">,</span><span class="mh">0xd7</span><span class="p">,</span><span class="mh">0xee</span><span class="p">,</span><span class="mh">0xa3</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span><span class="mh">0x80</span><span class="p">,</span><span class="mh">0x14</span><span class="p">,</span><span class="mh">0x2e</span><span class="p">,</span><span class="mh">0xa0</span><span class="p">,</span><span class="mh">0x47</span><span class="p">,</span><span class="mh">0x55</span><span class="p">,</span><span class="mh">0xc4</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xe5</span><span class="p">,</span><span class="mh">0x13</span><span class="p">,</span><span class="mh">0x3f</span><span class="p">,</span>
<span class="mh">0x81</span><span class="p">,</span><span class="mh">0xb6</span><span class="p">,</span><span class="mh">0x7a</span><span class="p">,</span><span class="mh">0x94</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0xb5</span><span class="p">,</span><span class="mh">0x54</span><span class="p">,</span><span class="mh">0xbf</span><span class="p">,</span><span class="mh">0x91</span><span class="p">,</span><span class="mh">0xa7</span><span class="p">,</span><span class="mh">0x37</span><span class="p">,</span><span class="mh">0xf1</span><span class="p">,</span><span class="mh">0x6b</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0xb1</span><span class="p">,</span>
<span class="mh">0x3c</span><span class="p">,</span><span class="mh">0xb6</span><span class="p">,</span><span class="mh">0xd9</span><span class="p">,</span><span class="mh">0x32</span><span class="p">,</span><span class="mh">0x24</span><span class="p">,</span><span class="mh">0x8d</span><span class="p">,</span><span class="mh">0xf2</span><span class="p">,</span><span class="mh">0x82</span><span class="p">,</span><span class="mh">0xb4</span><span class="p">,</span><span class="mh">0xf9</span><span class="p">,</span><span class="mh">0xdb</span><span class="p">,</span><span class="mh">0x7d</span><span class="p">,</span><span class="mh">0x44</span><span class="p">,</span><span class="mh">0xfb</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span>
<span class="mh">0xea</span><span class="p">,</span><span class="mh">0x5d</span><span class="p">,</span><span class="mh">0x35</span><span class="p">,</span><span class="mh">0x69</span><span class="p">,</span><span class="mh">0x23</span><span class="p">,</span><span class="mh">0x71</span><span class="p">,</span><span class="mh">0x57</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0x06</span><span class="p">,</span><span class="mh">0xe4</span><span class="p">,</span><span class="mh">0x55</span><span class="p">,</span><span class="mh">0x9a</span><span class="p">,</span><span class="mh">0xa4</span><span class="p">,</span><span class="mh">0x58</span><span class="p">,</span><span class="mh">0x56</span><span class="p">,</span><span class="mh">0xc7</span><span class="p">,</span>
<span class="mh">0x4a</span><span class="p">,</span><span class="mh">0x8c</span><span class="p">,</span><span class="mh">0x8a</span><span class="p">,</span><span class="mh">0xd6</span><span class="p">,</span><span class="mh">0x6a</span><span class="p">,</span><span class="mh">0x49</span><span class="p">,</span><span class="mh">0x70</span><span class="p">,</span><span class="mh">0xc5</span><span class="p">,</span><span class="mh">0x8e</span><span class="p">,</span><span class="mh">0x0a</span><span class="p">,</span><span class="mh">0x62</span><span class="p">,</span><span class="mh">0xdc</span><span class="p">,</span><span class="mh">0x29</span><span class="p">,</span><span class="mh">0x4b</span><span class="p">,</span><span class="mh">0x42</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span>
<span class="mh">0xcb</span><span class="p">,</span><span class="mh">0x2b</span><span class="p">,</span><span class="mh">0xb7</span><span class="p">,</span><span class="mh">0xce</span><span class="p">,</span><span class="mh">0x08</span><span class="p">,</span><span class="mh">0xa1</span><span class="p">,</span><span class="mh">0x76</span><span class="p">,</span><span class="mh">0x1d</span><span class="p">,</span><span class="mh">0x1a</span><span class="p">,</span><span class="mh">0xb8</span><span class="p">,</span><span class="mh">0xe3</span><span class="p">,</span><span class="mh">0xcc</span><span class="p">,</span><span class="mh">0x7e</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x20</span><span class="p">,</span><span class="mh">0xe6</span><span class="p">,</span>
<span class="mh">0xf8</span><span class="p">,</span><span class="mh">0x45</span><span class="p">,</span><span class="mh">0x93</span><span class="p">,</span><span class="mh">0xde</span><span class="p">,</span><span class="mh">0xc3</span><span class="p">,</span><span class="mh">0x63</span><span class="p">,</span><span class="mh">0x0f</span><span class="p">,</span><span class="mh">0xb0</span><span class="p">,</span><span class="mh">0xac</span><span class="p">,</span><span class="mh">0x5c</span><span class="p">,</span><span class="mh">0xba</span><span class="p">,</span><span class="mh">0xdf</span><span class="p">,</span><span class="mh">0x07</span><span class="p">,</span><span class="mh">0x77</span><span class="p">,</span><span class="mh">0xe7</span><span class="p">,</span><span class="mh">0x4e</span><span class="p">,</span>
<span class="mh">0x1f</span><span class="p">,</span><span class="mh">0x28</span><span class="p">,</span><span class="mh">0x10</span><span class="p">,</span><span class="mh">0x6c</span><span class="p">,</span><span class="mh">0x59</span><span class="p">,</span><span class="mh">0xd3</span><span class="p">,</span><span class="mh">0xdd</span><span class="p">,</span><span class="mh">0x2d</span><span class="p">,</span><span class="mh">0x65</span><span class="p">,</span><span class="mh">0x39</span><span class="p">,</span><span class="mh">0xb2</span><span class="p">,</span><span class="mh">0x74</span><span class="p">,</span><span class="mh">0x84</span><span class="p">,</span><span class="mh">0x3d</span><span class="p">,</span><span class="mh">0xf4</span><span class="p">,</span><span class="mh">0xbd</span><span class="p">,</span>
<span class="mh">0xc7</span><span class="p">,</span><span class="mh">0x79</span><span class="p">,</span><span class="mh">0x60</span><span class="p">,</span><span class="mh">0x0b</span><span class="p">,</span><span class="mh">0x4d</span><span class="p">,</span><span class="mh">0x33</span><span class="p">,</span><span class="mh">0x36</span><span class="p">,</span><span class="mh">0x25</span><span class="p">,</span><span class="mh">0xbc</span><span class="p">,</span><span class="mh">0xe0</span><span class="p">,</span><span class="mh">0x09</span><span class="p">,</span><span class="mh">0xcf</span><span class="p">,</span><span class="mh">0x5b</span><span class="p">,</span><span class="mh">0xe2</span><span class="p">,</span><span class="mh">0x38</span><span class="p">,</span><span class="mh">0x9e</span><span class="p">,</span>
<span class="mh">0xc0</span><span class="p">,</span><span class="mh">0xef</span><span class="p">,</span><span class="mh">0xd2</span><span class="p">,</span><span class="mh">0x16</span><span class="p">,</span><span class="mh">0x05</span><span class="p">,</span><span class="mh">0xbe</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0xf7</span><span class="p">,</span><span class="mh">0xc2</span><span class="p">,</span><span class="mh">0xc6</span><span class="p">,</span><span class="mh">0xa2</span><span class="p">,</span><span class="mh">0x24</span><span class="p">,</span><span class="mh">0x98</span><span class="p">,</span><span class="mh">0x1c</span><span class="p">,</span><span class="mh">0xad</span><span class="p">,</span><span class="mh">0x04</span><span class="p">};</span>

<span class="n">u32</span> <span class="n">diffusion</span><span class="p">[</span><span class="mi">32</span><span class="p">]</span><span class="o">=</span><span class="p">{</span>
<span class="mh">0xf26cb481</span><span class="p">,</span><span class="mh">0x16a5dc92</span><span class="p">,</span><span class="mh">0x3c5ba924</span><span class="p">,</span><span class="mh">0x79b65248</span><span class="p">,</span><span class="mh">0x2fc64b18</span><span class="p">,</span><span class="mh">0x615acd29</span><span class="p">,</span><span class="mh">0xc3b59a42</span><span class="p">,</span><span class="mh">0x976b2584</span><span class="p">,</span>
<span class="mh">0x6cf281b4</span><span class="p">,</span><span class="mh">0xa51692dc</span><span class="p">,</span><span class="mh">0x5b3c24a9</span><span class="p">,</span><span class="mh">0xb6794852</span><span class="p">,</span><span class="mh">0xc62f184b</span><span class="p">,</span><span class="mh">0x5a6129cd</span><span class="p">,</span><span class="mh">0xb5c3429a</span><span class="p">,</span><span class="mh">0x6b978425</span><span class="p">,</span>
<span class="mh">0xb481f26c</span><span class="p">,</span><span class="mh">0xdc9216a5</span><span class="p">,</span><span class="mh">0xa9243c5b</span><span class="p">,</span><span class="mh">0x524879b6</span><span class="p">,</span><span class="mh">0x4b182fc6</span><span class="p">,</span><span class="mh">0xcd29615a</span><span class="p">,</span><span class="mh">0x9a42c3b5</span><span class="p">,</span><span class="mh">0x2584976b</span><span class="p">,</span>
<span class="mh">0x81b46cf2</span><span class="p">,</span><span class="mh">0x92dca516</span><span class="p">,</span><span class="mh">0x24a95b3c</span><span class="p">,</span><span class="mh">0x4852b679</span><span class="p">,</span><span class="mh">0x184bc62f</span><span class="p">,</span><span class="mh">0x29cd5a61</span><span class="p">,</span><span class="mh">0x429ab5c3</span><span class="p">,</span><span class="mh">0x84256b97</span><span class="p">};</span>

<span class="n">u8</span> <span class="n">input</span><span class="p">[</span><span class="mi">32</span><span class="p">]</span><span class="o">=</span><span class="p">{</span>
<span class="c1">//change only this :
</span><span class="mh">0x66</span><span class="p">,</span><span class="mh">0xd5</span><span class="p">,</span><span class="mh">0x4e</span><span class="p">,</span><span class="mh">0x28</span><span class="p">,</span><span class="mh">0x5f</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0x6b</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0xac</span><span class="p">,</span><span class="mh">0x3b</span><span class="p">,</span><span class="mh">0x34</span><span class="p">,</span><span class="mh">0x14</span><span class="p">,</span><span class="mh">0xb5</span><span class="p">,</span><span class="mh">0x3c</span><span class="p">,</span><span class="mh">0xb2</span><span class="p">,</span><span class="mh">0xc6</span><span class="p">,</span>
<span class="mh">0xa4</span><span class="p">,</span><span class="mh">0x85</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0x0d</span><span class="p">,</span><span class="mh">0x86</span><span class="p">,</span><span class="mh">0xc7</span><span class="p">,</span><span class="mh">0x4f</span><span class="p">,</span><span class="mh">0xba</span><span class="p">,</span><span class="mh">0x75</span><span class="p">,</span><span class="mh">0x5e</span><span class="p">,</span><span class="mh">0xcb</span><span class="p">,</span><span class="mh">0xc3</span><span class="p">,</span><span class="mh">0x6e</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x79</span><span class="p">,</span><span class="mh">0x8f</span>
<span class="c1">//
</span><span class="p">};</span>

<span class="kt">void</span> <span class="nf">Forward</span><span class="p">(</span><span class="n">u8</span> <span class="n">c</span><span class="p">[</span><span class="mi">32</span><span class="p">],</span><span class="n">u8</span> <span class="n">d</span><span class="p">[</span><span class="mi">32</span><span class="p">],</span><span class="n">u8</span> <span class="n">s</span><span class="p">[</span><span class="mi">512</span><span class="p">],</span><span class="n">u32</span> <span class="n">p</span><span class="p">[</span><span class="mi">32</span><span class="p">])</span>
<span class="p">{</span>
    <span class="k">for</span><span class="p">(</span><span class="n">u32</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="n">i</span><span class="o">&lt;</span><span class="mi">256</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">for</span><span class="p">(</span><span class="n">u8</span> <span class="n">j</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="n">j</span><span class="o">&lt;</span><span class="mi">32</span><span class="p">;</span><span class="n">j</span><span class="o">++</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="n">d</span><span class="p">[</span><span class="n">j</span><span class="p">]</span><span class="o">=</span><span class="n">s</span><span class="p">[</span><span class="n">c</span><span class="p">[</span><span class="n">j</span><span class="p">]];</span>
            <span class="n">c</span><span class="p">[</span><span class="n">j</span><span class="p">]</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="k">for</span><span class="p">(</span><span class="n">u8</span> <span class="n">j</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="n">j</span><span class="o">&lt;</span><span class="mi">32</span><span class="p">;</span><span class="n">j</span><span class="o">++</span><span class="p">)</span>
            <span class="k">for</span><span class="p">(</span><span class="n">u8</span> <span class="n">k</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="n">k</span><span class="o">&lt;</span><span class="mi">32</span><span class="p">;</span><span class="n">k</span><span class="o">++</span><span class="p">)</span>
                <span class="n">c</span><span class="p">[</span><span class="n">j</span><span class="p">]</span><span class="o">^=</span><span class="n">d</span><span class="p">[</span><span class="n">k</span><span class="p">]</span><span class="o">*</span><span class="p">((</span><span class="n">p</span><span class="p">[</span><span class="n">j</span><span class="p">]</span><span class="o">&gt;&gt;</span><span class="n">k</span><span class="p">)</span><span class="o">&amp;</span><span class="mi">1</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">for</span><span class="p">(</span><span class="n">u8</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="n">i</span><span class="o">&lt;</span><span class="mi">16</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">)</span>
        <span class="n">d</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">=</span><span class="n">s</span><span class="p">[</span><span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="o">*</span><span class="mi">2</span><span class="p">]]</span><span class="o">^</span><span class="n">s</span><span class="p">[</span><span class="n">c</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">1</span><span class="p">]</span><span class="o">+</span><span class="mi">256</span><span class="p">];</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span>
<span class="p">{</span>
    <span class="n">u8</span> <span class="n">target</span><span class="p">[]</span><span class="o">=</span><span class="s">"Hire me!!!!!!!!"</span><span class="p">;</span>
    <span class="n">u8</span> <span class="n">output</span><span class="p">[</span><span class="mi">32</span><span class="p">];</span>

    <span class="n">Forward</span><span class="p">(</span><span class="n">input</span><span class="p">,</span><span class="n">output</span><span class="p">,</span><span class="n">confusion</span><span class="p">,</span><span class="n">diffusion</span><span class="p">);</span>

    <span class="k">return</span> <span class="n">memcmp</span><span class="p">(</span><span class="n">output</span><span class="p">,</span><span class="n">target</span><span class="p">,</span><span class="mi">16</span><span class="p">);</span> <span class="c1">// =&gt; contact jobs(at)nerd.nintendo.com
</span><span class="p">}</span></code></pre></figure>

<p>Ma preuve de solution :</p>

<figure class="highlight"><pre><code class="language-diff" data-lang="diff"><span class="gh">diff --git a/HireMe.cpp b/HireMe.cpp
index ca94719..8374683 100644
</span><span class="gd">--- a/HireMe.cpp
</span><span class="gi">+++ b/HireMe.cpp
</span><span class="gu">@@ -45,8 +45,8 @@ u32 diffusion[32]={
</span> 
 u8 input[32]={
 //change only this :
<span class="gd">-0x66,0xd5,0x4e,0x28,0x5f,0xff,0x6b,0x53,0xac,0x3b,0x34,0x14,0xb5,0x3c,0xb2,0xc6,
-0xa4,0x85,0x1e,0x0d,0x86,0xc7,0x4f,0xba,0x75,0x5e,0xcb,0xc3,0x6e,0x48,0x79,0x8f
</span><span class="gi">+0x82,0x69,0xd7,0x3c,0xd7,0x58,0xd7,0x0d,0x22,0x46,0x58,0x22,0x22,0x69,0x22,0x77,
+0x77,0xd7,0x77,0xe6,0xf8,0x22,0xd7,0x58,0x9c,0x58,0x3c,0xf8,0xf8,0x22,0x58,0x13
</span> //
 };
 
<span class="gu">@@ -70,7 +70,7 @@ void Forward(u8 c[32],u8 d[32],u8 s[512],u32 p[32])
</span> 
 int main(int argc, char* argv[])
 {
<span class="gd">-   u8 target[]="Hire me!!!!!!!!";
</span><span class="gi">+   u8 target[]="[rom@rom1v.com]";
</span>    u8 output[32];
 
    Forward(input,output,confusion,diffusion);</code></pre></figure>


