# articles

feed_id: https://carlchenet.com/htop-explique-partie-7-utilisation-de-la-memoire/
title: Carl Chenet : htop expliqué, partie 7 : utilisation de la mémoire
uri: Carl-Chenet-htop-expliqué-partie-7-utilisation-de-la-mémoire
url: https://carlchenet.com/htop-explique-partie-7-utilisation-de-la-memoire/
content:
<p>Article arrivé 1er sur <a href="https://news.ycombinator.com/">Hacker News</a>, 1er sur <a href="https://www.reddit.com/r/sysadmin/">/r/sysadmin</a>, 2nd sur <a href="https://www.reddit.com/r/linux/">/r/linux</a>), traduit avec l’accord de son auteur <a href="https://peteris.rocks/">Pēteris Ņikiforovs</a>, il présente la commande <a href="https://hisham.hm/htop/">htop</a> et les notions de base des composants d’un système GNU/Linux que cette commande affiche.</p>
<p><span></span></p>
<p>Voici les différents chapitres déjà publiés :</p>
<ol><li><a href="https://carlchenet.com/htop-explique-luptime/">l’uptime</a></li>
<li><a href="https://carlchenet.com/htop-explique-partie-2-le-load-average/">la load average (charge moyenne)</a></li>
<li><a href="https://carlchenet.com/htop-explique-partie-3-les-processus/">les processus</a></li>
<li><a href="https://carlchenet.com/htop-explique-partie-4-les-processus-utilisateur/">les processus utilisateur</a></li>
<li><a href="https://carlchenet.com/htop-explique-partie-5-letat-des-processus/">l’état des processus</a></li>
<li><a href="https://carlchenet.com/htop-explique-partie-6-temps-et-priorite-des-processus/">temps et priorités des processus</a></li>
</ol><p>Aujourd’hui : l’usage de la mémoire</p>
<hr><p><img src="media/f8762536.htop.png" data-original-source="https://carlchenet.com/wp-content/uploads/2016/12/htop.png" alt="htop" width="973" height="546" srcset="https://carlchenet.com/wp-content/uploads/2016/12/htop.png 973w, https://carlchenet.com/wp-content/uploads/2016/12/htop-300x168.png 300w, https://carlchenet.com/wp-content/uploads/2016/12/htop-768x431.png 768w" sizes="(max-width: 973px) 100vw, 973px"></p>
<h1>Usage de la mémoire – VIRT/RES/SHR/MEM</h1>
<p>Un processus a l’illusion d’être seul à s’exécuter en mémoire. Cela est réalisé en utilisant la mémoire virtuelle.</p>
<p>Un processus n’a pas un accès direct à la mémoire physique. À la place, il a son propre espace virtuel d’adressage et le noyau fait correspondre les adresses de la mémoire virtuelle à la mémoire physique ou peut en mettre une partie sur disque. C’est pour cela qu’il semble que les processus utilisent plus de mémoire que celle installée sur votre système.</p>
<p>Le point que je veux souligner ici est qu’il n’est pas simple de savoir combien de mémoire un processus prend. Voulez-vous aussi comptabiliser les bibliothèques partagées ou en mémoire sur disque ? Mais le noyau le permet et htop montre des informations qui vous aident à estimer l’usage de la mémoire.</p>
<p>Voilà ce que les couleurs d’utilisation de la mémoire signifient :</p>
<ul><li>Vert : mémoire utilisée</li>
<li>Bleu : buffers</li>
<li>Orange : cache</li>
</ul><h2>VIRT/VSZ – image virtuelle</h2>
<p>La quantité totale de mémoire virtuelle utilisé par une tâche. Cela inclut tout le code, les données et les bibliothèques partagées plus les pages qui ont été mises dans la swap (ndt : sur disque) et les pages qui ont été mises sur disque mais pas utilisées.</p>
<p>VIRT est l’usage de la mémoire . Cela inclut tout, y compris les fichiers de mémoire sur disque.</p>
<p>Si une application demande 1 gigaoctet de mémoire mais n’en utilise que 1 mégaoctet, donc VIRT indiquera 1 gigaoctet. S’il fait correspondre cette mémoire vers un fichier de 1 gigaoctet et ne l’utilise jamais, VIRT indiquera également 1 gigaoctet.</p>
<p>La plupart du temps, ce n’est pas un nombre très utile.</p>
<h2>RES/RSS – taille résidente</h2>
<p>La taille de la mémoire physique non-mise en swap qu’une tâche utilise.</p>
<p>RES est l’usage de la mémoire résidente, c’est-à-dire ce qui est en ce moment en mémoire physique.</p>
<p>Si RES peut être un meilleur indicateur de l’utilisation de la mémoire par un processus que VIRT, gardez en tête que</p>
<ul><li>cela n’inclut pas la mémoire swappée (ndt : sur disque)</li>
<li>une partie de la mémoire peut être partagée avec d’autres processus</li>
</ul><p>Si un processus utilise 1 gigaoctet de mémoire et qu’il appelle fork(), le résultat de la bifurcation sera 2 processus dont RES est également 1 gigaoctet mais seulement 1 gigaoctet de mémoire sera en fait utilisée puisque Linux utilise copy-on-write.</p>
<h2>SHR – taille de la mémoire partagée</h2>
<p>La quantité de mémoire partagée utilisée par une tâche<br>
Cela représente simplement la mémoire qui pourrait potentiellement être partagée par d’autres processus.</p>
<pre>#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
 printf("Started\\n");
 sleep(10);

size_t memory = 10 * 1024 * 1024; // 10 MB
 char* buffer = malloc(memory);
 printf("Allocated 10M\\n");
 sleep(10);

for (size_t i = 0; i < memory/2; i++)
 buffer[i] = 42;
 printf("Used 5M\\n");
 sleep(10);

int pid = fork();
 printf("Forked\\n");
 sleep(10);

if (pid != 0) {
 for (size_t i = memory/2; i < memory/2 + memory/5; i++)
 buffer[i] = 42;
 printf("Child used extra 2M\\n");
 }
 sleep(10);

return 0;
}

fallocate -l 10G
gcc -std=c99 mem.c -o mem
./mem

Process Message VIRT RES SHR
main Started 4200 680 604
main Allocated 10M 14444 680 604
main Used 5M 14444 6168 1116
main Forked 14444 6168 1116
child Forked 14444 5216 0
main Child used extra 2M 8252 1116
child Child used extra 2M 5216 0

À faire : je devrais finir ça.</pre>
<h2>MEM% – utilisation de la mémoire</h2>
<p>La part de la mémoire physique disponible couramment utilisée par une tâche.<br>
Il s’agit de RES divisé par la totalité de la RAM que vous avez.<br>
Si RES est de 400 megaoctets et que vous avez 8 gigaoctets de RAM, MEM% sera 200/8192*100 = 2.4%.</p>
<hr><p>J’espère que vous aurez compris le fonctionnement des différents indicateurs de la mémoire dans htop. Pour le dernier article de cette série, nous étudierons les processus lancés au démarrage d’un système GNU/Linux.</p>
<p><img src="media/46f73009.e1f1addc890668ce2561431b7be810bc" data-original-source="http://cdn.libravatar.org/avatar/e1f1addc890668ce2561431b7be810bc" alt="Gravatar de Carl Chenet" class="gravatar" /><br/><i>Original post of <a href="https://carlchenet.com/htop-explique-partie-7-utilisation-de-la-memoire/" title="Visit the source">Carl Chenet</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>Carl Chenet : <a href="">htop expliqu&eacute;, partie 1 : l&rsquo;uptime</a> (06/12/2016)</li><li>Carl Chenet : <a href="">htop expliqu&eacute;, partie 2 : le load average</a> (08/12/2016)</li><li>Carl Chenet : <a href="">htop expliqu&eacute;, partie 3 : les processus</a> (14/12/2016)</li><li>Carl Chenet : <a href="">htop expliqu&eacute;, partie 5 : l&rsquo;&eacute;tat des processus</a> (22/12/2016)</li><li>Carl Chenet : <a href="">htop expliqu&eacute;, partie 6 : temps et priorit&eacute;s des processus</a> (27/12/2016)</li></ul></div></p>


feed_id: https://www.petitpouyo.fr/donner-une-seconde-vie-a-un-netbook-de-2010/
title: Petit Pouyo : Donner une seconde vie à un netbook de 2010
uri: Petit-Pouyo-Donner-une-seconde-vie-à-un-netbook-de-2010
url: https://www.petitpouyo.fr/donner-une-seconde-vie-a-un-netbook-de-2010/
content:
<p><strong>J’ai récupérer il y a quelques jours un Toshiba NB250-101, un netbook sorti en 2010 équipé de Windows 7. Autant vous dire que cette petite bécane ramait à mort et rendait son utilisation quasiment impossible, il a donc fallu trouver un moyen de lui redonner un peu de pep’s.</strong><span></span></p>
<h3><strong>Petit tour de la bêbête</strong></h3>
<p>Le Toshiba NB250-101 est un netbook c’est à dire un ordinateur de très petite taille, aux performances plus faibles qu’un ultraportable classique (cf. <a href="https://fr.wikipedia.org/wiki/Netbook">Wikipedia</a>), doté d’un écran de 10.1 pouces ce miniportable contient un disque dur de 160Go et d’une mémoire vive d’1 Go, pas féroce n’est ce pas ? <img src="media/70955cbf.1f609.png" data-original-source="https://s.w.org/images/core/emoji/2.2.1/72x72/1f609.png" alt="😉"> À l’origine il est vendu avec Windows 7 Starter Edition… Pour pousser le tout il est équipé d’un processeur Intel Atom Pineview N455 qui supporte la DDR3, ah j’oubliais, c’est un 32bits.</p>
<p>Bref rien de bien transcendant (cc <a href="https://twitter.com/cristinacordula">Córdula</a>), je pense qu’à sa sortie c’était une belle acquisition qui devait faire ce qu’on lui demande sans trop de chichi pour 280€ neuf en tout cas bien mieux que dans l’état dans lequel je l’ai récupérer. Laisser pour mort au fin fond d’un tiroir du grenier chez mes parents car devenu trop inutilisable pour ma petite maman qui à préféré s’acheter un iPad Air à la place.</p>
<p>En effet au démarrage du netbook tout se lance en un clin d’œil mais ça c’est avant l’ouverture de la session Windows, s’en suit alors une réaction en chaîne de programme qui se lancent dès l’ouverture qui alourdit considérablement la bécane, sans compter Skype qui se fige en plein milieu de l’écran, eBay qui fait chier aussi, Windows Live Essentials (c’est pas une blague)… et pour couronner le tout McAfee qui s’affole car ça fait 3 ans que le bitoniau était éteint donc pas du tout à jour enfin bref une calamité cosmique !</p>
<h3><strong>À L’AIDEEEEEEEEEE</strong></h3>
<p>Personnellement on me prend pas la pine longtemps j’ai donc tout couper de force et suis parti à la <a href="http://frederic.bezies.free.fr/blog/?s=ma+qu%C3%AAte">quête</a> d’une distribution Linux légère pour donner une seconde vie à ce netbook qui me servira peut-être d’ordi de secours dans le futur. Mon réflexe à été d’essayer Xubuntu mais c’est trop puissant et impossible à lancer dessus, après avoir parcouru la toile et sauter de forum en forum j’ai tester Lubuntu qui démarre sans aucuns pépins dessus mais à la longue est aussi trop puissant pour le Toshiba qui fini par se figer quelques fois comme à l’ouverture de Firefox par exemple.</p>
<p>Il existe pleins de distributions Linux plus ou moins légères mais les supports techniques en français se font rares et pour certains distro les supports anglais ne sont plus à jours depuis plusieurs années donc pas enfin de me prendre la tête à jouer l’Indiana Jones du cambouis tu vois alors après avoir lu les 3 articles de <a href="http://frederic.bezies.free.fr/blog/?s=ma+qu%C3%AAte">Frédéric Béziès</a> qui a tenté il y a un an de jouer au docteur Frankenstein avec son Asus eeePC 1005 j’ai opté pour Debian.</p>
<p><strong>Dé dé dé Débiannnnnnnnnnn<br></strong><em>(titre à lire avec l’air de la <a href="https://www.youtube.com/watch?v=_4IRMYuE1hI">symphonie n°5 de Beethoven</a>)</em></p>
<p>En effet Debian est réputé pour pouvoir tourner sur de vieilles bécane, couplé avec XFCE un environnement rapide et léger. Je ne me suis jamais aventurer chez Debian, ayant toujours utiliser Ubuntu comme OS chez Linux j’avais un peu peur de sauter le pas mais le mode de fonctionnement reste quasiment identique (mise à part l’histoire des PPA et des DEB).</p>
<p>Comme je n’ai pas vraiment envie de me prendre la tête surtout pour un ordinateur que j’utiliserais occasionnellement je suis tomber sur <a href="https://lescahiersdudebutant.fr/dflinux.html">DFLinux</a> qui basé sur Debian avec XFCE et quelques outils additionnels pour les débutants sur Debian de ce fait que l’OS est utilisable aussi bien par un môme de 6 ans que par un senior. L’avantage outre le fait de la simplicité d’utilisation c’est l’existence d’une communauté française très active <a href="https://debian-facile.org/">Debian-Facile</a>.</p>
<p><img src="https://i2.wp.com/www.petitpouyo.fr/wp-content/uploads/2016/12/15732387_1350305158355085_9020123190617552604_o.jpg?resize=618%2C362&amp;ssl=1" alt="" srcset="https://i2.wp.com/www.petitpouyo.fr/wp-content/uploads/2016/12/15732387_1350305158355085_9020123190617552604_o.jpg?w=1024&amp;ssl=1 1024w, https://i2.wp.com/www.petitpouyo.fr/wp-content/uploads/2016/12/15732387_1350305158355085_9020123190617552604_o.jpg?resize=300%2C176&amp;ssl=1 300w, https://i2.wp.com/www.petitpouyo.fr/wp-content/uploads/2016/12/15732387_1350305158355085_9020123190617552604_o.jpg?resize=768%2C450&amp;ssl=1 768w, https://i2.wp.com/www.petitpouyo.fr/wp-content/uploads/2016/12/15732387_1350305158355085_9020123190617552604_o.jpg?resize=150%2C88&amp;ssl=1 150w, https://i2.wp.com/www.petitpouyo.fr/wp-content/uploads/2016/12/15732387_1350305158355085_9020123190617552604_o.jpg?resize=600%2C352&amp;ssl=1 600w" sizes="(max-width: 618px) 100vw, 618px" data-recalc-dims="1"></p>
<h3>Fin de l’histoire et coup de pouce</h3>
<p>J’ai galérer à virer Windows du netbook, en effet il était impossible de supprimer la partition où il était installer. Bien évidemment on peu pas virer Windows en passant par Windows (lol) d’ailleurs c’était mission impossible pour moi vu l’état de l’engin à l’ouverture de la session, ensuite j’ai balancer un live avec Lubuntu pour destroy la partition avec Gparted mais la aussi impossible de démonter la partition pour y faire quoi que ce soit….</p>
<p>Au final j’ai carrément télécharger l’ISO de Gparted pour le lancer en live sur le netbook, tonnerre de Brest ! Via cette solution la partition parasite à été éliminée avec succès. À partir de la on peu installer n’importe quel système d’exploitation sans aucuns soucis <img src="media/78924bcd.1f642.png" data-original-source="https://s.w.org/images/core/emoji/2.2.1/72x72/1f642.png" alt="🙂"></p>
<p><img src="https://i2.wp.com/www.petitpouyo.fr/wp-content/uploads/2016/12/2016-12-27-235132_1024x600_scrot.png?resize=618%2C362&amp;ssl=1" alt="" srcset="https://i2.wp.com/www.petitpouyo.fr/wp-content/uploads/2016/12/2016-12-27-235132_1024x600_scrot.png?w=1024&amp;ssl=1 1024w, https://i2.wp.com/www.petitpouyo.fr/wp-content/uploads/2016/12/2016-12-27-235132_1024x600_scrot.png?resize=300%2C176&amp;ssl=1 300w, https://i2.wp.com/www.petitpouyo.fr/wp-content/uploads/2016/12/2016-12-27-235132_1024x600_scrot.png?resize=768%2C450&amp;ssl=1 768w, https://i2.wp.com/www.petitpouyo.fr/wp-content/uploads/2016/12/2016-12-27-235132_1024x600_scrot.png?resize=150%2C88&amp;ssl=1 150w, https://i2.wp.com/www.petitpouyo.fr/wp-content/uploads/2016/12/2016-12-27-235132_1024x600_scrot.png?resize=600%2C352&amp;ssl=1 600w" sizes="(max-width: 618px) 100vw, 618px" data-recalc-dims="1"></p>
<p><iframe type="text/html" width="618" height="378" src="https://www.youtube.com/embed/slP4oNsJsHs?version=3&amp;rel=1&amp;fs=1&amp;autohide=2&amp;showsearch=0&amp;showinfo=1&amp;iv_load_policy=1&amp;wmode=transparent" allowfullscreen="true"></iframe></p>
<p> </p>
<a href="https://www.petitpouyo.fr/wp-content/plugins/share-on-diaspora/new_window.php?url=https%3A%2F%2Fwww.petitpouyo.fr%2Fdonner-une-seconde-vie-a-un-netbook-de-2010%2F&amp;title=Donner%20une%20seconde%20vie%20%C3%A0%20un%20netbook%20de%202010" target="_blank"><span><font>Partager sur diaspora*</font> <span><img src="https://i2.wp.com/www.petitpouyo.fr/wp-content/plugins/share-on-diaspora/images/asterisk-20.png?w=618&amp;ssl=1" alt="" data-recalc-dims="1"></span></span></a><p>Cet article <a rel="nofollow" href="https://www.petitpouyo.fr/donner-une-seconde-vie-a-un-netbook-de-2010/">Donner une seconde vie à un netbook de 2010</a> est apparu en premier sur <a rel="nofollow" href="https://www.petitpouyo.fr/">Petit Pouyo</a>.</p>
<p><img src="media/b0ef002c.c0afbcd218a95bb258589c6f50529449" data-original-source="http://cdn.libravatar.org/avatar/c0afbcd218a95bb258589c6f50529449" alt="Gravatar de Petit Pouyo" class="gravatar" /><br/><i>Original post of <a href="https://www.petitpouyo.fr/donner-une-seconde-vie-a-un-netbook-de-2010/" title="Visit the source">Petit Pouyo</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>


feed_id: http://ilphrin.com/planet/2016/12/27/un-nouveau-stock-de-musiques-libres.html
title: Ilphrin : Un nouveau stock de musiques en libre écoute
uri: Ilphrin-Un-nouveau-stock-de-musiques-en-libre-écoute
url: http://ilphrin.com/planet/2016/12/27/un-nouveau-stock-de-musiques-libres.html
content:
<p>Je n’en parle pas beaucoup, mais je suis un grand féru de musique et, bien que je ne sois pas un connaisseur technique dans le domaine, j’apprécie énormément la découverte de nouveaux groupes et de nouveaux genres. Je vais régulièrement sur le site de <a href="https://jamendo.com/">Jamendo</a>, qui présente un paquet d’artistes très hétérogènes, le tout sous écoute libre pour un usage personnel. Pour changer un peu du thème de l’informatique je me suis dit que j’allais faire un premier pack des derniers groupes que j’ai écouté sur le site.</p>

<!--break-->

<p>Pour chaque artiste, groupe, ou album le titre est un lien vers l’une des musiques qui lui est lié.</p>

<div><div><p><img src="media/9f1a8d06.djspooky.jpg" data-original-source="http://ilphrin.com/images/djspooky.jpg" alt="DJ Spooky"></p>
</div><div><h3><a href="http://ilphrin.com/kevin/projects/dodgell.html">DJ Spooky</a></h3>

<p>C’est pas courant que j’en écoute alors je vais commencer par un peu de musique électronique. DJ Spooky est un compositeur, éditeur et auteur américain, et a sorti dernièrement un projet nommé <a href="http://djspooky.com/antarctica/">Book of Ice</a> qui parle de l’Antarctique. Dans ce projet on retrouve un album composé par lui-même dans un style électro qui s’appelle <a href="https://www.jamendo.com/album/122759/of-water-and-ice">Of Water And Ice</a>.</p>

<p>La musique qui m’a le plus marqué est la musique éponyme de l’album, qui reflète beaucoup ce continent glacé notamment avec l’écho de la voix qui donne une impression de vasteté. À écouter pour les amateurs d’électro ;)</p>
</div></div>

<div><div><h3><a href="https://www.jamendo.com/track/1284466/we-are-victorious">Alumno Music</a></h3>

<p><a href="https://www.alumomusic.com/">Alumno Music</a> est un studio de musique indépendant dirigé par l’anglais Matt Harris, compositeur, producteur, designer et photographe. Son studio produit des musiques de plusieurs genres allant de la “musique inspirante” au pop et au (gentil) rock. Je vais parler d’une musique en particulier de ce créateur car je n’en ai pas encore écouté d’autres, qui s’appelle <a href="https://www.jamendo.com/track/1284466/we-are-victorious">We Are Victorious</a>. C’est une musique avec un rythme assez doux et une majorité de sons éléctroniques.</p>

<p>C’est une musique assez agréable à entendre pour se détendre, ou que j’écoute parfois en faisant une activité comme de la peinture ou de la cuisine, à voir ce que donne le reste de ses musiques pour voir ce qu’elle valent!</p>
</div><div><p><span><img src="media/1e09410b.alumno.jpg" data-original-source="http://ilphrin.com/images/alumno.jpg" alt="Alumno"></span></p>
</div></div>

<div><div><p><span><img src="media/a4885753.akashicRecords.jpg" data-original-source="http://ilphrin.com/images/akashicRecords.jpg" alt="Akashic Records"></span></p>
</div><div><h3><a href="https://www.jamendo.com/track/1158368/the-final-battle-no-vox">Akashic Records</a></h3>

<p>Encore une fois je n’ai écouté qu’une seule musique (au moins ça vous poussera à aller écouter par vous-même le reste ;)). <a href="http://saregama-music.blogspot.fr/">Akashic Records</a> est un projet audiovisuel fondé par le compositeur et producteur Saregama (aka Serge). Il crée de la musique mais aussi des films, documentaires, des campagnes publicitaires, etc. La musique que j’ai écouté s’appelle <a href="https://www.jamendo.com/track/1158368/the-final-battle-no-vox">The Final Battle</a>, c’est de la musique classique mais qui s’apparente beacoup à une bande-son de film hollywoodien, avec un côté épique.</p>

<p>D’ailleurs la jaquette est un spartiate tel qu’on peut le voir dans le film 300 avec son allure dynamique et son tas de muscles. C’est une musique assez entrainante, qui passerait bien aussi pour un trailer de jeu-vidéo.</p>
</div></div>

<div><div><h3><a href="https://www.jamendo.com/track/1305561/fiore-d-inchiostro">Mattia Vlad Morleo</a></h3>

<p>On termine en douceur avec un compositeur italien du nom de <a href="http://nuke.morleoeditore.com/">Mattia Vlad Morleo</a>, il fait presque exclusivement de la musique classique avec comme instrument principal du piano. C’est le style le plus calme des 4 groupes/compositeurs que je présente ici, j’utilise notamment <a href="https://www.jamendo.com/track/1305561/fiore-d-inchiostro">Fiore D’Inchiostro</a> pour le menu de mon jeu vidéo <a href="http://ilphrin.com/kevin/projects/dodgell.html">Dodgell</a></p>
</div><div><p><span><img src="media/b434cd52.mattiaVladMorleo.jpg" data-original-source="http://ilphrin.com/images/mattiaVladMorleo.jpg" alt="Mattia Vlad Morleo"></span></p>
</div></div>

<div><div>
<p>Si je devais parler de tous les groupes que j’écoute sur Jamendo on ne s’en sortirait pas donc je vais m’arrêter là pour le moment, je sortirais peut-être une deuxième article sur le sujet si l’envie s’en fait ressentir ;)</p>
</div></div>
<p><img src="media/9292dabf.235511b5004cfd4af8c43a8b06c9e121" data-original-source="http://cdn.libravatar.org/avatar/235511b5004cfd4af8c43a8b06c9e121" alt="Gravatar de Ilphrin" class="gravatar" /><br/><i>Original post of <a href="http://ilphrin.com/planet/2016/12/27/un-nouveau-stock-de-musiques-libres.html" title="Visit the source">Ilphrin</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>


feed_id: https://girinstud.io/news/2016/12/zemarmot-compte-rendu-de-fin-2016/
title: Jehan : ZeMarmot: compte-rendu de fin 2016
uri: Jehan-ZeMarmot-compte-rendu-de-fin-2016
url: https://girinstud.io/news/2016/12/zemarmot-compte-rendu-de-fin-2016/
content:
<p><img src="media/1353e7fe.zemarmot-sticker-hi.png" data-original-source="http://girinstud.io/log/wp-content/uploads/2016/12/zemarmot-sticker-hi.png" alt="" width="50" height="50">Coucou!</p>
<p>Alors comment vous a traité 2016? Pas trop mal, j’espère? Bon l’année a été bizarre sur certains aspects, mais quelle année ne l’est pas? Parlons maintenant de <em><a href="http://film.zemarmot.net/">ZeMarmot!</a></em> Pour rappel, notre réalisatrice, Aryeom Han, s’était fait une entorse au pouce mais hormis lors d’usage trop constraignant ou prolongé de la main, elle peut désormais dessiner. Elle remercie d’ailleurs chaleureusement ceux qui nous suivent pour les gentils messages reçus.</p>
<h2>Rappel du projet</h2>
<p>Avant de rentrer dans le gros du compte-rendu, je souhaite rappeler — comme il est de coutume en fin d’année — que <em>ZeMarmot </em>est un projet entièrement financé par les bonnes volontés de particuliers et sociétés donatrices, dont l’action est à 2 niveaux: art et logiciel.</p>
<p>Je suis un des développeurs de <a href="https://gimp.org/">GIMP</a>, second plus gros contributeur en terme de nombre de <em>commits</em> depuis 4 ans; je développe aussi un plugin pour l’animation 2D avec GIMP, qu’Aryeom utilise sur ZeMarmot. Ce plugin devrait faire partie de GIMP 2.10.</p>
<p>Aryeom utilise le logiciel pour animer, dessiner et peindre un film, d’après une histoire originale: une marmotte qui voyage dans le monde! Et bien sûr, <a href="http://film.zemarmot.net/">le film</a> sera sous licence <a href="https://creativecommons.org/licenses/by-sa/4.0/">Creative Commons by-SA</a>!</p>
<p lang="en"><img src="media/e623e8e5.zemarmot-sticker-yahou.png" data-original-source="http://girinstud.io/log/wp-content/uploads/2016/12/zemarmot-sticker-yahou.png" alt="" width="50" height="50">À ce jour, notre <em>crowdfunding</em> initial (~ 14 000 €) a permis de payer quelques mois de salaire à Aryeom. Je n’ai rien touché à ce jour (non que je ne veuille pas, mais le projet n’a pas les moyens). Il reste un peu de la somme initiale mais principalement gardée de côté pour payer les musiciens.</p>
<p lang="en"><strong><img src="media/f6719b80.zemarmot-sticker-boude.png" data-original-source="http://girinstud.io/log/wp-content/uploads/2016/12/zemarmot-sticker-boude.png" alt="" width="50" height="50"></strong>Maintenant nous nous reposons surtout sur un <em>crowdfunding</em> mensuel grâce aux plateformes <a href="https://www.patreon.com/zemarmot">Patreon</a> (financement USD) et <a href="https://www.tipeee.com/zemarmot">Tipeee</a> (financement EUR). À ce jour, cela monte à 180 € par mois, soit à peine plus d’un jour de salaire (et avec les charges salariales et patronales, ce qui revient à l’artiste en <em>net </em>est très faible). <strong>1 jour par mois</strong> pour faire un film, c’est pas assez, on est d’accord!</p>
<p lang="en">Mon rêve? Nous pourrions un jour être un studio qui emploie de nombreux artistes, produisant des films libres pour le cinéma (oui dans mon rêve fou, les films libres ont leur place sur le grand écran!), ainsi que des développeurs qui améliorent des logiciels libres pour le multimédia pour un écosystème logiciel libre, riche et pour tous!<br>
À ce jour, avec ce financement, c’est encore juste un projet expérimental principalement fait bénévolement. Mais c’est le but.</p>
<p lang="en">Vous aimez mon rêve? Voulez-vous m’aider à le réaliser? C’est possible en donnant pour le projet! Que ce soit la pièce symbolique ou une donation plus généreuse, toute aide est un coup de pouce dans la bonne direction.</p>
<p lang="en"><img src="media/ccd13b43.zemarmot-sticker-ok.png" data-original-source="http://girinstud.io/log/wp-content/uploads/2016/12/zemarmot-sticker-ok.png" alt="" width="50" height="50"><img src="media/c308d4ba.zemarmot-sticker-happy.png" data-original-source="http://girinstud.io/log/wp-content/uploads/2016/12/zemarmot-sticker-happy.png" alt="" width="50" height="50"><a href="https://www.tipeee.com/zemarmot">Cliquez pour financer <em>ZeMarmot en</em> € (Tipeee) »</a><br><a href="https://www.patreon.com/zemarmot">Cliquez pour financer <em>ZeMarmot en $</em> (Patreon) »</a></p>
<p lang="en">Pas encore sûr? Prenez votre temps, lisez davantage et n’hésitez pas à revenir voir nos pages de financement si vous aimez ce que vous voyez!</p>
<p lang="en">Notez bien qu’en plus du financement, le nombre de contributeur est aussi important car cela remonte le moral de se sentir soutenu par plus de monde. En outre de gros chiffres nous donneront du poids lorsque nous chercherons de plus gros financements auprès d’organismes privés ou publics, mais aussi auprès de producteurs potentiels avec la possibilité de ne pas compromettre sur les aspects idéalistes du projet.</p>
<h2>L’animation</h2>
<p>Voici 2 vidéos pour illustrer le travail d’Aryeom. Dans cette première vidéo, elle explique quelques plans de la Marmotte:</p>
<p><iframe type="text/html" width="700" height="424" src="https://www.youtube.com/embed/ZOgvBOBej4E?version=3&amp;rel=1&amp;fs=1&amp;autohide=2&amp;showsearch=0&amp;showinfo=1&amp;iv_load_policy=1&amp;wmode=transparent" allowfullscreen="true"></iframe></p>
<p>Cette seconde vidéo examine des plans montrant un second personnage, l’<a href="https://fr.wikipedia.org/wiki/Aigle_royal">aigle royal</a>, grand prédateur de la marmotte:</p>
<p><iframe type="text/html" width="700" height="424" src="https://www.youtube.com/embed/yham5f9Sq4U?version=3&amp;rel=1&amp;fs=1&amp;autohide=2&amp;showsearch=0&amp;showinfo=1&amp;iv_load_policy=1&amp;wmode=transparent" allowfullscreen="true"></iframe></p>
<p>Des pages entières sur l’art de l’animation pourraient être écrites à partir de ces quelques extraits mais je m’en tiendrai aux bases. Peut-être détaillerais-je dans de futurs articles.</p>
<h3>Animer = donner la vie</h3>
<p>Aryeom l’évoque et plusieurs extraits de la vidéo en sont l’exemple. Quand un personnage se déplace d’un point A à un point B, il ne s’agit pas de « bouger » celui-ci. Vous devez donner l’impression qu’il agit de son propre accord, en être vivant et pensant, en un mot, qu’il est « <strong>animé</strong>« .</p>
<p>Ce n’est pas étonnant qu’un des livres de référence du métier se nomme « <em>L’illusion de la Vie</em> » (de <span>Frank Thomas et </span><span>Ollie Johnston</span>), aussi livre de chevet d’Aryeom. Cela a de nombreuses conséquences sur le travail de l’animateur.</p>
<h4>Crédible plutôt que réaliste</h4>
<p>Avant d’aller plus loin, je souhaite mettre un point au clair: bien que l’animation « réaliste » existe (Disney vient à l’esprit), une bonne animation est avant tout une animation « crédible ».</p>
<p>Il est tout à fait acceptable et même habituel d’exagérer des mouvements pour une raison ou une autre (effet comique parfois, mais même parfois il n’est pas impossible qu’un geste exagéré paraisse plus crédible qu’un geste réaliste), ou l’inverse (se débarrasser de détails trop anatomiquement corrects). Il n’y a pas de mauvais choix, seulement des décisions pour obtenir un style désiré.</p>
<p>Maintenant que tout est clair, continuons.</p>
<h4>« Bouger un bras » n’est pas possible</h4>
<p>L’exemple classique donné aux débutants: « lève ton bras droit ». C’est fait? As-tu vraiment bougé seulement le bras? Non, vois-tu, pour garder l’équilibre, ton corps s’est déplacé sensiblement à gauche en contrepoids, ton épaule droite s’est soulevée alors que la gauche s’est abaissée pour rester dans l’axe, maintenant oblique… Probablement tes pieds et jambes même se sont adaptés pour compenser le déplacement du centre de gravité.<br>
Le corps entier s’est mis en mouvement pour ce qu’on aurait pu croire une simple action. En conséquence, on ne bouge pas « un bras », mais un « corps » entier (dans une nouvelle configuration où le bras se trouve à la place souhaitée).</p>
<p>C’est la principale raison pour laquelle un animateur redessinera le corps entier à chaque image et ne peut se contenter de récupérer des bouts d’images en modifiant seulement certaines parties du corps. Quitte à simuler la vie, autant le faire proprement.</p>
<p><em><span>Note</span>: le terme « animation » dans l’esprit d’un développeur fait en général une connexion neuronale avec « <a href="https://en.wikipedia.org/wiki/Interpolation">interpolation</a>« , le processus mathématique qui consiste en le calcul automatique de positions intermédiaires. La conséquence de mon explication précédente est qu’en réalité cela sera rarement utile en animation traditionnelle, même numérique. En vectoriel et 3D, c’est bien plus fréquent mais même là, le rôle d’un bon animateur ne doit absolument pas être minimisé. En 3D/vecteur, l’interpolation remplace tout au plus l’assistant qui dessinait les entre-deux (les images entre 2 images clés) de l’animation traditionnelle.</em></p>
<h4>Timing, silence et accélération</h4>
<p>On l’entend souvent dire de la bouche de poètes ou danseurs: le silence est aussi important que l’action. J’ajouterais aussi l’accélération et la décélération.</p>
<p>On le voit bien dans le premier exemple de la vidéo 1 (à <a href="https://youtu.be/ZOgvBOBej4E?t=41s">0’41</a>). Aryeom était mécontente de la marmotte qui court dont la vitesse est presque linéaire. Il y a bien une petite décélération sur la fin, mais trop peu. Sa version finale montre donc Marmotte arriver plus vite avec un ralentissement bien plus visible, rendant le mouvement plus crédible dans son entier.</p>
<p>Dans la vidéo 2 (à <a href="https://youtu.be/yham5f9Sq4U?t=1m9s">1’09</a>), l’envol de l’aigle est encore un bon exemple de timing difficile. D’abord l’aigle semblait lourd et pataud (« malade » dit-elle dans la vidéo). Puis au contraire trop léger, presque à l’image d’un <a href="https://fr.wikipedia.org/wiki/Passeridae">moineau</a>. Il lui fallut 8 versions pour obtenir un envol qui lui plaise. Regardez notamment la toute fin quand il se met à planer… Ce genre de détails de quelques centièmes de seconde peut passer inaperçu au public et pourtant occuper longtemps un animateur.</p>
<h4>Images fixes vivantes (<em>a.k.a.</em> « <em>line boil</em>« )</h4>
<p>Un effet assez usuel dans l’animation est cette sorte d’image tremblotante lors du plan présentant l’aigle fier sur sa montagne (vidéo 2 à <a href="https://youtu.be/yham5f9Sq4U?t=33s">0’33</a>). Parfois vous voulez une situation fixe mais une image statique contredit l’attente du cerveau: dans la vie, l’absence totale de mouvement n’existe pas. Essayez de ne pas bouger plusieurs secondes devant une caméra pour voir! Ça tombe bien, dessinez deux fois exactement les mêmes lignes relève de la gageur, donc l’animateur rusé redessine la même image plusieurs fois et boucle. Nous avons maintenant une image fixe … qui vit!</p>
<h4>Éviter les cycles</h4>
<p>Les boucles sont un outil habituel de l’animation et il n’est pas rare de voir un étudiant s’entraîner sur des « cycles de marche ». Pourtant plus on cherche à monter en qualité, moins les boucles sont acceptables. De même que l’immobilisme n’existe pas dans la vie, on ne répète jamais 2 fois <strong>exactement</strong> le même mouvement. Si votre caractère fait plusieurs pas, vous préférerez peut-être les redessiner à chaque fois, et vous ne réutilisez pas les images précédentes.</p>
<p>Bien sûr, c’est à vous de placer la limite. Peut-être que cette nuée d’oiseaux dans le lointain ira bien avec des boucles (et même du copier-coller pour multiplier les oiseaux). Tout est question de choix, temps et d’argent passé à payer un animateur sur cela, bien entendu.</p>
<h3>Animer, c’est dessiner… beaucoup</h3>
<p>Concluons donc en disant que ce métier consiste à dessiner et redessiner énormément!</p>
<p>À tel point qu’on en perd le nord. L’anecdote du pigeon dans la vidéo 2 est vraie et c’est moi qui ai proposé à Aryeom de la rentrer dans la vidéo tellement c’est drôle. Un jour, Aryeom vient me voir et me montre ce plan sur lequel elle travaille depuis des jours. Elle me demande: « tu trouves pas qu’on dirait plutôt un pigeon? »<br>
Je ne l’aurai pas arrêtée, elle était partie pour recommencer de zéro.</p>
<p>Mais après tout, un art où on redessine tout, même pour exprimer l’immobilisme et où on s’interdit les raccourcis (boucles), c’est peut-être déjà un peu pour les fous, non? <img src="media/70955cbf.1f609.png" data-original-source="https://s.w.org/images/core/emoji/2.2.1/72x72/1f609.png" alt="😉"></p>
<p>Plus sérieusement: il existe plusieurs écoles et beaucoup sont pour se simplifier la vie et autorisent la réutilisation d’images. Au Japon — même si le studio Ghibli est un contre-exemple connu qui se complique la vie, comme nous — le reste de l’industrie du cinéma d’animation a su nous prouver à maintes reprises qu’il est possible d’afficher une image statique pendant 30 secondes, de rajouter des sons et des voix, puis d’appeler cela une animation!</p>
<p>Parfois c’est un choix artistique aussi, ou un <em>focus</em>. Par exemple <em>Les </em><em>Simpsons</em> ne sont pas un chef-d’œuvre graphique animée (ils font régulièrement des blagues de mise-en-abîme où ils se moquent de la qualité de leur propre animation d’ailleurs), mais ils ont les scripts les plus extraordinaires; et c’est clairement ce qui fut leur succès.<br>
Au final, il n’y a pas de mauvais choix. Chacun suit sa voie.</p>
<p>C’est celle de <em>ZeMarmot</em>!</p>
<h2>Musique</h2>
<p>Courte note: nous avons commencé à travailler avec les musiciens, à distance et en rencontre physique le 1er décembre. Nous avons quelques extraits de « premières idées », mais les diffuser ne ferait nullement honneur au travail des musiciens. Il vaudra donc mieux attendre et s’en tenir à cela pour le moment!</p>
<h2>Logiciel</h2>
<p>Ai-je perdu mes lecteurs après ce long chapitre « animation »? Pour ceux qui sont encore là, un petit compte rendu de mes activités de dév.</p>
<h3>GIMP</h3>
<p>Je fais ma part sur <a href="https://gimp.org/">GIMP</a>, pour l’améliorer de manière générale et rapprocher la sortie de la version 2.10. Je compte donc 259 <em>commit</em>s en tant qu’auteur en 2016 (60 dans les 3 derniers mois) + 48 en tant que relecteur/responsable. J’ai commenté sur <a href="https://bugzilla.gnome.org/buglist.cgi?bug_status=UNCONFIRMED&amp;bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;bug_status=NEEDINFO&amp;bug_status=RESOLVED&amp;bug_status=VERIFIED&amp;chfieldfrom=2016-01-01&amp;chfieldto=Now&amp;email1=jehan%40zemarmot.net&amp;emaillongdesc1=1&amp;emailtype1=substring&amp;list_id=178966&amp;product=GIMP&amp;query_format=advanced">352 rapports de bug</a> en 2016, faisant une habitude de faire le plus possible de revues de patch.</p>
<p>J’ai beaucoup de projets pour GIMP, certains ambitieux comme un système de gestion des plugins (installation/désinstallation/mise-à-jour… directement depuis un dialogue dans GIMP) ainsi que sur l’évolution de l’interface graphique (cela devra être discuté en détail sujet par sujet dans d’autres articles).</p>
<p>J’expérimente aussi avec <a href="http://flatpak.org/">Flatpak</a> pour que GIMP puisse fournir un paquet officiel. Pendant des années, notre position de sortie fut: un installeur Windows, un paquet OSX et GNU/Linux… ben attrape le code source et compile quoi! Ou bien utilise la vieille version de ton gestionnaire de paquet…<br>
Je pense que cette situation pourra s’améliorer avec Flatpak et des technologies similaires.</p>
<h3>Animation dans GIMP</h3>
<p>Il s’agit donc d’un plugin, pas une fonctionnalité native. Cependant c’est presque aussi puissant, même si certaines fonctionnalités manquent (comme le lien non-bidirectionnel entre GIMP et les plugins: un plugin n’est pas notifié de changements sur les images notamment; fonctionnalité sur laquelle je prévois de travailler).<br>
Le plugin d’animation a 2 vues:</p>
<h4>Vue « storyboard »</h4>
<figure><a href="media/c22f5960.Screenshot-from-2016-12-29-07-06-37.png" data-original-source="http://girinstud.io/log/wp-content/uploads/2016/12/Screenshot-from-2016-12-29-07-06-37.png"><img src="media/c9320047.Screenshot-from-2016-12-29-07-06-37-1024x576.png" data-original-source="http://girinstud.io/log/wp-content/uploads/2016/12/Screenshot-from-2016-12-29-07-06-37-1024x576.png" alt="GIMP's animation plug-in: storyboard view" width="700" height="394" srcset="https://girinstud.io/log/wp-content/uploads/2016/12/Screenshot-from-2016-12-29-07-06-37-1024x576.png 1024w, https://girinstud.io/log/wp-content/uploads/2016/12/Screenshot-from-2016-12-29-07-06-37-300x169.png 300w, https://girinstud.io/log/wp-content/uploads/2016/12/Screenshot-from-2016-12-29-07-06-37-768x432.png 768w, https://girinstud.io/log/wp-content/uploads/2016/12/Screenshot-from-2016-12-29-07-06-37.png 1366w" sizes="(max-width: 700px) 100vw, 700px"></a><figcaption>GIMP’s animation plug-in: storyboard view</figcaption></figure><p>Cela correspond à la logique très basique 1 calque = 1 image, habituelle par exemple pour les créateurs d’animation GIF (ou MNG/WebP maintenant), excepté qu’il y a maintenant une jolie interface pour paramétrer la durée d’affichage de chaque image (plutôt que « taguer » les noms de calque, très mauvais choix d’interface, ce qui explique d’ailleurs que la fonctionnalité est quasi cachée, et trouvable sur de vieux <a href="https://www.gimp.org/tutorials/Simple_Animations/">tutoriaux</a> seulement), faire de la composition de base et même commenter chaque vignette si besoin est. Le tout avec une bonne prévisualisation de l’animation.</p>
<h4>Vue « x-sheet »</h4>
<figure><a href="media/f690ec1c.Screenshot-from-2016-12-29-06-13-39.png" data-original-source="http://girinstud.io/log/wp-content/uploads/2016/12/Screenshot-from-2016-12-29-06-13-39.png"><img src="media/1e683423.Screenshot-from-2016-12-29-06-13-39-1024x576.png" data-original-source="http://girinstud.io/log/wp-content/uploads/2016/12/Screenshot-from-2016-12-29-06-13-39-1024x576.png" alt="GIMP Animation plug-in: Cel-animation view" width="700" height="394" srcset="https://girinstud.io/log/wp-content/uploads/2016/12/Screenshot-from-2016-12-29-06-13-39-1024x576.png 1024w, https://girinstud.io/log/wp-content/uploads/2016/12/Screenshot-from-2016-12-29-06-13-39-300x169.png 300w, https://girinstud.io/log/wp-content/uploads/2016/12/Screenshot-from-2016-12-29-06-13-39-768x432.png 768w, https://girinstud.io/log/wp-content/uploads/2016/12/Screenshot-from-2016-12-29-06-13-39.png 1366w" sizes="(max-width: 700px) 100vw, 700px"></a><figcaption>GIMP’s Animation plug-in: cel-animation view</figcaption></figure><p>Vue plus puissante où vous pouvez composer chaque image à partir de plusieurs calques, souvent au moins un décor et un personnage. L’exemple ci-dessus compose 3 images à chaque position: le décor, l’aigle et la marmotte.</p>
<p>Vous connaissez peut-être plus les vues de type « ligne de temps », ce qui est en gros la même chose mais horizontal plutôt que vertical. J’ai essayé aussi mais suis rapidement revenu vers un design plus classique dans le monde de l’animation, appelé <a href="https://en.wikipedia.org/wiki/Exposure_sheet">x-sheet </a>(feuille d’exposition). Je le trouve plus pratique, mieux pour commenter, facile à <em>scroller</em>, et plus organisé. On voit peu de choses dans cette capture, mais le plugin cible vraiment une animation professionnelle et organisée. En particulier, avec des calques convenablement nommés, vous pouvez créer des cycles d’animation de dizaines d’images en juste quelques clics.</p>
<p>Je travaille aussi sur le <em>keyframing</em> d’effets (opérations GEGL animées) et les mouvements de caméra.</p>
<p>Beaucoup fut fait, mais bien plus reste à faire. Je posterai des articles plus détaillés et surtout pousserai le code publiquement sur une branche du dépôt de GIMP bientôt (probablement avant la prochaine réunion <em>Libre Graphics Meeting</em> en avril).</p>
<h2>That’s all, folks!</h2>
<p>Et voici donc notre compte-rendu de fin d’années de l’équipe <em>ZeMarmot</em>! J’espère que cela vous a plu. Et si vous n’avez pas tout dépensé en cadeaux de Noël, je rappelle que le projet accepte toute l’aide possible sur les liens donnés plus haut. Certains donnent juste 1 € par mois, d’autres 15 € par mois… il n’y a pas de limites. Au final, nous donnons vie à <em>ZeMarmot</em> tous ensemble! <img src="media/78924bcd.1f642.png" data-original-source="https://s.w.org/images/core/emoji/2.2.1/72x72/1f642.png" alt="🙂"></p>
<p>Merci, et bonne année 2017!</p>
<p><img src="media/ca644cf9.99a063c1d30a65a33c408a4ad189b9de" data-original-source="http://cdn.libravatar.org/avatar/99a063c1d30a65a33c408a4ad189b9de" alt="Gravatar de Jehan" class="gravatar" /><br/><i>Original post of <a href="https://girinstud.io/news/2016/12/zemarmot-compte-rendu-de-fin-2016/" title="Visit the source">Jehan</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>Jehan : <a href="">Retour en arri&egrave;re sur les Films Libres d&rsquo;Aryeom et Jehan</a> (03/06/2015)</li><li>Jehan : <a href="">Combien de temps durera ZeMarmot? Quel est le business plan?</a> (17/04/2015)</li><li>Jehan : <a href="">L&rsquo;AMMD s&rsquo;associe au projet &laquo;&nbsp;ZeMarmot&nbsp;&raquo;</a> (20/04/2015)</li><li>Jehan : <a href="">Compte rendu de GUADEC 2016</a> (12/09/2016)</li><li>Jehan : <a href="">GIMP 2.9.4 et le futur de GIMP</a> (31/07/2016)</li></ul></div></p>


feed_id: https://marienfressinaud.fr/projet-zero-2016.html
title: Marien Fressinaud : Les projets 2016 de Projet Zéro
uri: Marien-Fressinaud-Les-projets-2016-de-Projet-Zéro
url: https://marienfressinaud.fr/projet-zero-2016.html
content:
<p>En septembre
<a href="https://marienfressinaud.fr/projet-zero-readme-md.html">j’expliquais</a> comment
j’allais essayer de m’organiser pour enfin produire les choses qui me
trottaient dans la tête. J’avais mis cela en place un mois plus tôt et je
manquais donc nécessairement de recul dessus. Pour rappel, cette méthodologie
repose sur les points suivants :</p>
<ul><li>un carton contient l’ensemble de mes projets et est restreint par les quatre
  règles suivantes :<ul><li>je n’ai pas le droit de toucher ou d’avancer les projets qui sont dedans ;</li>
<li>j’ai le droit d’en sortir trois maximum à la fois ;</li>
<li>un projet sorti du carton ne peut pas y retourner avant une date limite que
  j’ai fixée au préalable (ou alors je dois l’avoir terminé) ;</li>
<li>tout nouveau projet doit le rejoindre ;</li>
</ul></li>
<li>chacun des projets en dehors du carton doit avoir un objectif ainsi qu’une
  date limite de fin ;</li>
<li>un article de blog est publié à chaque fin de projet.</li>
</ul><p>Concernant ce dernier point, je n’ai publié que deux articles concernant mes
projets durant ces 4 derniers mois… cela fait donc seulement 2 projets
terminés sur pas moins de 7 projets ! Alors, que s’est-il passé ?</p>
<h2>SogiMood, l’article qui a eu du mal à sortir</h2>
<p>Bien que SogiMood soit un projet que je considère comme terminé, il n’en a pas
moins été problématique. En effet, je l’ai terminé fin septembre (donc peu de
temps après avoir expliqué ma méthodologie) mais <a href="https://marienfressinaud.fr/sogimood.html">son
article</a> est paru au début du mois
de décembre. La raison est assez simple : l’article a été réécrit au moins 2
fois en entier et puis est resté en gestation un certain temps. J’ai d’abord eu
du mal à trouver le ton et le contenu avant d’avoir l’idée de le proposer sur
<a href="http://sogilis.com/blog/sogimood-appli-sante-projets">le blog de Sogilis</a>.
Après relecture et correction par les collègues, je me suis retrouvé trop
occupé pour avoir vraiment la motivation de m’occuper de la publication finale.
1 mois puis 2 mois sont ainsi passés sans que je ne publie rien.</p>
<p>Conclusion : prévoir un article final n’est pas forcément une bonne idée
et je pense que je ne me forcerai plus de la sorte à l’avenir.</p>
<h2>Le dessin et le sport, stoppés par perte de motivation</h2>
<p>En février je commençais à m’intéresser à la pratique du dessin et en août je
me remettais une énième fois à aller courir, plus motivé que jamais.</p>
<p>Dans le premier cas, je me suis même acheté des bouquins et je souhaitais finir
un livre d’exercices d’ici février prochain. La pratique assidue ne me faisait
pas plus peur que ça et je voyais déjà mes progrès. Autre objectif : changer le
dessin moche en arrière-plan du site par quelque chose de plus travaillé.
Chaque année devait venir compléter et améliorer cette « fresque ».
Je n’avais malheureusement pas pris en compte un élément fondamental :
j’ai toujours eu horreur des exercices et je n’avais pas l’impression de
m’amuser en suivant les instructions d’un bouquin. Cela a freiné net ma
motivation et je me suis arrêté en septembre.</p>
<p>Dans le cas du sport, je ne vous referai pas la même rengaine de la motivation
à bloc, etc. J’allais principalement courir le soir voire un petit peu les
matins avec des collègues. En revanche, fin octobre, lorsque la nuit a
commencé à se faire plus longue et que je n’avais plus le choix que d’aller
courir de nuit, j’ai commencé à me démotiver pour faire une pause d’un mois en
novembre. Au début du mois toutefois j’ai réussi à me remotiver pour… une seule
séance avant de me restopper aussi net à cause de la pollution (bienvenue à
Grenoble).</p>
<p>Quoi qu’il en soit, ce sont deux projets que j’ai encore à cœur et il est
certain que je les reprendrai, peut-être sous d’autres formes pour ne pas me
démotiver à nouveau.</p>
<p>J’ai en revanche abandonné la règle qui m’interdisait de replacer un projet
dans le carton : ça n’a aucun sens de s’acharner sur un projet que l’on
n’avance pas.</p>
<h2>Contribution à Framasoft, les contours trop flous</h2>
<p>Ici, à l’inverse des deux précédents, je suis encore sur ce
« projet ». Je m’étais fixé plusieurs objectifs : contribuer à
l’écriture des articles du lancement de la saison 3 de Dégooglisons, mettre à
jour Framaboard avec quelques contributions upstream, aider au support et
participer éventuellement à plus d’événements pour tenir les stands. Je
souhaitais faire cela durant environ deux mois avant de repasser au régime
habituel.</p>
<p>Ce qu’il s’est concrêtement passé, c’est que j’ai légèrement augmenté mon
activité sur les projets Framasoft sans pour autant trouver la motivation de
m’y impliquer autant que je le souhaitais. De plus, je bloque depuis fin
septembre sur ma contribution à Kanboard pour faire en sorte de simplifier les
mises à jour de Framaboard. À vrai dire je crois que je ne suis pas hyper
emballé à l’idée de devoir faire du PHP ;). J’ai repoussé cela pour après les
fêtes, en espérant que je sois plus motivé que pour le moment.</p>
<p>Framasoft reste un projet un peu particulier puisque j’essaye de contribuer
tout au long de l’année, ne serait-ce que pour répondre aux questions sur le
support ou pour participer aux évènements.</p>
<p>La morale de tout ça c’est qu’il faut que je me force à mieux définir ce que je
compte faire au sein du projet pour me donner les moyens de savoir quand
celui-ci est véritablement fini.</p>
<h2>Voyage et Projet Zéro, les projets pas encore terminés</h2>
<p>Pour finir, les projets qui sont en cours. Le premier est un voyage au
Royaume-Uni : j’ai dû commencer les préparatifs assez tôt afin d’avoir une
réduction sur mon billet Interrail et donc planifier des dates. Rien de très
compliqué mais tout ça pour dire que je terminerai ce « projet » en
juin, lorsque je serai revenu.</p>
<p>Concernant Projet Zéro, j’ai enfin attaqué une version applicative (web) afin
de donner un cadre à ma méthodologie. Ma version actuelle ne me permet pas
d’être suffisamment rigoureux dans l’avancement de mes projets et je souhaitais
avoir un outil plus manipulable ainsi qu’un système de rappels. L’application
est encore dans une version préliminaire mais j’en parlerai dès que j’aurai
quelque chose d’utilisable. À l’inverse de Taglibro, je souhaite fournir une
version hébergée et permettre à n’importe qui de s’y inscrire… mais j’y
reviendrai !</p>
<p>Cela fait donc le tour de mes projets que je m’étais fixé sur cette moitié
d’année 2016. Rendez-vous l’année prochaine si jamais je continue à appliquer
ma méthodologie « Projet Zéro » :).</p>
<p><img src="media/aa8c2751.ea7e8807d513b71b5779dcee35c8e611" data-original-source="http://cdn.libravatar.org/avatar/ea7e8807d513b71b5779dcee35c8e611" alt="Gravatar de Marien Fressinaud" class="gravatar" /><br/><i>Original post of <a href="https://marienfressinaud.fr/projet-zero-2016.html" title="Visit the source">Marien Fressinaud</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>


feed_id: http://www.elementaryos-fr.org/on-reparle-de-pantheon-debian/
title: elementary OS : On reparle de pantheon sous Debian
uri: elementary-OS-On-reparle-de-pantheon-sous-Debian
url: http://www.elementaryos-fr.org/on-reparle-de-pantheon-debian/
content:
<p>Il y a plus d’un an je vous parlais de Nicolas Bruguier <a href="http://www.elementaryos-fr.org/on-recherche-des-testeurs-pour-pantheon-sur-debian/">qui avait packagé pantheon desktop pour Debian et qui était à la recherche de testeurs</a>. Il a posté il y a deux jours <a href="https://plus.google.com/u/0/b/109348840800096254191/101795512660548996299/posts/UtrZC9imGa2?sfc=true" target="_blank">sur Google+</a> des nouvelles du portage !</p>
<p>Il a mis à jour les paquets, ce sont les mêmes versions que sur elementary OS 0.4 Loki, donc AppCenter est même présent comme on peut le voir <a href="https://gitlab.com/groups/pantheon-debian" target="_blank">ici</a>. Ces paquets sont disponibles que pour <strong>Debian Stretch (testing)</strong>.</p>
<p>Le dépôt de paquets se trouve <a href="http://gandalfn.ovh/debian" target="_blank">ici</a> et n’est disponible que pour deux branches: <strong>amd64 et armhf</strong></p>
<p>Bien évidemment, <strong>ce portage est encore expérimental</strong>, mais si vous voulez tester, voici la procédure à suivre:</p>
<p><span></span></p>
<h3>On rajoute le dépôt au sources.list:</h3>
<p>D’abord, on récupère la clé gpg:</p><pre>wget http://gandalfn.ovh/debian/pantheon-debian.gpg.key -O- | apt-key add -</pre><p>
On ajoute le dépôt « stretch-loki »:</p><pre>echo "deb http://gandalfn.ovh/debian stretch-loki main contrib" > /etc/apt/sources.list.d/pantheon-debian.list</pre><p>
On met à jour la liste des dépôts:</p><pre>apt-get update</pre><p>
</p><h3>Installation de Pantheon</h3>
<p>Commande d’installation:</p><pre>apt-get install pantheon</pre><p>
ou si vous voulez installer pantheon desktop sans le greeter:</p><pre>apt-get install pantheon-shell</pre><p>
</p><h3><a href="media/d449f600.debian-pantheon.jpeg" data-original-source="http://www.elementaryos-fr.org/wp-content/uploads/2016/12/debian-pantheon.jpeg"><img src="media/72469a31.debian-pantheon-600x333.jpeg" data-original-source="http://www.elementaryos-fr.org/wp-content/uploads/2016/12/debian-pantheon-600x333.jpeg" alt="" width="600" height="333" srcset="http://www.elementaryos-fr.org/wp-content/uploads/2016/12/debian-pantheon-600x333.jpeg 600w, http://www.elementaryos-fr.org/wp-content/uploads/2016/12/debian-pantheon-300x167.jpeg 300w, http://www.elementaryos-fr.org/wp-content/uploads/2016/12/debian-pantheon-768x427.jpeg 768w, http://www.elementaryos-fr.org/wp-content/uploads/2016/12/debian-pantheon-1024x569.jpeg 1024w, http://www.elementaryos-fr.org/wp-content/uploads/2016/12/debian-pantheon.jpeg 1579w" sizes="(max-width: 600px) 100vw, 600px"></a></h3>
<h3>Cas particulier: Mise à jour depuis la version précédente du dépôt</h3>
<p>Si vous utilisiez déjà ce dépôt, avant de mettre à jour voici ce qu’il faut faire:</p>
<p>Il faut créer ce nouveau fichier:</p><pre>$> vi /etc/apt/preferences.d/pantheon-debian</pre><p>
puis remplir le fichier avec ces règles:</p><pre>Package: *
Pin: origin "gandalfn.ovh"
Pin-Priority: 1001</pre><p>
Ensuite vous pourrez faire</p><pre>apt-get dist-upgrade</pre><p>
Source: <a href="http://gandalfn.ovh/" target="_blank">http://gandalfn.ovh/</a></p>
<p>Le billet <a rel="nofollow" href="http://www.elementaryos-fr.org/on-reparle-de-pantheon-debian/">On reparle de pantheon sous Debian</a> a été publié sur le site de la <a rel="nofollow" href="http://www.elementaryos-fr.org/">elementary OS - </a></p>
<p><img src="media/7e20f332.e363a9ed45733fa3aec7c3a0361380c6" data-original-source="http://cdn.libravatar.org/avatar/e363a9ed45733fa3aec7c3a0361380c6" alt="Gravatar de elementary OS" class="gravatar" /><br/><i>Original post of <a href="http://www.elementaryos-fr.org/on-reparle-de-pantheon-debian/" title="Visit the source">elementary OS</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>elementary OS : <a href="">Pantheon d&eacute;barque bient&ocirc;t sur Debian</a> (26/04/2014)</li><li>elementary OS : <a href="">On recherche des testeurs pour Pantheon sur Debian</a> (22/08/2015)</li></ul></div></p>


feed_id: https://www.dadall.info/blog/index.php?article579/diaspora-en-2016
title: dada : diaspora* en 2016
uri: dada-diaspora-en-2016
url: https://www.dadall.info/blog/index.php?article579/diaspora-en-2016
content:
<br><div align="center"><img src="media/65b34b45.diaspora_large_new.png" data-original-source="https://www.dadall.info/blog/data/images/logo/diaspora_large_new.png" alt=""><br></div><br>Une belle année se termine pour le réseau social libre diaspora* et comme je n'ai pas pris le temps de faire des billets d'annonce à chaque sortie de version, voici ce qu'on peut résumer des 12 derniers mois :<br><h3>Une refonte du core <br></h3>C'est sans doute la chose qui intéresse le moins les utilisateurs mais qui les concerne directement : le système qui se cache sous la page web de votre compte diaspora* et sur les serveurs de vos podmins adorés s'est vu beaucoup retravaillé.<br>Souvenez-vous des situations gênantes d'avant 2016 : un post attirant beaucoup de commentaires, rapidement, se transformait en un bordel pas possible. Les commentaires s'empilaient dans un ordre chronologique inconnu de notre planète. C'est maintenant du passé ! La fédération des messages est bien plus au point qu'avant ! De plus, une partie du travail est toujours en cours : ça sera pour 2017 donc.<br><h3>Un chat en ligne <br></h3>Alors, celui-là, il n'est pas encore actif sur la totalité des pods mais ça arrive. Je sais que je dis ça à chaque fois mais 2017 devrait terminer son activation sur la totalité des pods en service.<div>Ce système de communication en direct est utilisable depuis votre navigateur mais aussi depuis n'importe quel client XMPP qui va bien. Les vieux de la vieille dont je fais partie ne s'en servent pas trop : on traîne sur IRC depuis toujours pour parler entre nous, mais les nouveaux, moins geeks, devraient apprécier. Ceci-dit, la belle équipe qui va représenter diaspora* au FOSDEM 2017 devrait s'en servir pour se retrouver. J'en suis et je vous tiendrai au courant !<br><h3>Un nouveau design <br></h3>Il n'avait pas bougé depuis des années : le style très old-school est passé par une esthéticienne pour se refaire une beauté. Je sais bien que les goûts et les couleurs se discutent et que chacun y trouvera des éléments qui lui plaisent plus ou moins. Perso, j'aime et j'invite ceux qui n'y trouvent pas leur compte à créer un thème perso !<br><h3>Des boutons pour commenter <br></h3>Cette <span>révolution</span> évolution est celle dont je suis particulièrement fier puisqu'elle fût directement testée sur mon pod : diaspote.org.</div><div>Faire des jolis messages avec un gros titre, des citations, des liens et tout le tralala n'était pas bien difficile pour les amateurs de Markdown mais pour les autres, c'était franchement frustrant. Maintenant, grâce au travail d'Augier, tout le monde peut <em>designer</em> ses posts en quelques clics ! C'est disponible sur les posts, les commentaires et les messages privés, of course.<br><h3>Mais aussi... <br></h3></div><div>Des correctifs de sécurité toujours passé à temps, des améliorations discrètes mais bien utiles comme l'ajout du lien vers le post duquel est tirée la photo dans la vue des Photos, une utilisation mobile grandement améliorée, si ce n'est enfin 100% agréable, une application Android libre qui avance, et j'en passe. Je n'ai pas la liste complète en tête mais je parle ici d'un travail de fourmi qui améliore l'expérience utilisateur au jour le jour.<br></div><br><div>Enfin voilà, quand je dis que 2016 fut une bonne année ! J'avais l'idée de vous sortir une pile de chiffres pour vous montrer l'activité du projet mais je suis vite tombé sur des nombres bien trop gros. Simplement : 16 <a href="https://github.com/diaspora/diaspora/releases" title="releases">releases</a>  sur 12 mois, c'est suffisamment clair, non ?<br><br>Pour finir ce billet, je vous invite à venir vous créer un compte sur <a href="https://diaspote.org/" title="diaspote.org">diaspote.org</a>  ou sur le pod de votre choix (<a href="https://framasphere.org/" title="Framasphere">Framasphere</a>  de Framasoft est chouette aussi) et de nous rejoindre sur ce beau réseau. Ça serait une belle résolution pour 2017 ! -;)<br><br></div><br><noscript><!-- Piwik Image Tracker--><img src="http://www.dadall.info/piwik/piwik.php?idsite=1&amp;rec=1&amp;action_name=RSS" alt=""><!-- End Piwik --></noscript>
<p><img src="media/48d98f88.9bcde41f0ceee54d4588bb741ab92e6f" data-original-source="http://cdn.libravatar.org/avatar/9bcde41f0ceee54d4588bb741ab92e6f" alt="Gravatar de dada" class="gravatar" /><br/><i>Original post of <a href="https://www.dadall.info/blog/index.php?article579/diaspora-en-2016" title="Visit the source">dada</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>Rapha&euml;l Hertzog : <a href="">Mes activit&eacute;s libres en f&eacute;vrier et mars 2016</a> (18/04/2016)</li><li>Rapha&euml;l Hertzog : <a href="">Mes activit&eacute;s libres en avril 2016</a> (17/05/2016)</li><li>Rapha&euml;l Hertzog : <a href="">Mes activit&eacute;s libres en mai 2016</a> (16/06/2016)</li><li>Rapha&euml;l Hertzog : <a href="">Mes activit&eacute;s libres en juin 2016</a> (11/07/2016)</li><li>Rapha&euml;l Hertzog : <a href="">Mes activit&eacute;s libres en juillet 2016</a> (26/08/2016)</li></ul></div></p>


feed_id: http://blogduyax.madyanne.fr/mon-bilan-2016.html
title: Yannic Arnoux : Mon bilan 2016
uri: Yannic-Arnoux-Mon-bilan-2016
url: http://blogduyax.madyanne.fr/mon-bilan-2016.html
content:
<p>C'est le moment du bilan personnel de l'année écoulée. Si je regarde mon compte
GitHub, je vois peu de code cette année et
<a href="https://github.com/kianby/mail2diaspora">Mail2Diaspora</a> est mon seul nouveau
projet. Si je jette un œil au blog, j'ai réussi à réduire ma production en deçà
d'un billet mensuel. Pourtant je n'ai pas diminué mon temps passé sur
l'informatique au sens large. Alors il est vrai que je suis beaucoup plus
régulier sur Diaspora, ce qui explique en partie la baisse du nombre de
billets. Il est plus simple de partager un lien technique avec un commentaire
rapide (mais pertinent hein) que d'élaborer un long article après une
expérimentation plus poussée. Ma consommation de jeux vidéos a diminué
elle-aussi et je ne me suis pas encore jeté à corps perdu dans le bricolage ou
la cuisine. Finalement, en repassant l'année au ralenti, j'ai passé énormément
de temps à apprendre et me perfectionner dans mon métier de programmeur, dont
je ne parle pas souvent. Apprendre, c'est une pratique que j'exerce régulièrement depuis
une dizaine d'années suite à un licenciement où j'avais réalisé être un peu
largué techniquement : la faute à la routine d'un poste et la fainéantise.
Depuis cette époque je me tiens informé : langages, méthodes, conception tout
ce qui touche à mon métier. Je lis beaucoup : de la documentation, des retours
d'expérience d'experts, et j'expérimente un peu.</p>
<p>J'ai beaucoup joué avec Javascript l'année dernière et la moitié de ce que j'ai
appris est déjà <em>has-been</em>. Mais ce n'est pas grave ; ça n'a pas été inutile
car cela me servira pour aborder d'autres outils et d'autres Frameworks.
J'avais aussi suivi une formation sur la programmation fonctionnelle en Scala
avec l'organisme de cours en ligne Coursera. Il est possible que je ne fasse
plus jamais de Scala mais l'éclairage sur la programmation fonctionnelle est
transposable, il ouvre l'esprit sur d'autres façons de penser et de coder. </p>
<p>Et il ne s'agit pas que de langages et de frameworks. On n'est pas largué parce
qu'on ne connaît pas un langage. Si un recruteur voit les choses de cette
manière c'est qu'il a une vision limitée du potentiel de la personne, juste
réduite à des mots clefs dans un CV. Pour voir plus loin, il faut qu'il
connaisse le métier, pose les bonnes questions et surtout comprenne les
réponses. Ce n'est pas un tâcle, mais on voit une catégorie de recruteurs
sortis tout droit d'écoles de commerce qui ne connaissent absolument rien au
métier et dont le seul talent est finalement de faire correspondre des
mots-clés dans des annonces avec des mots-clés dans des profils. Quel gâchis
pour eux et quelle frustation pour les candidats qu'ils approchent... </p>
<p>Au delà des technos, rester en phase avec le métier de développeur c'est
s'intéresser à tous les aspects, réfléchir verticalement, ne pas rester
cantonné au code et aux langages : s'intéresser à l'agilité, à la qualité du
code : un vaste sujet qui va des tests unitaires à l'intégration et au
déploiement continus et qui amène à aborder des outils comme Jenkins, Docker,
Sonar. Et puis il y a les bonnes pratiques, mon dada en prenant de l'âge. Faire
n'est plus suffisant, réaliser selon l'état de l'art dans le domaine est
beaucoup plus gratifiant. Ces bonnes pratiques sont présentes dans tous les
domaines. Ce sont les design patterns en programmation, la compréhension des
concepts et de la philosophie derrière une techno pour l'utiliser dans le bon
cadre et en tirer la quintessence. Ne pas utiliser la programmation orienté
objet en JAVA ou utiliser Ansible comme un bête installeur via SSH, c'est
dommage et c'est passer à côté de la puissance qu'on aurait pu en tirer. </p>
<p>Quand on a étiré ses connaissances dans plusieurs domaines avec cet état
d'esprit on atteint la satisfaction de l'artisan qui sait choisir l'outil le
plus approprié pour chaque tâche, on peut prétendre faire de l'architecture
logicielle : être capable de choisir le bon langage et le bon paradigme de
programmation pour un projet, les bons frameworks, et mettre en place les
outils nécessaires à une production de qualité. Le seul hic c'est le temps. Il
y a tellement de sujets et cela prend déjà tant de temps pour se maintenir dans
son cœur de métier, qu'il faut obligatoirement sélectionner. Dans mon cas, le
cœur c'est d'abord le développement avec des solides compétences en JAVA et
PYTHON, deux écosystèmes qui évoluent en permanence. En parallèle ce sont les
méthodes et outils transverses, valables pour tout langage : tests,
intégration, méthodes agiles.  Et comme j'ai une fibre système, de par ma
formation initiale, que j'ai bien fait évoluer depuis 6 ans, je me maintiens
sur les outils de déploiement, la virtualisation et les conteneurs.</p>
<p>Pour en revenir à l'année écoulée, j'ai mis le paquet sur le langage PYTHON que
je pratique pourtant depuis 15 ans et sur lequel j'ai décidé de grimper en
compétence. Remise à niveau sur l'aspect fonctionnel du langage, découverte de
nouvelles librairies. J'ai aussi appliqué un conseil lu chez
<a href="http://sametmax.com/">Sam</a> : la lecture de bon code écrit par d'autres. Et
c'est ainsi que j'ai disséqué le code de quelques librairies standard de
PYTHON, notamment les collections. Et c'est un très bon conseil, on en tire des
façons de faire, des conceptions élégantes et cela démystifie le côté un peu
magique de certaines librairies en regardant sous le capot. C'est un effort que
je vais continuer en 2017.</p>
<p>Bonnes fêtes de fin d'année à tous.</p>
<p><img src="media/79716ccf.308a3596152a79231f3feedc49afa4ef" data-original-source="http://cdn.libravatar.org/avatar/308a3596152a79231f3feedc49afa4ef" alt="Gravatar de Yannic Arnoux" class="gravatar" /><br/><i>Original post of <a href="http://blogduyax.madyanne.fr/mon-bilan-2016.html" title="Visit the source">Yannic Arnoux</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>


feed_id: http://ilphrin.com/planet/2016/12/30/oni-un-gui-pour-neovim.html
title: Ilphrin : Oni: Un GUI sympa pour Neovim
uri: Ilphrin-Oni-Un-GUI-sympa-pour-Neovim
url: http://ilphrin.com/planet/2016/12/30/oni-un-gui-pour-neovim.html
content:
<p>Ca faisait longtemps que je n’avais pas parlé de <a href="https://neovim.io/">Neovim</a> hein? Eh bien pour la peine je vais présenter un GUI fait avec Electron pour Neovim qui claque</p>

<!--break-->

<p>J’avais déjà essayé un GUI qui s’appelait <a href="https://github.com/rhysd/NyaoVim">Nyaovim</a> il y a plusieurs mois. Le souci que j’avais était que beaucoup de choses ne fonctionnaient pas très bien (peut-être qu’il y a eu des améliorations ceci-dit depuis le temps), mais il avait un grand avantage qui était son API pour développer des widgets graphiques qui venaient s’ajouter aux fonctionnalités de Nyaovim.</p>

<p>L’ayant laissé de côté en attendant une meilleure stabilité, j’ai découvert un autre programme qui s’appelle cette fois-ci <a href="https://github.com/extr0py/oni">Oni</a>. Celui-ci possède beaucoup de points communs à Nyaovim. Il ont tous les deux un logo cool, ils fonctionnent tous les deux avec de l’Eléctron, ont tous les deux une API pour faire des extensions, etc.</p>

<p>Voici un petit screenshot de ce à quoi ressemble Oni pendant que je rédige mon article:</p>

<p><img src="media/9f7de2ae.oni.png" data-original-source="http://ilphrin.com/images/oni.png" alt="Oni"></p>

<p>C’est cool hein? En comparaison voilà à quoi ressemble mon nvim en terminal (qui est déjà assez sympa à mon goût):</p>

<p><img src="media/6f33e8e6.oni_02.png" data-original-source="http://ilphrin.com/images/oni_02.png" alt="Neovim"></p>

<p>Dans les différences visible on peut voir (outre ma pub caché pour le terminal Terminix ;) ):</p>

<ul><li>Que les caractères de vim-airline ne passent pas très bien</li>
  <li>Qu’il y a une petite barre en plus à droite de mon buffer. Cette barre m’indique ma position par rapport au fichier entier</li>
  <li>L’auto-complétion n’a pas du tout la meme tronche. Oni profite de l’<a href="https://github.com/neovim/neovim/pull/5686">externalisation de l’UI</a> qu’est en train de faire Neovim pour améliorer graphiquement les différents éléments.</li>
  <li>Il y a une image en fond. Ca peut paraitre bete mais c’est le genre de personnalisation que j’aime beaucoup et qui rajotue une touche personnelle supplémentaire.super</li>
</ul><p>Il faut savoir qu’au début de mes tests d’Oni, j’avais remarqué un bug d’affichage avec la première ligne de mon buffer et NERDTree, et j’ai donc fait un <a href="https://github.com/extr0py/oni/issues/106">rapport de bug</a>, qui a été corrigé 4 jours plus tard, avec une poignée d’autres bugs corrigé.</p>

<p>C’est une réactivité vraiment sympa surtout quand on voit qu’il n’y a que quelques développeurs principaux (3 à première vue d’après les graphs Github), et le reste des contributions étant assez minimes en comparaison.</p>

<p>Il y a la <a href="https://github.com/extr0py/oni/releases">version 1.6</a> qui est sortie tout récemment pour Oni qui rajoute notamment:</p>

<ul><li>Le support des caractères <a href="https://fr.wikipedia.org/wiki/Chinois,_japonais_et_cor%C3%A9en">CJC</a> (Chinois, Japonais, Coréen)</li>
  <li>Correction de l’affichage de l’autoauto-complétion</li>
  <li>Une refonte du système de plugin pour préparer les prochaines fonctionalités (Prévisualisation Markdown, intégration dynamique de l’UI des plugins)</li>
</ul><p>C’est en somme un logiciel que je conseille vivement malgré deux trois petits bug genant parfois (par exemple je dois ré-écrire cet-article sous Neovim en terminal, car les accents circonflexes ne se mettent pas sur Oni)</p>
<p><img src="media/9292dabf.235511b5004cfd4af8c43a8b06c9e121" data-original-source="http://cdn.libravatar.org/avatar/235511b5004cfd4af8c43a8b06c9e121" alt="Gravatar de Ilphrin" class="gravatar" /><br/><i>Original post of <a href="http://ilphrin.com/planet/2016/12/30/oni-un-gui-pour-neovim.html" title="Visit the source">Ilphrin</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>


title: Tuxicoman : Bonnes résolutions 2017
uri: Tuxicoman-Bonnes-résolutions-2017
feed_id:
https://tuxicoman.jesuislibre.net/2016/12/bonnes-resolutions-2017.html?pk_campaign=feed&amp;pk_kwd=bonnes-resolutions-2017

url:
https://tuxicoman.jesuislibre.net/2016/12/bonnes-resolutions-2017.html?pk_campaign=feed&amp;pk_kwd=bonnes-resolutions-2017

content:
<p><a href="media/13501ab5.2017.jpg" data-original-source="https://tuxicoman.jesuislibre.net/blog/wp-content/uploads/2017.jpg"><img src="media/13501ab5.2017.jpg" data-original-source="https://tuxicoman.jesuislibre.net/blog/wp-content/uploads/2017.jpg" alt="" width="420" height="240" srcset="https://tuxicoman.jesuislibre.net/blog/wp-content/uploads/2017.jpg 420w, https://tuxicoman.jesuislibre.net/blog/wp-content/uploads/2017-300x171.jpg 300w" sizes="(max-width: 420px) 100vw, 420px"></a></p>
<p>Voici une liste de bonnes résolutions que vous pouvez prendre pour cette nouvelle année :</p>
<p>Facile :</p>
<ul><li>Utiliser Firefox comme navigateur web par défaut sur tous vos appareils. Installer l’extension <a href="https://addons.mozilla.org/en-us/firefox/addon/ublock-origin/">Ublock Origin</a> pour supprimer les pubs des sites web.</li>
<li>Utiliser un compte mail respectueux de la vie privée (ex: <a href="https://protonmail.ch/">ProtonMail</a>, <a href="https://www.openmailbox.org/">OpenMailbox</a>, <a href="https://www.gandi.net/">Gandi</a>)</li>
<li>Utiliser <a href="https://conversations.im/">Conversations</a> sur Android pour chatter de manière privée.</li>
<li>Ouvrir un compte sur le <a href="https://framasphere.org/">réseau social Diaspora</a>, l’alternative décentralisée à Facebook et Twitter</li>
<li>Faire un don (aussi minime soit-il) à un logiciel libre</li>
</ul><p>Moyen :</p>
<ul><li>Apprendre les bases de la programmation avec <a href="https://www.python.org/">Python</a>. Vous comprendrez mieux comment fonctionne un ordinateur et pourrez automatiser des taches.</li>
<li>Installer Cyanogen/<a href="http://lineageos.org/">LineageOS</a> sur votre smartphone. Redevenez le maître de votre smartphone, bloquez les permissions abusives, supprimez la pub des applications, supprimer les applications préinstallées qui bouffent votre batterie et polluent l’interface, gagnez en vitesse, sécurité et autonomie avec toujours la dernière version d’Android sans devoir racheter de nouvel appareil</li>
<li>Essayez une <a href="https://www.ubuntu.com/">distribution Linux</a> sur votre PC personnel. Bénéficiez de tous les logiciels libres installables d’un clic et d’un ordinateur rapide, sans antivirus et sans espions. Le plus simple est d’installer Linux sur un deuxième disque dur pour commencer. Vous retrouverez les mêmes logiciels libres que vous utilisez sous Windows ou Mac et plus encore.</li>
</ul><p>Difficile :</p>
<ul><li>Gérer votre serveur personnel (chez vous) avec un Raspberry Pi et <a href="https://nextcloud.com/">Nextcloud</a>, <a href="https://wordpress.com/">WordPress</a>, <a href="https://prosody.im/">Prosody</a>, <a href="https://wiki.mumble.info/wiki/Main_Page">Mumble</a>, etc… pour une infrastructure efficace et privée.</li>
</ul><h3>Related Posts:</h3>
<ul><li><a href="https://tuxicoman.jesuislibre.net/2016/11/migration-owncloud-nextcloud.html" title="Migration owncloud -> nextcloud">Migration owncloud -> nextcloud</a></li>
<li><a href="https://tuxicoman.jesuislibre.net/2014/02/etat-des-lieux-de-la-messagerie-chiffree.html" title="Etat des lieux de la messagerie chiffrée">Etat des lieux de la messagerie chiffrée</a></li>
<li><a href="https://tuxicoman.jesuislibre.net/2016/10/bloquer-les-publicites-et-traqueurs-au-niveau-du-dns-avec-unbound.html" title="Bloquer les publicités et traqueurs au niveau du DNS avec Unbound">Bloquer les publicités et traqueurs au niveau du DNS avec Unbound</a></li>
<li><a href="https://tuxicoman.jesuislibre.net/2016/10/utiliser-signal-impose-la-presence-de-lespion-de-google.html" title="Utiliser Signal impose la présence de l’espion de Google">Utiliser Signal impose la présence de l’espion de Google</a></li>
<li><a href="https://tuxicoman.jesuislibre.net/2016/09/googleplaydownloader-2-3.html" title="GooglePlayDownloader 2.3">GooglePlayDownloader 2.3</a></li>
</ul><img src="https://piwik.jesuislibre.net/piwik.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Ftuxicoman.jesuislibre.net%2F2016%2F12%2Fbonnes-resolutions-2017.html%3Fpk_campaign%3Dfeed%26pk_kwd%3Dbonnes-resolutions-2017&amp;action_name=Bonnes+r%C3%A9solutions+2017&amp;urlref=https%3A%2F%2Ftuxicoman.jesuislibre.net%2Ffeed" width="0" height="0" alt="">
<p><img src="media/a4176171.d01ce01523a0434fc1c413922f7fd8a2" data-original-source="http://cdn.libravatar.org/avatar/d01ce01523a0434fc1c413922f7fd8a2" alt="Gravatar de Tuxicoman" class="gravatar" /><br/><i>Original post of <a href="https://tuxicoman.jesuislibre.net/2016/12/bonnes-resolutions-2017.html?pk_campaign=feed&amp;pk_kwd=bonnes-resolutions-2017" title="Visit the source">Tuxicoman</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>Tuxicoman : <a href="">Migration owncloud -&amp;gt; nextcloud</a> (06/11/2016)</li><li>Tuxicoman : <a href="">Etat des lieux de la messagerie chiffr&eacute;e</a> (09/02/2014)</li><li>Tuxicoman : <a href="">GooglePlayDownloader 2.3</a> (27/09/2016)</li><li>Tuxicoman : <a href="">Fail2ban pour votre installation WordPress</a> (03/04/2013)</li><li>Tuxicoman : <a href="">Ins&eacute;rer des vid&eacute;os dans WordPress 3.6</a> (20/08/2013)</li></ul></div></p>


title: Tuxicoman : Changer la résolution d’une vidéo avec FFMPEG sous Linux
uri: Tuxicoman-Changer-la-résolution-d-une-vidéo-avec-FFMPEG-sous-Lin
feed_id:
https://tuxicoman.jesuislibre.net/2017/01/changer-la-resolution-dune-video-avec-ffmpeg-sous-linux.html?pk_campaign=feed&amp;pk_kwd=changer-la-resolution-dune-video-avec-ffmpeg-sous-linux

url:
https://tuxicoman.jesuislibre.net/2017/01/changer-la-resolution-dune-video-avec-ffmpeg-sous-linux.html?pk_campaign=feed&amp;pk_kwd=changer-la-resolution-dune-video-avec-ffmpeg-sous-linux

content:
<p>J’ai pris une vidéo avec mon smartphone Android mais j’ai oublié de choisir la bonne résolution. Bilan, la vidéo est haute qualité (3840×2160 pixels) et fait 500Mo pour 2 min de film. Impossible à envoyer par Internet.</p>
<p>Pour réduire le poids du fichier, on va alors réduire la résolution de la vidéo.</p>
<p>Avec le logiciel <a href="https://ffmpeg.org/">FFMPEG</a>, on peut redimensionner la vidéo en une seule ligne de commande.<br><code>$ ffmpeg -i input.mp4 -vf scale=960:-1 output.mp4</code></p>
<p><strong>960</strong> est ici la largeur en pixels désirée pour le fichier de sortie. Pour ne pas trop altérer la qualité, il faut choisir une valeur qui soit une division de la largeur du fichier originale par un multiple de 2 (ici 960 = 3840/2/2)</p>
<p>Bilan, la vidéo fait maintenant 960x540px et fait 23Mo. Pratique !</p>
<h3>Related Posts:</h3>
<ul><li><a href="https://tuxicoman.jesuislibre.net/2016/09/mesa-12-sur-debian-jessie.html" title="Mesa 12 sur Debian Jessie">Mesa 12 sur Debian Jessie</a></li>
<li><a href="https://tuxicoman.jesuislibre.net/2016/09/googleplaydownloader-2-3.html" title="GooglePlayDownloader 2.3">GooglePlayDownloader 2.3</a></li>
<li><a href="https://tuxicoman.jesuislibre.net/2016/01/faille-critique-dans-le-noyau-linux-2.html" title="Faille critique dans le noyau Linux">Faille critique dans le noyau Linux</a></li>
<li><a href="https://tuxicoman.jesuislibre.net/2015/06/hotplug-sata-sous-linux.html" title="Hotplug SATA sous linux">Hotplug SATA sous linux</a></li>
<li><a href="https://tuxicoman.jesuislibre.net/2015/03/aide-a-une-noob-par-reverse-ssh.html" title="Aide à une noob par reverse SSH">Aide à une noob par reverse SSH</a></li>
</ul><img src="https://piwik.jesuislibre.net/piwik.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Ftuxicoman.jesuislibre.net%2F2017%2F01%2Fchanger-la-resolution-dune-video-avec-ffmpeg-sous-linux.html%3Fpk_campaign%3Dfeed%26pk_kwd%3Dchanger-la-resolution-dune-video-avec-ffmpeg-sous-linux&amp;action_name=Changer+la+r%C3%A9solution+d%26rsquo%3Bune+vid%C3%A9o+avec+FFMPEG+sous+Linux&amp;urlref=https%3A%2F%2Ftuxicoman.jesuislibre.net%2Ffeed" width="0" height="0" alt="">
<p><img src="media/a4176171.d01ce01523a0434fc1c413922f7fd8a2" data-original-source="http://cdn.libravatar.org/avatar/d01ce01523a0434fc1c413922f7fd8a2" alt="Gravatar de Tuxicoman" class="gravatar" /><br/><i>Original post of <a href="https://tuxicoman.jesuislibre.net/2017/01/changer-la-resolution-dune-video-avec-ffmpeg-sous-linux.html?pk_campaign=feed&amp;pk_kwd=changer-la-resolution-dune-video-avec-ffmpeg-sous-linux" title="Visit the source">Tuxicoman</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>Tuxicoman : <a href="">Hunspell : correction orthographique sous Linux</a> (18/11/2012)</li><li>Tuxicoman : <a href="">Ex&eacute;cuter une application graphique root dans une session utilisateur</a> (27/02/2013)</li><li>Tuxicoman : <a href="">Changer son adresse MAC</a> (13/11/2014)</li><li>Tuxicoman : <a href="">Mesa 12 sur Debian Jessie</a> (29/09/2016)</li><li>Tuxicoman : <a href="">GooglePlayDownloader 2.3</a> (27/09/2016)</li></ul></div></p>


feed_id: http://leubuntupodcast.org/podcast-video/le-dernier-episode-de-la-saison-1/
title: cm-t : Le dernier épisode de la saison 1
uri: cm-t-Le-dernier-épisode-de-la-saison-1
url: http://leubuntupodcast.org/podcast-video/le-dernier-episode-de-la-saison-1/
content:
<a href="http://leubuntupodcast.org/podcast-video/le-dernier-episode-de-la-saison-1/"><img width="560" height="315" src="media/aa520641.s1-last-560x315.jpg" data-original-source="http://leubuntupodcast.org/wp-content/uploads/2017/01/s1-last-560x315.jpg" alt="Le dernier épisode de la saison 1" align="left"></a>
<div></div>
<p><a href="http://leubuntupodcast.org/#version_audio"><button><span>Header button label:Écouter la version audio</span>Écouter la version audio</button></a></p>
<p> </p>
<h3>L’actualité</h3>
<ul><ul><li>Les 5ans du podcast <a href="http://bloglinux.ca/">bloglinux.ca</a>
</li>
<li>L’apéro des papas manchots, suivez-les sur <a href="http://bloglinux.ca/">bloglinux.ca</a>
</li>
<li>L’April fête<a href="http://www.nextinpact.com/news/102596-lapril-fete-ses-20-ans-et-rappelle-que-servitude-s-avance-masquee.htm"> ses 20ans</a>
</li>
<li>
<a href="https://www.fullcirclemag.fr/?post/2016/12/20/Pour-les-F%C3%AAtes-de-fin-d-ann%C3%A9e2">Numéro</a> <a href="https://www.fullcirclemag.fr/?post/2016/12/20/Pour-les-F%C3%AAtes-de-fin-d-ann%C3%A9e2">115 </a>: le courriel en ligne de commande, astuces pour KODI (anciennement XBMC), programmation C, le jeu Rocket League, …<a href="https://www.fullcirclemag.fr/?post/2016/12/20/Pour-les-F%C3%AAtes-de-fin-d-ann%C3%A9e2" target="_blank" rel="https://www.fullcirclemag.fr/?post/2016/12/20/Pour-les-F%C3%AAtes-de-fin-d-ann%C3%A9e2"><img src="media/267586c4.page-t-560x89.png" data-original-source="http://leubuntupodcast.org/wp-content/uploads/2017/01/page-t-560x89.png" width="560"></a>
</li>
<li>Plus de 1000 jeux supportant Linux <a href="http://www.developpez.com/actu/109344/Plus-de-1000-jeux-supportant-Linux-ont-ete-lances-sur-Steam-en-2016-une-tendance-qui-devrait-s-accelerer-dans-le-futur/">ont été lancés en 2016</a> sur Steam.</li>
<li>Le jeu <a href="http://linuxfr.org/news/lugaru-enfin-libre">lugaru</a> est libre (Wolfire)<a href="http://linuxfr.org/news/lugaru-enfin-librehttp://" target="_blank" rel="http://linuxfr.org/news/lugaru-enfin-libre"><img src="media/4b11713b.lugaru-banner-560x270.png" data-original-source="http://leubuntupodcast.org/wp-content/uploads/2017/01/lugaru-banner-560x270.png" width="560"></a>
</li>
<li>
<a href="http://www.nextinpact.com/news/102618-openshot-2-2-hausse-generale-performances-et-courbes-bezier.htm">OpenShot 2.2</a> : hausse générale des performances et courbes de Bézier, 4K</li>
</ul></ul><div></div>
<ul><li>
<a href="http://www.zdnet.fr/actualites/ubuntu-faille-severe-dans-l-outil-de-reporting-de-crash-39846142.htm">Une faille dans</a> apport <em>(le logiciel de rapport de bogue dans Ubuntu)</em> a été corrigée, mettez à jour votre système</li>
<li>Un<a href="http://www.fredzone.org/il-suffisait-dun-mp3-pour-pirater-ubuntu-ou-fedora-003"> autre faille corrigée</a>, utilisant un fichier nommé en mp3, c’était en fait un son de snes, qui arrive à insérer des instructions critiques, mettez à jour votre système, on ne cessera de le répéter !<br><em><strong>Mise à jour:</strong> Il s’agit de GStreamer (FFmpeg énoncé dans les versions audio/vidéo)</em>
</li>
<li>
<a href="http://people.videolan.org/~jb/Builds/360/">VLC</a> gère <a href="http://www.toolinux.com/Video-a-360o-pour-VLC">les vidéos 360°.</a><br><blockquote><p><b>VLC 3.0</b> final release will merge those features on all platforms.<a href="http://people.videolan.org/~jb/Builds/360/" target="_blank" rel="http://people.videolan.org/~jb/Builds/360/"><img src="media/4dcdb495.cover-560x214.jpg" data-original-source="http://leubuntupodcast.org/wp-content/uploads/2017/01/cover-560x214.jpg" width="560"></a></p></blockquote>
</li>
</ul><h3>Prédiction</h3>
<p>Rudy</p>
<ul><li>Unity8 installé par défaut</li>
<li>Une annonce tablette Ubuntu (6premiers mois)</li>
<li>Paris UbuCon Europe sera selectionné en 2016 pour l’édition 2017</li>
<li>Tél Ubuntu: Sony, Xiaomi</li>
<li>Microsoft rachète Canonical (quesh avait dit “hum, non”)</li>
<li>Canonical rachète Microsoft (quesh dit “faut voir l’agenda, c’est bien blindé”)</li>
</ul><p>Quesh</p>
<ul><li>Une annonce tablette Ubuntu (6derniers mois)</li>
<li>Un super téléphone convegent</li>
<li>Tél Ubuntu: Alcatel Lucent,</li>
<li>NAS qui tourne avec Ubuntu (existait déjà au moment des prédictions)</li>
</ul><p>cm-t: 3</p>
<p>quesh: 3</p>
<h3>C’est la fin de la saison 1</h3>
<p>On a bien lu vos commentaires (merci encore fred d’ailleurs), continuez d’en laisser, on les prend vraiment en compte.</p>
<p>Sur ce, on va se laisser le mois de janvier pour retravailler certains points, on publiera cependant peut-être des hors série. En attendant, vous pouvez continuer de nous suggèrer des actu sur <a href="http://www.reddit.com/r/ubuntuFr">/r/ubuntuFr</a>.</p>
<p><img src="media/b9fd655a.2382dc5b2226f1a1ea0ef0d995ad0648" data-original-source="http://cdn.libravatar.org/avatar/2382dc5b2226f1a1ea0ef0d995ad0648" alt="Gravatar de cm-t" class="gravatar" /><br/><i>Original post of <a href="http://leubuntupodcast.org/podcast-video/le-dernier-episode-de-la-saison-1/" title="Visit the source">cm-t</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>cm-t : <a href="">Ubuntu Party de Paris &amp;amp; UbuCon Europe Essen</a> (23/12/2016)</li><li>cm-t : <a href="">Le Ubuntu Podcast &ndash; Saison 01 le Episode 00</a> (30/12/2015)</li><li>cm-t : <a href="">Le French UOS summary 16.11</a> (20/12/2016)</li><li>cm-t : <a href="">Le french UOS summary 16.05</a> (01/06/2016)</li><li>cm-t : <a href="">Le Crossover #01 @ Ubuntu Party Paris 16.05</a> (10/06/2016)</li></ul></div></p>


title: Journal du hacker : Liens intéressants Journal du hacker semaine #52
uri: Journal-du-hacker-Liens-intéressants-Journal-du-hacker-semaine-52
feed_id:
https://blog.journalduhacker.net/index.php?article82/liens-interessants-journal-du-hacker-semaine-52

url:
https://blog.journalduhacker.net/index.php?article82/liens-interessants-journal-du-hacker-semaine-52

content:
<p>Pour la 52ème semaine de 2016, voici 5 liens intéressants que vous avez peut-être ratés, relayés par <a href="https://www.journalduhacker.net/">le Journal du hacker</a>, votre source d’informations pour le Logiciel Libre francophone !</p>

<a href="https://www.journalduhacker.net/"><img src="media/01f45034.logo-journal-du-hacker.png" data-original-source="https://blog.journalduhacker.net/data/medias/logo-journal-du-hacker.png"></a>

<ul><li><a href="https://www.journalduhacker.net/s/u6qqpp/de_mac_linux_les_dix_premiers_jours_2">De Mac à Linux : les dix premiers jours (2)</a></li>
<li><a href="https://www.journalduhacker.net/s/drqex3/gitlab_une_importante_version_8_15_les_pages_d_barquent_dans_la_community_edition">GitLab : une importante version 8.15, les Pages débarquent dans la Community Edition</a></li>
<li><a href="https://www.journalduhacker.net/s/1ux82o/fairphone_2_le_nouveau_smartphone_thique_et_durable">Fairphone 2, le nouveau smartphone éthique et durable</a></li>
<li><a href="https://www.journalduhacker.net/s/8ly44t/les_fichiers_po_c_est_pas_si_mal">Les fichiers po c’est pas si mal !</a></li>
<li><a href="https://www.journalduhacker.net/s/irl6ys/plus_de_p_lican_c_est_grav">Plus de pélican, c'est grav</a></li>
</ul><p>Pour ne plus rater aucun article de la communauté francophone, voici :</p>

<ul><li><a href="https://www.journalduhacker.net/rss">Le flux RSS du Journal du hacker</a></li>
<li><a href="https://twitter.com/journalduhacker">Le compte Twitter du Journal du hacker</a></li>
<li><a href="https://framasphere.org/u/journalduhacker">Le compte Diaspora* du Journal du hacker</a></li>
</ul><p>De plus le site web du Journal du hacker est « adaptatif (responsive) ». N’hésitez pas à le consulter depuis votre smartphone ou votre tablette !</p>

<p>Le Journal du hacker fonctionne de manière collaborative, grâce à la participation de ses membres. <a href="https://www.journalduhacker.net/invitations/request">Rejoignez-nous</a> pour proposer vos contenus à partager avec la communauté du Logiciel Libre francophone et faire connaître vos projets !</p>

<p><strong>Et vous ? Qu’avez-vous pensé de ces articles ?</strong> N’hésitez pas à réagir directement dans les commentaires de l’article sur le Journal du hacker ou bien dans les commentaires de ce billet :)</p>
<p><img src="media/ffe97a17.7916ee3cafa0bc3e9583bedad876dcd5" data-original-source="http://cdn.libravatar.org/avatar/7916ee3cafa0bc3e9583bedad876dcd5" alt="Gravatar de Journal du hacker" class="gravatar" /><br/><i>Original post of <a href="https://blog.journalduhacker.net/index.php?article82/liens-interessants-journal-du-hacker-semaine-52" title="Visit the source">Journal du hacker</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>Carl Chenet : <a href="">Liens int&eacute;ressants Journal du hacker semaine #52</a> (27/12/2015)</li></ul></div></p>


feed_id: http://ilphrin.com/planet/2017/01/02/faire-marcher-une-carte-hybride-sous-linux.html
title: Ilphrin : Faire marcher une carte hybride sous Linux
uri: Ilphrin-Faire-marcher-une-carte-hybride-sous-Linux
url: http://ilphrin.com/planet/2017/01/02/faire-marcher-une-carte-hybride-sous-linux.html
content:
<p>J’ai un <a href="http://www8.hp.com/us/en/ads/elite-products/elitebook-840.html">HP Elitebook 840</a>, qui possède un système de carte graphique dite “hybride”, pour les besoins de mes études. Après deux ans j’ai enfin réussi à la faire fonctionner, et je me suis dis que j’allais partager ma méthode</p>

<!--break-->

<p>Pour détailler un peu, j’ai:</p>

<ul><li>Un chipset Intel intégré -> <a href="http://www.intel.com/content/www/us/en/support/graphics-drivers/graphics-for-4th-generation-intel-processors/intel-hd-graphics-4400.html">Intel HD Graphics 4400</a></li>
  <li>Une carte graphique “discrète” (j’y reviendrais plus tard sur le terme) -> <a href="http://www.amd.com/en-us/products/graphics/notebook/8700m-8800m#">AMD Radeon HD 8750M</a></li>
</ul><p>Bien sûr, je n’utilise pas cet ordinateur que pour mes cours vu que c’est mon seul PC portable. L’utilisation la plus gourmande que j’ai vient des jeux vidéos. Souvent ce sont des jeux qui ne demandant pas grand-chose comme Osu, Dungeon Crawl Stone Soup, ou Beyond Divinity.</p>

<p>Mais certains jeux ont plus de demandes, comme Doom 3 ou Path Of Exile (jouant à ce dernier fréquemment), et là la performance baisse énormément, avec des piques descendant à 1 image toutes les 2-3 secondes.</p>

<p>Je ne me suis que rarement posé la question puisque je joue à tous ces jeux par le biais de Wine et PlayOnLinux, qui rajoute une couche de complexité et de travail pour l’ordinateur. Seulement depuis 3 mois j’ai eu envie d’investiguer un peu sur les performances de mon pc et j’ai découvert une chose intéressante</p>

<figure><pre><code data-lang="sh">sudo cat /sys/kernel/debug/vgaswitcheroo/switch

0:DIS: :DynOff:0000:03:00.0
1:IGD:+:Pwr:0000:00:02.0
2:DIS-Audio: :Off:0000:03:00.1</code></pre></figure><p>Cette commande permet d’afficher l’état des deux cartes graphiques sur un pc hybride</p>

<ul><li>L’intégrée (IGD -> InteGrateD) : C’est le chipset fourni avec la carte mère. Il s’occupe de tous les traitements peu gourmands comme le compositeur de bureau, des pages web, etc. Tout ce qui est graphique mais qui ne consomme pas beaucoup de ressources.</li>
  <li>La discrete (DIS -> Discrete) : C’est la carte graphique, beaucoup plus puissante et utilisée pour des traitements graphiques plus poussés comme de l’OpenGL.</li>
</ul><p>Dans la sortie de la commande plus haut on voit que la DIScrete est DynamicallyOFF, ce qui est normal puisque je ne fais aucun traitement particulier. Le souci c’est que quoique je fasse je n’arrivais pas à l’activer. Jusqu’à maintenant (petit teaser ;)).</p>

<p>Il faut d’abord rajouter une configuration dans votre xorg.conf:</p>

<figure><pre><code data-lang="xorg">Section "Device"
  Identifier "Radeon"
  Driver "intel"
    Option "AccelMethod" "UXA"
    Option "SwapbuffersWait" "false"
    Option "VSync" "false"
    Option "DRI" "3"
EndSection

Section "Device"
  Identifier "Radeon"
  Driver "radeon"
    Option "SwapbuffersWait" "false"
    Option "TearFree" "false"
    Option "DRI" "3"
EndSection</code></pre></figure><p>On redémarre, et maintenant on peut forcer l’utilisation de la carte graphique sur une commande en mettant une variable d’environnement:</p>

<figure><pre><code data-lang="sh"><span>DRI_PRIME</span><span>=</span>1 macommande</code></pre></figure><p>Maintenant je peux jouer à Path Of Exile sans trop ramer ;)</p>

<div><i></i><div>
Je ne sais pas si ça marche pour tous les pc portables avec une carte hybride Intel/Radeon, et surtout je n'ai pas testé toutes les combinaisons de configuration. C'est un amalgame d'informations trouvées sur StackOverflow, le bug tracker de Xorg, et d'autres recherches Google. N'hésitez pas à me dire ce qui à marché pour vous je vais essayer de faire une partie "Note" sur le site pour stocker ce genre d'astuces
</div></div>
<p><img src="media/9292dabf.235511b5004cfd4af8c43a8b06c9e121" data-original-source="http://cdn.libravatar.org/avatar/235511b5004cfd4af8c43a8b06c9e121" alt="Gravatar de Ilphrin" class="gravatar" /><br/><i>Original post of <a href="http://ilphrin.com/planet/2017/01/02/faire-marcher-une-carte-hybride-sous-linux.html" title="Visit the source">Ilphrin</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>


feed_id: http://alterlibriste.free.fr/index.php?post/2017/01/02/Une-ann%C3%A9e-de-jeux-sous-Debian
title: alterlibriste : Une année de jeux sous Debian
uri: alterlibriste-Une-année-de-jeux-sous-Debian
url: http://alterlibriste.free.fr/index.php?post/2017/01/02/Une-ann%C3%A9e-de-jeux-sous-Debian
content:
<p>Pour redémarrer l’année, je voudrais faire un petit récapitulatif de mes activités vidéo-ludiques de 2016. Avant de déclencher trop d’optimisme chez les hardcores gamers, je tiens à préciser que je ne suis pas un gros joueur, que mes machines ne sont pas des foudres de guerre et que je me suis principalement attaqué à des jeux qui ont une bonne dizaine d’années.</p>


<h5>Petite rétrospective</h5>

<p>Lorsque j’étais jeune actif au début des années 2000, je passais pas mal de temps à jouer mais principalement sur des démos. Non seulement j’hésite toujours à mettre de l’argent dans un jeu vidéo (alors que je n’ai pas de mal à acheter des CD) mais surtout j’aime la phase de découverte alors que je me lasse très vite et ne ressentais donc pas le besoin d’acheter le jeu complet. J’achetais des tas de CD de démo et en ai fait des dizaines, voire des centaines. Seuls quelques jeux m’ont incité à en acquérir l’intégralité comme Baldur’s Gate, Diablo, Outcast et surtout Half-Life pour lequel j’ai aussi joué à des tas de maps faites par des joueurs.</p>


<p>Le début de la vie de famille puis mon passage à Linux ont mis un terme à mes activités vidéo-ludique, seule exception, le pack Half-Life 2 qui a occupé mon été 2012 et tournait très bien avec Steam sous Wine (il n’était pas encore dispo sous Linux). Entre deux, j’ai quand même testé quelques jeux natifs sous Linux pour me détendre en passant mais rien de bien marquant.</p>


<h5>Ah, les gamins, on ne peut rien leur refuser</h5>

<p>Mais depuis près de deux ans, mes gamins commencent à vouloir jouer aux jeux vidéos, après avoir profité de leur présence pour replonger dans les Lego, l’occasion était trop belle. Pour moi, il y a le défi de faire tourner quelque chose sous mon OS préféré et le plaisir de jouer avec eux. <br>
L’aîné est grand amateur de véhicules en tout genre et veut jouer à toutes sortes de simulations et jeux de courses. J’ai fait <a href="http://alterlibriste.free.fr/index.php?post/2015/12/01/Et-si-on-se-faisait-une-course">un billet sur les jeux de courses libres</a>. On a aussi acheté les Farming Simulator 2013 puis 2015, Euro Truck Simulator et Construction Simulator. Tous fonctionnent sous Wine et certains ont même leur version Linux sur Steam.</p>


<h5>Deux grands changements</h5>

<p>À Noël de l’an passé, afin de jouer aux jeux de courses, le père Noël a décidé d’acheter des manettes, objets que je n’avais jamais utilisé car je n’avais joué que sur PC à des jeux plutôt orientés souris/clavier. Première surprise, les manettes de base sont reconnues sans aucun paramétrage (par contre, je n’ai pas réussi à faire fonctionner les vibrations, mais je ne me suis pas acharné). Il faut reconnaître que pour les jeux de courses ou de plateforme (<a href="http://alterlibriste.free.fr/index.php?post/2016/01/17/Vous-prendrez-bien-une-petite-cuisse-de-grenouille">un autre billet en faisait mention</a>) c’est bien agréable.</p>


<p>Un autre changement de taille fût un peu fortuit puisqu’étant passé sous Debian Testing sur mon laptop, j’ai découvert le projet <a href="https://fr.dolphin-emu.org/">Dolphin</a> pour l’émulation de la GameCube et de la Wii. Couplé à la manette, c’est tout le monde des consoles qui s’ouvrait à moi.</p>


<h5>Reprendre les choses là où je les avais laissé</h5>

<p>Grace à l’émulation des consoles des années 2000, je retrouvais donc le monde du jeu vidéo là où je l’avais laissé et sans aucune critique, étant donné le manque de moyens humains et financiers, au niveau des jeux libres sous Linux. Les premiers bons jeux en 3D comme les Prince of Persia ou les jeux de course d’arcade comme les Mario Kart, de quoi passer quelques heures.</p>


<p>À noter aussi le projet <a href="http://ppsspp.org/">PPSSPP</a> qui permet de jouer sur PC à de bons jeux de console portable. Même si les graphismes ne sont pas époustouflants, on peut pousser la résolution et les rendre très agréables à jouer à la manette.</p>


<p>Et puis comme je le disais précédemment, il y a Wine qui permet quand même de jouer à pas mal de choses sous Linux sans oublier Steam et les portages de plus en plus nombreux. Encore une fois, lorsque l’on veut la dernière nouveauté triple A, il faut investir dans du matériel et du propriétaire.</p>


<h5>Profiter de tout ce qui est sorti de bien depuis</h5>


<p>Étant donné la configuration de mes machines, je ne peux jouer qu’à des jeux assez anciens surtout lorsqu’il faut émuler, mais ce n’est pas non plus de la nostalgie ; j’ai bien tenté un peu de rétrogaming mais je n’ai pas vraiment accroché ou juste pour la découverte au même titre que je me faisais plaisir avec les démos (par exemple j’ai été impressionné par le jeu Secret of Mana qui a marqué son temps sur SuperNes). N’ayant jamais joué sur console, les vieux jeux ne m’évoquent pas grand chose. Je ne m’y suis donc pas attardé. Je me contente de jouer aux bons jeux qui m’attirent sortis ces quinzes dernières années. De quoi m’occuper encore pas mal d’heure à moindres frais.<br>
La semaine dernière, le pack des 3 premiers épisodes d’Assassin’s Creed pour moins de 10€ a eu raison de moi et devrait m’occuper quelques mois.</p>
<p><img src="media/2a099e18.9ff6af75660c788842bdb4e186b8909f" data-original-source="http://cdn.libravatar.org/avatar/9ff6af75660c788842bdb4e186b8909f" alt="Gravatar de alterlibriste" class="gravatar" /><br/><i>Original post of <a href="http://alterlibriste.free.fr/index.php?post/2017/01/02/Une-ann%C3%A9e-de-jeux-sous-Debian" title="Visit the source">alterlibriste</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>Olivier Delort : <a href="">Steam rejoint la Linux Fondation</a> (05/12/2013)</li><li>alterlibriste : <a href="">Debian rules (bis)</a> (13/05/2014)</li></ul></div></p>


feed_id: https://wodric.com/commande-grep/
title: Wodric : Commande grep : Rechercher une aiguille dans un système
uri: Wodric-Commande-grep-Rechercher-une-aiguille-dans-un-système
url: https://wodric.com/commande-grep/
content:
<p>L’article qui suit traite de la commande grep ; l’objectif est de montrer ces fonctionnalités avec quelques explications et pas mal d’exemples. Sur le thème des commandes Linux, vous pouvez retrouver un autre article sur<a href="https://wodric.com/la-commande-find/"> la commande find.</a></p>
<p>L’ensemble des exemples ont été mis en place et effectué sur mon Linux Mint 18. Ma version de grep est la GNU 2.25.</p>
<h2>Petit rappel, la commande grep qu’est ce que c’est ?</h2>
<p>Grep est une commande qui permet de faire des recherches de chaînes de caractères dans un flux de texte (fichier ou sortie d’une autre commande, par exemple) et elle accepte les expressions régulières.</p>
<p>Il en existe plusieurs variantes, par exemple :</p>
<ul><li>agrep, qui permet la recherche de chaîne approximative</li>
<li>zgrep, qui permet la recherche dans un fichier compressé</li>
<li>rgrep, qui permet la recherche dans tous les fichiers d’un répertoire</li>
</ul><p>On en trouve d’autres avec chacune ces spécificités (egrep, fgrep, tcgrep, pgrep).</p>
<h2>Exemples</h2>
<h3>La base</h3>
<p>L’utilisation générale de la commande grep se fait de la manière suivante:</p>
<pre data-enlighter-language="shell" data-enlighter-linenumbers="false">grep options "recherche" chemin
</pre>
<p>Avec :</p>
<ul><li>options: les options possibles, que nous verrons un peu plus tard</li>
<li>recherche : le terme à rechercher entre guillemets</li>
<li>chemin : le chemin du fichier (ou dossier) où faire la recherche</li>
</ul><p>Les guillemets autour du terme à rechercher ne sont pas obligatoire. Néanmoins je les conseils dès lors qu’il y a des caractères autres qu’alphanumériques dans votre recherche.</p>
<p>Voici quelques utilisations possible :</p>
<pre data-enlighter-language="shell" data-enlighter-linenumbers="false"># recherche "192" dans le fichier hosts
grep "192" /etc/hosts
# recherche du terme ip dans le répertoire de configuration de apache2
grep "ip" /etc/apache2/conf.d/*
# recherche des lignes d'erreurs dans des fichiers de logs
grep "ERROR" ./tomcat/log/*.log</pre>
<p>Comme vous pouvez le voir, il est possible d’utiliser des patterns afin de cibler, par exemple, un type de fichier ou l’ensemble des fichiers d’un répertoire.</p>
<p>Il est aussi possible d’utiliser des expressions régulières dans le terme de recherche</p>
<pre data-enlighter-language="shell" data-enlighter-linenumbers="false"># recherche des suites de 10 chiffres dans tous les fichiers du répertoire courant
grep "[0-9]\\{10\\}" *</pre>
<p>Je ne suis pas un expert en expressions régulières et je ne souhaite pas dire de bêtises, je vous fournis donc un lien intéressant pour <a href="https://www.lucaswillems.com/fr/articles/25/tutoriel-pour-maitriser-les-expressions-regulieres">bien débuter avec les expressions régulières</a>. Il existe également des sites webs permettant de <a href="http://regexr.com/">s’entrainer avec les expressions régulières</a>.</p>
<h3>Les options les plus utiles</h3>
<p>Voici une liste non exhaustive des options les plus utiles :</p>
<ul><li>–color : un indispensable, permettra de faire<strong> ressortir</strong> le terme recherché <strong>en couleur</strong> dans les résultats</li>
<li>-r : recherche<strong> récursive</strong> dans tous les fichiers et dossiers du répertoire en paramètre</li>
<li>-i : permet d’<strong>ignorer la casse</strong></li>
<li>-c : retourne le <strong>nombre d’occurrences</strong> de la recherche par fichier</li>
<li>-m + num : Par exemple -m5, recherchera <strong>maximum 5 résultats</strong> par fichiers, après le 5 ème la recherche s’arrêtera sur le fichier et passera au suivant</li>
<li>-n : affichera le <strong>numéro de ligne</strong> à laquelle se trouve le résultat dans le fichier</li>
<li>-A + num : Par exemple -A3, affichera les 3 lignes <strong>suivants</strong> le terme de recherche</li>
<li>-B + num : Par exemple -B6, affichera les 6 lignes <strong>précédents</strong> le terme de recherche</li>
<li>-C + num : Par exemple -C2, affichera les 2 lignes <strong>précédents et suivants</strong> le terme de recherche</li>
<li>-w : affichera seulement les résultats où le terme de recherche est <strong>le mot complet</strong></li>
</ul><p>Il existe d’autres options bien entendu, si vous êtes curieux je vous invite à poursuivre vos recherches au-delà de cet article.</p>
<h3>Exemples d’utilisations des options</h3>
<p>Voici un exemple d’utilisation en image des options -n (numéro de ligne), -i (casse) et –color :</p>
<figure><a href="https://i1.wp.com/wodric.com/wp-content/uploads/2016/12/optionGrep.png?ssl=1"><img src="https://i1.wp.com/wodric.com/wp-content/uploads/2016/12/optionGrep.png?resize=700%2C155&amp;ssl=1" alt="Grep options" srcset="https://i1.wp.com/wodric.com/wp-content/uploads/2016/12/optionGrep.png?w=747&amp;ssl=1 747w, https://i1.wp.com/wodric.com/wp-content/uploads/2016/12/optionGrep.png?resize=300%2C66&amp;ssl=1 300w" sizes="(max-width: 700px) 100vw, 700px" data-recalc-dims="1"></a><figcaption>grep -n -i –color</figcaption></figure><p>Il était 23 h lorsque je fais cette petite démonstration, je n’étais pas particulièrement inspiré ;).</p>
<p>Maintenant d’autres exemples plus fonctionnels, mis en contexte.</p>
<pre data-enlighter-language="shell" data-enlighter-linenumbers="false"># recherche la configuration des workers (loadblancing) dans apache, récursivement
grep -r "worker" /etc/apache2/
# la même chose en couleur
grep -r --color "worker" /etc/apache2
# on complète en affichant les numéros de ligne concernés
grep -rn --color "worker" /etc/apace2</pre>
<p>Autres exemples pour récupérer les lignes autours d’un terme recherché :</p>
<pre data-enlighter-language="shell" data-enlighter-linenumbers="false"># recherche d'erreur dans des logs Java, en affichant la source d'erreur (3 lignes suivants l'erreur)
grep --color -A3 "ERROR" /opt/tomcat/logs/*.log
# même chose mais en remontant les 3 lignes précédents l'erreur
grep --color -B3 "ERROR" /opt/tomcat/logs/*.log
# même chose avec 3 lignes avant et après
grep --color -A3 -B3 /opt/tomcat/logs/*.log
# c'est l'équivalent de 
grep --color -C3 /opt/tomcat/logs/*.log</pre>
<p>Une autre petite image afin que l’option -w soit plus clair :</p>
<figure><a href="https://i0.wp.com/wodric.com/wp-content/uploads/2016/12/optionw.png?ssl=1"><img src="https://i0.wp.com/wodric.com/wp-content/uploads/2016/12/optionw.png?resize=650%2C107&amp;ssl=1" alt="Option word grep" srcset="https://i0.wp.com/wodric.com/wp-content/uploads/2016/12/optionw.png?w=650&amp;ssl=1 650w, https://i0.wp.com/wodric.com/wp-content/uploads/2016/12/optionw.png?resize=300%2C49&amp;ssl=1 300w" sizes="(max-width: 650px) 100vw, 650px" data-recalc-dims="1"></a><figcaption>grep -w</figcaption></figure><p>Voici un exemple pour l’option -c :</p>
<pre data-enlighter-language="shell" data-enlighter-linenumbers="false"># compter les occurences d'un mot par fichier dans le répertoire de log du système
grep -c "word" /var/log/*
# la même chose en ignorant la casse
grep -ci "word" /var/log/*
# de manière récursive dans les sous répertoires
grep -rci "word" /var/log/*
</pre>
<h3>Utilisation des opérateur OR, AND et NOT</h3>
<p>Voici des exemples avec l’opérator OR, qui permet de recherche plusieurs termes disjointement.</p>
<pre data-enlighter-language="shell" data-enlighter-linenumbers="false"># recherche des termes ERROR et CRITICAL dans les logs
grep  "ERROR\\|CRITICAL" /opt/tomcat/log/*.log
# même chose avec l'option -E qui gère l'utilisation étendu des regex
grep -E "ERROR|CRITICAL" /opt/tomcat/log/*.log
# il y a également l'option -e
grep -e "ERROR" -e "CRITICAL" /opt/tomcat/log/*.log
# egrep est équivalent à grep -E
egrep "ERROR|CRITICAL" /opt/tomcat/log/*.log</pre>
<p>Pour faire un AND, il est nécessaire d’utiliser les pipes.</p>
<p>Rappel : <a href="https://fr.wikipedia.org/wiki/Tube_(shell)">un pipe</a> permet d’utiliser la sortie d’une commande pour l’appliquer à l’entrée d’une autre.</p>
<p>Dans l’exemple ci-dessous, l’objectif est de rechercher les NullPointerException parmi les erreurs dans la log d’un Tomcat</p>
<pre data-enlighter-language="shell" data-enlighter-linenumbers="false"># On filtre les logs sur le mot error, puis on filtre le résultat pour rechercher les NullPointerException
grep -E "ERROR" /opt/tomcat/log/*.log | grep -E "NullPointerException"
# La commande suivante offre le même résultat
grep "ERROR" /opt/tomcat/log/*.log | grep "NullPointerException"</pre>
<p>Enfin, pour utiliser la négation logique , il faut utiliser l’option -v, par exemple :</p>
<pre data-enlighter-language="shell" data-enlighter-linenumbers="false"># recherche les lignes sans le mot démonstration
grep -v "démonstration" *.txt
# recherche les erreurs qui ne sont pas des NullPointerException
grep "ERROR" /opt/tomcat/log/*.log | grep -v "NullPointerException"</pre>
<h3>Utiliser la commande grep comme un filtre</h3>
<p>Dans les faits, la commande grep est autant utilisée pour faire de la recherche brut dans des fichiers que pour filtrer le résultat d’autres commandes. Lorsque vous utilisez une commande verbeuse, il est intéressant de filtrer le résultat de cette commande pour obtenir uniquement l’information souhaitée.</p>
<p>Par exemple, avec la commande « ps » qui retourne la liste des process à l’instant sur la machine. Elle retourne souvent plusieurs centaines de lignes, un grep sur le nom du process à rechercher fait des miracles!</p>
<p>Voici plusieurs exemples en image :</p>
<figure><a href="https://i0.wp.com/wodric.com/wp-content/uploads/2016/12/grep_as_filter.png?ssl=1"><img src="https://i0.wp.com/wodric.com/wp-content/uploads/2016/12/grep_as_filter.png?resize=601%2C213&amp;ssl=1" alt="Grep comme filtre" srcset="https://i0.wp.com/wodric.com/wp-content/uploads/2016/12/grep_as_filter.png?w=601&amp;ssl=1 601w, https://i0.wp.com/wodric.com/wp-content/uploads/2016/12/grep_as_filter.png?resize=300%2C106&amp;ssl=1 300w" sizes="(max-width: 601px) 100vw, 601px" data-recalc-dims="1"></a><figcaption>Grep comme filtre</figcaption></figure><h3>A votre tour</h3>
<p><strong>Le meilleur moyen d’apprécier l’utilisation des commandes et leurs puissances est de s’y essayer</strong>. La prochaine fois que vous avez une recherche à faire, prenez votre courage à deux mains pour vous lancer.</p>
<p>Si vous êtes déjà<strong> un habitué de son utilisation</strong>, vous pouvez<strong> partager vos tips</strong> aux autres lecteurs en commentaire. J’essayerai de les ajouter à l’article.</p>
<h2>Pour finir</h2>
<p>Nous avons vu une bonne partie des fonctionnalités de la commande grep,<strong> pour creuser le sujet</strong> je vous invite à essayer par vous-même et vous référer <a href="http://pwet.fr/man/linux/commandes/grep">au manuel utilisateur</a>. Il existe également de très nombreuses sources anglophones que vous trouverez dans n’importe quel <a href="https://www.qwant.com/?q=grep%20advanced%20examples&amp;t=all">moteur de recherche</a>.</p>
<p>J’espère ne pas attendre 1 an pour sortir le prochain article sur une nouvelle commande (sed et/ou awk).</p>
<p>N’hésitez pas à me<strong> laisser un feedback</strong> sur cet article en attribuant une note (système d’étoiles en dessous de l’article) ou en me commentant vos impressions. Et si vous l’avez apprécié, vous pouvez également <strong><a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fwodric.com%2Fcommande-grep&amp;text=Allez%20voir%20cet%20article%20sur%20la%20commande%20grep">le partager</a></strong> pour mon plus grand plaisir ;).</p>
<p>Sources:</p>
<ul><li><a href="https://www.lucaswillems.com/fr/articles/25/tutoriel-pour-maitriser-les-expressions-regulieres">Les expressions régulières [FR]</a></li>
<li><a href="https://fr.wikipedia.org/wiki/Tube_(shell)">Les pipes [FR]</a></li>
<li><a href="http://pwet.fr/man/linux/commandes/grep">Manuel de la commande grep [FR]</a></li>
</ul><table><tr><td><nobr> </nobr></td><td><div><div data-img="https://wodric.com/wp-content/uploads/2017/01/Linux_Logo_02-e1483378331390.png"></div></div></td></tr></table><p>The post <a rel="nofollow" href="https://wodric.com/commande-grep/">Commande grep : Rechercher une aiguille dans un système</a> appeared first on <a rel="nofollow" href="https://wodric.com/">Wodric</a>.</p>
<p><img src="media/12b79bd3.21f2b7f4d244dc2f786fe4254d935e89" data-original-source="http://cdn.libravatar.org/avatar/21f2b7f4d244dc2f786fe4254d935e89" alt="Gravatar de Wodric" class="gravatar" /><br/><i>Original post of <a href="https://wodric.com/commande-grep/" title="Visit the source">Wodric</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>


feed_id: http://jeff.ecchi.ca/blog/2017/01/03/renommer-un-peripherique-audio-avec-pulseaudio/
title: Kiddo : Renommer un périphérique audio avec PulseAudio
uri: Kiddo-Renommer-un-périphérique-audio-avec-PulseAudio
url: http://jeff.ecchi.ca/blog/2017/01/03/renommer-un-peripherique-audio-avec-pulseaudio/
content:
<p>J’ai découvert par hasard qu’on peut faire un clic droit sur le “profil” d’un périphérique dans <em>pavucontrol</em> pour renommer le périphérique. Or, cette fonctionnalité n’est pas disponible par défaut puisqu’il faut un module supplémentaire (sous Fedora, du moins). Pour faire un essai en temps réel:</p>
<p><code>$ pactl load-module module-device-manager<br>
34</code></p>
<p><span></span></p>
<p>“34”? Quelle drôle de réponse! Je présume que ça veut dire que ça a fonctionné. Si on réessaie immédiatement la même commande, on obtient:</p>
<p><code>$ pactl load-module module-device-manager<br>
Échec : Échec lors de l'initialisation du module</code></p>
<p>Ce qui, si on pense comme un développeur un peu paresseux sur la sémantique, dévoile que le module est bel et bien chargé déjà.</p>
<p>On peut maintenant donner des noms beaucoup plus courts et pratiques à nos périphériques favoris. Par exemple, ma SoundBlaster au nom beaucoup trop complexe:</p>
<div><!--[if lt IE 9]><![endif]-->
<video width="635" height="499" preload="metadata" controls="controls"><source type="video/webm" src="http://jeff.ecchi.ca/blog/wp-content/uploads/pulseaudio-device-renaming-1.webm?_=1"></source><a href="media/7151e1d8.pulseaudio-device-renaming-1.webm" data-original-source="http://jeff.ecchi.ca/blog/wp-content/uploads/pulseaudio-device-renaming-1.webm">http://jeff.ecchi.ca/blog/wp-content/uploads/pulseaudio-device-renaming-1.webm</a></video></div>
<p>Ou encore mon bon vieux <a href="http://jeff.ecchi.ca/blog/2009/05/16/microphone-usb-logitech/">micro Logitech</a> au nom tout à fait cryptique:</p>
<div><video width="577" height="323" preload="metadata" controls="controls"><source type="video/webm" src="http://jeff.ecchi.ca/blog/wp-content/uploads/pulseaudio-device-renaming-2.webm?_=2"></source><a href="media/4206b548.pulseaudio-device-renaming-2.webm" data-original-source="http://jeff.ecchi.ca/blog/wp-content/uploads/pulseaudio-device-renaming-2.webm">http://jeff.ecchi.ca/blog/wp-content/uploads/pulseaudio-device-renaming-2.webm</a></video></div>
<p>Côté interface, tout ceci est plutôt moche et difficile à découvrir, alors j’ai ouvert <a href="https://bugs.freedesktop.org/show_bug.cgi?id=94975">un rapport de bug à ce sujet</a>. Ce qui est un peu dommage, c’est qu’on renomme ici les entrées/sorties (sources/sinks) individuellement, au lieu de renommer le périphérique matériel dans sa globalité. Aussi, les versions renommées ne sont pas prises en compte par les paramètres de son de GNOME Control Center.</p>
<p>En tout cas, après ce test concluant, on peut ajouter les lignes suivantes dans le fichier ~/.config/pulse/default.pa pour rendre le changement permanent (je préfère éditer ce fichier dans mon dossier personnel plutôt que le fichier système “/etc/pulse/default.pa”, pour que ça persiste après des “clean installs” de distros:</p>
<p><code>.include /etc/pulse/default.pa<br><strong>load-module module-device-manager</strong></code></p>
<p>Note: “default.pa”, contrairement à daemon.conf (dans lequel j’ai simplement mis “flat-volumes = no” pour revenir au mixage à l’ancienne), n’hérite pas automatiquement des paramètres système, c’est pourquoi j’ai inséré la ligne “.include”.</p>
<p><img src="media/bb18a5c3.ca9664d6eee3bdf362c3741adb83e4bb" data-original-source="http://cdn.libravatar.org/avatar/ca9664d6eee3bdf362c3741adb83e4bb" alt="Gravatar de Kiddo" class="gravatar" /><br/><i>Original post of <a href="http://jeff.ecchi.ca/blog/2017/01/03/renommer-un-peripherique-audio-avec-pulseaudio/" title="Visit the source">Kiddo</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>Kiddo : <a href="">Le SSD du pauvre</a> (08/03/2012)</li><li>Kiddo : <a href="">GNOME pour les non-ordinateuriens</a> (12/06/2010)</li><li>Silvyn : <a href="">Fedora 12, PulseAudio &amp;amp; Bluetooth et p&eacute;riph&eacute;rique audio (Headset)</a> (22/11/2009)</li><li>TheGlu : <a href="">Songbird, le lecteur audio qu&rsquo;il est pratique !</a> (18/11/2007)</li><li>Jos : <a href="">Ubuntu &ndash; Rediriger l&rsquo;entr&eacute;e audio vers la sortie avec pulseaudio</a> (21/03/2010)</li></ul></div></p>


feed_id: https://www.bloguslibrus.fr/post/20170103-au-revoir-google/
title: Bridouz : Au revoir Google et Arise
uri: Bridouz-Au-revoir-Google-et-Arise
url: https://www.bloguslibrus.fr/post/20170103-au-revoir-google/
content:
<p>Hier, j’ai eu une pulsion : retirer les Gapps de mon smartphone Android, principalement parce que je n’utilise guère plus les services Google et qu’il y a des équivalents libres pour la plupart de mes besoins. Plus d’applications Google donc et j’en profite pour aller faire un tour sur xda voir les projets en cours et l’un d’eux a retenu mon attention d’amateur de musique. Son nom : <strong>A.R.I.S.E</strong></p>

<p></p>

<p>Ce qui implique de ne plus avoir de play store et des applications qui disparaissent car signalées comme <em>non compatibles</em>.</p>

<p>Alors il faut donc revoir pas mal de choses, et peser les bénéfices et les inconvénients.</p>

<ul><li>Plus de Play Store donc plus de possibilité d’installer et mettre à jour des applications rapidement.</li>
<li>Au revoir les notifications push passant par GCM (Google Cloud Messenger).</li>

<li><p>Certaines applications ne sont plus <em>compatibles</em> avec mon smartphone.</p></li>

<li><p>Votre RAM vous remercie (votre vie privée également).</p></li>
</ul><p>On ne va pas se mentir un smartphone sans applications n’est qu’un vulgaire téléphone, dans ce cas pourquoi mettre quelques billets de plus pour avoir un outil qui ne servira qu’au strict minimum ? Pour palier ce manque de store plusieurs choix s’offrent à nous :</p>

<ul><li>L’incontournable <a href="https://f-droid.org/">F-Droid</a>, store d’applications open-sources et respectueuses.</li>
<li><a href="https://www.apkmirror.com/">ApkMirror</a></li>
<li><a href="https://www.apkpure.com/">ApkPure</a>, Store alternatif au Play Store, un peu comme Aptoide donc soyez prudents sur les applications que vous installez avec ces sources. Rien n’est vraiment vérifié et ça peut partir en sucette.</li>
<li>Et pour automatiser un peu le tout</li>
</ul><p>Je conseille principalement F-Droid tant le store s’est étoffé avec les années et il arrive maintenant à offrir un large éventail d’applications pour quasiment tous les besoins.</p>

<p>La supression des services Google implique qu’il n’est plus possible de mettre à jour ses applications via le Play Store, alors que faire ?<br>
Il éxiste l’application <a href="https://forum.xda-developers.com/android/apps-games/app-apkupdater-t3444517">ApkUpdater</a> qui ira vérifier pour vous sur <em>ApkMirror</em> et <em>ApkPure</em> si des versions plus récentes de vos applications éxistent au format <em>apk</em>. Pour l’utiliser depuis quelques jours ça fait le taff et c’est tout ce que je lui demande.</p>

<p>Pour ce qui est D’<a href="https://forum.xda-developers.com/android/software/r-s-e-sound-systems-auditory-research-t3379709">A.R.I.S.E</a> je suis parti du fait que le DSP disponible dans des ROMS comme feu Cyanogen n’était pas ce qu’on peut appeler un bijou pour les oreilles. Il y a bien longtemps, du temps d’Ice Cream Sandwich, j’avais installé Viper4Android et j’avais été bluffer de la qualité de l’audio avec ce mode. ARISE en est le successeur et se pose en mod ultime pour les audiophiles avec tout un tas de réglages possibles pour embellir le son de votre téléphone. Attention ici point de miracle, seulement du bidouillage dans les librairies audios et les effets disponibles pour obtenir de belles basses et autres trucs qui chatouillent les oreilles.</p>

<p>Pour les personnes disposants d’un téléphone rooté ça vaut le coup d’essayer le mod et de s’amuser pour avoir un son que l’on aime.</p>

<p>On va bien voir par la suite si je survis à la dégooglisation d’un OS googlisé, Je pense que l’alternative est viable pour mon usage, à suivre donc.</p>
<p><img src="media/06ba8eba.7d1e02f86fac7aa11519ad0a32657aa1" data-original-source="http://cdn.libravatar.org/avatar/7d1e02f86fac7aa11519ad0a32657aa1" alt="Gravatar de Bridouz" class="gravatar" /><br/><i>Original post of <a href="https://www.bloguslibrus.fr/post/20170103-au-revoir-google/" title="Visit the source">Bridouz</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>


feed_id: http://blog.niqnutn.com/index.php?article62/faire-une-presentation-avec-reveal-js-et-markdown
title: nIQnutn : Faire une présentation avec reveal.js et Markdown
uri: nIQnutn-Faire-une-présentation-avec-reveal-js-et-Markdown
url: http://blog.niqnutn.com/index.php?article62/faire-une-presentation-avec-reveal-js-et-markdown
content:
<p>
On a vu dans l'article précédent comment <a href="http://blog.niqnutn.com/index.php?article59" title="réaliser une présentation avec reveal.js .">réaliser une présentation avec reveal.js</a>.<br>
Pour ajouter du contenu dans le diaporama, il faut utiliser HTML mais il existe aussi une solution pour utiliser la syntaxe <a href="http://blog.niqnutn.com/index.php?article34/rediger-en-markdown" title="Markdown">Markdown</a>.

</p>
<div><img src="media/73b78795.presentation_markdown.tb.jpg" data-original-source="http://blog.niqnutn.com/data/medias/0062/presentation_markdown.tb.jpg" alt=""></div>
<p>
L'utilisation de Markdown apporte certains avantages:
</p><ul><li>rédaction rapide</li>
<li>facile à lire</li>
<li>permet une vue d'ensemble de la présentation</li>
</ul><p>
La solution la plus efficace est de créer un <b>fichier externe</b> avec le contenu des diapos (<i>diaporama.md</i>) et d'indiquer son utilisation dans le fichier <i>index.html</i>.<br>
Il est possible de définir des attributs pour modifier des éléments du diaporama grâce une syntaxe spécifique.
</p><h2>Utilisation</h2>


<p>
Dans notre fichier <strong>index.html</strong>, on commence par créer une <i>section</i> qui permettra d'utiliser le fichier <strong>diaporama.md</strong>.
</p>

<div>
<div><i></i><br><span> code</span></div>
  <div><span><strong>index.html</strong></span><pre><code>...
<section data-markdown="diaporama.md"  
         data-separator="^\\n\\n\\n"  
         data-separator-vertical="^\\n\\n"  
         data-separator-notes="^Note:"  
         data-charset="UTF-8">
</section>
...</code></pre></div>
  </div>


<p>
</p><ul><li><b>data-markdown</b>: le nom du fichier Markdown utilisé.</li>
<li><b>data-separator</b>: séparateur pour les diapos (séquence horizontale).</li>
<li><b>data-separator-vertical</b>: séparateur pour les diapos (séquence verticale).</li>
<li><b>data-separator-notes</b>: séparateur pour les notes (mode présentation).</li>
<li><b>data-charset</b>: encodage (optionnel).</li>
</ul><p>
Ensuite, on crée notre fichier Markdown (<i>diaporama.md</i>):
</p>


<div>
<div><i></i><br><span> code</span></div>
  <div><span><strong>diaporama.md</strong></span><pre><code># reveal.js
## Outil de présentation HTML

Crée par [https://blog.niqnutn.com](nIQnutn)</code></pre></div>
  </div>



<h2>Créer des diapositives</h2>


<p>
Pour créer des <em>slides</em>, il suffit d'insérer les <strong>séparateurs</strong> correspondant à la <i>séquence horizontale ou verticale</i>.
</p>

<p>
Avec les séparateurs définit dans notre fichier <i>index.html</i>:<br></p><ul><li>Pour créer une diapo de horizontale, il suffit d'insérer <b>3 lignes vides</b> (correspond au séparateur "^\\n\\n\\n").</li>
<li>Pour insérer une diapo verticale, il suffit d'insérer <b>2 lignes vides</b> (correspond au séparateur "^\\n\\n").</li>
</ul><p>
Par exemple, pour réaliser une présentations avec 5 diapos :
</p>

<pre>
[A] [B] [E]
    [C]
    [D]</pre>


<p>
Il faut écrire:
</p>

<div>
<div><i></i><br><span> code</span></div>
  <div><pre><code># Diapositive A

Lorem Ipsum



# Diapositive B

Non paranda nobis solum ea, sed fruenda etiam sapientia est.


## Diapositive C

Sive enim ad sapientiam perveniri potest.


## Diapositive D

Etenim si delectamur, cum scribimus, quis est tam invidus, qui ab eo nos abducat?



# Diapositive E

Iis igitur est difficilius satis facere.</code></pre></div>
  </div>



<h2>Notes</h2>



<p>
Il est toujours possible d'insérer des notes dans notre diaporama. 
Il faudra utiliser le séparateur définit précédemment.
</p>
<p>
Pour ajouter une commentaire dans une diapo, il faut ajouter en début de ligne "Note:"
</p>

<div>
<div><i></i><br><span> code</span></div>
  <div><pre><code># Comment insérer des notes

Il suffit d'insérer `Note:` dans votre diapo.

Note: Sequi quae veritatis voluptate minima libero</code></pre></div>
  </div>



<h2>Définir des attributs</h2>



<h3>Pour un élément</h3>



<p>
Il est possible d'ajouter des attributs à certains éléments de la présentation grâce à une syntaxe spécifique.
</p>

<p>
Pour afficher une liste avec l'animation <i>fragment</i>:
</p>

<div>
<div><i></i><br><span> code</span></div>
  <div><pre><code>Liste:
* HTML <!-- .element: class="fragment" -->
* CSS <!-- .element: class="fragment" -->
* javascript <!-- .element: class="fragment" --></code></pre></div>
  </div>



<p>
En utilisant cette syntaxe, on peut aussi définir la taille d'une image:
</p>


<div>
<div><i></i><br><span> code</span></div>
  <div><pre><code>![Description de l'image](image.jpg) <!-- .element: width="80px" --></code></pre></div>
  </div>


<h3>Pour une diapo</h3>



<p>
De la même manière, il est possible d'ajouter des attributs pour une diapositive.
</p>

<p>
Par exemple, pour définir l'arrière-plan de la diapo:
</p>


<div>
<div><i></i><br><span> code</span></div>
  <div><pre><code><!-- .slide: data-background="#ff0000" -->
Arrière plan: rouge</code></pre></div>
  </div>

<h2>Méthode alternative</h2>



<p>
Plutôt que d'utiliser un fichier externe, on peut utiliser Mardown directement dans notre fichier <i>index.html</i><br>
Pour ajouter une diapo utilisant la syntaxe Markdown:
</p>

<div>
<div><i></i><br><span> code</span></div>
  <div><pre><code><section data-markdown>
    <script type="text/template">
        # Le titre
        
        Un paragraphe avec du texte et un [lien](https://blog.niqnutn.com)
    </script>
</section></code></pre></div>
  </div>

<h2>Conclusion</h2>


<p>
Avec <i>reveal.js</i> on peut retrouver les avantages de Markdown pour faire rapidement des présentations.<br>
C'est facile et concis, un exemple avec le fichier Markdown <a href="http://blog.niqnutn.com/data/medias/0062/.reveal.js/diaporama.md">diaporama.md</a> et son <a href="http://blog.niqnutn.com/data/medias/0062/.reveal.js/markdown.html">rendu</a>.
</p>

<p>
Utiliser un fichier externe permet notamment de séparer le fond de la forme.<br>
Le contenu présent dans un fichier "diaporama.md" et le reste dans "index.html" pour définir la configuration. 
</p>

<p>
Par contre, Markdown ne permet pas de tout faire directement.<br>
On pourra utiliser une syntaxe spécifique pour ajouter des attributs à un élément ou à une diapo.<br>
Dans le pire des cas, on peut toujours utiliser le format HTML.
</p>

<h2>Ressources</h2>


<ul><li><a href="http://blog.niqnutn.com/index.php?article59">Réaliser une présentation avec reveal.js </a></li>
<li><a href="https://github.com/hakimel/reveal.js#markdown">Documentation</a></li>
</ul><br>
2016 nIQnutn CC-BY
<p><img src="media/a91347c8.5c27127d0dc6fdd370e85d336aa73f8c" data-original-source="http://cdn.libravatar.org/avatar/5c27127d0dc6fdd370e85d336aa73f8c" alt="Gravatar de nIQnutn" class="gravatar" /><br/><i>Original post of <a href="http://blog.niqnutn.com/index.php?article62/faire-une-presentation-avec-reveal-js-et-markdown" title="Visit the source">nIQnutn</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>


feed_id: https://blog.genma.fr/?Coupure-de-courant-et-auto-hebergement
title: genma : Coupure de courant et auto-hébergement
uri: genma-Coupure-de-courant-et-auto-hébergement
url: https://blog.genma.fr/?Coupure-de-courant-et-auto-hebergement
content:
<img alt="" src="https://blog.genma.fr/IMG/arton2613.jpg?1483346837" width="150" height="79"><div><p>Dans ce billet je voudrais raconter une mésaventure qui m'est arrivé le week-end du réveillon entre le 31/12/2016 et le 01/01/2017.</p>
<p><strong>Mon anecdote</strong></p>
<p>En début de soirée le 31 décembre, soirée traditionnelle de réveillon pour beaucoup, coupure de courant dans toute la maison où j'habite (chez moi). Je vérifie les disjoncteurs, tout est ok. Je sors dehors, je vois des voisins qui font de même. La coupure de courant est dans une bonne partie du quartier. Certains reçoivent, d'autres pensent à leurs chauffages qui dépend de l'électricité... Dans le froid de la rue (il fait une température négative dehors et il est seulement 19h), je cherche le numéro d'urgence d'EDF (devenu Enedis). Remarque de mon voisin "y a plus de wifi". Oui je sais, c'est pour ça que je passe par la 3G ;) On finit après un peu d'attente par joindre EDF qui nous informe que le problème a déjà été remonté et qu'une équipe est en cours d'intervention. Il n'y a plus qu'à attendre.</p>
<p>Pendant ce temps, ma compagne télécharge l'application Enedis sur son téléphone Android. L'application nous confirme l'étendue de la coupure, l'intervention en cours et une prévision de retour du courant (vers 23h....)</p>
<p>Dans ma maison, on cherche les bougies, le feu de cheminée qu'on avait lancé permet d'avoir un peu de lumière. Et on essaie tant bien que mal de voir ce qu'on va pouvoir manger, vu que pour cuisiner, nous dépendons de plaques électriques... Le repas de réveillon est reporté au lendemain finalement, on grignote et manque froid... Le courant finit par revenir dans la soirée.</p>
<p>Le lendemain dans l'après-midi, dimanche, j'ai lancé une lessive. Et elle se coupe pendant que la machine tourne... Nouvelle coupure de courant dans le quartier, nouvel appel. Coupure d'une heure et demi.</p>
<p>Le soir, on regarde une série devant la télévision. Nouvelle coupure brusque dans le quartier. Nouvel appel, nouveau tour chez les voisins pour les informer que j'ai eu Enedis et qu'ils interviennent (je fais court). Une heure et demi après c'est revenu.</p>
<p>Bref, 3 coupures, dont on ne sait pas trop pourquoi. Il fait froid dehors, température négative. La personne au téléphone m'informe que la coupure de l'après-midi était planifiée pour une bascule sur un autre disjoncteur de quartier et que si ça a relâché, c'est que quelqu'un dans le quartier consomme de façon anormale...</p>
<p>Trois coupures qui ont causées des soucis plus embêtant qu'autre chose : repas de réveillon reporté, la lessive qui est décalée, la fin de l'épisode qu'on ne voit que le lendemain... Mais surtout des questions qui commencent à se poser : combien de temps le congélateur peut conserver les aliments si ça la coupure doit durée plusieurs heures, est-ce que le courant ne va pas relâcher dès que le courant va revenir car les radiateurs électriques vont se remettre à chauffer à fond... (Nous avons perdu 2 degré dans le salon durant la coupure en soirée, malgré le feu de cheminée).</p>
<p><strong>Ce qu'il faut retenir et comprendre de cette anecdote...</strong></p>
<p>... qui m'a amené à ce titre de billet de blog. Les préoccupations que j'ai eu durant ces trois coupures de courant n'ont pas été sur mon auto-hébergement vers des préoccupations plus terre à terre. Ne pas avoir de chauffage pendant plusieurs heures, vu les températures extérieures, manger froid et ne pas pouvoir cuisiner un jour où on devrait faire la fête est plus important que de ne pas avoir accès à mon cloud personnel.</p>
<p>N'évoquez pas un onduleur : oui le serveur serait allumé mais je n'avais plus de connexion Internet et même si j'étais chez moi, pouvoir me connecter à mon serveur ne m'aurait pas beaucoup avancé, été utile... De même, héberger ce cloud personnel sur un serveur qui tourne H24, vu que je n'avais pas d'accès à Internet (en fait si via mon téléphone, mais est-ce que ce qu'on peut vraiment appeler un accès Internet : réseau filté/natté, non neutre...)</p>
<p>Là où je veux en venir, c'est que mon auto-hébergement ne concerne que mon cloud personnel. Mes mails et mon blog sont (encore et y resteront) sur des serveurs qui eux tournent H24, dans des datacenters, gérér par des professionnels. Blog et mails sont pour moi des services critiques et ils ne sont donc pas chez moi. Dans le cas de mon <i>cloud personnel, sous Yunohost, je peux m'en passer quelques heures voir quelques jours. J'ai tout prévu pour. Mon agenda, mes contacts, mes documents, mes notes et todo-listes, dont la référence est sur le cloud, je les ai aussi sur mon téléphone, sur mon PC fixe (qui lui ne marche que s'il y a du courant). Si je ne peux pas synchroniser en temps réel, je le ferai plus tard. Mon cloud est un confort et non une nécessité absolue. Je l'utilise tous les jours, parce que je peux le faire. Mais je ne suis pas dépendant de ce cloud. J'ai des sauvegardes accessibles me permettant de passer en mode "dégradé" si besoin (si la machine lâche par exemple). Je sais en combien de temps je peux restaurer un cloud personnel... J'avais évoqué la partie matérielle dans mon billet <a href="https://blog.genma.fr/?Yunohost-Autohebergement-Le-Spare" title="Yunohost - Autohébergement - Le Spare">Yunohost - Autohébergement - Le Spare</a>. Il y a l'agrégateur RSS, le Wallabag, le Shaarli, le wiki.... Tant pis si je ne peux pas ajouter des favoris de suite. Je mets dans ça dans un fichier texte et ferai le rattrapage /intégration plus tard. Pour les RSS, je vais consulter les sites les plus importants directement en ligne. Pour le Wiki, j'ai ma sauvegarde (Dokuwiki ça reste des fichiers textes bruts/markdown donc lisibles). J'ai donc des solutions alternatives en cas de coupure sur le long terme de mon cloud personnel.</i></p>
<p>Et comme l'a montré mon anecdote, mon cloud personnel est un plus, une lubie de geek. Dans <a href="https://fr.wikipedia.org/wiki/Pyramide_des_besoins" title="Wikipedia - Pyramide des besoins">la pyramide de Maslow</a>, il n'est pas au plus haut, il y a des choses plus importantes qui passent avant.</p></div>
<p><img src="media/42493842.dd4318d0d3a7d2ffb13756f63b76d85d" data-original-source="http://cdn.libravatar.org/avatar/dd4318d0d3a7d2ffb13756f63b76d85d" alt="Gravatar de genma" class="gravatar" /><br/><i>Original post of <a href="https://blog.genma.fr/?Coupure-de-courant-et-auto-hebergement" title="Visit the source">genma</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>


title: Tuxicoman : Yalp Store : téléchargez les applications du Google Play Store sans Google Apps
uri: Tuxicoman-Yalp-Store-téléchargez-les-applications-du-Google-Play
feed_id:
https://tuxicoman.jesuislibre.net/2017/01/yalp-store-telechargez-les-applications-du-google-play-store-sans-google-apps.html?pk_campaign=feed&amp;pk_kwd=yalp-store-telechargez-les-applications-du-google-play-store-sans-google-apps

url:
https://tuxicoman.jesuislibre.net/2017/01/yalp-store-telechargez-les-applications-du-google-play-store-sans-google-apps.html?pk_campaign=feed&amp;pk_kwd=yalp-store-telechargez-les-applications-du-google-play-store-sans-google-apps

content:
<p><img src="media/54c38bfe.com.github.yeriomin.yalpstore.2.png" data-original-source="https://f-droid.org/repo/icons/com.github.yeriomin.yalpstore.2.png" width="48" height="48">L’application <a href="https://f-droid.org/repository/browse/?fdfilter=yalp&amp;fdid=com.github.yeriomin.yalpstore">Yalp Store vient de paraitre sur Fdroid</a>. Il s’agit d’une application libre (<a href="https://github.com/yeriomin/YalpStore">code source</a>) qui permet de télécharger les APK sur le Google Play Store similaire à <a href="https://framagit.org/tuxicoman/googleplaydownloader">GooglePlayDownloader</a> et <a href="https://github.com/onyxbits/Raccoon">Raccoon</a>.</p>
<p>La particularité de Yalp, c’est que l’application tourne directement sur Android :) Vous n’avez donc plus besoin d’un PC.<br>
Vous avez ainsi accès depuis votre smartphone aux applications du Google Play Store sans devoir donner les droits root aux logiciels espions de Google (Google Apps)</p>
<p>La seule nécessité est de se créer des identifiants de compte Google.<br>
Je vous en aurait bien donné mais il y a toujours un petit malin pour changer le mot de passe du compte au bout d’un certain temps :-/</p>
<h3>Related Posts:</h3>
<ul><li><a href="https://tuxicoman.jesuislibre.net/2014/01/android-kitkat-en-route-vers-bigbrother.html" title="Android KitKat : en route vers BigBrother">Android KitKat : en route vers BigBrother</a></li>
<li><a href="https://tuxicoman.jesuislibre.net/2013/05/pourquoi-faut-il-se-mefier-des-applications-de-whispersystem.html" title="Pourquoi faut-il se méfier des applications de Whispersystem ?">Pourquoi faut-il se méfier des applications de Whispersystem ?</a></li>
<li><a href="https://tuxicoman.jesuislibre.net/2013/05/cyanogen-10-1-rc2.html" title="Cyanogen 10.1 RC2">Cyanogen 10.1 RC2</a></li>
<li><a href="https://tuxicoman.jesuislibre.net/2012/11/cyanogenmod-10-est-sortie.html" title="CyanogenMod 10 est sortie">CyanogenMod 10 est sortie</a></li>
<li><a href="https://tuxicoman.jesuislibre.net/2016/09/googleplaydownloader-2-3.html" title="GooglePlayDownloader 2.3">GooglePlayDownloader 2.3</a></li>
</ul><img src="https://piwik.jesuislibre.net/piwik.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Ftuxicoman.jesuislibre.net%2F2017%2F01%2Fyalp-store-telechargez-les-applications-du-google-play-store-sans-google-apps.html%3Fpk_campaign%3Dfeed%26pk_kwd%3Dyalp-store-telechargez-les-applications-du-google-play-store-sans-google-apps&amp;action_name=Yalp+Store+%3A+t%C3%A9l%C3%A9chargez+les+applications+du+Google+Play+Store+sans+Google+Apps&amp;urlref=https%3A%2F%2Ftuxicoman.jesuislibre.net%2Ffeed" width="0" height="0" alt="">
<p><img src="media/a4176171.d01ce01523a0434fc1c413922f7fd8a2" data-original-source="http://cdn.libravatar.org/avatar/d01ce01523a0434fc1c413922f7fd8a2" alt="Gravatar de Tuxicoman" class="gravatar" /><br/><i>Original post of <a href="https://tuxicoman.jesuislibre.net/2017/01/yalp-store-telechargez-les-applications-du-google-play-store-sans-google-apps.html?pk_campaign=feed&amp;pk_kwd=yalp-store-telechargez-les-applications-du-google-play-store-sans-google-apps" title="Visit the source">Tuxicoman</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>Tuxicoman : <a href="">Pourquoi faut-il se m&eacute;fier des applications de Whispersystem ?</a> (18/05/2013)</li><li>Tuxicoman : <a href="">CyanogenMod 10 est sortie</a> (15/11/2012)</li><li>Tuxicoman : <a href="">Cyanogen 10.1 RC2</a> (12/05/2013)</li><li>Tuxicoman : <a href="">Real APK Leecher : T&eacute;l&eacute;charger les APK du Google Play</a> (06/07/2013)</li><li>Tuxicoman : <a href="">Mes applications sur Android</a> (09/07/2013)</li></ul></div></p>


feed_id: http://yeuxdelibad.net/Blog/?d=2017/01/04/15/09/36-programmer-un-gui-en-python----pourquoi-tkinter
title: Thuban : Programmer un GUI en python -- Pourquoi TkInter ?
uri: Thuban-Programmer-un-GUI-en-python-Pourquoi-TkInter
url: http://yeuxdelibad.net/Blog/?d=2017/01/04/15/09/36-programmer-un-gui-en-python----pourquoi-tkinter
content:
<p>Même si la ligne de commande est un outil surpuissant, une interface graphique (GUI) peut s'avérer très pratique pour certains. Puisque j'aime bien bidouiller de petits outils en python, j'en suis arrivé à  la question : <em>qu'utiliser pour réaliser un GUI ?</em><br>
J'ai donc découvert pygtk et wxwidgets... Et m'y suis cassé les dents.</p>

<div><img src="media/41252aa7.guitar.png" data-original-source="http://yeuxdelibad.net/Blog/img/de/guitar.png" alt=""></div>

<p>En effet, ces deux bibliothèques sont très et même trop complètes. Par ailleurs, installer de si grosses dépendances pour juste quelques petits outils, ça me cassait les pieds. J'ai définitivement laissé tombé l'idée de maîtriser GTK quand j'ai vu le code du <a href="https://moutonlibre.net/blog/?d=2016/12/29/08/48/32-3hg-menu-reorganisation-des-briques">3hg-menu</a>. C'était totalement différent dans les widgets que ce que j'avais pu découvrir en écrivant le handymenu. Quelle plaie de voir des "deprecated" dans ses programmes, et ne pas trouver de la documentation à jour !</p>

<p>Après avoir perdu du temps avec GTK, je me suis tourné vers la bibliothèque Tk que j'avais pu croiser auparavant. Et aujourd'hui, je suis convaincu que c'est la plus adaptée à mes besoin, à la fois simple et puissante. Pour apprendre à programmer, elle est à mon avis la plus pratique.</p>

<p>J'ai donc envie de publier quelques billets sur le sujet, à commencer par celui-ci.</p>

<p><strong>Pourquoi TkInter</strong> me paraît être le meilleur choix ?</p>

<ul><li> Il est disponible pour python, on profite donc de la syntaxe si agréable.</li>
<li> Il est léger, donc rapide.</li>
<li> Il est bien pensé et permet de rapidement créer une interface graphique.</li>
<li> Il dispose de tout ce dont on peut avoir besoin sans pour autant être trop fournit au risque de se perdre en chemin. Il manque peut-être le sypport de l'icône de notification (systray), mais on peut arranger ça (on y reviendra).</li>
<li> Il est stable, en particulier dans le sens où la sytaxe et la façon de l'utiliser n'est pas prête de changer. Ce n'est pas le cas de GTK par exemple, avec des modules très vite dépréciés... Car c'est très pénible de devoir réécrire une application parce que le toolkit graphique a mal évolué.</li>
<li> Il est multi-plateforme.</li></ul><p>On peut tout de même noter que visuellement, tkinter n'est pas très beau. Cela peut toutefois s'améliorer. Je fais cependant passer la "beauté" d'une interface après son utilité.</p>

<p>En attendant le prochain article qui parlera de l'installation de tkinter, voici quelques références à avoir sous le coude :</p>

<ul><li> <a href="https://docs.python.org/3/library/tkinter.html">https://docs.python.org/3/library/tkinter.html</a></li>
<li> <a href="http://www.tkdocs.com/tutorial/index.html">http://www.tkdocs.com/tutorial/index.html</a></li>
<li> <a href="http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/index.html">http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/index.html</a></li>
<li> <a href="http://www.ferg.org/thinking_in_tkinter/languages/france/penser_en_tkinter.html">http://www.ferg.org/thinking_in_tkinter/languages/france/penser_en_tkinter.html</a></li>
<li> <a href="http://effbot.org/tkinterbook/">http://effbot.org/tkinterbook/</a></li></ul><p>ps : blague pourrie générée avec <a href="https://framalab.org/gknd-creator/">GéGé</a></p>
<p><img src="media/0d200000.a17c14dbfc42f0936cee56ed7a9b3b31" data-original-source="http://cdn.libravatar.org/avatar/a17c14dbfc42f0936cee56ed7a9b3b31" alt="Gravatar de Thuban" class="gravatar" /><br/><i>Original post of <a href="http://yeuxdelibad.net/Blog/?d=2017/01/04/15/09/36-programmer-un-gui-en-python----pourquoi-tkinter" title="Visit the source">Thuban</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>


feed_id: https://carlchenet.com/ledito-de-janvier-2017/
title: Carl Chenet : L’édito de janvier 2017
uri: Carl-Chenet-L-édito-de-janvier-2017
url: https://carlchenet.com/ledito-de-janvier-2017/
content:
<p>Après des fêtes de fin d’année rondement menées, il était plus que temps de revenir aux choses sérieuses. L’édito de ce mois a un peu de retard et j’ai même publié <a href="https://carlchenet.com/my-free-software-activities-in-december-2016/">mon compte-rendu de mes activités du Libre du mois passé</a> avant. Aucun respect des conventions <img src="media/59af913d.1f642.png" data-original-source="https://s.w.org/images/core/emoji/2/72x72/1f642.png" alt="🙂"></p>
<h2>Statistiques du blog</h2>
<p>Sans me concentrer sur les statistiques du blog, je suis avec plaisir l’augmentation du nombre de visiteurs. Comme dirait <a href="https://blog.seboss666.info/">Seboss666</a>, la régularité paie. S’appliquer à publier du contenu de qualité régulièrement, en faire correctement la promotion via mes comptes sur <a href="https://framasphere.org/u/carlchenet">Diaspora*</a> et <a href="https://twitter.com/carl_chenet">Twitter</a> permet de se faire connaître et presque mécaniquement les lecteurs intéressés reviennent. Ce qui est logique. Aucune pression là-dessus pour moi, mais il est toujours intéressant de garder à l’esprit ce lien entre régularité et suivi par les lecteurs, effet qu’on retrouve dans une moindre mesure aujourd’hui dans l’édition logiciel. Une bonne motivation à continuer de publier régulièrement donc <img src="media/59af913d.1f642.png" data-original-source="https://s.w.org/images/core/emoji/2/72x72/1f642.png" alt="🙂"></p>
<h2>La série « htop expliqué »</h2>
<p>La fin de <a href="https://carlchenet.com/category/htop-explique/">la série d’articles consacrés à l’outil htop</a> et aux notions de bases d’un système GNU/Linux arrive, je n’ai plus qu’un billet (un peu long) à publier.</p>
<p>Réaliser cette série d’articles avec l’accord de l’auteur a été très intéressant, du fait que les lecteurs francophones ont par exemple identifié une erreur dans l’article que j’ai remonté à l’auteur et d’une point de vue plus personnel sur ma capacité à traduire un texte technique originellement en anglais vers le français. La partie traduction est allée relativement vite et j’aimerais renouveler l’expérience si je tombe de nouveau sur un très bon article.</p>
<h2>Journal du hacker v2</h2>
<p>Suite à la mise en préproduction de la nouvelle version du <a href="https://www.journalduhacker.net/">Journal du hacker</a>, le site participatif et communautaire d’informations de la communauté du Logiciel Libre francophone, et suite à une période de test et de corrections de bugs, l’équipe a estimé la nouvelle version prête à être passée en production. Les fêtes de fin d’année puis mes vacances ayant retardées la date possible, nous sommes finalement tombés d’accord sur le 4 février, dans un peu moins d’un mois donc. À prévoir un court arrêt de service lors de la bascule.</p>
<p>Nous publierons de toute façon rapidement un billet sur <a href="https://blog.journalduhacker.net/">le blog du Journal du hacker</a> pour annoncer la nouvelle.</p>
<p><a href="https://www.journalduhacker.net/"><img src="media/88d7c669.logo-journal-du-hacker-300x88.png" data-original-source="https://carlchenet.com/wp-content/uploads/2015/07/logo-journal-du-hacker-300x88.png" alt="logo-journal-du-hacker" width="300" height="88" srcset="https://carlchenet.com/wp-content/uploads/2015/07/logo-journal-du-hacker-300x88.png 300w, https://carlchenet.com/wp-content/uploads/2015/07/logo-journal-du-hacker-768x225.png 768w, https://carlchenet.com/wp-content/uploads/2015/07/logo-journal-du-hacker-1024x299.png 1024w, https://carlchenet.com/wp-content/uploads/2015/07/logo-journal-du-hacker.png 1036w" sizes="(max-width: 300px) 100vw, 300px"></a></p>
<h2>Feed2tweet : la v1.0 approche</h2>
<p>À côté de ce blog, je continue à développer <img src="media/59af913d.1f642.png" data-original-source="https://s.w.org/images/core/emoji/2/72x72/1f642.png" alt="🙂"> Je viens de publier <a href="https://github.com/chaica/feed2tweet/releases/tag/0.9">la v0.9</a> de <a href="https://github.com/chaica/feed2tweet">Feed2tweet</a>, mon projet d’outil publiant les entrées d’un flux RSS vers <a href="https://twitter.com/">le réseau social Twitter</a>, une version dont je ne suis pas peu fier. Pour cette version j’ai réalisé ce que j’appelle « passer d’une appli simple à une appli simple et puissante » (billet de blog à venir sur ce sujet). Je me suis laissé un numéro de version de libre au cas où, mais j’aurais pu faire de la 0.9 la 1.0.</p>
<h2>Mes vacances</h2>
<p>Mes dernières vacances remontant à janvier 2016, il est donc plus que temps pour moi d’en prendre de nouvelles. Je ne vous apprends rien en vous disant que prendre des vacances permet de rompre la routine du quotidien, faire le vide, se ressourcer pour permettre à de nouvelles idées de naître et de repartir sur les chapeaux de roue. Je serai donc peu disponible les deux prochaines semaines, même si quelques billets de blog devraient quand même être publiés, afin de ne pas perdre les (nouvelles) bonnes habitudes <img src="media/59af913d.1f642.png" data-original-source="https://s.w.org/images/core/emoji/2/72x72/1f642.png" alt="🙂"></p>
<p> </p>
<p><img src="media/46f73009.e1f1addc890668ce2561431b7be810bc" data-original-source="http://cdn.libravatar.org/avatar/e1f1addc890668ce2561431b7be810bc" alt="Gravatar de Carl Chenet" class="gravatar" /><br/><i>Original post of <a href="https://carlchenet.com/ledito-de-janvier-2017/" title="Visit the source">Carl Chenet</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>Carl Chenet : <a href="">Dans le Libre : faire sien un logiciel</a> (23/11/2016)</li><li>Carl Chenet : <a href="">L&rsquo;&eacute;dito de d&eacute;cembre 2016</a> (05/12/2016)</li><li>Carl Chenet : <a href="">Le Journal Du Hacker remplace le Journal Du Pirate</a> (23/07/2015)</li><li>Carl Chenet : <a href="">Le Journal du hacker choisit son logo !</a> (27/07/2015)</li><li>Carl Chenet : <a href="">Liens int&eacute;ressants Journal Du Hacker semaine #31</a> (31/07/2015)</li></ul></div></p>


title: Eddy33 : Création du dépôt Fedora eddy33
uri: Eddy33-Création-du-dépôt-Fedora-eddy33
feed_id:
http://eddy33.eddy33.free.fr/weblog/index.php?post/2017/01/07/Cr%C3%A9ation-du-d%C3%A9p%C3%B4t-eddy33

url:
http://eddy33.eddy33.free.fr/weblog/index.php?post/2017/01/07/Cr%C3%A9ation-du-d%C3%A9p%C3%B4t-eddy33

content:
<p>Salut.</p>
<p>Cela faisait pas mal de temps que je cherchais l'occasion de créer un dépôt Fedora... C'est fait !</p>
<p>J'utilise le logiciel libre AMC (Auto Multiple Choice) pour créer des QCM avec autocorrection après scan des copies afin d'évaluer certains de mes cours. </p>
<p>AMC est un logiciel plutôt génial pour cela : <a href="http://home.gna.org/auto-qcm/">http://home.gna.org/auto-qcm/ <br></a></p>
Malheureusement, il n'est plus maintenu sous forme de paquetages RPM pour Fedora depuis la version 21. J'ai ainsi comblé ce vide avec la création du dépôt eddy33. Le dépôt eddy33 propose AMC pour Fedora 23 et supérieur en version 32 et 64 bits. Voici donc le premier paquetage que je maintiens. Il faut bien un début <img src="media/7231847f.wink.png" data-original-source="http://eddy33.eddy33.free.fr/weblog/themes/eddy33_v5/smilies/wink.png" alt=";-)"><br><br>L'accès au dépôt eddy33 se fait par la commande : <br><pre># dnf install http://kadionik.vvv.enseirb-matmeca.fr/fedora/repo-eddy33-1.0-1.fc25.noarch.rpm</pre><br>Les paquetages disponibles sont signés.<br><br>++<br>
<p><img src="media/889f4f2a.d1430102ed05bb1a49902c819454fef2" data-original-source="http://cdn.libravatar.org/avatar/d1430102ed05bb1a49902c819454fef2" alt="Gravatar de Eddy33" class="gravatar" /><br/><i>Original post of <a href="http://eddy33.eddy33.free.fr/weblog/index.php?post/2017/01/07/Cr%C3%A9ation-du-d%C3%A9p%C3%B4t-eddy33" title="Visit the source">Eddy33</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>Slobberbone : <a href="">Cr&amp;eacute;ation d&#039;un d&amp;eacute;p&amp;ocirc;t RPM &amp;agrave; base de Fedora</a> (17/08/2011)</li></ul></div></p>


feed_id: http://yeuxdelibad.net/Blog/?d=2017/01/07/15/19/59-autohebergement-et-panne
title: Thuban : Autohébergement et panne
uri: Thuban-Autohébergement-et-panne
url: http://yeuxdelibad.net/Blog/?d=2017/01/07/15/19/59-autohebergement-et-panne
content:
<p>On a récemment vu passer plusieurs articles mettant à mal l'auto-hébergement en soulevant un problème simple : "En cas de panne, c'est la panique" (voir l'<a href="https://blog.genma.fr/?Coupure-de-courant-et-auto-hebergement">article de Genma</a>). Puisque je ne suis pas tout à fait d'accord, voici quelques idées à ce sujet.</p>

<p>Tout d'abord, la fameuse coupure de courant. Ça peut arriver à tout le monde, et c'est bien dommage. Dans ce cas, votre serveur est effectivement inaccessible. Cela veut dire que votre blog ne pourra pas être lu pendant quelques temps. Je laisse chacun juger du degré critique de cette panne...</p>

<p>Plus gênant peut-être, vous ne pourrez pas recevoir vos mails... En fait si, mais plus tard ! Il faut savoir que lorsqu'un serveur tente d'envoyer un mail et que le destinataire n'est pas prêt à le recevoir (il est en panne), alors l'expéditeur va tenter à nouveau de l'envoyer à intervalles réguliers. Alors bien sûr, au bout d'un moment, il va abandonner, mais ça vous laisse plusieurs jours avant que ce mail ne soit perdu dans le néant.</p>

<p>Si vous avez malgré tout peur de la panne de courant et si votre serveur ne peut se permettre quelques heures d'inaccessibilité, vous pouvez faire l'acquisition d'un onduleur (sorte de grosse batterie) sur lequel sera branché votre routeur et votre serveur.</p>

<p>Reste les plantages, bugs et autres accidents. À ce problème, il n'y a que les sauvegardes qui pourront restaurer votre serveur. Heureusement, <a href="http://yeuxdelibad.net/ah/#toc58">ce n'est pas compliqué</a>.</p>

<p>Plus important, je crois qu'il faut garder en tête que ces pannes peuvent aussi arriver à un hébergeur professionnel. Et lorsque cela arrive, vous êtes totalement dépendant du prestataire, et vous n'avez plus qu'à croiser les doigts qu'il a su faire des sauvegardes de vos données et que la panne sera vite réparée. Alors que si vous vous auto-hébergez, les sauvegardes, vous les avez déjà activées de façon journalière grâce au système de "altroot" d'OpenBSD et un rsync quotidien.</p>

<p>Je m'auto-héberge depuis plusieurs années maintenant. Des pannes, il y en a eu une grosse : lorsque j'ai déménagé, mon serveur était bien évidemment inaccessible. Mais il existe des astuces pour conserver ses mails, j'en avais parlé dans <a href="http://yeuxdelibad.net/Blog/?d=2015/05/26/21/58/13-que-faire-quand-on-doit-demenager-et-que-lon-sauto-heberge">un précédent article</a>. Les autres pannes étaient toutes de ma faute : je bidouillais sur le serveur et j'ai tenté des trucs, parce que ça m'amuse.</p>

<p>Tout ça pour dire que ce genre de choses ne devraient pas être un frein à l'auto-hébergement si vous voulez reprendre le contrôle de vos données.</p>
<p><img src="media/0d200000.a17c14dbfc42f0936cee56ed7a9b3b31" data-original-source="http://cdn.libravatar.org/avatar/a17c14dbfc42f0936cee56ed7a9b3b31" alt="Gravatar de Thuban" class="gravatar" /><br/><i>Original post of <a href="http://yeuxdelibad.net/Blog/?d=2017/01/07/15/19/59-autohebergement-et-panne" title="Visit the source">Thuban</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>


title: Journal du hacker : Liens intéressants Journal du hacker semaine #01
uri: Journal-du-hacker-Liens-intéressants-Journal-du-hacker-semaine-01
feed_id:
https://blog.journalduhacker.net/index.php?article83/liens-interessants-journal-du-hacker-semaine-01

url:
https://blog.journalduhacker.net/index.php?article83/liens-interessants-journal-du-hacker-semaine-01

content:
<p>Pour la première semaine de 2017, voici 5 liens intéressants que vous avez peut-être ratés, relayés par <a href="https://www.journalduhacker.net/">le Journal du hacker</a>, votre source d’informations pour le Logiciel Libre francophone !</p>

<a href="https://www.journalduhacker.net/"><img src="media/01f45034.logo-journal-du-hacker.png" data-original-source="https://blog.journalduhacker.net/data/medias/logo-journal-du-hacker.png"></a>

<ul><li><a href="https://www.journalduhacker.net/s/zbxizs/faire_une_pr_sentation_avec_reveal_js_et_markdown">Faire une présentation avec reveal.js et Markdown</a></li>
<li><a href="https://www.journalduhacker.net/s/ac9wpw/mise_en_place_de_haproxy_et_letsencrypt_en_front_terminaison_ssl">Mise en place de HAProxy et LetsEncrypt en front (Terminaison SSL)</a></li>
<li><a href="https://www.journalduhacker.net/s/xc8unp/c_est_quoi_le_cloud_computing_2_2">C'est quoi le "Cloud Computing" ? 2/2</a></li>
<li><a href="https://www.journalduhacker.net/s/5rluhs/blockchain_etat_des_lieux_et_prospective">« Blockchain » : Etat des lieux et prospective</a></li>
<li><a href="https://www.journalduhacker.net/s/yr0ocr/d_ploiement_et_automatisation_avec_ansible_-_partie_1">Déploiement et automatisation avec Ansible - partie 1</a></li>
</ul><p>Pour ne plus rater aucun article de la communauté francophone, voici :</p>

<ul><li><a href="https://www.journalduhacker.net/rss">Le flux RSS du Journal du hacker</a></li>
<li><a href="https://twitter.com/journalduhacker">Le compte Twitter du Journal du hacker</a></li>
<li><a href="https://framasphere.org/u/journalduhacker">Le compte Diaspora* du Journal du hacker</a></li>
</ul><p>De plus le site web du Journal du hacker est « adaptatif (responsive) ». N’hésitez pas à le consulter depuis votre smartphone ou votre tablette !</p>

<p>Le Journal du hacker fonctionne de manière collaborative, grâce à la participation de ses membres. <a href="https://www.journalduhacker.net/invitations/request">Rejoignez-nous</a> pour proposer vos contenus à partager avec la communauté du Logiciel Libre francophone et faire connaître vos projets !</p>

<p><strong>Et vous ? Qu’avez-vous pensé de ces articles ?</strong> N’hésitez pas à réagir directement dans les commentaires de l’article sur le Journal du hacker ou bien dans les commentaires de ce billet :)</p>
<p><img src="media/ffe97a17.7916ee3cafa0bc3e9583bedad876dcd5" data-original-source="http://cdn.libravatar.org/avatar/7916ee3cafa0bc3e9583bedad876dcd5" alt="Gravatar de Journal du hacker" class="gravatar" /><br/><i>Original post of <a href="https://blog.journalduhacker.net/index.php?article83/liens-interessants-journal-du-hacker-semaine-01" title="Visit the source">Journal du hacker</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>


feed_id: https://carlchenet.com/journal-hacker-et-francophonie/
title: Carl Chenet : Journal du hacker et francophonie
uri: Carl-Chenet-Journal-du-hacker-et-francophonie
url: https://carlchenet.com/journal-hacker-et-francophonie/
content:
<p><em>Petite précision avant de commencer, le terme francophonie est à prendre ici comme l’utilisation commune de la langue française par différentes communauté. Nous laissons de côté les liens politiques et historiques qui peuvent être recouverts par ce terme et qui sont hors-sujet dans le cadre de cet article. Si cette précision vous étonne, je pourrais développer à la demande dans les commentaires.</em></p>
<h2>La démarche</h2>
<p>Lorsque j’ai fondé <a href="https://www.journalduhacker.net/">le Journal du hacker</a>, j’avais dans l’idée de réaliser un média participatif de la communauté du Logiciel Libre et open source francophone. Donc un média pas seulement dédié à la France, ce qui avec un peu de recul apparaîtrait comme arbitrairement restrictif quand on parle et agit via le web et qu’on souhaite s’exprimer en français.</p>
<p><a href="https://www.journalduhacker.net/"><img src="media/b37c3f35.journalduhacker-banniere-verticale-248x300.jpg" data-original-source="https://carlchenet.com/wp-content/uploads/2015/10/journalduhacker-banniere-verticale-248x300.jpg" width="248" height="300" srcset="https://carlchenet.com/wp-content/uploads/2015/10/journalduhacker-banniere-verticale-248x300.jpg 248w, https://carlchenet.com/wp-content/uploads/2015/10/journalduhacker-banniere-verticale.jpg 541w" sizes="(max-width: 248px) 100vw, 248px"></a></p>
<p>Aujourd’hui le Journal du hacker vit grâce à ses utilisateurs et la formidable équipe qui l’anime. Nous sommes déjà bien au-dessus de mes espérances lorsque j’ai lancé le projet en terme de visites et de visibilité via les réseaux sociaux. Pourtant le point concernant l’ouverture du Journal du hacker à la francophonie reste pour l’instant largement en arrière par rapport aux autres axes de développement.</p>
<p>En effet, il est assez simple de lancer un projet dans la communauté la plus proche de nous, de se faire connaître par les médias qui nous entourent et les acteurs avec qui l’on peut échanger au quotidien. Et cela a été notre axe de développement jusqu’ici. Me rendant compte peu à peu du fossé qui nous séparait des autres communautés de la francophonie, j’ai été amené à commencer à découvrir les médias et communautés du Logiciel Libre hors de France. Il ne serait pas honnête de passer sous silence que le déclencheur de cette prise de conscience a été l’arrivée dans l’équipe du Journal du hacker <a href="https://www.journalduhacker.net/u/cloug">du très sympathique Cloug</a>, de nationalité belge.</p>
<h2>Découvertes des acteurs</h2>
<p>Je me suis donc lancé dans l’exploration des différentes communautés francophones du Libre. J’ai découvert avec grand plaisir un acteur québecois <a href="http://quebecos.com/">QuebecOS</a>, qui vient de fêter ses 10 ans. Chapeau.</p>
<p><a href="http://quebecos.com/"><img src="media/802f239c.quebecos-300x82.png" data-original-source="https://carlchenet.com/wp-content/uploads/2016/12/quebecos-300x82.png" alt="quebecos" width="300" height="82"></a></p>
<p>En tournant ensuite mes recherches vers l’Afrique, j’ai donc découvert depuis l’association du Logiciel Libre <a href="http://clibre.tn/">CLibre</a> en Tunisie, très active, ayant organisée cette année <a href="http://clibre.tn/2016/11/communique-de-presse-sfd2016/">l’événement Software Freedom Day 2016</a>. Également de nombreux acteurs individuels en Côte d’Ivoire, <a href="http://fyouzan.ci/index.php?post/2014/05/06/L-importance-du-Logiciel-Libre-dans-l-enseignement-en-Afrique">comme Florent Youzan</a>, mettant en avant le Logiciel Libre et l’innovation mais aussi au Bénin, où a été organisé en 2016 <a href="http://rnll.blolab.org/">les Rencontres Nationales du Logiciel Libre</a> et les sympathiques activités <a href="http://www.blolab.org/">du fablab Blolab</a> toujours au Bénin.</p>
<div><a href="http://www.blolab.org/"><img src="media/14d017ca.jerry-1024x768.jpg" data-original-source="https://carlchenet.com/wp-content/uploads/2016/12/jerry-1024x768.jpg" alt="Réalisation d'un Jerry au Blolab au Bénin" width="700" height="525" srcset="https://carlchenet.com/wp-content/uploads/2016/12/jerry.jpg 1024w, https://carlchenet.com/wp-content/uploads/2016/12/jerry-300x225.jpg 300w, https://carlchenet.com/wp-content/uploads/2016/12/jerry-768x576.jpg 768w" sizes="(max-width: 700px) 100vw, 700px"></a><p><em>Réalisation d’un Jerry au Blolab au Bénin</em></p></div>
<p>J’ai également découvert l’engouement des communautés <a href="http://www.openstreetmap.org/">OpenStreeMaps</a>, très (très) actives en Afrique qui sont un formidable moteur des idées du Libre auprès des acteurs locaux, car propulsés par un besoin réel et pressant : le besoin de cartographier des environnements se modifiant très rapidement en  l’absence d’un acteur étatique assurant ce service. Citons <a href="http://www.openstreetmap.ci/">OpenStreetMaps Côté d’Ivoire</a> et <a href="https://twitter.com/OSM_BF">OpenStreetMaps Burkina Faso</a>.</p>
<div><a href="http://www.openstreetmap.cihttp://"><img src="media/e32c98b3.mappingparty.jpg" data-original-source="https://carlchenet.com/wp-content/uploads/2016/12/mappingparty.jpg" alt="Collecte de données sur le terrain de contributeurs OpenStreetMaps" width="620" height="465" srcset="https://carlchenet.com/wp-content/uploads/2016/12/mappingparty.jpg 620w, https://carlchenet.com/wp-content/uploads/2016/12/mappingparty-300x225.jpg 300w" sizes="(max-width: 620px) 100vw, 620px"></a><p><em>Collecte de données sur le terrain de contributeurs OpenStreetMaps</em></p></div>
<p>Je n’ai pas prétention à avoir identifier tout le monde et je dois rater un nombre incroyable d’initiatives francophones autour du Libre. Les commentaires sont ouverts pour m’informer à ce sujet <img src="media/b2c7da53.1f609.png" data-original-source="https://s.w.org/images/core/emoji/2/72x72/1f609.png" alt="😉"></p>
<h2>Relayer les initiatives</h2>
<p>Suite à l’identification des acteurs, j’ai commencé à utiliser le Journal du hacker pour relayer les initiatives francophones du Logiciel Libre, par exemple <a href="https://www.journalduhacker.net/s/j97cpj/rencontres_nationales_du_logiciel_libre_2016_cotonou_b_nin">les Rencontres Nationales du Logiciel Libre 2016 au Bénin</a> ou <a href="https://www.journalduhacker.net/s/f559lx/software_freedom_day_2016_en_tunisie_vid_os_dition_2015">le Software Freedom Day 2016</a>. C’est encore nettement insuffisant par rapport à ce qui doit se faire et j’espère motiver les acteurs à se saisir de l’outil Journal du hacker pour communiquer eux-mêmes sur les initiatives. Je souhaite par ces contributions montrer que nous sommes ouverts, attentifs à ces initiatives et que nous souhaitons les relayer.</p>
<p>Car le point critique est là. Les acteurs doivent eux-mêmes relayer leurs initiatives, sans dépendre du fait qu’ils pourraient ou non être relayés par un tiers. Le Journal du hacker est simple d’utilisation, très simple. Un lien, un titre (souvent récupéré automatiquement) et une marque. Et pour les initiatives intéressantes, une grande visibilité en retour.</p>
<p><img src="media/46f73009.e1f1addc890668ce2561431b7be810bc" data-original-source="http://cdn.libravatar.org/avatar/e1f1addc890668ce2561431b7be810bc" alt="Gravatar de Carl Chenet" class="gravatar" /><br/><i>Original post of <a href="https://carlchenet.com/journal-hacker-et-francophonie/" title="Visit the source">Carl Chenet</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>Carl Chenet : <a href="">Le Journal Du Hacker remplace le Journal Du Pirate</a> (23/07/2015)</li><li>Carl Chenet : <a href="">Le Journal du hacker choisit son logo !</a> (27/07/2015)</li><li>Carl Chenet : <a href="">Liens int&eacute;ressants Journal Du Hacker semaine #31</a> (31/07/2015)</li><li>Carl Chenet : <a href="">Le Journal du hacker choisit son nom de domaine !</a> (24/08/2015)</li><li>Carl Chenet : <a href="">Liens int&eacute;ressants Journal du hacker semaine #35</a> (27/08/2015)</li></ul></div></p>


feed_id: http://ilphrin.com/planet/2017/01/09/traduction-watch-angularjs.html
title: Ilphrin : Traduction: Maitriser $watch dans AngularJS
uri: Ilphrin-Traduction-Maitriser-watch-dans-AngularJS
url: http://ilphrin.com/planet/2017/01/09/traduction-watch-angularjs.html
content:
Ce qui suit est une traduction d'un article sur [Sitepoint.com \\[lien d'origine\\]](https://www.sitepoint.com/mastering-watch-angularjs/), rédigé par [Marcello La Rocca](https://www.sitepoint.com/author/mlarocca/) et [Francisco Paulo.](https://www.sitepoint.com/author/fpaulo/) Je ne suis en aucun cas l'auteur de cet article, j'ai simplement eu envie de le traduire parce que j'aime ça et que je considère que beaucoup de ressources anglophones devraient être aussi à la portée des personnes qui ne parlent pas anglais.

<!--break-->

# Maitriser $watch dans AngularJS

[AngularJS](https://angularjs.org/) dispose de plusieurs options pour appliquer le modèle [Publish-subscribe](https://fr.wikipedia.org/wiki/Publish-subscribe) à travers trois différentes méthodes "watch". Chacune prend différent paramètres optionnels qui peuvent modifier son comportement.

La documentation officielle de $watch ne va pas vraiment en profondeur: un problème récurrent qui a affecté l'entièreté d'AngularJS 1 après tout. Même la plupart des ressources en ligne qui en expliquent le fonctionnement sont éparpillées.

Et au final, il devient difficile pour un développeur de choisir la bonne méthode pour une situation donnée. Et cela est particulièrement vrai pour les débutants. Le résultat peut être pleins de surprises et est imprévisible, amenant inévitablement à des bugs.

Dans cet article, je (Ndt: Les auteurs d'origine de cet article) vais partir du principe que vous avez les bases d'AngularJS. Si vous avez besoin de vous rafraichir la mémoire, vous pourriez vous tourner vers des lectures sur [$scope](https://docs.angularjs.org/guide/scope), [binding](http://www.sitepoint.com/angularjs-tutorial-build-an-app-using-directives-and-data-binding/) et [$apply et $digest](http://www.sitepoint.com/understanding-angulars-apply-digest/).

## Testez vos connaissances

Par exemple, quel est le meilleur moyen de surveiller le premier élément d'un tableau? Supposons que nous avons un tableau dans notre scope, <code>$scope.letters = ['A', 'B', 'C'];</code>

* Est-ce que <code>$scope.$watch('letters', function() {...})</code> va lancer sa callback lorsque nous ajouterons un élément au tableau?
* Le lancera-t-il si nous changeons le premier élément?
* Et pour <code>$scope.$watch('letters[0]', function() {...});</code> ? Fonctionnera-t-il de la même manière ou mieux?
* Les éléments sont des valeurs primitives, que se passe-t-il si nous changeons le premier élément par la meme valeur?
* Et maintenant supposons que notre tableau contienne des objets? Que se passe-t-il?
* Quelle est la différence entre <code>$watch</code>, <code>$watchCollection</code>, et <code>$watchGroup</code>?

Si vous vous sentez confus par ces questions, continuez de lire cet article. Mon but est de rendre tout ça aussi clair que possible au travers de plusieurs example en vous guidant.

## $scope.$watch

Commençons avec <code>$scope.$watch</code>. C'est la bête de somme des toutes les fonctionnalités de surveillance: chacune des autres méthodes que nous verrons sera juste un raccourci pour <code>$watch</code>

### $watch-ez ça

Ce qui est bien avec Angular est que l'on peut utilise le même mécanisme explicitement pour accomplir des actions complexes dans nos controllers, activées par des changements dans les données. Par example, vous pourriez placer un observater/watcher sur des données qui peuvent changer en réponse aux:

* Timeouts
* UI
* Calculs asynchrones complexes par des Web Workers
* Appels Ajax

Vous pouvez mettre un 'listener' pour vérifier les changements de données, sans vous soucier de ce qui l'a causé.

Pour ce faire, vous allez devoir appeler <code>$scope.$watch</code> vous-même.

### En pratique

Regardons le code de <code>$rootscope.watch()</code>.

Voici sa signature: <code>function(watchExp, listener, objectEquality, prettyPrintExpression)</code>.

En détail, ces 4 paramètres sont:

* <code>watchExp</code> L'expression à observer. Cela peut être une fonction ou une chaine de caractères, elle est évaluée à chaque cycle.
Un aspect à noter ici est que _si_ l'expression est évaluée comme une fonction, alors cette fonction doit être idempotent. En d'autres termes, pour une même valeur en entré la fonction doit retourner la même sortie. Si ce n'est pas le cas, Angular va penser que les données ont changées. Et donc il va continuer à détecter une différence et appeler le listener à chaque itération du cycle.
* <code>listener</code> Une callback lancé lorsque  l'observateur/watch est crée, et ensuite à chaque fois que, pendant un cycle, un changement <code>watchExp</code> est détecté. L'appel initial à la configuration est faite pour enregistrer une première valeur de l'expression.
* <code>objectEquality</code> L'observateur/watcher va faire une comparaison profonde si, et seulement si cette variable est vraie. Sinon elle opérera une comparaison en surface, ce qui veut dire que seules les références seront comparées.<br>Prenons un exemple: <code>$scope.fruit = ["banana", "apple"];</code>.<br><code>objectEquality == false</code> signifie que seul une réassignation de "fruit" lancera un appel au listener. Nous avons aussi besoin de savoir a quelle "profondeur" la comparaison se fera. Nous verrons ça plus tard.
* <code>prettyPrintExpression</code> Si elle est indiquée, va surcharger l'expression observée. Ce paramètre n'est __PAS__ fait pour être utilisé lors d'un appel normal à <code>$watch();</code>, elle est utilisée en interne par le parser d'expression. <br> __Faites attention__, comme vous pouvez le voir par vous-même il est très facile d'obtenir des résultats inatendus en passant le 4e argument par erreur.

Maintenant nous sommes en passe de répondre à quelques questions de l'introduction. Regardons nos examples pour cette section:

<p data-height="345" data-theme-id="0" data-slug-hash="GoYyzB" data-default-tab="js" data-user="SitePoint" data-embed-version="2" data-pen-title="Angular $watch demo - $scope.$watch()">See the Pen <a href="http://codepen.io/SitePoint/pen/GoYyzB/">Angular $watch demo - $scope.$watch()</a> by SitePoint (<a href="http://codepen.io/SitePoint">@SitePoint</a>) on <a href="http://codepen.io/">CodePen</a>.</p>


Prenez le temps de vous familiariser avec. Vous pouvez comparer les différences de comportement directement, ou suivre l'ordre dans l'article.

#### Observer un Array

Vous voulez observer les changements d'un Array de votre scope, mais que signifie "changement"?

Disons que vôtre controller ressemble à ceci:

<figure><pre><code data-lang="javascript"><span>app</span><span>.</span><span>controller</span><span>(</span><span>'watchDemoCtrl'</span><span>,</span> <span>[</span><span>'$scope'</span><span>,</span> <span>function</span><span>(</span><span>$scope</span><span>)</span> <span>{</span>
  <span>$scope</span><span>.</span><span>letters</span> <span>=</span> <span>[</span><span>'A'</span><span>,</span> <span>'B'</span><span>,</span> <span>'C'</span><span>];</span>
<span>}]);</span></code></pre></figure>

L'une des options serait de faire un appel comme ceci:

<figure><pre><code data-lang="javascript"><span>$scope</span><span>.</span><span>$watch</span><span>(</span><span>'letters'</span><span>,</span> <span>function</span><span>(</span><span>newValue</span><span>,</span> <span>oldValue</span><span>,</span> <span>scope</span><span>)</span> <span>{</span>
  <span>// Faire quelque chose ici avec $scope.letters</span>
<span>});</span></code></pre></figure>

Dans la fonction au-dessus, <code>newValue</code> et <code>oldValue</code> parlent d'eux-mêmes, et seront mis à jour à chaque fois qu'elle est appelée par le cycle <code>$digest</code>. La signification de <code>scope</code> est assez intuitive aussi, elle contient une référence au scope courant.

Mais la question est: quand le listener sera-t-il appelé? Si vous essayez d'ajouter, supprimer, ou remplacer des éléments du tableau <code>letters</code>, et rien de se passera. C'est parce que par défaut <code>$watch</code> par du principe que vous ne voulez vérifier que _l'égalité de références_, donc si vous assignez une nouvelle valeur à <code>$scope.letters</code>, la callback sera lancée.

Si vous voulez observer les changements d'un élément du tableau, vous devez passer <code>true</code> en 3e paramètre a l'observateur (c'est-à-dire mettre une valeur au paramètre <code>objectEquality</code> décrit plus haut).

<figure><pre><code data-lang="javascript"><span>$scope</span><span>.</span><span>$watch</span><span>(</span><span>'letters'</span><span>,</span> <span>function</span><span>(</span><span>newValue</span><span>,</span> <span>oldValue</span><span>,</span> <span>scope</span><span>)</span> <span>{</span>
  <span>// Faire quelque chose ici avec $scope.letters</span>
<span>});</span></code></pre></figure>

#### Observer un Objet

Pour les objets c'est la même chose. Si <code>objectEquality</code> est a <code>false</code>, on observe juste la réassignation de cette variable dans le scope. Alors qu'à <code>true</code>, a chaque changement d'un élément dans l'objet, la callback est appélée.

#### Observer le premier élément d'un Array

Il faut rappeler qu'avec <code>objectEquality == true</code>, chaque fois que la callback est appelée, <code>newValue</code> est <code>oldValue</code> seront l'ancienne et nouvelle valeur du tableau __en entier__. Donc il faut faire la différence entre les deux à chaque fois pour savoir ce qui a changé.

Imaginons que vous ne vouliez observer les changements du premier élément seulement (ou le 4e, c'est le même principe). Eh bien puisque Angular est génial, il vous permet de faire ça: vous pouvez l'écrire naturellement dans l'expression que vous passez en premier paramètre à <code>$watch</code>:

<figure><pre><code data-lang="javascript"><span>$scope</span><span>.</span><span>$watch</span><span>(</span><span>'letter[4]'</span><span>,</span> <span>function</span><span>(</span><span>newValue</span><span>,</span> <span>oldValue</span><span>,</span> <span>scope</span><span>)</span> <span>{</span>
  <span>//</span>
<span>},</span> <span>true</span><span>);</span></code></pre></figure>

Et si le tableau n'avait que 2 éléments? Eh bien pas de problème, la callback ne sera lancé que lorsque vous ajouterez un 4e élément. Enfin, elle sera lancée quand vous initialiserez pour la première fois l'observateur/watch, et ensuite seulement lorsque vous mettrez un 4e élément.

Si vous affichez <code>oldValue</code>, vous que les deux fois elle vaudra <code>undefined</code>. Comparez ceci avec ce qu'il se passe si on observe un élément existant: À l'initialisation, vous aurez toujours <code>oldValue == undefined</code>. Donc rien que <code>$watch</code> ne peut gérer!

Maintenant passons à une question plus intéressante: doit-on passer <code>objectEquality == true</code> ici?

Malheureusement il n'y a pas de réponse simple à cette question.

Cela dépend:

* Dans cet exemple, puisque nous avons des valeurs primitives, nous n'avons pas besoin de comparaison profonde, donc nous pouvons omettre <code>objectEquality</code>.
* Mais supposons que nous ayons une matrice <code>$scope.board = [[1, 2, 3], [4, 5, 6]];</code>, et que nous voulions observer la première ligne. Alors nous voudrions surement être alertés d'un changement comme <code>$scope.board[0][1] = 7</code>.

#### Observer le champ d'un Objet

Sûrement encore plus utile qu'observer un élément arbitraire d'un tableau, nous pouvons observer un champ arbitraire dans un objet. Mais il n'y a là aucune surprise hein? Les Arrays en JavaScript sont des objets après tout.

<figure><pre><code data-lang="javascript"><span>$scope</span><span>.</span><span>obj</span> <span>=</span> <span>{</span><span>'a'</span><span>:</span> <span>1</span><span>,</span> <span>'b'</span><span>:</span> <span>2</span><span>};</span>
<span>$scope</span><span>.</span><span>$watch</span><span>(</span><span>'obj["a"]'</span><span>,</span> <span>function</span><span>(</span><span>newValue</span><span>,</span> <span>oldValue</span><span>,</span> <span>scope</span><span>)</span> <span>{</span>
  <span>//</span>
<span>})</span></code></pre></figure>

### Une comparaison jusqu'à quelle profondeur?

Nous devons éclaircir un dernier point crucial: que se passe-t-il si nous devons observer un objet complexe imbriqué avec uniquement des valeurs non-primitives? Comme un graphe ou un arbre, ou des données en JSON.

Regardons tout ça!

D'abord nous avons besoin d'un objet à observer:

<figure><pre><code data-lang="javascript"><span>$scope</span><span>.</span><span>obj</span> <span>=</span> <span>{</span>
  <span>'a'</span><span>:</span> <span>1</span><span>,</span>
  <span>'b'</span><span>:</span> <span>{</span>
    <span>'ba'</span><span>:</span> <span>{</span>
      <span>'bab'</span><span>:</span> <span>2</span>
    <span>},</span>
    <span>'bb'</span><span>:</span> <span>[</span>
      <span>{</span>
        <span>'bb1a'</span><span>:</span> <span>3</span><span>,</span>
        <span>'bb1b'</span><span>:</span> <span>4</span>
      <span>},</span>
      <span>{</span>
        <span>'bb2a'</span><span>:</span> <span>5</span>
      <span>}</span>
    <span>]</span>
  <span>}</span>
<span>};</span></code></pre></figure>

Appliquons notre watch sur l'objet en entier: Je suppose que maintenant il est assez clair que <code>objectEquality</code> doit valoir <code>true</code> dans ce cas.

<figure><pre><code data-lang="javascript"><span>$scope</span><span>.</span><span>$watch</span><span>(</span><span>'obj'</span><span>,</span> <span>function</span> <span>(</span><span>newValue</span><span>,</span> <span>oldValue</span><span>,</span> <span>scope</span><span>)</span> <span>{</span>
    <span>//...</span>
<span>},</span> <span>true</span><span>);</span></code></pre></figure>

La question est la suivante: Angular sera-t-il assez sympa pour nous prévenir lorsque nous ferons quelque chose du genre <code>$scope.b.bb[1].bb2a = 7</code>?

La réponse est oui, heureusement pour nous (vérifiez sur la démo CodePen précédente).

## D'autres méthodes

### <code>$scope.$watchGroup</code>

Est-ce que <code>$watchGroup</code> est vraiment une méthode? La réponse est non.

<code>$watchGroup</code> est un raccourci pratique qui vous permet de placer plusieurs observateurs/watchers avec une même callback, en lui passant un tableau de <code>watchExpressions</code>.

Chaque expression passé sera observée en utilisant la méthode <code>$scope.$watch()</code>:

<figure><pre><code data-lang="javascript"><span>$scope</span><span>.</span><span>$watchGroup</span><span>([</span><span>'obj.a'</span><span>,</span> <span>'obj.b.bb[1]'</span><span>,</span> <span>'letters[2]'</span><span>],</span> <span>function</span><span>(</span><span>newValues</span><span>,</span> <span>oldValues</span><span>,</span> <span>scope</span><span>)</span> <span>{</span>
  <span>//</span>
<span>});</span></code></pre></figure>

Il est à noter qu'avec <code>$watchGroup</code>, <code>newValues</code> et <code>oldValues</code> vont avoir une liste de valeur pour les expressionns, celles qui ont changées et celles d'avant, dans le __même ordre__ que le tableau que vous lui donnez en paramètre.

En regardant la documentation de cette méthode, on peut remarquer que cette méthode ne prend pas <code>objectEquality</code>. C'est parce qu'elle ne prends que les expressions en elle-même, et ne réagit qu'aux changements de référence.

En jouant avec la démo ci-dessous de <code>$watchGroup</code>, vous pourriez remarquerer quelques subtilités. Par exemple <code>unshift</code> va provoquer un appel du listener, au moins dans certains cas: c'est parce qu'en passant une liste d'expressionsns à <code>$watchGroup</code>, _chacune d'entre elles_ pourra provoquer l'execution de la callback.

<p data-height="345" data-theme-id="0" data-slug-hash="rxqpbe" data-default-tab="html" data-user="SitePoint" data-embed-version="2" data-pen-title="Angular $watch demo - $scope.$watchGroup">See the Pen <a href="http://codepen.io/SitePoint/pen/rxqpbe/">Angular $watch demo - $scope.$watchGroup</a> by SitePoint (<a href="http://codepen.io/SitePoint">@SitePoint</a>) on <a href="http://codepen.io/">CodePen</a>.</p>


Notez aussi que changer un champ à l'intérieur de <code>$scope.obj.j</code> ne provoquera pas de mise à jour, seulement l'assignation de <code>b</code> le fera.

### <code>$scope.$watchCollection</code>

C'est un autre raccourci pourriez observer des tableaux ou des objets. Pour les tableaux, le listener sera appelé à chaque fois qu'un élément est déplacé, supprimé ou ajouté. Pour les objets, c'est lorsqu'une propriété change. Encore une fois, <code>objectEquality</code> n'est pas autorisé, la fonction ne regardera que le premier niveau de champs/éléments, et ne réagira pas aux changements de leurs sous-champs.

<p data-height="265" data-theme-id="0" data-slug-hash="VeEyNy" data-default-tab="html" data-user="SitePoint" data-embed-version="2" data-pen-title="Angular $watch demo - $scope.$watchCollection()">See the Pen <a href="http://codepen.io/SitePoint/pen/VeEyNy/">Angular $watch demo - $scope.$watchCollection()</a> by SitePoint (<a href="http://codepen.io/SitePoint">@SitePoint</a>) on <a href="http://codepen.io/">CodePen</a>.</p>


## Conclusion

J'espère que ces exemples vous auront aidé à découvrir la puissance de cette fonctionnalité d'Angular, et à quel point il est important d'utiliser les bonnes options.

N'hésitez pas à retoucher et forker les CodePens et à éxperimenter avec les méthodes des différents contextes, et n'oubliez pas de faire des retours en commentaires! (Ndlt: Du site original, moi les commentaires ne marche plus pour le moment, encore x) )

Si vous voulez en savoir plus sur les différents concepts que nous avons abordés dans cet article, voici quelques suggestions de lectures:

* [AngularJS scope](https://docs.angularjs.org/guide/scope)
* [Understanding Angular's $apply() and $digest()](http://www.sitepoint.com/understanding-angulars-apply-digest/)
* [Emerging Patterns in JavaScript Event Handling](http://www.sitepoint.com/emerging-patterns-javascript-event-handling/)
* [Prototypal Inheritance in AngularJS Scopes](https://www.sitepoint.com/premium/books/angularjs-novice-to-ninja/preview/prototypal-inheritance-in-angularjs-scopes-14afa0b)
* [Documentation for watch &amp;co](https://docs.angularjs.org/api/ng/type/$rootScope.Scope#$watch)

## Conclusion Bis (D'Ilphrin cette fois-ci)

J'ai vraiment aimé faire cette traduction et je pense que j'en ferais bien plus par la suite car j'ai beaucoup appris. Que ce soit au niveau technique parce que...bah c'est un article technique quand même, et moi qui utilise AngularJS au travail c'est toujours un plus d'avoir des articles comme ça.

Mais aussi au niveau rédactionnel, je me suis beaucoup imprégné de la façon d'écrire de l'auteur original, ce qui m'aidera pour écrire les prochains articles.

J'en ai aussi profité pour faire quelques petits changements sur le site, notamment maintenant je peux faire de la coloration syntaxique avec highlight.js, et je peux maintenant écrie du code dans une ligne.

J'éspère que cet article vous aura plu, j'en ferais d'autres par la suite ;)
<p><img src="media/9292dabf.235511b5004cfd4af8c43a8b06c9e121" data-original-source="http://cdn.libravatar.org/avatar/235511b5004cfd4af8c43a8b06c9e121" alt="Gravatar de Ilphrin" class="gravatar" /><br/><i>Original post of <a href="http://ilphrin.com/planet/2017/01/09/traduction-watch-angularjs.html" title="Visit the source">Ilphrin</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>


feed_id: http://fortintam.com/blog/2017/01/03/renommer-un-peripherique-audio-avec-pulseaudio/
title: Kiddo : Renommer un périphérique audio avec PulseAudio
uri: 2017-01-09-Kiddo-Renommer-un-périphérique-audio-avec-PulseAudio
url: http://fortintam.com/blog/2017/01/03/renommer-un-peripherique-audio-avec-pulseaudio/
content:
<p>J’ai découvert par hasard qu’on peut faire un clic droit sur le “profil” d’un périphérique dans <em>pavucontrol</em> pour renommer le périphérique. Or, cette fonctionnalité n’est pas disponible par défaut puisqu’il faut un module supplémentaire (sous Fedora, du moins). Pour faire un essai en temps réel:</p>
<p><code>$ pactl load-module module-device-manager<br>
34</code></p>
<p><span></span></p>
<p>“34”? Quelle drôle de réponse! Je présume que ça veut dire que ça a fonctionné. Si on réessaie immédiatement la même commande, on obtient:</p>
<p><code>$ pactl load-module module-device-manager<br>
Échec : Échec lors de l'initialisation du module</code></p>
<p>Ce qui, si on pense comme un développeur un peu paresseux sur la sémantique, dévoile que le module est bel et bien chargé déjà.</p>
<p>On peut maintenant donner des noms beaucoup plus courts et pratiques à nos périphériques favoris. Par exemple, ma SoundBlaster au nom beaucoup trop complexe:</p>
<div><!--[if lt IE 9]><![endif]-->
<video width="635" height="499" preload="metadata" controls="controls"><source type="video/webm" src="http://jeff.ecchi.ca/blog/wp-content/uploads/pulseaudio-device-renaming-1.webm?_=1"></source><a href="media/7151e1d8.pulseaudio-device-renaming-1.webm" data-original-source="http://jeff.ecchi.ca/blog/wp-content/uploads/pulseaudio-device-renaming-1.webm">http://jeff.ecchi.ca/blog/wp-content/uploads/pulseaudio-device-renaming-1.webm</a></video></div>
<p>Ou encore mon bon vieux <a href="http://jeff.ecchi.ca/blog/2009/05/16/microphone-usb-logitech/">micro Logitech</a> au nom tout à fait cryptique:</p>
<div><video width="577" height="323" preload="metadata" controls="controls"><source type="video/webm" src="http://jeff.ecchi.ca/blog/wp-content/uploads/pulseaudio-device-renaming-2.webm?_=2"></source><a href="media/4206b548.pulseaudio-device-renaming-2.webm" data-original-source="http://jeff.ecchi.ca/blog/wp-content/uploads/pulseaudio-device-renaming-2.webm">http://jeff.ecchi.ca/blog/wp-content/uploads/pulseaudio-device-renaming-2.webm</a></video></div>
<p>Côté interface, tout ceci est plutôt moche et difficile à découvrir, alors j’ai ouvert <a href="https://bugs.freedesktop.org/show_bug.cgi?id=94975">un rapport de bug à ce sujet</a>. Ce qui est un peu dommage, c’est qu’on renomme ici les entrées/sorties (sources/sinks) individuellement, au lieu de renommer le périphérique matériel dans sa globalité. Aussi, les versions renommées ne sont pas prises en compte par les paramètres de son de GNOME Control Center.</p>
<p>En tout cas, après ce test concluant, on peut ajouter les lignes suivantes dans le fichier ~/.config/pulse/default.pa pour rendre le changement permanent (je préfère éditer ce fichier dans mon dossier personnel plutôt que le fichier système “/etc/pulse/default.pa”, pour que ça persiste après des “clean installs” de distros:</p>
<p><code>.include /etc/pulse/default.pa<br><strong>load-module module-device-manager</strong></code></p>
<p>Note: “default.pa”, contrairement à daemon.conf (dans lequel j’ai simplement mis “flat-volumes = no” pour revenir au mixage à l’ancienne), n’hérite pas automatiquement des paramètres système, c’est pourquoi j’ai inséré la ligne “.include”.</p>
<p><img src="media/bb18a5c3.ca9664d6eee3bdf362c3741adb83e4bb" data-original-source="http://cdn.libravatar.org/avatar/ca9664d6eee3bdf362c3741adb83e4bb" alt="Gravatar de Kiddo" class="gravatar" /><br/><i>Original post of <a href="http://fortintam.com/blog/2017/01/03/renommer-un-peripherique-audio-avec-pulseaudio/" title="Visit the source">Kiddo</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>Kiddo : <a href="">Le SSD du pauvre</a> (08/03/2012)</li><li>Kiddo : <a href="">GNOME pour les non-ordinateuriens</a> (12/06/2010)</li><li>Silvyn : <a href="">Fedora 12, PulseAudio &amp;amp; Bluetooth et p&eacute;riph&eacute;rique audio (Headset)</a> (22/11/2009)</li><li>TheGlu : <a href="">Songbird, le lecteur audio qu&rsquo;il est pratique !</a> (18/11/2007)</li><li>Jos : <a href="">Ubuntu &ndash; Rediriger l&rsquo;entr&eacute;e audio vers la sortie avec pulseaudio</a> (21/03/2010)</li></ul></div></p>


title: Tuxicoman : Statistiques de blog… à prendre avec des pincettes
uri: Tuxicoman-Statistiques-de-blog-à-prendre-avec-des-pincettes
feed_id:
https://tuxicoman.jesuislibre.net/2017/01/statistiques-de-blog-a-prendre-avec-des-pincettes.html?pk_campaign=feed&amp;pk_kwd=statistiques-de-blog-a-prendre-avec-des-pincettes

url:
https://tuxicoman.jesuislibre.net/2017/01/statistiques-de-blog-a-prendre-avec-des-pincettes.html?pk_campaign=feed&amp;pk_kwd=statistiques-de-blog-a-prendre-avec-des-pincettes

content:
<p>Les blogs aiment bien parler de leur <a href="https://tuxicoman.jesuislibre.net/2016/02/mes-statistiques-2015.html">statistiques de visite après une année écoulée</a>. Cependant, il faut prendre les statistiques avec des pincettes.</p>
<p>Il faut notamment :</p>
<ul><li>enlever les robots et spammeurs de commentaires, qui sont souvent le gros des visiteurs sur des petits sites web!</li>
<li>ajouter tous ceux qui utilisent des bloqueurs de traqueurs comme <a href="https://addons.mozilla.org/en-us/firefox/addon/ublock-origin/">Ublock Origin</a> et qui ne sont donc pas comptés par GoogleAnalytics ou Piwik (…du moins par défaut)</li>
<li>ajouter ceux qui lisent les articles uniquement en <a href="https://tuxicoman.jesuislibre.net/flux-rss-tuxicoman">RSS</a> ou qui n’exécutent pas de code javascript.</li>
<li>oublier Facebook qui repompe le contenu.</li>
</ul><p>Ensuite, qu’est ce qui est décompté?</p>
<ul><li>Les pages vues: compliqué pour les pages déroulantes ou qui se rafraîchissent automatiquement. Si un visiteur ouvre le site web après avoir lu le RSS, on compte 2 pages vues ?</li>
<li>Les visiteurs : Il faut s’assurer qu’on ne compte pas plusieurs fois la même personne. Hors, l’IP change, les cookies sont parfois supprimés (ex: <a href="https://addons.mozilla.org/fr/firefox/addon/self-destructing-cookies/">Cookie self destruct</a>), la personne revient sur le site depuis un autre appareil (smartphone + pc)</li>
<li>Les visites : <a href="https://piwik.org/faq/general/faq_36/">Piwik considère qu’un visiteur qui revient plus de 30 minutes après sa première visite, génère une nouvelle visite</a>. Mais si on a déjà du mal à compter les visiteurs, ça va fausser le comptage des visites… Et cette définition de « visite » est propre à chaque outil de comptage et sujet à débat.</li>
</ul><p>Donc, ce n’est pas facile du tout. Chaque outil (Piwik, Awstats, GoogleAnalytics, Xiti, etc…) va mesurer différemment et donner des résultats différents. D’où la difficulté de comparer.</p>
<p>Certains sites web seront plus sensibles aux bloqueurs de traqueurs si leur visiteurs sont plus geek. Et donc, même comparer des statistiques entre sites web utilisant le même outil est difficile.</p>
<p>Donc finalement, les statistiques pour un blog perso, ça permet surtout d’avoir une vague idée de sa popularité (Il y a t il plus que 10 personnes qui me lisent?) sans en savoir beaucoup plus. (Quid de la qualité du lectorat ?)</p>
<p>Si vous voulez avoir la plus grosse, ne vous prenez pas la tête, <a href="https://tuxicoman.jesuislibre.net/2016/11/fausser-les-stats-de-googleanalytics.html">vous pouvez tricher comme je l’ai montré avec GoogleAnalytics</a> ou <a href="https://tuxicoman.jesuislibre.net/2016/10/exploser-le-compteur-de-visites-de-piwik.html">même Piwik</a></p>
<h3>Related Posts:</h3>
<ul><li><a href="https://tuxicoman.jesuislibre.net/2016/11/migration-owncloud-nextcloud.html" title="Migration owncloud -> nextcloud">Migration owncloud -> nextcloud</a></li>
<li><a href="https://tuxicoman.jesuislibre.net/2016/10/exploser-le-compteur-de-visites-de-piwik.html" title="Exploser le compteur de visites de Piwik">Exploser le compteur de visites de Piwik</a></li>
<li><a href="https://tuxicoman.jesuislibre.net/2016/10/bloquer-les-publicites-et-traqueurs-au-niveau-du-dns-avec-unbound.html" title="Bloquer les publicités et traqueurs au niveau du DNS avec Unbound">Bloquer les publicités et traqueurs au niveau du DNS avec Unbound</a></li>
<li><a href="https://tuxicoman.jesuislibre.net/2016/10/mysearch-1-10.html" title="MySearch 1.10">MySearch 1.10</a></li>
<li><a href="https://tuxicoman.jesuislibre.net/2015/10/wd-my-cloud-et-seagate-personal-cloud-vos-donnees-sont-elles-privees.html" title="Cloud personnels, attention à la fonctionnalité d’accès à distance">Cloud personnels, attention à la fonctionnalité d’accès à distance</a></li>
</ul><img src="https://espion.jesuislibre.net/piwik.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Ftuxicoman.jesuislibre.net%2F2017%2F01%2Fstatistiques-de-blog-a-prendre-avec-des-pincettes.html%3Fpk_campaign%3Dfeed%26pk_kwd%3Dstatistiques-de-blog-a-prendre-avec-des-pincettes&amp;action_name=Statistiques+de+blog%26%238230%3B+%C3%A0+prendre+avec+des+pincettes&amp;urlref=https%3A%2F%2Ftuxicoman.jesuislibre.net%2Ffeed" width="0" height="0" alt="">
<p><img src="media/a4176171.d01ce01523a0434fc1c413922f7fd8a2" data-original-source="http://cdn.libravatar.org/avatar/d01ce01523a0434fc1c413922f7fd8a2" alt="Gravatar de Tuxicoman" class="gravatar" /><br/><i>Original post of <a href="https://tuxicoman.jesuislibre.net/2017/01/statistiques-de-blog-a-prendre-avec-des-pincettes.html?pk_campaign=feed&amp;pk_kwd=statistiques-de-blog-a-prendre-avec-des-pincettes" title="Visit the source">Tuxicoman</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>Tuxicoman : <a href="">Mettre &agrave; jour son DNS chez Gandi.net avec une IP dynamique</a> (23/03/2013)</li><li>Tuxicoman : <a href="">Fail2ban pour votre installation WordPress</a> (03/04/2013)</li><li>Tuxicoman : <a href="">PRISM et l&rsquo;auto-h&eacute;bergement</a> (09/06/2013)</li><li>Tuxicoman : <a href="">Co&ucirc;t d&rsquo;un service de r&eacute;seau social</a> (27/07/2013)</li><li>Tuxicoman : <a href="">MySearch 1.10</a> (08/10/2016)</li></ul></div></p>


feed_id: http://blog.rom1v.com/2017/01/commentaires-statiques-avec-jekyll/
title: ®om : Commentaires statiques avec Jekyll
uri: om-Commentaires-statiques-avec-Jekyll
url: http://blog.rom1v.com/2017/01/commentaires-statiques-avec-jekyll/
content:
<p>Pour ce blog, j’ai abandonné
<a href="https://fr.wikipedia.org/wiki/WordPres://fr.wordpress.org/">Wordpress</a> pour
<a href="https://jekyllrb.com/">Jekyll</a>, un moteur de blog <em>statique</em>.</p>

<p>Ainsi, j’écris mes articles en <a href="https://fr.wikipedia.org/wiki/Markdown">markdown</a> dans mon <a href="https://fr.wikipedia.org/wiki/Vim">éditeur favori</a>, je
les <em>commite</em> dans un <a href="https://github.com/rom1v/blog.rom1v.com/">dépôt git</a>, et je génère le blog avec :</p>

<pre><code>jekyll build
</code></pre>

<p>Le contenu hébergé étant statique, les pages ainsi générées à partir des sources
sont renvoyées telles quelles.</p>

<p>Ce fonctionnement a beaucoup d’avantages :</p>

<ul><li>le temps de réponse est minimal ;</li>
  <li>la sécurité est largement accrue ;</li>
  <li>la maintenance est simplifiée (pas de mises à jour de sécurité régulières) ;</li>
  <li>le backup est trivial (<code>git clone</code>, pas de base de données).</li>
</ul><h2>Sans commentaires</h2>

<p>L’inconvénient, c’est qu’un contenu statique est difficilement conciliable avec
le support des commentaires (il faut bien d’une manière ou d’une autre exécuter
du code lors de la réception d’un commentaire).</p>

<p>Il y a plusieurs manières de contourner le problème.</p>

<p>Il est par exemple possible d’en déporter la gestion (sur un service en ligne
comme <a href="http://www.perfectlyrandom.org/2014/06/29/adding-disqus-to-your-jekyll-powered-github-pages/">Disqus</a> ou un équivalent libre – <a href="https://posativ.org/isso/">isso</a> – à héberger
soi-même). Ainsi, les commentaires peuvent être chargés séparément par le client
en <em>Javascript</em>.</p>

<p>Au lieu de cela, j’ai choisi d’intégrer les commentaires aux sources du blog.
Voici comment.</p>

<p>L’objectif est d’une part de pouvoir <strong>stocker</strong> et <strong>afficher</strong> les commentaires
existants, et d’autre part de fournir aux lecteurs la possibilité d’en
<strong>soumettre</strong> de nouveaux, qui me seront <strong>envoyés par e-mail</strong>.</p>

<p>Je me suis principalement inspiré du contenu de <a href="http://theshed.hezmatt.org/jekyll-static-comments/">Jekyll::StaticComments</a>, même
si, comme nous allons le voir, je n’utilise pas le plug-in lui-même.</p>

<h2>Stockage</h2>

<p>L’idée est de stocker les commentaires quelque part dans les sources du site au
format <a href="https://fr.wikipedia.org/wiki/YAML">YAML</a>.</p>

<p>Le plugin <em>Jekyll::StaticComments</em> nécessite de stocker <a href="https://github.com/mpalmer/jekyll-static-comments/blob/master/README.md#technical-details">un fichier par
commentaire</a> dans un dossier spécial (<code>_comments</code>) parsé par un
script à insérer dans le répertoire <code>_plugins</code>.</p>

<p>Personnellement, je préfère avoir tous les commentaires d’un même post regroupés
au sein d’un même fichier. Et pour cela, pas besoin de plug-in : nous pouvons
faire <a href="http://stevesspace.com/2014/04/static-jekyll-comments/">correspondre</a> à chaque post dans <code>_posts</code> une liste de
commentaires dans <code>_data</code> (un répertoire géré nativement par <em>Jekyll</em>).</p>

<p>Par exemple, ce billet est stocké dans :</p>

<pre><code>_posts/2017-01-09-commentaires-statiques-avec-jekyll.md
</code></pre>

<p>Dans l’idéal, je voudrais que les commentaires associés soient stockés dans :</p>

<pre><code>_data/comments-2017-01-09-commentaires-statiques-avec-jekyll.yaml
</code></pre>

<p>En pratique, pour des raisons techniques (<a href="https://github.com/jekyll/jekyll/issues/633"><em>Jekyll</em> ne donne pas accès au nom du
fichier</a>), le nom du fichier ne contient pas le numéro du jour :</p>

<pre><code>_data/comments-2017-01-commentaires-statiques-avec-jekyll.yaml
</code></pre>

<p>Il suffit alors de stocker dans ces fichiers les commentaires sous cette forme :</p>

<div><pre><code data-lang="yaml"><span>-</span> <span>id</span><span>:</span> <span>1</span>
  <span>author</span><span>:</span> <span>this_is_me</span>
  <span>date</span><span>:</span> <span>2017-01-02 10:11:12+01:00</span>
  <span>contents</span><span>:</span> <span>|</span>
    <span>Bonjour,</span>

    <span>Ceci est un commentaire écrit en _markdown_.</span>
<span>-</span> <span>id</span><span>:</span> <span>2</span>
  <span>author</span><span>:</span> <span>dev42</span>
  <span>author-url</span><span>:</span> <span>https://github.com</span>
  <span>date</span><span>:</span> <span>2017-01-02 12:11:10+01:00</span>
  <span>contents</span><span>:</span> <span>|</span>
    <span>> Ceci est un commentaire écrit en _markdown_.</span>

    <span>Et ça supporte aussi le [Liquid](https://jekyllrb.com/docs/templates/) :</span>

    <span>{% highlight c %}</span>
    <span>int main() {</span>
        <span>return 0;</span>
    <span>}</span>
    <span>{% endhighlight %}</span></code></pre></div>

<p>Pour des exemples réels, voir les <a href="https://github.com/rom1v/blog.rom1v.com/tree/master/_data">sources des commentaires</a> de ce
blog.</p>

<h2>Affichage</h2>

<p>Maintenant que nous avons les données des commentaires, nous devons les
afficher.</p>

<p>Il faut d’abord trouver la liste des commentaires associée à la page courante.</p>

<p>Comme nous ne pouvons pas récupérer directement le nom du fichier d’une page,
nous devons reconstruire la chaîne à partir de la <a href="https://jekyllrb.com/docs/variables/#page-variables">variable</a> <code>page.id</code>, qui
ici vaut :</p>

<pre><code>/2017/01/commentaires-statiques-avec-jekyll
</code></pre>

<p>Cette ligne de <em>Liquid</em> :</p>

<div><pre><code data-lang="liquid">comments<span>{{</span><span> </span><span>page</span><span>.</span><span>id</span><span> </span><span>|</span><span> </span><span>replace</span><span>:</span><span> </span><span>'/'</span><span>,</span><span> </span><span>'-'</span><span> </span><span>}}</span></code></pre></div>

<p>donne la valeur :</p>

<pre><code>comments-2017-01-commentaires-statiques-avec-jekyll
</code></pre>

<p>Nous avons donc tout ce dont nous avons besoin pour créer le <em>template</em> de
commentaires (à stocker dans <a href="https://github.com/rom1v/blog.rom1v.com/blob/master/_includes/comments.html"><code>_include/comments.html</code></a>) :</p>

<div><pre><code data-lang="html">{% capture commentid %}comments{{ page.id | replace: '/', '-' }}{% endcapture %}
{% if site.data[commentid] %}
<span><h2</span> <span>id=</span><span>"comments"</span><span>></span>Commentaires<span></h2></span>
<span><div</span> <span>class=</span><span>"comments"</span><span>></span>
    {% for comment in site.data[commentid] %}
        <span><div</span> <span>id=</span><span>"comment-{{ comment.id }}"</span> <span>class=</span><span>"comment"</span> <span>/></span>
            <span><div</span> <span>class=</span><span>"comment-author"</span><span>></span>
                {% if (comment.author-url) %}
                    <span><a</span> <span>href=</span><span>"{{comment.author-url}}"</span><span>></span>
                {% endif %}
                {{ comment.author }}
                {% if (comment.author-url) %}
                    <span></a></span>
                {% endif %}
            <span></div></span>
            <span><div</span> <span>class=</span><span>"comment-date"</span><span>></span>
                <span><a</span> <span>href=</span><span>"#comment-{{ comment.id }}"</span><span>></span>
                    {{ comment.date | date: "%-d %B %Y, %H:%M" }}
                <span></a></span>
            <span></div></span>
            <span><div</span> <span>class=</span><span>"comment-contents"</span><span>></span>
                {{ comment.contents | liquify | markdownify }}
            <span></div></span>
        <span></div></span>
    {% endfor %}
<span></div></span></code></pre></div>

<p>Il suffit alors d’inclure cette page à l’endroit où vous souhaitez insérer les
commentaires (typiquement dans <a href="https://github.com/rom1v/blog.rom1v.com/blob/master/_layouts/post.html"><code>_layout/post.html</code></a>) :</p>

<div><pre><code data-lang="liquid"><span>{%</span><span> </span><span>include</span><span> </span>comments.html<span> </span><span>%}</span></code></pre></div>

<h2>Formulaire</h2>

<p>Pour proposer aux utilisateurs de poster de nouveaux commentaires, il nous faut
un formulaire.</p>

<p>À titre d’exemple, voici le mien (intégré à
<a href="https://github.com/rom1v/blog.rom1v.com/blob/master/_includes/comments.html"><code>_include/comments.html</code></a>) :</p>

<div><pre><code data-lang="html"><span><h3</span> <span>class=</span><span>"comment-title"</span><span>></span>Poster un commentaire<span></h3></span>
<span><form</span> <span>method=</span><span>"POST"</span> <span>action=</span><span>"/comments/submit.php"</span><span>></span>
    <span><input</span> <span>type=</span><span>"hidden"</span> <span>name=</span><span>"post_id"</span> <span>value=</span><span>"{{ page.id }}"</span> <span>/></span>
    <span><input</span> <span>type=</span><span>"hidden"</span> <span>name=</span><span>"return_url"</span> <span>value=</span><span>"{{ page.url }}"</span> <span>/></span>
    <span><table</span> <span>class=</span><span>"comment-table"</span><span>></span>
        <span><tr></span>
            <span><th></span>Nom :<span></th></span>
            <span><td></span>
                <span><input</span> <span>type=</span><span>"text"</span> <span>size=</span><span>"25"</span> <span>name=</span><span>"name"</span> <span>/></span>
                <span><em></span>(requis)<span></em></span>
            <span></td></span>
        <span></tr></span>
        <span><tr></span>
            <span><th></span>E-mail :<span></th></span>
            <span><td></span>
                <span><input</span> <span>type=</span><span>"text"</span> <span>size=</span><span>"25"</span> <span>name=</span><span>"email"</span> <span>/></span>
                <span><em></span>(requis, non publié)<span></em></span>
            <span></td></span>
        <span></tr></span>
        <span><tr></span>
            <span><th></span>Site web :<span></th></span>
            <span><td></span>
                <span><input</span> <span>type=</span><span>"text"</span> <span>size=</span><span>"25"</span> <span>name=</span><span>"url"</span> <span>/></span>
                <span><em></span>(optionnel)<span></em></span>
            <span></td></span>
        <span></tr></span>
        <span><tr></span>
            <span><td</span> <span>colspan=</span><span>"2"</span><span>></span>
                <span><textarea</span> <span>name=</span><span>"comment"</span> <span>rows=</span><span>"10"</span><span>></textarea></span>
            <span></td></span>
        <span></tr></span>
        <span><tr></span>
            <span><td</span> <span>colspan=</span><span>"2"</span><span>></span>
                <span><input</span> <span>class=</span><span>"comment-submit"</span> <span>type=</span><span>"submit"</span> <span>value=</span><span>"Envoyer"</span> <span>/></span>
            <span></td></span>
        <span></tr></span>
    <span></table></span>
<span></form></span></code></pre></div>

<p>Ce formulaire est affiché sous les commentaires existants.</p>

<h2>Traitement</h2>

<p>L’<code>action</code> du formulaire précédent pointait sur
<a href="https://github.com/rom1v/blog.rom1v.com/blob/master/comments/submit.php"><code>comments/submit.php</code></a>. Il nous reste donc à écrire dans ce fichier
le code à exécuter lorsqu’un utilisateur envoie un commentaire au serveur.</p>

<p>Ce sera la seule partie “dynamique” du site.</p>

<p>Voici les parties importantes de <a href="https://github.com/rom1v/blog.rom1v.com/blob/master/comments/submit.php"><code>comments/submit.php</code></a> (basé sur
<a href="https://github.com/mpalmer/jekyll-static-comments/blob/master/commentsubmit.php">la version de Jekyll::StaticComments</a>) :</p>

<div><pre><code data-lang="php"><span><?php</span>
<span>$DATE_FORMAT</span> <span>=</span> <span>"Y-m-d H:i:sP"</span><span>;</span>
<span>$EMAIL_ADDRESS</span> <span>=</span> <span>"your@email"</span><span>;</span>
<span>$SUBJECT</span> <span>=</span> <span>"Nouveau commentaire"</span><span>;</span>
<span>$COMMENT_SENT</span> <span>=</span> <span>"sent.html"</span><span>;</span>

<span>$msg</span> <span>=</span> <span>"post_id: "</span> <span>.</span> <span>$_POST</span><span>[</span><span>"post_id"</span><span>]</span> <span>.</span> <span>"</span><span>\\n</span><span>"</span><span>;</span>
<span>$msg</span> <span>.=</span> <span>"email: "</span> <span>.</span> <span>$_POST</span><span>[</span><span>"email"</span><span>]</span> <span>.</span> <span>"</span><span>\\n</span><span>"</span><span>;</span>
<span>$msg</span> <span>.=</span> <span>"---</span><span>\\n</span><span>"</span><span>;</span>
<span>$msg</span> <span>.=</span> <span>"- id: ?</span><span>\\n</span><span>"</span><span>;</span>
<span>$msg</span> <span>.=</span> <span>"  author: "</span> <span>.</span> <span>$_POST</span><span>[</span><span>"name"</span><span>]</span> <span>.</span> <span>"</span><span>\\n</span><span>"</span><span>;</span>
<span>if</span> <span>(</span><span>$_POST</span><span>[</span><span>"url"</span><span>]</span> <span>!==</span> <span>''</span><span>)</span>
<span>{</span>
    <span>$msg</span> <span>.=</span> <span>"  author-url: "</span> <span>.</span> <span>$_POST</span><span>[</span><span>"url"</span><span>]</span> <span>.</span> <span>"</span><span>\\n</span><span>"</span><span>;</span>
<span>}</span>
<span>$msg</span> <span>.=</span> <span>"  date: "</span> <span>.</span> <span>date</span><span>(</span><span>$DATE_FORMAT</span><span>)</span> <span>.</span> <span>"</span><span>\\n</span><span>"</span><span>;</span>
<span>$msg</span> <span>.=</span> <span>"  contents: |</span><span>\\n</span><span>"</span> <span>.</span> <span>$_POST</span><span>[</span><span>"comment"</span><span>];</span>

<span>$headers</span> <span>=</span> <span>"From: </span><span>$EMAIL_ADDRESS\\n</span><span>"</span><span>;</span>
<span>$headers</span> <span>.=</span> <span>"Content-Type: text/plain; charset=utf-8"</span><span>;</span>

<span>if</span> <span>(</span><span>mail</span><span>(</span><span>$EMAIL_ADDRESS</span><span>,</span> <span>$SUBJECT</span><span>,</span> <span>$msg</span><span>,</span> <span>$headers</span><span>))</span>
<span>{</span>
    <span>include</span> <span>$COMMENT_SENT</span><span>;</span>
<span>}</span>
<span>else</span>
<span>{</span>
    <span>echo</span> <span>"Le commentaire n'a pas pu être envoyé."</span><span>;</span>
<span>}</span></code></pre></div>

<p>Quand un commentaire est envoyé avec succès, la page
<a href="https://github.com/rom1v/blog.rom1v.com/blob/master/comments/sent.html"><code>comments/sent.html</code></a> est affichée à l’utilisateur.</p>

<p>Ainsi, lorsqu’un commentaire est posté, je reçois un mail :</p>

<pre><code>post_id: /2017/01/commentaires-statiques-avec-jekyll
email: my@email
---
- id: ?
  author: ®om
  author-url: http://blog.rom1v.com
  date: 2017-01-09 19:27:10+01:00
  contents: |
Ceci est un test.
</code></pre>

<p>J’ai d’ailleurs ajouté une règle <a href="http://blog.rom1v.com/2010/01/trier-ses-mails-directement-sur-le-serveur-procmail/">procmail</a> pour que ces mails arrivent dans
un dossier dédié.</p>

<p>Je peux alors copier le contenu dans le <code>.yaml</code> correspondant, formatter le
commentaire (entre autres l’indenter de 4 espaces, ce qu’on pourrait
automatiser), et le commiter.</p>

<h2>Résumé</h2>

<p>Une fois mis en place, vous devriez donc avoir les fichiers suivants :</p>

<ul><li><code>_data/comments-*.yaml</code></li>
  <li><code>_include/comments.html</code></li>
  <li><code>comments/submit.php</code></li>
  <li><code>comments/sent.html</code></li>
</ul><h2>Conclusion</h2>

<p>Je souhaitais depuis longtemps migrer vers un moteur de blog statique, qui
correspond davantage à ma façon d’écrire des articles, et offre beaucoup
d’avantages (légèreté, sécurité, maintenance…).</p>

<p>Je suis très content d’y être parvenu sans perdre les commentaires ni la
possibilité d’en poster de nouveaux.</p>

<p>Certes, la validation est très manuelle, mais c’est le prix à payer pour avoir
des commentaires statiques. Pour un blog avec une fréquence de commentaires
assez faible, je pense que ce n’est pas très gênant.</p>
<p><img src="media/7cefb81c.1a63f34b9244a38a08fd9b3e5a4aa85e" data-original-source="http://cdn.libravatar.org/avatar/1a63f34b9244a38a08fd9b3e5a4aa85e" alt="Gravatar de &reg;om" class="gravatar" /><br/><i>Original post of <a href="http://blog.rom1v.com/2017/01/commentaires-statiques-avec-jekyll/" title="Visit the source">®om</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>


feed_id: https://www.bloguslibrus.fr/post/20170110-au-revoir-google-2/
title: Bridouz : Au revoir Google #2
uri: Bridouz-Au-revoir-Google-2
url: https://www.bloguslibrus.fr/post/20170110-au-revoir-google-2/
content:
<p>Au revoir google #2</p>

<p>Le billet précédent parlait de la dégooglisation de l’OS Android mais j’y oubliais de parler des applications et c’est assez bête car un smartphone serait-il <em>smart</em> sans ces fameuses applications ?
Quoi qu’il en soit voici un rapide tour du propriétaire sans applications propriétaires.</p>

<p></p>

<p>Le souci donc c’est que, sans les services <em>Play Store</em> un bon nombre d’applications ne marchent plus et sont détectées comme <em>incompatibles</em> avec mon appareil.</p>

<p>Il existe des alternatives pour émuler les services Play comme <a href="https://github.com/microg/android_packages_apps_GmsCore/wiki">µGms</a> mais, je n’ai pas encore essayé et de plus il faut avoir une ROM alternative permettant le <em>signature spoofing</em>… Mais dans l’optique de se dégoogliser je préfère autant me passer le plus possible des applications utilisant leurs services, on verra sur le long terme si je tiens le coup.</p>

<p>Voici donc ma petite liste d’alternatives sans méchant code <em>(du moins il me semble)</em> à l’intérieur :</p>

<ul><li><strong><a href="https://f-droid.org/repository/browse/?fdfilter=transport&amp;fdid=de.grobox.liberario">Transport :</a></strong> Quand il s’agit de prendre le bus mieux vaut être à l’heure. L’application propose les heures des lignes d’un grand panel d’endroits, en France et dans le monde. Recherche d’arrêt, itinéraire, cartes OSM, Favoris. C’est du tout bon.</li>
<li><strong><a href="https://f-droid.org/repository/browse/?fdfilter=Privacy+Browser&amp;fdid=com.stoutner.privacybrowser.standard">Privacy Browser :</a></strong> Un navigateur encore jeune mais qui permet de surfer sans trop grossir d’un trop plein de <em>cookies</em> et de <em>javascript</em>. Il est possible d’activer ses derniers si vous le voulez d’ailleurs. Pour le moment il n’y a pas la gestion d’onglet, mais on s’y retrouve tout de même. De plus l’application s’auto-nétoie avant de la fermer.
<em>L’application peut naturellement s’utiliser avec des moteurs de recherches comme <a href="https://www.qwant.com/">Qwant</a> ou <a href="https://duckduckgo.com/">DuckDuckGo</a></em></li>
<li><strong><a href="https://f-droid.org/repository/browse/?fdfilter=vanilla&amp;fdid=ch.blinkenlights.android.vanilla">Vanilla Music :</a></strong> Ici c’est un simple lecteur audio. Rien de plus à ajouter.</li>
<li><strong><a href="https://f-droid.org/repository/browse/?fdfilter=AntennaPod&amp;fdid=de.danoeh.antennapod">AntennaPod :</a></strong> Lecteur de podcasts léger et open-source. Recherche via <a href="https://gpodder.net/">Gpodder</a> possible, liste de lecture, streaming/téléchargement, supression automatique après lecture. Top</li>
<li><strong><a href="https://f-droid.org/repository/browse/?fdfilter=osmand&amp;fdid=net.osmand.plus">OsmAND :</a></strong> Il est vrai que la cartographie OpenStreetMap peut parfois être moins pratique qu’un Google Maps, mais sa richesse est telle que le souci est rapidement oublié. Et puis rien de mieux que l’aventure sur la route. Passer par la même route que les autres ? Suivre la masse sans détours ? Sans voir ce que les <em>petites</em> routes cachent ? C’est un choix. En tous cas OsmAND est une application complète, demandant pas mal de mémoire (autant physique que virtuelle) et il serait légitime que ce projet soit encore plus utilisé tant il est passionnant.</li>
<li><strong><a href="https://f-droid.org/repository/browse/?fdfilter=password&amp;fdid=com.zeapo.pwdstore">Password-Store </a></strong> avec <strong><a href="https://f-droid.org/repository/browse/?fdfilter=password&amp;fdid=org.sufficientlysecure.keychain">OpenKeyChain :</a></strong> Gestionnaire de mots de passe utilisant <a href="https://www.passwordstore.org/">pass</a>. Synchronisation sur le serveur <em>git</em> maison, génération de mots de passes complexes, auto-complétion possible avec le navigateur.</li>
<li><strong><a href="https://f-droid.org/repository/browse/?fdfilter=k9&amp;fdid=com.fsck.k9">K-9 Mail :</a></strong> Même en aimant Dr Who je suis bien obligé de reconnaître que l’icône de l’application est d’une mocheté sans noms. Certes oui, il n’empêche que K-9 est une très bonne application pour gérer ses boîtes mails. Elle s’avère très complète et intuitive.</li>
<li><strong><a href="https://f-droid.org/repository/browse/?fdfilter=newpipe&amp;fdid=org.schabi.newpipe">NewPipe :</a></strong> Une application pour Youtube, lecture en arrière-plan en prime.</li>
<li><strong><a href="https://f-droid.org/repository/browse/?fdfilter=anysoft&amp;fdid=com.menny.android.anysoftkeyboard">AnySoftKeyboard :</a></strong> Un clavier plus respectueux, qui fait le boulot sans petits plus. Il faut tout de même un petit moment avant de le prendre en main.</li>
<li><strong><a href="https://f-droid.org/repository/browse/?fdfilter=KISS&amp;fdid=fr.neamar.kiss">KISSLauncher :</a></strong> Un launcher alternatif original, je n’en dis pas plus.</li>
</ul><p>Voilà pour la liste des applications que j’utilise le plus et qui se posent en alternatives plus libres. J’aurais pu parler de Nextcloud et de ses différents services mais beaucoup le font mieux que moi…</p>

<p>Et dernier cas que je souhaitais aborder aujourd’hui est celui des applications bancaires. Là il n’y a pas de secrets aucunes alternatives possibles. Seul le bon vieux site internet reste à notre disposition. Avec Privacy Browser il faut activer <em>cookies</em> et <em>javascript</em> selon les banques. En tous cas, les comptes ne changeront pas.</p>

<blockquote>
<p>L’alternative est possible, elle se travaille et s’éduque.</p>
</blockquote>
<p><img src="media/06ba8eba.7d1e02f86fac7aa11519ad0a32657aa1" data-original-source="http://cdn.libravatar.org/avatar/7d1e02f86fac7aa11519ad0a32657aa1" alt="Gravatar de Bridouz" class="gravatar" /><br/><i>Original post of <a href="https://www.bloguslibrus.fr/post/20170110-au-revoir-google-2/" title="Visit the source">Bridouz</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>


feed_id: http://blog.niqnutn.com/index.php?article63/aller-plus-loin-avec-reveal-js
title: nIQnutn : Aller plus loin avec reveal.js
uri: nIQnutn-Aller-plus-loin-avec-reveal-js
url: http://blog.niqnutn.com/index.php?article63/aller-plus-loin-avec-reveal-js
content:
<p>
<em>reveal.js</em> est un outil très utile pour faire des <a href="http://blog.niqnutn.com/index.php?article59" title="présentations en HTML">présentations en HTML</a>. 
Il propose en plus d'<a href="http://blog.niqnutn.com/index.php?article62" title="utiliser la syntaxe Markdown">utiliser la syntaxe Markdown</a>.
Son utilisation est relativement simple et ne nécessite pas de logiciels spécifiques.
</p>
<div><img src="media/e017f092.presentation_expert.tb.jpg" data-original-source="http://blog.niqnutn.com/data/medias/0063/presentation_expert.tb.jpg" alt=""></div>
<p>
Il existe encore quelques options très intéressantes à connaître pour réaliser votre présentation.
</p><h2>Chargement différé</h2>

<p>
Si vous réalisez une présentation avec beaucoup de contenu multimédia, le chargement du diaporama pourrait être long.
L'utilisation du <em>lazy loading</em> (ou chargement différé) permet de charger le contenu multimédia que pour les <b>n</b> diapos suivantes.
</p>

<p>
Cela permet d'être plus réactif lors du lancement de la présentation tout en évitant d'avoir des temps de chargement pendant.
</p>

<p>
Pour utiliser le chargement différé, il faut remplacer "src" par "data-src".
</p>

<div>
<div><i></i><br><span> code</span></div>
  <div><pre><code><section>
	<img data-src="media/e80aff3e.image.png" data-original-source="http://blog.niqnutn.com/image.png">
	<video data-src="media/6129700e.video.mp4" data-original-source="http://blog.niqnutn.com/video.mp4"></video>
</section></code></pre></div>
  </div>


<p>
Le chargement différé peut être utilisé pour les images, les vidéos, les fichiers audio et les iframes.
</p>

<h3>Configuration</h3>


<p>
Il est possible de modifier le nombre de <em>slides</em> à charger:
</p>

<div>
<div><i></i><br><span> code</span></div>
  <div><pre><code>Reveal.initialize({
	...
	viewDistance: 3,   // Number of slides away from the current that are visible
	...
})</code></pre></div>
  </div>



<p>
<a href="https://github.com/hakimel/reveal.js#lazy-loading" title="https://github.com/hakimel/reveal.js#lazy-loading">https://github.com/hakimel/reveal.js#lazy-loading</a>
</p>

<h2>Code</h2>


<p>
Il est possible de créer un bloc de code éditable:
</p>

<div>
<div><i></i><br><span> code</span></div>
  <div><pre><code><section>
	<pre><code contenteditable>
		$(document).ready(function() {
		  $('pre code').each(function(i, block) {
		    hljs.highlightBlock(block);
		  });
		});
	</code></pre>
</section></code></pre></div>
  </div>


<p>
Il est possible de supprimer les lignes vides (en dessus et en dessous du bloc de code):
</p>

<div>
<div><i></i><br><span> code</span></div>
  <div><pre><code><section>
	<pre><code data-trim>


		$(document).ready(function() {
		  $('pre code').each(function(i, block) {
		    hljs.highlightBlock(block);
		  });
		});
	</code></pre>
</section></code></pre></div>
  </div>


<p>
<a href="https://github.com/hakimel/reveal.js#code-syntax-highlighting" title="https://github.com/hakimel/reveal.js#code-syntax-highlighting">https://github.com/hakimel/reveal.js#code-syntax-highlighting</a>
</p>


<h2>Animation avancée</h2>



<p>
Il est possible de définir l'ordre d'apparition d'un élément avec "data-fragment-index":
</p>


<div>
<div><i></i><br><span> code</span></div>
  <div><pre><code><section>
	<p class="fragment" data-fragment-index="3">Et pour finir, le troisième</p>
	<p class="fragment" data-fragment-index="1">En premier</p>
	<p class="fragment" data-fragment-index="2">Ensuite le deuxième</p>
</section></code></pre></div>
  </div>



<p>
<a href="https://github.com/hakimel/reveal.js#fragments" title="https://github.com/hakimel/reveal.js#fragments">https://github.com/hakimel/reveal.js#fragments</a>
</p>


<h2>Transition avancée</h2>



<p>
On peut définir la vitesse de transition entre les diaporama.
</p>

<p>
 Pour définir la vitesse de transition pour l'ensemble du diaporama: 
</p>

<div>
<div><i></i><br><span> code</span></div>
  <div><pre><code>Reveal.initialize({
	...
	transitionSpeed: 'default', // default, fast, slow
	...
})</code></pre></div>
  </div>

<p>
 Pour définir la vitesse de transition pour une seule diapo: 
</p>

<div>
<div><i></i><br><span> code</span></div>
  <div><pre><code><section data-transition-speed="fast">
	<h2>Choisir la vitesse de transition: default, fast or slow!</h2>
</section></code></pre></div>
  </div>




<p>
On peut définir un type de transition pour l'apparition et un autre pour la disparition de la diapo.<br>
Il faut suffixer le type de transition avec "-in" et "-out":
</p>

<div>
<div><i></i><br><span> code</span></div>
  <div><pre><code><section data-transition="zoom-in slide-out">
	<b>zoom</b> puis <b>slide</b>
</section></code></pre></div>
  </div>


<p>
<a href="https://github.com/hakimel/reveal.js#slide-transitions" title="https://github.com/hakimel/reveal.js#slide-transitions">https://github.com/hakimel/reveal.js#slide-transitions</a>
</p>



<h2>Étirer un élément</h2>


<p>
Il est possible d'étirer un élément (image, vidéo, ...) pour qu'il utilise le maximum d'espace sur la diapo.
</p>

<div>
<div><i></i><br><span> code</span></div>
  <div><pre><code><section>
	<video class="stretch" src="media/6129700e.video.mp4" data-original-source="http://blog.niqnutn.com/video.mp4"></video>
</section></code></pre></div>
  </div>


<p>
<a href="https://github.com/hakimel/reveal.js#stretching-elements" title="https://github.com/hakimel/reveal.js#stretching-elements">https://github.com/hakimel/reveal.js#stretching-elements</a>
</p>

<h2>Note</h2>



<p>
Il existe une méthode alternative pour insérer des notes dans la présentation.
</p>

<div>
<div><i></i><br><span> code</span></div>
  <div><pre><code><section data-notes="Lorem Ipsum">
	<p>Appuyer sur la touche <strong>S</strong> pour afficher les notes.</p>
</section></code></pre></div>
  </div>



<h2>Titre sur les diapos verticales</h2>


<p>
On peut insérer un titre sur l'ensemble des diapos verticales.<br>
Il faut ajouter le titre juste avant de créer les diapos X et Y.
</p>

<div>
<div><i></i><br><span> code</span></div>
  <div><pre><code><section>Titre visible
	<section>Diapo X</section>
	<section>Diapo Y</section>
</section>	</code></pre></div>
  </div>

<h2>Conclusion</h2>



<p>
Je vous ai présenté l'essentiel des fonctionnalités qui me semblent intéressantes (pour mon usage personnel).
La documentation officielle contient encore quelques éléments, n'hésitez pas à la consulter pour en apprendre plus.
</p>

<p>
Pour ceux qui sont à l'aise avec HTML, CSS et javascript il y aura la possibilité d'être beaucoup plus créatif.<br>
Je pense notamment à la création de nouveaux thèmes.
</p>

<p>
N'hésitez pas à partager vos trucs et astuces sur <i>reveal.js</i>.
</p>

<h2>Ressources</h2>



<ul><li>reveal.js: <a href="https://github.com/hakimel/reveal.js" title="documentation">documentation</a></li>
<li><a href="http://blog.niqnutn.com/index.php?article59">Réaliser une présentation avec reveal.js</a></li>
<li><a href="http://blog.niqnutn.com/index.php?article62">Faire une présentation avec reveal.js et Markdown</a></li>
</ul><br>
2016 nIQnutn CC-BY
<p><img src="media/a91347c8.5c27127d0dc6fdd370e85d336aa73f8c" data-original-source="http://cdn.libravatar.org/avatar/5c27127d0dc6fdd370e85d336aa73f8c" alt="Gravatar de nIQnutn" class="gravatar" /><br/><i>Original post of <a href="http://blog.niqnutn.com/index.php?article63/aller-plus-loin-avec-reveal-js" title="Visit the source">nIQnutn</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>


feed_id: https://blog.genma.fr/?Python-W3C-et-automatisation
title: genma : Python, W3C et automatisation
uri: genma-Python-W3C-et-automatisation
url: https://blog.genma.fr/?Python-W3C-et-automatisation
content:
<img alt="" src="https://blog.genma.fr/IMG/arton2612.jpg?1482914844" width="150" height="79"><div><p>Ce billet est dédié à l'amie Norore.</p>
<p>Dans la série de mes projets me permettant l'apprentissage de Python, il y avait celui de scripter l'appel aux URL du service fournit par le W3C. J'avais évoqué ce projet dans mon billet <a href="https://blog.genma.fr/?FreshRSS-Verifier-la-validite-du-flux" v la validit du flux>FreshRSS - Vérifier la validité du flux</a>.</p>
<p>En effet, le W3C fournit un service de validation des pages HTML et des feuilles de style CSS, indiquant les erreurs ou écarts par rapport à la norme du W3C. Il suffit de copier - coller le code source ou de donner le lien vers un page / le fichier pour avoir le résultat afficher.</p>
<p>Une première ébauche de mon script est <a href="https://framagit.org/genma/Python_Public/blob/42749373ab8ddb253d22142678ce380512fe3957/Billet_Blog_W3c_Validation.py" title="Framagit - Script Python">disponible ici, sur mon compte Framagit</a></p>
<p>Pour le paramétrage, c'est dans un fichier Config.ini qui contient</p>
<div dir="ltr"><code>[Blog]<br>
filRSS = https://blog.genma.fr/spip.php?page=backend</code></div>
<p>A adapter à vos besoins, bien évidemment.</p>
<p>Je me suis inspiré d'un code existant trouvé sur Github, que j'ai adapté à mes besoins. En effet, ce que je veux ce n'est pas valider un seul fichier mais une série de fichiers... dont les URL sont dans le fil RSS.</p>
<p>Pour l'instant, le script récupère le fil RSS, prend les URL des billets dedans. Pour chaque URL, il fait appel au validateur du W3C et ça renvoie le résultat de l'analyse, puis passe à l'URL suivante du fil RSS. Tout ça sur la sortie standard de la ligne de commande.</p>
<p><strong>Il me reste à faire :</strong>
<br><img src="https://blog.genma.fr/local/cache-vignettes/L8xH11/puce-32883.gif?1475396778" width="8" height="11" alt="-"> Mail : dès que j'aurai un peu de temps (et l'envie), je pense à ajouter une fonction d'envoi d'un mail donnant le résultat des différents validators. Comme ça, je pourrais en mettant le script dans une crontab, faire qu'il soit lancé une fois par semaine. Et recevoir le résultat par mail. Un moyen simple d'avoir une validation du code HTML de mes billets publiés dans la semaine, de façon automatisée.
<br><img src="https://blog.genma.fr/local/cache-vignettes/L8xH11/puce-32883.gif?1475396778" width="8" height="11" alt="-"> Validation des CSS : ajouter l'appel à la validation des CSS une fois de temps en temps (même si elle ne change pas souvent, ça peut être utile)
<br><img src="https://blog.genma.fr/local/cache-vignettes/L8xH11/puce-32883.gif?1475396778" width="8" height="11" alt="-"> Validation du RSS : ajouter l'appel à la validation du fil RSS en lui-même (comme il reprend le corps de texte des billets, il peut y avoir des erreurs spécifiques au RSS)
<br><img src="https://blog.genma.fr/local/cache-vignettes/L8xH11/puce-32883.gif?1475396778" width="8" height="11" alt="-"> Cumul des erreurs du même type (pour éviter d'avoir plein de lignes en doublons si une même erreur est récurrente),</p>
<p>A suivre donc :)</p></div>
<p><img src="media/42493842.dd4318d0d3a7d2ffb13756f63b76d85d" data-original-source="http://cdn.libravatar.org/avatar/dd4318d0d3a7d2ffb13756f63b76d85d" alt="Gravatar de genma" class="gravatar" /><br/><i>Original post of <a href="https://blog.genma.fr/?Python-W3C-et-automatisation" title="Visit the source">genma</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>


feed_id: http://yeuxdelibad.net/Blog/?d=2017/01/10/16/31/08-un-gui-en-python-tp-1-une-visionneuse-dimages
title: Thuban : Un GUI en python : TP 1, une visionneuse d'images
uri: Thuban-Un-GUI-en-python-TP-1-une-visionneuse-d-images
url: http://yeuxdelibad.net/Blog/?d=2017/01/10/16/31/08-un-gui-en-python-tp-1-une-visionneuse-dimages
content:
<p>Marre de tous ces tutos qui commencent avec un "Bonjour monde". J'aime pas le monde moi. À la place, je vous propose de faire une visionneuse d'images que nous appelerons "<strong>tkv</strong>" afin d'aller mater les <a href="https://lesptitsdessinsdepeha.wordpress.com/">dessins de Péhä</a>.</p>

<p>Vous aurez besoin de :</p>

<ul><li> tkinter avec python3 (python2 sapu, et puis même debian le lâche, il était temps ! ). Installez donc les paquets <strong>python3-tk</strong> sous debian ou <strong>python-tkinter-3.4.5</strong> sous OpenBSD,</li>
<li> La bibliothèque de manipulation d'images PIL ou pillow (<strong>python3-pil</strong> sous debian ou <strong>py3-Pillow</strong> sous OpenBSD),</li>
<li> Un éditeur de texte,</li>
<li> 20 minutes,</li>
<li> Un slip propre.</li></ul><p>Voici le code qui va nous servir de point de départ, à enregistrer dans un fichier tkv.py :</p>

<pre><code>#!/usr/bin/env python3
# -*- coding:Utf-8 -*- 

import urllib.request
from tkinter import *
from PIL import Image, ImageTk
</code></pre>

<p>Vous pouvez tester ce code avec la commande :</p>

<pre><code>python3.4 tkv.py</code></pre>

<p><em>Hé, mais c'est nul ton truc !</em></p>

<p>Patience ^^ . Il ne se passe rien pour l'instant, mis à part l'import des bibliothèques qui vont nous être utiles. S'il y a des erreurs, c'est qu'il vous manque tkinter ou la bibliothèque PIL.</p>

<p>Quelques commentaires maintenant, intégrés au code :</p>

<pre><code>#!/usr/bin/env python3
# -*- coding:Utf-8 -*- 

import urllib.request     # On veut télécharger des trucs
from tkinter import *     # Là, on appelle tkinter
from PIL import Image, ImageTk     # On va afficher des images
</code></pre>

<p>On code en dessous de ces lignes. Pour commencer, on affiche la fenêtre avec :</p>

<pre><code>w = Tk()
w.mainloop()
</code></pre>

<p>Si vous lancez le script, vous verrez un carré gris.</p>

<div><img src="media/b584c8de.tkv1.png" data-original-source="http://yeuxdelibad.net/Blog/img/c1/tkv1.png" alt=""></div>

<p>On est encore un peu loin de ce que l'on souhaite :) <br>
La première ligne crée une instance de notre fenêtre, et l'appel de <code>w.mainloop()</code> la "démarre".<br>
Avant cette dernière ligne, nous allons personnaliser notre application.</p>

<p>Afin d'afficher les images, on va ajouter dans la fenêtre un espace qui servira de conteneur. Il s'agit d'une "Frame" :</p>

<pre><code>mainframe = Frame(w)
mainframe.pack(fill=BOTH, expand=True, padx=15, pady=15)</code></pre>

<p>Remarquez qu'on passe à <code>Frame(w)</code> le widget dans laquelle elle est contenue. On parle de widget "parent".</p>

<p>Ensuite, on attache notre widget avec la fonction "pack". Nous indiquons quelques paramètres afin qu'elle remplisse bien toute la fenêtre (<code>fill=BOTH, expand=True</code>). De plus, on définit une marge, totalement facultative avec les paramètres <code>padx</code> et <code>pady</code>.</p>

<p>Si vous lancez le code, vous ne verrez aucun changement pour l'instant.</p>

<p>Maintenant, on va récupérer une image à afficher. On commence douvement avec une image qui est en ligne que l'on affichera dans <code>mainframe</code>.</p>

<p>Pour télécharger l'image, on utilise les lignes suivantes. C'est du python très bête, puisque ce n'est pas l'objet de l'article. Cette image sera enregistrée dans /tmp/image.jpg.</p>

<pre><code>url="https://pbs.twimg.com/media/C1Zv9ZbXEAA4-W0.jpg"
urllib.request.urlretrieve(url, "/tmp/image.jpg")</code></pre>

<p>Une fois cette image récupérée, nous la chargeons en mémoire :</p>

<pre><code>image = Image.open(img_path)
img = ImageTk.PhotoImage(image)</code></pre>

<p>Ne reste plus qu'à mettre cette image dans un widget. Ici, je vais la mettre dans un widget de type "Label", habituellement utilisé pour afficher du texte, mais qui peut aussi contenir une image :</p>

<pre><code>img_widget = Label(mainframe, image=img)
img_widget.pack()</code></pre>

<p>Remarquez que l'on met l'image dans le conteneur "mainframe", puis qu'on l'accroche dedans avec la fonction "pack".</p>

<p>Testez le code tel qu'il est actuellement :</p>

<pre><code>#!/usr/bin/env python
# -*- coding:Utf-8 -*- 

import urllib.request
from tkinter import *
from PIL import Image, ImageTk

# Notre fenêtre principale
w = Tk()

# Un conteneur dans la fenêtre
mainframe = Frame(w)
mainframe.pack(fill=BOTH,expand=True, padx=15, pady=15)

# Téléchargement de l'image
url="https://pbs.twimg.com/media/C1Zv9ZbXEAA4-W0.jpg"
img_path="/tmp/image.jpg"
urllib.request.urlretrieve(url, img_path)

# Chargement de l'image
image = Image.open(img_path)
img = ImageTk.PhotoImage(image)

# Insertion de l'image dans le conteneur.
img_widget = Label(mainframe, image=img)
img_widget.pack()

# Démarrage du programme
w.mainloop()</code></pre>

<p>Tout fonctionne comme prévu, sauf que l'image est trop grande. On va donc chercher à savoir s'il faut la redimensionner. <br>
Déjà, on récupère les dimensions de l'écran :</p>

<pre><code>gap = 100 # marge par rapport aux bords de l'écran
screen_width = w.winfo_screenwidth() - gap
screen_height = w.winfo_screenheight() - gap</code></pre>

<p>On les compare aux dimensions de l'image. Si nécessaire, on la redimensionne avec un bête calcul de proportionnalité :</p>

<pre><code>if image.width > screen_width : 
    image = image.resize((screen_width, int(image.height * screen_width / image.width)), Image.ANTIALIAS)
if image.height > screen_height :   
    image = image.resize((int(image.width * screen_height / image.height), screen_height), Image.ANTIALIAS)</code></pre>

<p>Et voilà, notre image apparaît maintenant correctement :</p>

<div><img src="media/19672c4d.tkv2.png" data-original-source="http://yeuxdelibad.net/Blog/img/a9/tkv2.png" alt=""></div>

<p>Avant de se quitter à la fin de ce gros TP, on va améliorer un petit peu l'apparence de notre fenêtre.</p>

<p>On va déjà lui donner un titre :</p>

<pre><code>w.title("tkv : visionneuse d'images")</code></pre>

<p>Puis on définit un fond noir :</p>

<pre><code>w.configure(background='#000000')</code></pre>

<p>C'est la fenêtre qui est mise en noir. Et puisqu'on a laissé une marge lorsqu'on a ajouté le conteneur principal, ça nous permet de la voir.</p>

<p>C'est déjà un peu mieux :</p>

<div><img src="media/cd32b812.tkv3.png" data-original-source="http://yeuxdelibad.net/Blog/img/76/tkv3.png" alt=""></div>

<p>Ouf, ça fait déjà beaucoup pour une première étape. Vous aurez remarqué que les parties les plus difficiles concernent le téléchargement de l'image et son redimensionnement. À côté de ça, l'utilisation de tkinter est d'une grande simplicité.</p>

<p>La prochaine fois, nous verrons comment choisir une image sur le disque de l'ordinateur et comment ajouter quelques boutons pour faire défiler les images.</p>

<p>À bientôt !</p>

<p>ps : voici le code final :</p>

<pre><code>
#!/usr/bin/env python
# -*- coding:Utf-8 -*- 

import urllib.request
from tkinter import *
from PIL import Image, ImageTk


# Notre fenêtre principale
w = Tk()
w.title("tkv : visionneuse d'images") # Un titre
w.configure(background='#000000')     # Fond noir

# Un conteneur dans la fenêtre
mainframe = Frame(w)
mainframe.pack(fill=BOTH,expand=True, padx=15, pady=15)

# Téléchargement de l'image
url="https://pbs.twimg.com/media/C1Zv9ZbXEAA4-W0.jpg"
img_path="/tmp/image.jpg"
urllib.request.urlretrieve(url, img_path)

# Ouverture de l'image
image = Image.open(img_path)
# Dimensions de l'écran : 
gap = 100 # marge par rapport aux bords de l'écran
screen_width = w.winfo_screenwidth() - gap
screen_height = w.winfo_screenheight() - gap

if image.width > screen_width : 
    image = image.resize((screen_width, int(image.height * screen_width / image.width)), Image.ANTIALIAS)
if image.height > screen_height :   
    image = image.resize((int(image.width * screen_height / image.height), screen_height), Image.ANTIALIAS)

# Chargement de l'image en mémoire
img = ImageTk.PhotoImage(image)

# Insertion de l'image dans le conteneur.
img_widget = Label(mainframe, image=img)
img_widget.pack()

# Démarrage du programme
w.mainloop()

</code></pre>
<p><img src="media/0d200000.a17c14dbfc42f0936cee56ed7a9b3b31" data-original-source="http://cdn.libravatar.org/avatar/a17c14dbfc42f0936cee56ed7a9b3b31" alt="Gravatar de Thuban" class="gravatar" /><br/><i>Original post of <a href="http://yeuxdelibad.net/Blog/?d=2017/01/10/16/31/08-un-gui-en-python-tp-1-une-visionneuse-dimages" title="Visit the source">Thuban</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>Thuban : <a href="">Programmer un GUI en python -- Pourquoi TkInter ?</a> (04/01/2017)</li></ul></div></p>


feed_id: https://framablog.org/2017/01/11/framaestro-menez-vos-reunions-et-collaborations-a-la-baguette/
title: Framablog : Framaestro : menez vos réunions et collaborations à la baguette !
uri: Framablog-Framaestro-menez-vos-réunions-et-collaborations-à-la
url: https://framablog.org/2017/01/11/framaestro-menez-vos-reunions-et-collaborations-a-la-baguette/
content:
<p>Vous souhaiteriez afficher et partager, dans un seul et même onglet, une page d’écriture collaborative, un site web, une visio-conférence et un tableur… ?</p>
<p>Pas de problème : avec <a href="https://framaestro.org/">Framaestro</a>, c’est vous qui orchestrez un bureau collaboratif !</p>
<p><span></span></p>
<h2>Plusieurs outils dans une seule page web</h2>
<p>C’est, en quelque sorte, le défi que nous avons lancé à JosephK. Comment orchestrer, sur une seule page web, de multiples services Framasoft afin d’avoir tous les outils nécessaires à sa réunion, aux discussions, à la collaboration sur des documents, etc. ? Imaginez que sur une seule et même page web, à l’intérieur de cadres, vous puissiez afficher :</p>
<ul><li>un Framapad (pour écrire collaborativement) qui peut durer un jour, une semaine, un, deux ou six mois, ou même un an ;</li>
<li>un Framacalc, afin d’avoir un tableur sous la main ;</li>
<li>un Framémo, pour organiser ses petites notes dans des colonnes ;</li>
<li>un Framavectoriel, pour dessiner ce que vous voulez ;</li>
<li>une visio-conférence via Framatalk ;</li>
<li>un petit tchat pour discuter <a href="https://fr.wikipedia.org/wiki/Internet_Relay_Chat">en IRC</a> ;</li>
<li>et surtout la (ou les) page(s) web de votre choix (pour travailler sur un site web, par exemple)…</li>
</ul><div><a href="media/f66dc26d.slide-framaestro01.jpg" data-original-source="https://framablog.org/wp-content/uploads/2017/01/slide-framaestro01.jpg"><img src="media/e61f9d2e.slide-framaestro01-1024x350.jpg" data-original-source="https://framablog.org/wp-content/uploads/2017/01/slide-framaestro01-1024x350.jpg" alt="" width="1024" height="350" srcset="https://framablog.org/wp-content/uploads/2017/01/slide-framaestro01-1024x350.jpg 1024w, https://framablog.org/wp-content/uploads/2017/01/slide-framaestro01-300x103.jpg 300w, https://framablog.org/wp-content/uploads/2017/01/slide-framaestro01-768x263.jpg 768w, https://framablog.org/wp-content/uploads/2017/01/slide-framaestro01.jpg 1050w" sizes="(max-width: 1024px) 100vw, 1024px"></a><p>Lorsqu’une image vaut mieux que nombre d’explications…</p></div>
<p>Avec <a href="https://framaestro.org/">Framaestro</a>, c’est à vous d’orchestrer un bureau collaboratif comme vous l’entendez ! Il vous suffit de <a href="https://framaestro.org/">créer votre projet</a> (comme pour un pad : vous choisissez simplement son nom), d’ajouter les cadres que vous voulez y voir (par exemple un pad, une visio-conf, et des pages web), de les arranger comme bon vous semble, puis de partager l’URL (l’adresse web) de votre Framaestro avec vos collaborateurs et collaboratrices.</p>
<p>Dès lors, vous pouvez utiliser ensemble et en même temps, tous les outils choisis.</p>
<h2>Une création originale pour des usages multiples</h2>
<p>Cela fait quelques semaines, maintenant, que Pierre-Yves a lancé l’idée d’un tel (méta-)outil. C’est JosephK qui a saisi la balle au bond, afin de nous coder cela aux petits oignons. En se basant sur de multiples briques existantes (le principe des <a href="https://fr.wikipedia.org/wiki/%C3%89l%C3%A9ment_HTML#Jeu_de_cadres">iframes</a>, <a href="http://jspanel.de/">JSPanel</a>, <a href="http://getbootstrap.com/">Bootstrap</a>, <a href="https://togetherjs.com/">TogetherJS</a>, de l’<a href="https://fr.wikipedia.org/wiki/Internet_Relay_Chat">IRC</a> pour le tchat…), il a créé un service, qui utilise d’autres services, et dont les possibilités d’applications sont nombreuses !</p>
<p>Bien entendu, il s’agit là d’une toute première version, avec ses limites et ses lacunes. L’internationalisation n’est pas encore intégrée (donc, pour l’instant, la seule langue disponible est le Français), il y a des efforts à fournir pour rendre ce service accessible aux personnes en situation de handicap (l’accessibilité nous tient à cœur), et il existe des restrictions sur les sites web que l’on peut afficher (liées à la sécurité de ces sites, tout est expliqué lorsque vous utilisez cette fonctionnalité). Pour nous aider à améliorer ce code, vous pouvez y contribuer <a href="https://framagit.org/framasoft/framaestro">sur notre forge logicielle</a>, ou bien encore <a href="https://framagit.org/framasoft/framaestro/issues">suggérer des améliorations par ici</a>.</p>
<p>Néanmoins, <a href="https://framaestro.org/">Framaestro</a> vous permet d’ores et déjà de nombreuses choses :</p>
<p>En réunion, sur l’écran de votre rétro-projecteur, vous voulez afficher de multiples outils avec lesquels tous les participants peuvent collaborer sans en modifier l’agencement ni en rajouter ? Pas de souci, Framaestro le fait.</p>
<p>À distance, vous souhaitez créer un espace de collaboration libre, où chacun-e peut voir les curseurs et clics des autres, tout en ajoutant les cadres qu’iels veulent ? No problemo, Framaestro le fait aussi.</p>
<p>Vous en avez marre des Frama-services, mais voulez simplement afficher plusieurs pages web bien agencées sur une seule et même page ? OK : Framaestro fait ça tranquillou.</p>
<p>Vous voulez juste reprendre le principe, l’installer sur votre serveur pour y mettre vos propres outils ? Avec <a href="https://framacloud.org/cultiver-son-jardin/installation-de-framaestro/">le tuto d’installation disponible sur le Framacloud</a>, ça le fera.</p>
<p>En fait, il y a une chose que <a href="https://framaestro.org/">Framaestro</a> ne fait pas…</p>
<div><a href="media/e8f28a1b.418teapot-1-1-1.jpg" data-original-source="https://framablog.org/wp-content/uploads/2016/11/418teapot-1-1-1.jpg"><img src="media/e8f28a1b.418teapot-1-1-1.jpg" data-original-source="https://framablog.org/wp-content/uploads/2016/11/418teapot-1-1-1.jpg" alt="" width="750" height="600" srcset="https://framablog.org/wp-content/uploads/2016/11/418teapot-1-1-1.jpg 750w, https://framablog.org/wp-content/uploads/2016/11/418teapot-1-1-1-300x240.jpg 300w" sizes="(max-width: 750px) 100vw, 750px"></a><p>…c’est le café.<br>Framaestro ne fait pas le café.<br>(Désolé.)</p></div>
<h2>Les Framaoliques anonymes se réunissent sur Framaestro.</h2>
<p><em>Afin de vous présenter un exemple concret, nous avons décidé d’imaginer la réunion d’un groupe de parole de personnes atteintes d’une addiction, d’une maladie terrible : celle des gens qui mettent « Frama- » partout dans leurs phrases. Pour préserver leur anonymat, nous avions décidé de les appeler « Hioupou », « Yves-Pierre », et « LàPeuple ». Merci de votre compréhension.</em></p>
<p>Hioupou est chargé de préparer la prochaine réunion des Framaoliques Anonymes. Comme chaque semaine, ce petit groupe se réunit en ligne pour se soutenir, libérer la parole, et arriver à vivre une vie sereine, comme tout le monde, une vie où on ne dit pas « Tu peux me passer la Framagrafeuse ? »</p>
<p>Cette semaine, au lieu d’utiliser un <em>(scrogneugneu-)</em>Pad pour écrire ensemble le contenu de la réunion, et un <em>(non-je-le-dirai-pas-)</em>Talk pour la visio-conférence, il décide d’utiliser <a href="https://framaestro.org/">Framaestro</a> <em>(snif, je l’ai dit)</em> où tout peut se trouver au même endroit.</p>
<p>Il se rend donc sur le site, et choisi le nom de son projet « 20160112ReunionFA ».</p>
<div><a href="media/68b90c55.Framaestro001.png" data-original-source="https://framablog.org/wp-content/uploads/2017/01/Framaestro001.png"><img src="media/7d7f425d.Framaestro001-1024x813.png" data-original-source="https://framablog.org/wp-content/uploads/2017/01/Framaestro001-1024x813.png" alt="" width="1024" height="813" srcset="https://framablog.org/wp-content/uploads/2017/01/Framaestro001-1024x813.png 1024w, https://framablog.org/wp-content/uploads/2017/01/Framaestro001-300x238.png 300w, https://framablog.org/wp-content/uploads/2017/01/Framaestro001-768x610.png 768w, https://framablog.org/wp-content/uploads/2017/01/Framaestro001.png 1188w" sizes="(max-width: 1024px) 100vw, 1024px"></a><p>il a tenté « 2016 01 12 Réunion FA » avant de lire que les espaces et les lettres accentuées ne sont pas admises…</p></div>
<p>Il tombe sur une page blanche, avec une barre d’outils en haut. Certainement la page qui sera partagée avec ses collègues. Il clique donc sur le bouton « Ajouter » en haut à droite et décide de commencer par ajouter un Pad à durée hebdomadaire.</p>
<div><a href="media/f1326bb7.Framaestro002.png" data-original-source="https://framablog.org/wp-content/uploads/2017/01/Framaestro002.png"><img src="media/f1326bb7.Framaestro002.png" data-original-source="https://framablog.org/wp-content/uploads/2017/01/Framaestro002.png" alt="" width="901" height="782" srcset="https://framablog.org/wp-content/uploads/2017/01/Framaestro002.png 901w, https://framablog.org/wp-content/uploads/2017/01/Framaestro002-300x260.png 300w, https://framablog.org/wp-content/uploads/2017/01/Framaestro002-768x667.png 768w" sizes="(max-width: 901px) 100vw, 901px"></a><p>Le menu « Ajouter » est assez explicite, et ne contient que peu de « Frama- » ;)</p></div>
<p>En quelques clics, il décide d’afficher aussi sur ce bureau partagé la page « <a href="https://fr.wikipedia.org/wiki/Addiction">Addiction »</a> de Wikipédia, une visio-conférence (avec le bouton <i aria-hidden="true"></i> ), ainsi qu’un salon de tchat <a href="https://fr.wikipedia.org/wiki/Internet_Relay_Chat">par IRC</a> (bouton <i aria-hidden="true"></i> ) pour les anonymes qui ne veulent pas utiliser la visio conf. Cela ne lui demande pas trop d’efforts…</p>

<a href="https://framablog.org/2017/01/11/framaestro-menez-vos-reunions-et-collaborations-a-la-baguette/framaestro003/"><img width="300" height="118" src="media/64e05ce9.Framaestro003-300x118.png" data-original-source="https://framablog.org/wp-content/uploads/2017/01/Framaestro003-300x118.png" alt="" srcset="https://framablog.org/wp-content/uploads/2017/01/Framaestro003-300x118.png 300w, https://framablog.org/wp-content/uploads/2017/01/Framaestro003-768x303.png 768w, https://framablog.org/wp-content/uploads/2017/01/Framaestro003.png 884w" sizes="(max-width: 300px) 100vw, 300px"></a>
<a href="https://framablog.org/2017/01/11/framaestro-menez-vos-reunions-et-collaborations-a-la-baguette/framaestro004/"><img width="300" height="180" src="media/ffb1329b.Framaestro004-300x180.png" data-original-source="https://framablog.org/wp-content/uploads/2017/01/Framaestro004-300x180.png" alt="" srcset="https://framablog.org/wp-content/uploads/2017/01/Framaestro004-300x180.png 300w, https://framablog.org/wp-content/uploads/2017/01/Framaestro004-768x461.png 768w, https://framablog.org/wp-content/uploads/2017/01/Framaestro004.png 852w" sizes="(max-width: 300px) 100vw, 300px"></a>
<a href="https://framablog.org/2017/01/11/framaestro-menez-vos-reunions-et-collaborations-a-la-baguette/framaestro005/"><img width="300" height="180" src="media/707b4fd2.Framaestro005-300x180.png" data-original-source="https://framablog.org/wp-content/uploads/2017/01/Framaestro005-300x180.png" alt="" srcset="https://framablog.org/wp-content/uploads/2017/01/Framaestro005-300x180.png 300w, https://framablog.org/wp-content/uploads/2017/01/Framaestro005-768x460.png 768w, https://framablog.org/wp-content/uploads/2017/01/Framaestro005.png 857w" sizes="(max-width: 300px) 100vw, 300px"></a>

<p>Après avoir un peu joué à déplacer les cadres et à les redimensionner (seul le cadre Framatalk lui a donné du fil à retordre, et en même temps c’est un cadre vidéo ^^), il arrive à un joli résultat !</p>
<div><a href="media/81d25977.Framaestro006.png" data-original-source="https://framablog.org/wp-content/uploads/2017/01/Framaestro006.png"><img src="media/7f725485.Framaestro006-1024x474.png" data-original-source="https://framablog.org/wp-content/uploads/2017/01/Framaestro006-1024x474.png" alt="" width="1024" height="474" srcset="https://framablog.org/wp-content/uploads/2017/01/Framaestro006-1024x474.png 1024w, https://framablog.org/wp-content/uploads/2017/01/Framaestro006-300x139.png 300w, https://framablog.org/wp-content/uploads/2017/01/Framaestro006-768x356.png 768w, https://framablog.org/wp-content/uploads/2017/01/Framaestro006.png 1512w" sizes="(max-width: 1024px) 100vw, 1024px"></a><p>Et voilà le résultat !</p></div>
<p>Il ne lui reste plus qu’à partager son travail avec les autres membres des Framaoliques Anonymes ! Il repère assez vite le bouton de partage <i></i>, et voit qu’il a deux possibilités : un partage simple avec le permalien (il suffit de copier/coller le lien du dessus dans un email à Yves-Pierre et LàPeuple), ou un partage activant certaines options collaboratives. Aventureux, Hioupou choisit de partager selon les options cochées, et demande à Framaestro de lui raccourcir le lien : ce sera plus pratique à faire passer !</p>
<div><a href="media/412c2888.Framaestro007.png" data-original-source="https://framablog.org/wp-content/uploads/2017/01/Framaestro007.png"><img src="media/412c2888.Framaestro007.png" data-original-source="https://framablog.org/wp-content/uploads/2017/01/Framaestro007.png" alt="" width="899" height="558" srcset="https://framablog.org/wp-content/uploads/2017/01/Framaestro007.png 899w, https://framablog.org/wp-content/uploads/2017/01/Framaestro007-300x186.png 300w, https://framablog.org/wp-content/uploads/2017/01/Framaestro007-768x477.png 768w, https://framablog.org/wp-content/uploads/2017/01/Framaestro007-80x50.png 80w" sizes="(max-width: 899px) 100vw, 899px"></a><p>Le menu de partage se personnalise en quelques clics.</p></div>
<p>Une joyeuse réunion en ligne plus tard, grâce à Framaestro, les Framaoliques Anonymes décident de franchir une nouvelle étape dans leur guérison, en arrêtant collectivement de dire qu’ils trempent leurs Frama-chips dans du Fraguacamole. Voilà une réunion rondement menée !</p>
<p>Bien entendu, ce n’est là qu’une des utilisations possibles de <a href="https://framaestro.org/">Framaestro</a>… à vous d’inventer la vôtre !</p>
<div><a href="media/295d5085.slide-framaestro02.jpg" data-original-source="https://framablog.org/wp-content/uploads/2017/01/slide-framaestro02.jpg"><img src="media/24c01507.slide-framaestro02-1024x350.jpg" data-original-source="https://framablog.org/wp-content/uploads/2017/01/slide-framaestro02-1024x350.jpg" alt="" width="1024" height="350" srcset="https://framablog.org/wp-content/uploads/2017/01/slide-framaestro02-1024x350.jpg 1024w, https://framablog.org/wp-content/uploads/2017/01/slide-framaestro02-300x103.jpg 300w, https://framablog.org/wp-content/uploads/2017/01/slide-framaestro02-768x263.jpg 768w, https://framablog.org/wp-content/uploads/2017/01/slide-framaestro02.jpg 1050w" sizes="(max-width: 1024px) 100vw, 1024px"></a><p>Autre utilisation possible : n’afficher que des sites web !</p></div>
<h3>Pour aller plus loin :</h3>
<ul><li>Utiliser <a href="https://framaestro.org/">Framaestro</a></li>
<li><a href="http://framacloud.org/cultiver-son-jardin/installation-de-framaestro/">Installer Framaestro</a> sur votre serveur (tuto)</li>
<li>Un service proposé dans le cadre de la campagne <a href="https://degooglisons-internet.org/">Dégooglisons Internet</a></li>
</ul>
<p><img src="media/d4130779.f411e4809021b786b7eb0c8956612e76" data-original-source="http://cdn.libravatar.org/avatar/f411e4809021b786b7eb0c8956612e76" alt="Gravatar de Framablog" class="gravatar" /><br/><i>Original post of <a href="https://framablog.org/2017/01/11/framaestro-menez-vos-reunions-et-collaborations-a-la-baguette/" title="Visit the source">Framablog</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>Framablog : <a href="">GitHub et les libristes&amp;nbsp;: un danger et un d&amp;eacute;fi&amp;nbsp;!</a> (28/01/2016)</li><li>Framablog : <a href="">Framacalc Reloaded&amp;nbsp;: la force de vos feuilles de calculs se r&amp;eacute;veille&amp;nbsp;!</a> (29/01/2016)</li><li>Framablog : <a href="">D&amp;eacute;googlisons saison 3&amp;nbsp;: 30 services alternatifs aux produits de Google &amp;amp; co</a> (03/10/2016)</li><li>Framablog : <a href="">Huit.re, Framapic, Framabin&amp;nbsp;: Framasoft met les bouch&amp;eacute;es triples.</a> (16/03/2015)</li><li>Framablog : <a href="">Framabee, le (m&amp;eacute;ta-)moteur qui va vous butiner le web&amp;nbsp;!</a> (05/05/2015)</li></ul></div></p>


feed_id: http://www.elementaryos-fr.org/redesign-bluetooth-panel/
title: elementary OS : Réagencement de l’interface Bluetooth
uri: elementary-OS-Réagencement-de-l-interface-Bluetooth
url: http://www.elementaryos-fr.org/redesign-bluetooth-panel/
content:
<p>Daniel a posté dernièrement un billet sur les différentes évolutions de l’interface de gestion des équipements Bluetooth.</p>
<p>Ces différentes captures montrent les différentes étapes &amp; réflexions que l’équipe a pu avoir pour faire évoluer cette interface qui sera disponible d’ici prochainement (mais sans date annoncée) :</p>
<a title="Évolution du Bluetooth" href="media/de47a8cb.20170111-b0.png" data-original-source="http://www.elementaryos-fr.org/wp-content/uploads/2017/01/20170111-b0.png" data-fancybox-group="fancybox_1892865095"><img alt="" width="150" src="media/de47a8cb.20170111-b0.png" data-original-source="http://www.elementaryos-fr.org/wp-content/uploads/2017/01/20170111-b0.png"></a>
<a title="Évolution du Bluetooth" href="media/15dd7ea2.20170111-b1.png" data-original-source="http://www.elementaryos-fr.org/wp-content/uploads/2017/01/20170111-b1.png" data-fancybox-group="fancybox_1462777309"><img alt="" width="150" src="media/15dd7ea2.20170111-b1.png" data-original-source="http://www.elementaryos-fr.org/wp-content/uploads/2017/01/20170111-b1.png"></a>
<a title="Évolution du Bluetooth" href="media/0f072d18.20170111-b2.png" data-original-source="http://www.elementaryos-fr.org/wp-content/uploads/2017/01/20170111-b2.png" data-fancybox-group="fancybox_83797264"><img alt="" width="150" src="media/0f072d18.20170111-b2.png" data-original-source="http://www.elementaryos-fr.org/wp-content/uploads/2017/01/20170111-b2.png"></a>
<a title="Évolution du Bluetooth" href="media/8abdc020.20170111-b3.png" data-original-source="http://www.elementaryos-fr.org/wp-content/uploads/2017/01/20170111-b3.png" data-fancybox-group="fancybox_1067876597"><img alt="" width="150" src="media/8abdc020.20170111-b3.png" data-original-source="http://www.elementaryos-fr.org/wp-content/uploads/2017/01/20170111-b3.png"></a>
<a title="Évolution du Bluetooth" href="media/2ef74fe3.20170111-b4.png" data-original-source="http://www.elementaryos-fr.org/wp-content/uploads/2017/01/20170111-b4.png" data-fancybox-group="fancybox_1619320153"><img alt="" width="150" src="media/2ef74fe3.20170111-b4.png" data-original-source="http://www.elementaryos-fr.org/wp-content/uploads/2017/01/20170111-b4.png"></a>
<a title="Évolution du Bluetooth" href="media/303b0c90.20170111-b5.png" data-original-source="http://www.elementaryos-fr.org/wp-content/uploads/2017/01/20170111-b5.png" data-fancybox-group="fancybox_526019849"><img alt="" width="150" src="media/303b0c90.20170111-b5.png" data-original-source="http://www.elementaryos-fr.org/wp-content/uploads/2017/01/20170111-b5.png"></a>
<a title="Évolution du Bluetooth" href="media/72d8c23f.20170111-b6.png" data-original-source="http://www.elementaryos-fr.org/wp-content/uploads/2017/01/20170111-b6.png" data-fancybox-group="fancybox_838657543"><img alt="" width="150" src="media/72d8c23f.20170111-b6.png" data-original-source="http://www.elementaryos-fr.org/wp-content/uploads/2017/01/20170111-b6.png"></a>
<p>Il est toujours intéressant de voir l’évolution du travail effectué par l’équipe elementary et c’est à travers ces différentes révisions que l’on peut s’apercevoir que le travail réalisé (minime soit-il) peut avoir un impact important sur la manière d’utiliser une application.</p>
<p>Concernant l’évolution du plug Bluetooth, Daniel nous apprend qu’il y a eu jusqu’à 21 révisions différentes (et il se peut que ce nombre se voit revu à la hausse).</p>
<p>Source : <a href="https://medium.com/elementaryos/redesigning-bluetooth-settings-ab30abca480f">https://medium.com/elementaryos/redesigning-bluetooth-settings-ab30abca480f</a></p>
<p>Le billet <a rel="nofollow" href="http://www.elementaryos-fr.org/redesign-bluetooth-panel/">Réagencement de l’interface Bluetooth</a> a été publié sur le site de la <a rel="nofollow" href="http://www.elementaryos-fr.org/">elementary OS - </a></p>
<p><img src="media/7e20f332.e363a9ed45733fa3aec7c3a0361380c6" data-original-source="http://cdn.libravatar.org/avatar/e363a9ed45733fa3aec7c3a0361380c6" alt="Gravatar de elementary OS" class="gravatar" /><br/><i>Original post of <a href="http://www.elementaryos-fr.org/redesign-bluetooth-panel/" title="Visit the source">elementary OS</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>


title: Renault : Élections pour le Conseil, FESCo et FAmSCo cette semaine
uri: Renault-Élections-pour-le-Conseil-FESCo-et-FAmSCo-cette-semaine
feed_id:
http://blog.fedora-fr.org/renault/post/%C3%89lections-pour-le-Conseil%2C-FESCo-et-FAmSCo-cette-semaine

url:
http://blog.fedora-fr.org/renault/post/%C3%89lections-pour-le-Conseil%2C-FESCo-et-FAmSCo-cette-semaine

content:
<p>Comme le projet Fedora est communautaire, une partie du collège des
organisations suivantes doit être renouvelée : Council, FESCo et FAmSCo. Et ce
sont les contributeurs qui décident. Chaque candidat a bien sûr un programme et
un passif qu'ils souhaitent mettre en avant durant leur mandat pour orienter le
projet Fedora dans certaines directions. Je vous invite à étudier <a href="https://communityblog.fedoraproject.org/category/elections/" hreflang="en">les
propositions des différents candidats pour cela.</a></p>
<p><img src="media/e312b7ab.Vote.png" data-original-source="http://blog.fedora-fr.org/public/renault/Vote.png" alt="J'ai voté" title="J'ai voté, déc. 2008"></p>
<p>Pour voter, il est nécessaire d'avoir un <a href="https://admin.fedoraproject.org/accounts/home" hreflang="fr">compte FAS
actif</a> et de faire son choix <a href="https://admin.fedoraproject.org/voting" hreflang="en">sur le site du
scrutin</a>. Vous avez jusqu'au mardi 17 janvier à minuit heure française pour
le faire. Donc n'attendez pas trop.</p>
<p>Je vais profiter de l'occasion pour résumer le rôle de chacun de ces comités
afin de clarifier l'aspect décisionnel du projet Fedora mais aussi visualiser
le caractère communautaire de celui-ci.</p>
<h3>Council</h3>
<p>Le <a href="https://fedoraproject.org/wiki/Council" hreflang="en">Council</a> est ce qu'on pourrait qualifier le grand conseil du projet.
C'est donc l'organe décisionnaire le plus élevé de Fedora. Le conseil définit
les objectifs à long terme du projet Fedora et participe à l'organisation de
celui-ci pour y parvenir. Cela se fait notamment par le biais de discussions
ouvertes et transparentes vis à vis de la communauté.</p>
<p>Mais il gère également l'aspect financier. Cela concerne notamment les
budgets alloués pour organiser les évènements, produire les goodies, ou des
initiatives permettant de remplir les dits objectifs. Ils ont enfin la charge
de régler les conflits personnels importants au sein du projet, tout comme les
aspects légaux liés à la marque Fedora.</p>
<p>Les rôles au sein du conseil sont complexes.</p>
<h4>Ceux avec droit de vote complet</h4>
<p>Tout d'abord il y a le <a href="https://fedoraproject.org/wiki/Project_Leader?rd=Fedora_Project_Leader" hreflang="en">FPL (Fedora Project Leader)</a> qui est le dirigeant du conseil
et <em>de facto</em> le représentant du projet. Son rôle est lié à la tenue de
l'agenda et des discussions du conseil, mais aussi de représenter le projet
Fedora dans son ensemble. Il doit également servir à dégager un consensus au
cours des débats. Ce rôle est tenu par un employé de Red Hat et est choisi avec
le consentement du conseil en question.</p>
<p>Il y a aussi le FCAIC (Fedora Community Action and Impact Coordinator) qui
fait le lien entre la communauté et l'entreprise Red Hat pour faciliter et
encourager la coopération. Comme pour le FPL, c'est un employé de Red Hat qui
occupe cette position avec l'approbation du conseil.</p>
<p>Il y a deux places destinées à la représentation technique et à la
représentation plus marketing / ambassadrice du projet. Ces deux places
découlent d'une nomination décidée au sein des organes dédiées à ces activités
: le FESCo et le FAmSCo. Ces places sont communautaires mais ce sont uniquement
ces comités qui décident des attributions.</p>
<p>Il reste deux places communautaires totalement ouvertes et dont tout le
monde peut soumettre sa candidature ou voter. Cela permet de représenter les
autres secteurs d'activité comme la traduction ou la documentation mais aussi
la voix communautaire au sens la plus large possible. C'est pour l'une de ces
places que le vote est ouvert cette semaine !</p>
<h4>Ceux avec le droit de vote partiel</h4>
<p>Un conseiller en diversité est nommé par le FPL avec le soutien du conseil
pour favoriser l'intégration au sein du projet des populations le plus souvent
discriminées. Son objectif est donc de déterminer les programmes pour régler
cette problématique et résoudre les conflits associés qui peuvent se
présenter.</p>
<p>Un gestionnaire du programme Fedora qui s'occupe du planning des différentes
versions de Fedora. Il s'assure du bon respect des délais, du suivi des
fonctionnalités et des cycles de tests. Il fait également office de secrétaire
du conseil. C'est un employé de Red Hat qui occupe ce rôle toujours avec
l'approbation du conseil.</p>
<h3>FESCo</h3>
<p>Le <a href="https://fedoraproject.org/wiki/Fedora_Engineering_Steering_Committee?rd=FESCo" hreflang="en">FESCo (Fedora Engineering Steering Committee)</a> est un conseil
entièrement composé de membres élus et totalement dévoués à l'aspect technique
du projet Fedora.</p>
<p>Ils vont donc traiter en particulier les points suivants :</p>
<ul><li>Les nouvelles fonctionnalités de la distribution ;</li>
<li>Les sponsors pour le rôle d'empaqueteur (ceux qui pourront donc superviser
un débutant) ;</li>
<li>La création et la gestion des <a href="https://fedoraproject.org/wiki/Category:SIGs?rd=SIGs" hreflang="en">SIGs
(Special Interest Group)</a> pour organiser des équipes autour de certaines
thématiques ;</li>
<li>La procédure d'empaquetage des paquets.</li>
</ul><p>Le responsable de ce groupe est tournant. Les 9 membres sont élus pour un
an, sachant que chaque élection renouvelle la moitié du collège.</p>
<h3>FAmSCo</h3>
<p>Le <a href="https://fedoraproject.org/wiki/Fedora_Ambassadors_Steering_Committee?rd=FAMSCO" hreflang="en">FAmSCo (Fedora Ambassadors Steering Committee)</a> est
l'équivalent du FESCo sur l'aspect plus humain du projet. Pendant que le FESCo
se préoccupera beaucoup plus des empaqueteurs, la préoccupation de ce conseil
est plutôt l'ambassadeur.</p>
<p>Voici un exemple des thèmes dont il a compétence :</p>
<ul><li>Gérer l'accroissement des ambassadeurs à travers le mentoring ;</li>
<li>Pousser à la création et au développement des communautés plus locales
comme la communauté française par exemple ;</li>
<li>Réaliser le suivi des évènements auxquels participent les ambassadeurs
;</li>
<li>Accorder les ressources aux différentes communautés ou activités, en
fonction des besoin et de l'intérêt ;</li>
<li>S'occuper des conflits entre ambassadeurs.</li>
</ul><p>Les 7 membres de cette équipe sont également entièrement élus avec une durée
de mandat d'un an. Chaque élection renouvelle le collège par moitié.</p>
<p><img src="media/d143d7a6.f792a7629fb4a46c01613eb1976730ef" data-original-source="http://cdn.libravatar.org/avatar/f792a7629fb4a46c01613eb1976730ef" alt="Gravatar de Renault" class="gravatar" /><br/><i>Original post of <a href="http://blog.fedora-fr.org/renault/post/%C3%89lections-pour-le-Conseil%2C-FESCo-et-FAmSCo-cette-semaine" title="Visit the source">Renault</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>


feed_id: http://blog.rom1v.com/2017/01/cpp-sans-pointeurs/
title: ®om : C++ sans *pointers
uri: om-C-sans-pointers
url: http://blog.rom1v.com/2017/01/cpp-sans-pointeurs/
content:
<p>Les <a href="https://fr.wikipedia.org/wiki/Pointeur_%28programmation%29">pointeurs</a> sont utilisés plus souvent que nécessaire en <a href="https://fr.wikipedia.org/wiki/C%2B%2B">C++</a>.</p>

<p>Je voudrais présenter ici comment caractériser les utilisations abusives et par
quoi les remplacer.</p>

<h2>Objectifs</h2>

<p>La décision d’utiliser des pointeurs dépend en grande partie de l’<a href="https://fr.wikipedia.org/wiki/Interface_de_programmation">API</a> des
objets utilisés.</p>

<p><em>API est à comprendre dans un sens très large : je considère que des classes
utilisées dans une autre partie d’une même application exposent une API.</em></p>

<p>L’objectif est donc de concevoir des API de manière à ce que leur utilisation ne
nécessite pas de manipuler de pointeurs, ni même si possible de <em>smart
pointers</em>.</p>

<p>Cela peut paraître surprenant, mais c’est en fait ainsi que vous utilisez les
classes de la <a href="https://fr.wikipedia.org/wiki/Standard_Template_Library">STL</a> ou de <a href="https://fr.wikipedia.org/wiki/Qt">Qt</a> : vos méthodes ne retournent jamais
un <em>raw pointer</em> ni un <em>smart pointer</em> vers une <em>string</em> nouvellement créée.</p>

<p>De manière générale, vous n’écririez pas ceci :</p>

<div><pre><code data-lang="cpp"><span>// STL version</span>
<span>string</span> <span>*</span><span>getName</span><span>()</span> <span>{</span>
    <span>return</span> <span>new</span> <span>string</span><span>(</span><span>"my name"</span><span>);</span>
<span>}</span>

<span>// Qt version</span>
<span>QString</span> <span>*</span><span>getName</span><span>()</span> <span>{</span>
    <span>return</span> <span>new</span> <span>QString</span><span>(</span><span>"my name"</span><span>);</span>
<span>}</span></code></pre></div>

<p>ni ceci :</p>

<div><pre><code data-lang="cpp"><span>// STL version</span>
<span>shared_ptr</span><span><</span><span>string</span><span>></span> <span>getName</span><span>()</span> <span>{</span>
    <span>return</span> <span>make_shared</span><span><</span><span>string</span><span>></span><span>(</span><span>"my name"</span><span>);</span>
<span>}</span>

<span>// Qt version</span>
<span>QSharedPointer</span><span><</span><span>QString</span><span>></span> <span>getName</span><span>()</span> <span>{</span>
    <span>return</span> <span>QSharedPointer</span><span><</span><span>QString</span><span>>::</span><span>create</span><span>(</span><span>"my name"</span><span>);</span>
<span>}</span></code></pre></div>

<p>À la place, vous écririez sûrement :</p>

<div><pre><code data-lang="cpp"><span>// STL version</span>
<span>string</span> <span>getName</span><span>()</span> <span>{</span>
    <span>return</span> <span>"my name"</span><span>;</span>
<span>}</span>

<span>// Qt versiont</span>
<span>QString</span> <span>getName</span><span>()</span> <span>{</span>
    <span>return</span> <span>"my name"</span><span>;</span>
<span>}</span></code></pre></div>

<p>Notre objectif est d’écrire des classes qui s’utiliseront de la même manière.</p>

<h2>Ownership</h2>

<p>Il faut distinguer deux types de <em>raw pointers</em> :</p>

<ol><li>ceux que l’on <em>détient</em> (<strong><em>owning</em></strong>), dont on est responsable de la durée
de vie ;</li>
  <li>ceux que l’on ne <em>détient</em> pas (<strong><em>non-owning</em></strong>).</li>
</ol><p>Le plus simple est de les comparer sur un exemple.</p>

<h3>Owning</h3>

<div><pre><code data-lang="cpp"><span>Info</span> <span>*</span><span>getInfo</span><span>()</span> <span>{</span>
    <span>return</span> <span>new</span> <span>Info</span><span>(</span><span>/* … */</span><span>);</span>
<span>}</span>

<span>void</span> <span>doSomething</span><span>()</span> <span>{</span>
    <span>Info</span> <span>*</span><span>info</span> <span>=</span> <span>getInfo</span><span>();</span>
    <span>// info must be deleted</span>
<span>}</span></code></pre></div>

<p>Ici, nous avons la responsabilité de supprimer <code>info</code> au bon moment.</p>

<p><strong>C’est ce type de pointeurs dont nous voulons nous débarrasser.</strong></p>

<h3>Non-owning</h3>

<div><pre><code data-lang="cpp"><span>void</span> <span>writeDataTo</span><span>(</span><span>QBuffer</span> <span>*</span><span>buffer</span><span>)</span> <span>{</span>
    <span>buffer</span><span>-></span><span>write</span><span>(</span><span>"c++"</span><span>);</span>
<span>}</span>

<span>void</span> <span>doSomething</span><span>()</span> <span>{</span>
    <span>QBuffer</span> <span>buffer</span><span>;</span>
    <span>writeDataTo</span><span>(</span><span>&amp;</span><span>buffer</span><span>);</span>
<span>}</span></code></pre></div>

<p>Ici, le pointeur permet juste de passer l’adresse de l’objet, mais la méthode
<code>writeDataTo(…)</code> ne doit pas gérer sa durée de vie : elle ne le <em>détient</em> donc
pas.</p>

<p><strong>Cet usage est tout-à-fait légitime, nous souhaitons le conserver.</strong></p>

<p>Pour savoir si un pointeur est <em>owning</em> ou non, il suffit de se poser la
question suivante : est-ce que lui affecter <code>nullptr</code> provoquerait une <a href="https://en.wikipedia.org/wiki/Memory_leak">fuite
mémoire</a> ?</p>

<h2>Pourquoi ?</h2>

<p>Voici quelques exemples illustrant pourquoi nous voulons éviter les <em>owning raw
pointers</em>.</p>

<h3>Fuite mémoire</h3>

<p>Il est facile d’oublier de supprimer un pointeur dans des cas particuliers.</p>

<p>Par exemple :</p>

<div><pre><code data-lang="cpp"><span>bool</span> <span>parse</span><span>()</span> <span>{</span>
    <span>Parser</span> <span>*</span><span>parser</span> <span>=</span> <span>createParser</span><span>();</span>
    <span>QFile</span> <span>file</span><span>(</span><span>"file.txt"</span><span>);</span>
    <span>if</span> <span>(</span><span>!</span><span>file</span><span>.</span><span>open</span><span>(</span><span>QIODevice</span><span>::</span><span>ReadOnly</span><span>))</span>
        <span>return</span> <span>false</span><span>;</span>
    <span>bool</span> <span>result</span> <span>=</span> <span>parser</span><span>.</span><span>parse</span><span>(</span><span>&amp;</span><span>file</span><span>);</span>
    <span>delete</span> <span>parser</span><span>;</span>
    <span>return</span> <span>result</span><span>;</span>
    <span>// parser leaked if open failed</span>
<span>}</span></code></pre></div>

<p>Ici, si l’ouverture du fichier a échoué, <code>parser</code> ne sera jamais libéré.</p>

<p>L’exemple suivant est encore plus significatif :</p>

<div><pre><code data-lang="cpp"><span>Result</span> <span>*</span><span>execute</span><span>()</span> <span>{</span>
    <span>// …</span>
    <span>return</span> <span>new</span> <span>Result</span><span>(</span><span>/* … */</span><span>);</span>
<span>}</span>

<span>void</span> <span>doWork</span><span>()</span> <span>{</span>
    <span>execute</span><span>();</span>
    <span>// result leaked</span>
<span>}</span></code></pre></div>

<p>Appeler une méthode sans s’occuper du résultat peut provoquer des fuites
mémoires.</p>

<h3>Double suppression</h3>

<p>Il est également possible, par inattention, de supprimer plusieurs fois le même
pointeur (ce qui entraîne un <a href="http://blog.rom1v.com/2014/10/comportement-indefini-et-optimisation/"><em>undefined behavior</em></a>).</p>

<p>Par exemple, si <code>device</code> fait partie de la liste <code>devices</code>, ce code le supprime
deux fois :</p>

<div><pre><code data-lang="cpp"><span>delete</span> <span>device</span><span>;</span>
<span>qDeleteAll</span><span>(</span><span>devices</span><span>);</span>
<span>// device is deleted twice</span></code></pre></div>

<h3>Utilisation après suppression</h3>

<p>L’utilisation d’un pointeur après sa suppression est également indéfinie.</p>

<p>Je vais prendre un exemple réel en Qt.</p>

<p>Supposons qu’une classe <code>DeviceMonitor</code> surveille le branchement de
périphériques, et crée pour chacun un objet <code>Device</code>.</p>

<p><a></a>
Lorsqu’un périphérique est débranché, un <a href="http://doc.qt.io/qt-5/signalsandslots.html">signal Qt</a> provoque
l’exécution du <em>slot</em> <code>DeviceMonitor::onDeviceLeft(Device *)</code>. Nous voulons
alors signaler au reste de l’application que le device est parti (<em>signal</em>
<code>DeviceMonitor::deviceLeft(Device *)</code>), puis supprimer l’object <code>device</code>
correspondant :</p>

<div><pre><code data-lang="cpp"><span>void</span> <span>DeviceMonitor</span><span>::</span><span>onDeviceLeft</span><span>(</span><span>Device</span> <span>*</span><span>device</span><span>)</span> <span>{</span>
    <span>emit</span> <span>deviceLeft</span><span>(</span><span>device</span><span>);</span>
    <span>delete</span> <span>device</span><span>;</span>
    <span>// slots may use the device after its deletion</span>
    <span>// device->deleteLater() not sufficient</span>
<span>}</span></code></pre></div>

<p>Mais c’est loin d’être trivial.</p>

<p>Si nous le supprimons immédiatement comme ceci, et qu’un <em>slot</em> est branché à
<code>DeviceMonitor::deviceLeft(Device *)</code> en
<a href="http://doc.qt.io/qt-5/qt.html#ConnectionType-enum"><code>Qt::QueuedConnection</code></a>, alors il est possible que le pointeur
soit déjà supprimé quand ce <em>slot</em> sera exécuté.</p>

<p>Un proverbe dit que quand ça crashe avec un <code>delete</code>, <em>“il faut appeller
<a href="http://doc.qt.io/qt-5/qobject.html#deleteLater"><code>deleteLater()</code></a> pour corriger le problème”</em> :</p>

<div><pre><code data-lang="cpp"><span>device</span><span>-></span><span>deleteLater</span><span>();</span></code></pre></div>

<p>Mais malheureusement, ici, c’est faux : si le <em>slot</em> branché au <em>signal</em>
<code>DeviceMonitor::deviceLeft(Device *)</code> est associé à un <a href="http://doc.qt.io/qt-5/qobject.html"><code>QObject</code></a>
vivant dans un autre <a href="http://doc.qt.io/qt-5/qobject.html#thread-affinity">thread</a>, rien ne garantit que son
exécution aura lieu avant la suppression du pointeur.</p>

<p>L’utilisation des <em>owning raw pointers</em> n’est donc pas seulement vulnérable aux
erreurs d’inattention (comme dans les exemples précédents) : dans des cas plus
complexes, il devient <strong>difficile de déterminer quand supprimer le pointeur</strong>.</p>

<h3>Responsabilité</h3>

<p>De manière plus générale, lorsque nous avons un pointeur, nous ne savons pas
forcément qui a la responsabilité de le supprimer, ni comment le supprimer :</p>

<div><pre><code data-lang="cpp"><span>Data</span> <span>*</span><span>data</span> <span>=</span> <span>getSomeData</span><span>();</span>
<span>delete</span> <span>data</span><span>;</span> <span>// ?</span>
<span>free</span><span>(</span><span>data</span><span>);</span> <span>// ?</span>
<span>custom_data_deleter</span><span>(</span><span>data</span><span>);</span> <span>// ?</span></code></pre></div>

<p><em>Qt fournit un mécanisme pour supprimer automatiquement les <code>QObject *</code> quand
leur parent est détruit. Cependant, cette fonctionnalité ne s’applique qu’aux
<a href="https://fr.wikipedia.org/wiki/Composition_%28programmation%29">relations de composition</a>.</em></p>

<p>Résumons les inconvénients des <em>owning raw pointeurs</em> :</p>

<ul><li>la gestion mémoire est manuelle ;</li>
  <li>leur utilisation est propice aux erreurs ;</li>
  <li>la responsabilité de suppression n’est pas apparente ;</li>
  <li>déterminer quand supprimer le pointeur peut être difficile.</li>
</ul><h2>Valeurs</h2>

<p>Laissons de côté les pointeurs quelques instants pour observer ce qu’il se passe
avec de simples <em>valeurs</em> (des <em>objets</em> plutôt que des <em>pointeurs vers des
objets</em>) :</p>

<div><pre><code data-lang="cpp"><span>struct</span> <span>Vector</span> <span>{</span>
    <span>int</span> <span>x</span><span>,</span> <span>y</span><span>,</span> <span>z</span><span>;</span>
<span>};</span>

<span>Vector</span> <span>transform</span><span>(</span><span>const</span> <span>Vector</span> <span>&amp;</span><span>v</span><span>)</span> <span>{</span>
    <span>return</span> <span>{</span> <span>-</span><span>v</span><span>.</span><span>x</span><span>,</span> <span>v</span><span>.</span><span>z</span><span>,</span> <span>v</span><span>.</span><span>y</span> <span>};</span>
<span>}</span>

<span>void</span> <span>compute</span><span>()</span> <span>{</span>
    <span>Vector</span> <span>vector</span> <span>=</span> <span>transform</span><span>({</span> <span>1</span><span>,</span> <span>2</span><span>,</span> <span>3</span> <span>});</span>
    <span>emit</span> <span>finished</span><span>(</span><span>transform</span><span>(</span><span>vector</span><span>));</span>
<span>}</span></code></pre></div>

<p>C’est plus simple : la gestion mémoire est automatique, et le code est plus sûr.
Par exemple, les fuites mémoire et les double suppressions sont impossibles.</p>

<p><strong>Ce sont des avantages dont nous souhaiterions bénéficier également pour les
pointeurs.</strong></p>

<h3>Privilégier les valeurs</h3>

<p>Dans les cas où les pointeurs sont utilisés uniquement pour éviter des copies
(et non pour partager des objets), il est préférable de <strong>passer les objets par
valeur</strong> à la place.</p>

<p>Par exemple, si vous avez une classe :</p>

<div><pre><code data-lang="cpp"><span>struct</span> <span>Result</span> <span>{</span>
    <span>QString</span> <span>message</span><span>;</span>
    <span>int</span> <span>code</span><span>;</span>
<span>};</span></code></pre></div>

<p>Évitez :</p>

<div><pre><code data-lang="cpp"><span>Result</span> <span>*</span><span>execute</span><span>()</span> <span>{</span>
    <span>// …</span>
    <span>return</span> <span>new</span> <span>Result</span> <span>{</span> <span>message</span><span>,</span> <span>code</span> <span>};</span>
<span>}</span></code></pre></div>

<p>Préférez :</p>

<div><pre><code data-lang="cpp"><span>Result</span> <span>execute</span><span>()</span> <span>{</span>
    <span>// …</span>
    <span>return</span> <span>{</span> <span>message</span><span>,</span> <span>code</span> <span>};</span>
<span>}</span></code></pre></div>

<p>Certes, dans certains cas, il est moins efficace de passer un objet par valeur
qu’à travers un pointeur (car il faut le copier).</p>

<p>Mais cette inefficacité est à relativiser.</p>

<p>D’abord parce quand certains cas <em>(quand l’objet est copié à partir d’une
<a href="http://thbecker.net/articles/rvalue_references/section_01.html">rvalue reference</a>)</em>, la copie sera remplacée par un <a href="http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html"><em>move</em></a>. Le <em>move</em>
d’un <a href="http://en.cppreference.com/w/cpp/container/vector"><code>vector</code></a> par exemple n’entraîne aucune copie (ni <em>move</em>) de ses
éléments.</p>

<p>Ensuite parce que les compilateurs optimisent le retour par valeur
(<a href="https://en.wikipedia.org/wiki/Return_value_optimization">RVO</a>), ce qui fait qu’en réalité dans les exemples ci-dessus, aucun <code>Result</code>
ni <code>Vector</code> n’est jamais copié ni <em>mové</em> : ils sont directement créés à
l’endroit où ils sont affectés <em>(sauf si vous compilez avec le paramètre
<code>-fno-elide-constructors</code>)</em>.</p>

<p>Mais évidemment, il y a des cas où nous ne pouvons pas simplement remplacer un
<em>pointeur</em> par une <em>valeur</em>, par exemple quand un même objet doit être partagé
entre différentes parties d’un programme.</p>

<p><strong>Nous voudrions les avantages des <em>valeurs</em> également pour ces cas-là.</strong> C’est
l’objectif de la suite du billet.</p>

<h2>Idiomes C++</h2>

<p>Pour y parvenir, nous avons besoin de faire un détour par quelques <em>idiomes</em>
couramment utilisés en C++.</p>

<p>Ils ont souvent un nom étrange. Par exemple :</p>

<ul><li><a href="https://en.wikipedia.org/wiki/Resource_acquisition_is_initialization">RAII</a> <em>(Resource Acquisition Is Initialization)</em></li>
  <li><a href="https://en.wikipedia.org/wiki/Opaque_pointer">PIMPL</a> <em>(Private IMPLementation)</em></li>
  <li><a href="https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern">CRTP</a> <em>(Curiously Recurring Template Pattern)</em></li>
  <li><a href="https://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error">SFINAE</a> <em>(Substitution Failure Is Not An Error)</em></li>
  <li><a href="https://en.wikipedia.org/wiki/Immediately-invoked_function_expression">IIFE</a> <em>(Immediately-Invoked Function Expression)</em></li>
</ul><p>Nous allons étudier les deux premiers.</p>

<h3>RAII</h3>

<p>Prenons un exemple simple :</p>

<div><pre><code data-lang="cpp"><span>bool</span> <span>submit</span><span>()</span> <span>{</span>
    <span>if</span> <span>(</span><span>!</span><span>validate</span><span>())</span>
        <span>return</span> <span>false</span><span>;</span>
    <span>return</span> <span>something</span><span>();</span>
<span>}</span></code></pre></div>

<p>Supposons que <code>validate()</code> et <code>something()</code> puissent lever une <a href="http://en.cppreference.com/w/cpp/language/exceptions">exception</a>.</p>

<p>Nous souhaitons rendre cette méthode <a href="https://fr.wikipedia.org/wiki/Thread_safety">thread-safe</a> grâce à un <a href="https://fr.wikipedia.org/wiki/Exclusion_mutuelle">mutex</a>
(<a href="http://en.cppreference.com/w/cpp/thread/mutex"><code>std::mutex</code></a> en STL ou <a href="http://doc.qt.io/qt-5/qmutex.html"><code>QMutex</code></a> en Qt).</p>

<p>Le <em>mutex</em> doit être déverrouillé à la fin de l’exécution de la méthode. Le
problème, c’est que cela peut se produire à différents endroits, donc nous
devons gérer tous les cas :</p>

<div><pre><code data-lang="cpp"><span>bool</span> <span>submit</span><span>()</span> <span>{</span>
    <span>mutex</span><span>.</span><span>lock</span><span>();</span>
    <span>try</span> <span>{</span>
        <span>if</span> <span>(</span><span>!</span><span>validate</span><span>())</span> <span>{</span>
            <span>mutex</span><span>.</span><span>unlock</span><span>();</span>
            <span>return</span> <span>false</span><span>;</span>
        <span>}</span>
        <span>bool</span> <span>result</span> <span>=</span> <span>something</span><span>();</span>
        <span>mutex</span><span>.</span><span>unlock</span><span>();</span>
        <span>return</span> <span>result</span><span>;</span>
    <span>}</span> <span>catch</span> <span>(...)</span> <span>{</span>
        <span>mutex</span><span>.</span><span>unlock</span><span>();</span>
        <span>throw</span><span>;</span>
    <span>}</span>
<span>}</span></code></pre></div>

<p>Le code est beaucoup plus complexe et propice aux erreurs.</p>

<p>Avec des classes utilisant RAII (<a href="http://en.cppreference.com/w/cpp/thread/lock_guard"><code>std::lock_guard</code></a> en STL ou
<a href="http://doc.qt.io/qt-5/qmutexlocker.html"><code>QMutexLocker</code></a> en Qt), c’est beaucoup plus simple :</p>

<div><pre><code data-lang="cpp"><span>bool</span> <span>submit</span><span>()</span> <span>{</span>
    <span>QMutexLocker</span> <span>locker</span><span>(</span><span>&amp;</span><span>mutex</span><span>);</span>
    <span>if</span> <span>(</span><span>!</span><span>validate</span><span>())</span>
        <span>return</span> <span>false</span><span>;</span>
    <span>return</span> <span>something</span><span>();</span>
<span>}</span></code></pre></div>

<p>En ajoutant une seule ligne, la méthode est devenue <em>thread-safe</em>.</p>

<p>Cette technique consiste à utiliser le cycle de vie d’un objet pour allouer une
ressource dans le constructeur (ici verrouiller le <em>mutex</em>) et la relâcher dans
le destructeur (ici le déverrouiller).</p>

<p>Voici une implémentation simplifiée possible de <a href="http://doc.qt.io/qt-5/qmutexlocker.html"><code>QMutexLocker</code></a> :</p>

<div><pre><code data-lang="cpp"><span>class</span> <span>QMutexLocker</span> <span>{</span>
    <span>QMutex</span> <span>*</span><span>mutex</span><span>;</span>
<span>public</span><span>:</span>
    <span>explicit</span> <span>QMutexLocker</span><span>(</span><span>QMutex</span> <span>*</span><span>mutex</span><span>)</span> <span>:</span> <span>mutex</span><span>(</span><span>mutex</span><span>)</span> <span>{</span>
        <span>mutex</span><span>-></span><span>lock</span><span>();</span>
    <span>}</span>
    <span>~</span><span>QMutexLocker</span><span>()</span> <span>{</span>
        <span>mutex</span><span>-></span><span>unlock</span><span>();</span>
    <span>}</span>
<span>};</span></code></pre></div>

<p>Comme l’objet est détruit lors de la sortie du <em>scope</em> de la méthode (que ce
soit par un <code>return</code> ou par une exception survenue n’importe où), le <em>mutex</em>
sera <strong>toujours</strong> déverrouillé.</p>

<p>Au passage, dans l’exemple ci-dessus, nous remarquons que la variable <code>locker</code>
n’est jamais utilisée. RAII complexifie donc la détection des <em>variables
inutilisées</em>, car le compilateur doit détecter les effets de bords. Mais il s’en
sort bien : ici, il n’émet pas de <em>warning</em>.</p>

<h2>Smart pointers</h2>

<p>Les <a href="https://en.wikipedia.org/wiki/Smart_pointer">smart pointers</a> utilisent RAII pour gérer automatiquement la durée de vie
des pointeurs. Il en existe plusieurs.</p>

<p>Dans la STL :</p>

<ul><li><a href="http://en.cppreference.com/w/cpp/memory/unique_ptr"><code>std::unique_ptr</code></a></li>
  <li><a href="http://en.cppreference.com/w/cpp/memory/shared_ptr"><code>std::shared_ptr</code></a></li>
  <li><a href="http://en.cppreference.com/w/cpp/memory/weak_ptr"><code>std::weak_ptr</code></a></li>
  <li><a href="http://en.cppreference.com/w/cpp/memory/auto_ptr"><code>std::auto_ptr</code></a> <em>(à bannir)</em></li>
</ul><p>Dans Qt :</p>

<ul><li><a href="http://doc.qt.io/qt-5/qsharedpointer.html"><code>QSharedPointer</code></a> (équivalent de <code>std::shared_ptr</code>)</li>
  <li><a href="http://doc.qt.io/qt-5/qweakpointer.html"><code>QWeakPointer</code></a> (équivalent de <code>std::weak_ptr</code>)</li>
  <li><a href="http://doc.qt.io/qt-5/qscopedpointer.html"><code>QScopedPointer</code></a> (ersatz de <code>std::unique_ptr</code>)</li>
  <li><a href="http://doc.qt.io/qt-5/qscopedarraypointer.html"><code>QScopedArrayPointer</code></a></li>
  <li><a href="http://doc.qt.io/qt-5/qpointer.html"><code>QPointer</code></a></li>
  <li><a href="http://doc.qt.io/qt-5/qshareddatapointer.html"><code>QSharedDataPointer</code></a></li>
  <li><a href="http://doc.qt.io/qt-5/qexplicitlyshareddatapointer.html"><code>QExplicitlySharedDataPointer</code></a></li>
</ul><h3>Scoped pointers</h3>

<p>Le <em>smart pointer</em> le plus simple est le <em>scoped pointer</em>. L’idée est vraiment
la même que <a href="http://doc.qt.io/qt-5/qmutexlocker.html"><code>QMutexLocker</code></a>, sauf qu’au lieu de vérouiller et
déverrouiller un <em>mutex</em>, il stocke un <em>raw pointer</em> et le supprime.</p>

<p>En plus de cela, comme tous les <em>smart pointers</em>, il <a href="https://en.wikipedia.org/wiki/Operator_overloading">redéfinit certains
opérateurs</a> pour pouvoir être utilisé comme un <em>raw
pointer</em>.</p>

<p>Par exemple, voici une implémentation simplifiée possible de
<a href="http://doc.qt.io/qt-5/qscopedpointer.html"><code>QScopedPointer</code></a> :</p>

<div><pre><code data-lang="cpp"><span>template</span> <span><</span><span>typename</span> <span>T</span><span>></span>
<span>class</span> <span>QScopedPointer</span> <span>{</span>
    <span>T</span> <span>*</span><span>p</span><span>;</span>
<span>public</span><span>:</span>
    <span>explicit</span> <span>QScopedPointer</span><span>(</span><span>T</span> <span>*</span><span>p</span><span>)</span> <span>:</span> <span>p</span><span>(</span><span>p</span><span>)</span> <span>{}</span>
    <span>~</span><span>QScopedPointer</span><span>()</span> <span>{</span> <span>delete</span> <span>p</span><span>;</span> <span>}</span>
    <span>T</span> <span>*</span><span>data</span><span>()</span> <span>const</span> <span>{</span> <span>return</span> <span>p</span><span>;</span> <span>}</span>
    <span>operator</span> <span>bool</span><span>()</span> <span>const</span> <span>{</span> <span>return</span> <span>p</span><span>;</span> <span>}</span>
    <span>T</span> <span>&amp;</span><span>operator</span><span>*</span><span>()</span> <span>const</span> <span>{</span> <span>return</span> <span>*</span><span>p</span><span>;</span> <span>}</span>
    <span>T</span> <span>*</span><span>operator</span><span>-></span><span>()</span> <span>const</span> <span>{</span> <span>return</span> <span>p</span><span>;</span> <span>}</span>
<span>private</span><span>:</span>
    <span>Q_DISABLE_COPY</span><span>(</span><span>QScopedPointer</span><span>)</span>
<span>};</span></code></pre></div>

<p>Et un exemple d’utilisation :</p>

<div><pre><code data-lang="cpp"><span>// bad design (owning raw pointer)</span>
<span>DeviceInfo</span> <span>*</span><span>Device</span><span>::</span><span>getDeviceInfo</span><span>()</span> <span>{</span>
    <span>return</span> <span>new</span> <span>DeviceInfo</span><span>(</span><span>/* … */</span><span>);</span>
<span>}</span>

<span>void</span> <span>Device</span><span>::</span><span>printInfo</span><span>()</span> <span>{</span>
    <span>QScopedPointer</span><span><</span><span>DeviceInfo</span><span>></span> <span>info</span><span>(</span><span>getDeviceInfo</span><span>());</span>
    <span>// used like a raw pointer</span>
    <span>if</span> <span>(</span><span>info</span><span>)</span> <span>{</span>
        <span>qDebug</span><span>()</span> <span><<</span> <span>info</span><span>-></span><span>getId</span><span>();</span>
        <span>DeviceInfo</span> <span>copy</span> <span>=</span> <span>*</span><span>info</span><span>;</span>
    <span>}</span>
    <span>// automatically deleted</span>
<span>}</span></code></pre></div>

<h3>Shared pointers</h3>

<p>Les <em>shared pointers</em> permettent de partager l’<em>ownership</em> (la responsabilité de
suppression) d’un pointeur.</p>

<p>Ils contiennent un <a href="https://en.wikipedia.org/wiki/Reference_counting">compteur de références</a>, indiquant le nombre
d’instances partageant le même pointeur. Lorsque ce compteur tombe à 0, le
pointeur est supprimé (il faut donc éviter les <a href="https://en.wikipedia.org/wiki/Reference_counting#Dealing_with_reference_cycles">cycles</a>).</p>

<p>En pratique, voici ce à quoi ressemblerait une liste de <code>Device</code>s <em>partagés</em> par
des <a href="http://doc.qt.io/qt-5/qsharedpointer.html"><code>QSharedPointer</code></a>s :</p>

<div><pre><code data-lang="cpp"><span>class</span> <span>DeviceList</span> <span>{</span>
    <span>QList</span><span><</span><span>QSharedPointer</span><span><</span><span>Device</span><span>>></span> <span>devices</span><span>;</span>
<span>public</span><span>:</span>
    <span>QSharedPointer</span><span><</span><span>Device</span><span>></span> <span>getDevice</span><span>(</span><span>int</span> <span>index</span><span>)</span> <span>const</span><span>;</span>
    <span>void</span> <span>add</span><span>(</span><span>const</span> <span>QSharedPointer</span><span><</span><span>Device</span><span>></span> <span>&amp;</span><span>device</span><span>);</span>
    <span>void</span> <span>remove</span><span>(</span><span>Device</span> <span>*</span><span>device</span><span>);</span>
<span>};</span>
<span>// devices are automatically deleted when necessary</span></code></pre></div>

<p>Le <em>partage</em> d’un pointeur découle toujours de la copie d’un <em>shared pointer</em>.
C’est la raison pour laquelle <code>getDevice(…)</code> et <code>add(…)</code> manipulent un
<a href="http://doc.qt.io/qt-5/qsharedpointer.html"><code>QSharedPointer</code></a>.</p>

<p>Le piège à éviter est de créér plusieurs <em>smart pointers</em> indépendants sur le
même <em>raw pointer</em>. Dans ce cas, il y aurait deux <em>refcounts</em> à 1 plutôt qu’un
<em>refcount</em> à 2, et le pointeur serait supprimé dès la destruction du premier
<em>shared pointer</em>, laissant l’autre <a href="https://fr.wikipedia.org/wiki/Dangling_pointer"><em>pendouillant</em></a>.</p>

<p><em>Petite parenthèse : la signature des méthodes <code>add</code> et <code>remove</code> sont
différentes car une suppression ne nécessite pas de <a href="https://www.youtube.com/watch?v=xnqTKD8uD64&amp;t=18m38s">manipuler la durée de
vie</a> du <code>Device</code> passé en paramètre.</em></p>

<blockquote>
  <p>Refcounted smart pointers are about managing te owned object’s lifetime.</p>

  <p>Copy/assign one only when you intend to manipulate the owned object’s
lifetime.</p>
</blockquote>

<p>Au passage, si en Qt vous passez vos objets de la couche C++ à la couche
<a href="https://en.wikipedia.org/wiki/QML">QML</a>, il faut aussi passer les <em>shared pointers</em> afin de ne pas casser le
partage, ce qui implique d’enregistrer le type :</p>

<div><pre><code data-lang="cpp"><span>void</span> <span>registerQml</span><span>()</span> <span>{</span>
    <span>qRegisterMetaType</span><span><</span><span>QSharedPointer</span><span><</span><span>Device</span><span>>></span><span>();</span>
<span>}</span></code></pre></div>

<p>Listons donc les avantages des <em>shared pointers</em> :</p>

<ul><li>la gestion mémoire est automatique ;</li>
  <li>l’<em>ownership</em> est géré automatiquement ;</li>
  <li>l’utilisation est moins propice aux erreurs (à part la possibilité de créer
des <em>smart pointers</em> indépendants sur le même <em>raw pointer</em>) ;</li>
</ul><p>Cependant, si la gestion mémoire est <strong>automatique</strong>, elle n’est pas
<strong>transparente</strong> : elle nécessite de manipuler explicitement des
<code>QSharedPointer</code>, ce qui est verbeux.</p>

<p>Il est certes possible d’utiliser un <a href="http://en.cppreference.com/w/cpp/language/type_alias">alias</a> (<a href="https://en.wikipedia.org/wiki/Typedef">typedef</a>) pour atténuer la
verbosité :</p>

<div><pre><code data-lang="cpp"><span>using</span> <span>DevicePtr</span> <span>=</span> <span>QSharedPointer</span><span><</span><span>Device</span><span>></span><span>;</span>

<span>class</span> <span>DeviceList</span> <span>{</span>
    <span>QList</span><span><</span><span>DevicePtr</span><span>></span> <span>devices</span><span>;</span>
<span>public</span><span>:</span>
    <span>DevicePtr</span> <span>getDevice</span><span>(</span><span>int</span> <span>index</span><span>)</span> <span>const</span><span>;</span>
    <span>void</span> <span>add</span><span>(</span><span>const</span> <span>DevicePtr</span> <span>&amp;</span><span>device</span><span>);</span>
    <span>void</span> <span>remove</span><span>(</span><span>Device</span> <span>*</span><span>device</span><span>);</span>
<span>};</span></code></pre></div>

<p>Mais quoi qu’il en soit, <strong>cela reste plus complexe que des <em>valeurs</em></strong>.</p>

<p>Pour aller plus loin, nous allons devoir faire un détour inattendu, par un
<em>idiome</em> qui n’a a priori rien à voir.</p>

<h2>PImpl</h2>

<p><a href="https://en.wikipedia.org/wiki/Opaque_pointer">PImpl</a> sert à réduire les dépendances de compilation.</p>

<blockquote>
  <p>Opaque pointers are a way to hide the implementation details of an interface
from ordinary clients, so that the implementation may be changed without the
need to recompile the modules using it.</p>
</blockquote>

<p>Prenons la classe <code>Person</code> suivante (<code>person.h</code>) :</p>

<div><pre><code data-lang="cpp"><span>class</span> <span>Person</span> <span>{</span>
    <span>QString</span> <span>name</span><span>;</span>
    <span>long</span> <span>birth</span><span>;</span>
<span>public</span><span>:</span>
    <span>Person</span><span>(</span><span>const</span> <span>QString</span> <span>&amp;</span><span>name</span><span>,</span> <span>long</span> <span>birth</span><span>);</span>
    <span>QString</span> <span>getName</span><span>()</span> <span>const</span><span>;</span>
    <span>void</span> <span>setName</span><span>(</span><span>const</span> <span>QString</span> <span>&amp;</span><span>name</span><span>);</span>
    <span>int</span> <span>getAge</span><span>()</span> <span>const</span><span>;</span>
<span>private</span><span>:</span>
    <span>static</span> <span>long</span> <span>countYears</span><span>(</span><span>long</span> <span>from</span><span>,</span> <span>long</span> <span>to</span><span>);</span>
<span>};</span></code></pre></div>

<p>Elle contient juste un <em>nom</em> et un <em>âge</em>. Elle définit par ailleurs une méthode
privée, <code>countYears(…)</code>, qu’on imagine appelée dans <code>getAge()</code>.</p>

<p>Chaque classe désirant utiliser la classe <code>Person</code> devra l’inclure :</p>

<div><pre><code data-lang="cpp"><span>#include "person.h"</span></code></pre></div>

<p>Par conséquent, à chaque modification de ces parties privées (qui sont pourtant
que des détails d’implémentation), <strong>toutes les classes incluant <code>person.h</code>
devront être recompilées</strong>.</p>

<p>C’est ce que <em>PImpl</em> permet d’éviter, en séparant la classe en deux :</p>

<ul><li>une interface publique ;</li>
  <li>une implémentation privée.</li>
</ul><p>Concrètement, la classe <code>Person</code> précédente est la partie privée. Renommons-la :</p>

<div><pre><code data-lang="cpp"><span>class</span> <span>PersonPrivate</span> <span>{</span>
    <span>QString</span> <span>name</span><span>;</span>
    <span>long</span> <span>birth</span><span>;</span>
<span>public</span><span>:</span>
    <span>PersonPrivate</span><span>(</span><span>const</span> <span>QString</span> <span>&amp;</span><span>name</span><span>,</span> <span>long</span> <span>birth</span><span>);</span>
    <span>QString</span> <span>getName</span><span>()</span> <span>const</span><span>;</span>
    <span>void</span> <span>setName</span><span>(</span><span>const</span> <span>QString</span> <span>&amp;</span><span>name</span><span>);</span>
    <span>int</span> <span>getAge</span><span>()</span> <span>const</span><span>;</span>
<span>private</span><span>:</span>
    <span>static</span> <span>long</span> <span>countYears</span><span>(</span><span>long</span> <span>from</span><span>,</span> <span>long</span> <span>to</span><span>);</span>
<span>};</span></code></pre></div>

<p>Créons la partie publique, définissant l’interface souhaitée :</p>

<div><pre><code data-lang="cpp"><span>class</span> <span>PersonPrivate</span><span>;</span> <span>// forward declaration</span>
<span>class</span> <span>Person</span> <span>{</span>
    <span>PersonPrivate</span> <span>*</span><span>d</span><span>;</span>
<span>public</span><span>:</span>
    <span>Person</span><span>(</span><span>const</span> <span>QString</span> <span>&amp;</span><span>name</span><span>,</span> <span>long</span> <span>birth</span><span>);</span>
    <span>Person</span><span>(</span><span>const</span> <span>Person</span> <span>&amp;</span><span>other</span><span>);</span>
    <span>~</span><span>Person</span><span>();</span>
    <span>Person</span> <span>&amp;</span><span>operator</span><span>=</span><span>(</span><span>const</span> <span>Person</span> <span>&amp;</span><span>other</span><span>);</span>
    <span>QString</span> <span>getName</span><span>()</span> <span>const</span><span>;</span>
    <span>void</span> <span>setName</span><span>(</span><span>const</span> <span>QString</span> <span>&amp;</span><span>name</span><span>);</span>
    <span>int</span> <span>getAge</span><span>()</span> <span>const</span><span>;</span>
<span>};</span></code></pre></div>

<p>Elle contient un pointeur vers <code>PersonPrivate</code>, et lui délègue tous les appels.</p>

<p>Évidemment, <code>Person</code> ne doit pas inclure <code>PersonPrivate</code>, sinon nous aurions les
mêmes dépendances de compilation, et nous n’aurions rien résolu. Il faut
utiliser à la place une <a href="https://en.wikipedia.org/wiki/Forward_declaration"><em>forward declaration</em></a>.</p>

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

<div><pre><code data-lang="cpp"><span>Person</span><span>::</span><span>Person</span><span>(</span><span>const</span> <span>QString</span> <span>&amp;</span><span>name</span><span>,</span> <span>long</span> <span>birth</span><span>)</span> <span>:</span>
        <span>d</span><span>(</span><span>new</span> <span>PersonPrivate</span><span>(</span><span>name</span><span>,</span> <span>birth</span><span>))</span> <span>{}</span>

<span>Person</span><span>::</span><span>Person</span><span>(</span><span>const</span> <span>Person</span> <span>&amp;</span><span>other</span><span>)</span> <span>:</span>
        <span>d</span><span>(</span><span>new</span> <span>PersonPrivate</span><span>(</span><span>*</span><span>other</span><span>.</span><span>d</span><span>))</span> <span>{}</span>

<span>Person</span><span>::~</span><span>Person</span><span>()</span> <span>{</span> <span>delete</span> <span>d</span><span>;</span> <span>}</span>

<span>Person</span> <span>&amp;</span><span>Person</span><span>::</span><span>operator</span><span>=</span><span>(</span><span>const</span> <span>Person</span> <span>&amp;</span><span>other</span><span>)</span> <span>{</span>
    <span>*</span><span>d</span> <span>=</span> <span>*</span><span>other</span><span>.</span><span>d</span><span>;</span>
    <span>return</span> <span>*</span><span>this</span><span>;</span>
<span>}</span>

<span>QString</span> <span>Person</span><span>::</span><span>getName</span><span>()</span> <span>const</span> <span>{</span>
    <span>return</span> <span>d</span><span>-></span><span>getName</span><span>();</span>
<span>}</span>

<span>void</span> <span>Person</span><span>::</span><span>setName</span><span>(</span><span>const</span> <span>QString</span> <span>&amp;</span><span>name</span><span>)</span> <span>{</span>
    <span>d</span><span>-></span><span>setName</span><span>(</span><span>name</span><span>);</span>
<span>}</span>

<span>int</span> <span>Person</span><span>::</span><span>getAge</span><span>()</span> <span>const</span> <span>{</span>
    <span>return</span> <span>d</span><span>-></span><span>getAge</span><span>();</span>
<span>}</span></code></pre></div>

<p>Le pointeur vers la classe privée est souvent nommé <code>d</code> car il s’agit d’un
<a href="https://wiki.qt.io/D-Pointer">d-pointer</a>.</p>

<p>Donc comme prévu, tout cela n’a rien à voir avec notre objectif d’éviter
d’utiliser des pointeurs.</p>

<h2>Partage</h2>

<p>Mais en fait, si. <em>PImpl</em> permet de séparer les classes manipulées explicitement
de l’objet réellement modifié :</p>

<p><img src="media/a9496510.pimpl.png" data-original-source="http://blog.rom1v.com/assets/nopointers/pimpl.png" alt="graph_pimpl"></p>

<p>Il y a une relation 1-1 entre la classe publique et la classe privée
correspondante. Mais nous pouvons imaginer d’autres <a href="https://fr.wikipedia.org/wiki/Cardinalit%C3%A9_%28programmation%29">cardinalités</a>.</p>

<p>Par exemple, Qt <a href="http://doc.qt.io/qt-5/implicit-sharing.html">partage implicitement</a> les parties privées
d’un grand nombre de <a href="http://doc.qt.io/qt-5/implicit-sharing.html#list-of-classes">classes</a>. Il ne les copie que
lors d’une écriture (<a href="https://fr.wikipedia.org/wiki/Copy-on-write">CoW</a>) :</p>

<p><img src="media/89d2d335.pimpl_shareddata.png" data-original-source="http://blog.rom1v.com/assets/nopointers/pimpl_shareddata.png" alt="graph_pimpl_shareddata"></p>

<p>Par exemple, lorsqu’une <a href="http://doc.qt.io/qt-5/qstring.html"><code>QString</code></a> est copiée, la même zone mémoire
sera utilisée pour les différentes instances, jusqu’à ce qu’une modification
survienne.</p>

<p>Cependant, il ne s’agit que d’un détail d’implémentation utilisé pour améliorer
les performances. Du point de vue utilisateur, tout se passe comme si les
données étaient réellement copiées :</p>

<div><pre><code data-lang="cpp"><span>QString</span> <span>s1</span> <span>=</span> <span>"ABC"</span><span>;</span>
<span>QString</span> <span>s2</span> <span>=</span> <span>s1</span><span>;</span>
<span>s2</span><span>.</span><span>append</span><span>(</span><span>"DEF"</span><span>);</span>
<span>Q_ASSERT</span><span>(</span><span>s2</span> <span>==</span> <span>"ABCDEF"</span><span>);</span>
<span>Q_ASSERT</span><span>(</span><span>s1</span> <span>==</span> <span>"ABC"</span><span>);</span></code></pre></div>

<p>En d’autres termes, <strong>les classes publiques ci-dessus ont une <a href="https://en.wikipedia.org/wiki/Value_semantics">sémantique de
valeur</a></strong>.</p>

<h3>Resource handles</h3>

<p>À la place, nous pouvons décider de partager inconditionnellement la partie
privée, y compris après une écriture :</p>

<p><img src="media/e1de15fc.pimpl_shared.png" data-original-source="http://blog.rom1v.com/assets/nopointers/pimpl_shared.png" alt="graph_pimpl_shared"></p>

<p>Dans ce cas, <strong>la classe publique a sémantique d’entité</strong>. Elle est qualifiée de
<em>resource handle</em>.</p>

<p>C’est bien sûr le cas des <em>smart pointers</em> :</p>

<div><pre><code data-lang="cpp"><span>QSharedPointer</span><span><</span><span>Person</span><span>></span> <span>p1</span><span>(</span><span>new</span> <span>Person</span><span>(</span><span>"ABC"</span><span>,</span> <span>42</span><span>));</span>
<span>QSharedPointer</span><span><</span><span>person</span><span>></span> <span>p2</span> <span>=</span> <span>p1</span><span>;</span>
<span>p2</span><span>-></span><span>setName</span><span>(</span><span>"DEF"</span><span>);</span>
<span>Q_ASSERT</span><span>(</span><span>p1</span><span>.</span><span>getName</span><span>()</span> <span>==</span> <span>"DEF"</span><span>);</span>
<span>Q_ASSERT</span><span>(</span><span>p2</span><span>.</span><span>getName</span><span>()</span> <span>==</span> <span>"DEF"</span><span>);</span></code></pre></div>

<p>Mais aussi d’autres classes, comme l’<a href="http://doc.qt.io/qt-5/qdomdocument.html#details">API Dom de Qt</a> :</p>

<div><pre><code data-lang="cpp"><span>void</span> <span>addItem</span><span>(</span><span>const</span> <span>QDomDocument</span> <span>&amp;</span><span>document</span><span>,</span> <span>const</span> <span>QDomElement</span> <span>&amp;</span><span>element</span><span>)</span> <span>{</span>
    <span>QDomElement</span> <span>root</span> <span>=</span> <span>document</span><span>.</span><span>documentElement</span><span>();</span>
    <span>root</span><span>.</span><span>insertAfter</span><span>(</span><span>element</span><span>,</span> <span>{});</span>
    <span>// the document is modified</span>
<span>}</span></code></pre></div>

<h3>PImpl avec des <em>smart pointers</em></h3>

<p>Tout-à-l’heure, j’ai présenté <em>PImpl</em> en utilisant un <em>owning raw pointer</em> :</p>

<div><pre><code data-lang="cpp"><span>class</span> <span>PersonPrivate</span><span>;</span> <span>// forward declaration</span>
<span>class</span> <span>Person</span> <span>{</span>
    <span>// this is a raw pointer!</span>
    <span>PersonPrivate</span> <span>*</span><span>d</span><span>;</span>
<span>public</span><span>:</span>
    <span>// …</span>
<span>};</span></code></pre></div>

<p>Mais en fait, à chaque type de relation correspond un type de <em>smart pointer</em>
directement utilisable pour <em>PImpl</em>.</p>

<p>Pour une relation 1-1 classique :</p>

<ul><li><a href="http://en.cppreference.com/w/cpp/memory/unique_ptr"><code>std::unique_ptr</code></a></li>
  <li><a href="http://doc.qt.io/qt-5/qscopedpointer.html"><code>QScopedPointer</code></a></li>
</ul><p>Pour une relation 1-N à sémantique de valeur (CoW) :</p>

<ul><li><a href="http://doc.qt.io/qt-5/qshareddatapointer.html"><code>QSharedDataPointer</code></a></li>
</ul><p>Pour une relation 1-N à sémantique d’entité :</p>

<ul><li><a href="http://en.cppreference.com/w/cpp/memory/shared_ptr"><code>std::shared_ptr</code></a></li>
  <li><a href="http://doc.qt.io/qt-5/qsharedpointer.html"><code>QSharedPointer</code></a></li>
</ul><p>Par exemple, donnons à notre classe <code>Person</code> une sémantique d’entité :</p>

<div><pre><code data-lang="cpp"><span>class</span> <span>PersonPrivate</span><span>;</span> <span>// forward declaration</span>
<span>class</span> <span>Person</span> <span>{</span>
    <span>QSharedPointer</span><span><</span><span>PersonPrivate</span><span>></span> <span>d</span><span>;</span>
<span>public</span><span>:</span>
    <span>Person</span><span>()</span> <span>=</span> <span>default</span><span>;</span> <span>// a "null" person</span>
    <span>Person</span><span>(</span><span>const</span> <span>QString</span> <span>&amp;</span><span>name</span><span>,</span> <span>long</span> <span>birth</span><span>);</span>
    <span>QString</span> <span>getName</span><span>()</span> <span>const</span><span>;</span>
    <span>// shared handles should expose const methods</span>
    <span>void</span> <span>setName</span><span>(</span><span>const</span> <span>QString</span> <span>&amp;</span><span>name</span><span>)</span> <span>const</span><span>;</span>
    <span>int</span> <span>getAge</span><span>()</span> <span>const</span><span>;</span>
    <span>operator</span> <span>bool</span><span>()</span> <span>const</span> <span>{</span> <span>return</span> <span>d</span><span>;</span> <span>}</span>
<span>};</span></code></pre></div>

<p><code>Person</code> se comporte maintenant <em>comme un pointeur</em>.</p>

<div><pre><code data-lang="cpp"><span>Person</span> <span>p1</span><span>(</span><span>"ABC"</span><span>,</span> <span>42</span><span>);</span>
<span>Person</span> <span>p2</span> <span>=</span> <span>p1</span><span>;</span>
<span>p2</span><span>.</span><span>setName</span><span>(</span><span>"DEF"</span><span>);</span>
<span>Q_ASSERT</span><span>(</span><span>p1</span><span>.</span><span>getName</span><span>()</span> <span>==</span> <span>"DEF"</span><span>);</span>
<span>Q_ASSERT</span><span>(</span><span>p2</span><span>.</span><span>getName</span><span>()</span> <span>==</span> <span>"DEF"</span><span>);</span></code></pre></div>

<p><code>p1</code> et <code>p2</code> sont alors des <em>resource handles</em> vers <code>PersonPrivate</code> :</p>

<p><img src="media/70faab60.shared_person.png" data-original-source="http://blog.rom1v.com/assets/nopointers/shared_person.png" alt="graph_shared_person"></p>

<p>Évidemment, ce n’est pas approprié pour la classe <code>Person</code>, car le comportement
est trop inattendu.</p>

<p>Mais je vais présenter un cas réel où ce <em>design</em> est approprié.</p>

<h2>En pratique</h2>

<p><a></a>
Pour l’entreprise dans laquelle je suis salarié, j’ai implémenté une
fonctionnalité permettant d’utiliser une souris USB branchée sur un PC pour
contrôler un téléphone Android connecté en USB.</p>

<p>Concrètement, cela consiste à tranférer (grâce à <a href="http://libusb.info/"><code>libusb</code></a>), à partir
du PC, les événements <a href="https://en.wikipedia.org/wiki/Human_interface_device">HID</a> reçus de la souris vers le téléphone Android.</p>

<p>J’ai donc (entre autres) créé des <em>resources handles</em> <code>UsbDevice</code> et
<code>UsbDeviceHandle</code> qui wrappent les structures C <a href="http://libusb.sourceforge.net/api-1.0/group__dev.html#ga77eedd00d01eb7569b880e861a971c2b"><code>libusb_device</code></a>
et <a href="http://libusb.sourceforge.net/api-1.0/group__dev.html#ga7df95821d20d27b5597f1d783749d6a4"><code>libusb_device_handle</code></a>, suivant les principes
détaillés dans ce billet.</p>

<p>Leur utilisation illustre bien, d’après moi, les bénéfices d’une telle
conception.</p>

<div><pre><code data-lang="cpp"><span>class</span> <span>UsbDeviceMonitor</span> <span>{</span>
    <span>QList</span><span><</span><span>UsbDevice</span><span>></span> <span>devices</span><span>;</span>
<span>public</span><span>:</span>
    <span>// …</span>
    <span>UsbDevice</span> <span>getAnyDroid</span><span>()</span> <span>const</span><span>;</span>
    <span>UsbDevice</span> <span>getAnyMouse</span><span>()</span> <span>const</span><span>;</span>
<span>signals</span><span>:</span>
    <span>void</span> <span>deviceArrived</span><span>(</span><span>const</span> <span>UsbDevice</span> <span>&amp;</span><span>device</span><span>);</span>
    <span>void</span> <span>deviceLeft</span><span>(</span><span>const</span> <span>UsbDevice</span> <span>&amp;</span><span>device</span><span>);</span>
<span>};</span></code></pre></div>

<p><code>UsbDevice</code> peut être retourné par valeur, et passé en paramètre d’un <em>signal</em>
par <em>const reference</em> (exactement comme nous le ferions avec un
<a href="http://doc.qt.io/qt-5/qstring.html"><code>QString</code></a>).</p>

<div><pre><code data-lang="cpp"><span>UsbDevice</span> <span>UsbDeviceMonitor</span><span>::</span><span>getAnyMouse</span><span>()</span> <span>const</span> <span>{</span>
    <span>for</span> <span>(</span><span>const</span> <span>UsbDevice</span> <span>&amp;</span><span>device</span> <span>:</span> <span>devices</span><span>)</span>
        <span>if</span> <span>(</span><span>device</span><span>.</span><span>isMouse</span><span>())</span>
            <span>return</span> <span>device</span><span>;</span>
    <span>return</span> <span>{};</span>
<span>}</span></code></pre></div>

<p>Si une souris est trouvé dans la liste, on la retourne simplement ; sinon, on
retourne un <code>UsbDevice</code> “<a href="http://doc.qt.io/qt-5/qstring.html#isNull"><em>null</em></a>”.</p>

<div><pre><code data-lang="cpp"><span>void</span> <span>UsbDeviceMonitor</span><span>::</span><span>onHotplugDeviceArrived</span><span>(</span><span>const</span> <span>UsbDevice</span> <span>&amp;</span><span>device</span><span>)</span> <span>{</span>
    <span>devices</span><span>.</span><span>append</span><span>(</span><span>device</span><span>);</span>
    <span>emit</span> <span>deviceArrived</span><span>(</span><span>device</span><span>);</span>
<span>}</span></code></pre></div>

<p>La gestion mémoire est totalement automatique et transparente. Les <a href="http://blog.rom1v.com/#suppression-complexe">problèmes
présentés</a> sont résolus.</p>

<div><pre><code data-lang="cpp"><span>void</span> <span>registerQml</span><span>()</span> <span>{</span>
    <span>qRegisterMetaType</span><span><</span><span>UsbDevice</span><span>></span><span>();</span>
<span>}</span></code></pre></div>

<div><pre><code data-lang="javascript"><span>// QML</span>
<span>function</span> <span>startForwarding</span><span>()</span> <span>{</span>
    <span>var</span> <span>mouse</span> <span>=</span> <span>usbDeviceMonitor</span><span>.</span><span>getAnyMouse</span><span>()</span>
    <span>var</span> <span>droid</span> <span>=</span> <span>usbDeviceMonitor</span><span>.</span><span>getAnyDroid</span><span>()</span>
    <span>worker</span> <span>=</span> <span>hid</span><span>.</span><span>forward</span><span>(</span><span>mouse</span><span>,</span> <span>droid</span><span>)</span>
<span>}</span></code></pre></div>

<p><code>UsbDevice</code> peut naviguer entre la couche C++ et QML.</p>

<div><pre><code data-lang="cpp"><span>bool</span> <span>HID</span><span>::</span><span>forward</span><span>(</span><span>const</span> <span>UsbDevice</span> <span>&amp;</span><span>mouse</span><span>,</span> <span>const</span> <span>UsbDevice</span> <span>&amp;</span><span>droid</span><span>)</span> <span>{</span>
    <span>UsbDeviceHandle</span> <span>droidHandle</span> <span>=</span> <span>droid</span><span>.</span><span>open</span><span>();</span>
    <span>if</span> <span>(</span><span>!</span><span>droidHandle</span><span>)</span>
        <span>return</span> <span>false</span><span>;</span>
    <span>UsbDeviceHandle</span> <span>mouseHandle</span> <span>=</span> <span>mouse</span><span>.</span><span>open</span><span>();</span>
    <span>if</span> <span>(</span><span>!</span><span>mouseHandle</span><span>)</span>
        <span>return</span> <span>false</span><span>;</span>
    <span>// …</span>
<span>}</span></code></pre></div>

<p>Grâce à RAII, les connexions (<code>UsbDeviceHandle</code>) sont fermées automatiquement.</p>

<p>En particulier, si la connexion à la souris échoue, la connexion au téléphone
Android est automatiquement fermée.</p>

<h2>Résultat</h2>

<p>Dans ces différents exemples, <code>new</code> et <code>delete</code> ne sont jamais utilisés, et
<strong>par construction, la mémoire sera correctement gérée</strong>. Ou plus précisément,
si un problème de gestion mémoire existe, il se situera dans l’implémentation de
la classe elle-même, et non partout où elle est utilisée.</p>

<p>Ainsi, nous manipulons des <em>handles</em> se comportant comme des <em>pointeurs</em>, ayant
les mêmes avantages que les <em>valeurs</em> :</p>

<ul><li>gestion mémoire <strong>automatique</strong> et <strong>transparente</strong> ;</li>
  <li>simple ;</li>
  <li>efficace ;</li>
  <li>sûr et robuste.</li>
</ul><p>Ils peuvent par contre présenter quelques limitations.</p>

<p>Par exemple, ils sont incompatibles avec <a href="http://doc.qt.io/qt-5/qobject.html"><code>QObject</code></a>. En effet,
techniquement, la classe d’un <em>resource handle</em> doit pouvoir être copiée (pour
supporter le passage par <em>valeur</em>), alors qu’un <a href="http://doc.qt.io/qt-5/qobject.html"><code>QObject</code></a> <a href="http://doc.qt.io/qt-5/object.html#identity-vs-value">n’est pas
copiable</a> :</p>

<blockquote>
  <p><code>QObject</code>s are <em>identities</em>, not <em>values</em>.</p>
</blockquote>

<p>Très concrètement, cela implique que <code>UsbDevice</code> ne pourrait pas supporter de
<em>signaux</em> (en tout cas, pas directement). C’est d’ailleurs le cas de beaucoup de
classes de Qt : par exemple <a href="http://doc.qt.io/qt-5/qstring.html"><code>QString</code></a> et <a href="http://doc.qt.io/qt-5/qlist.html"><code>QList</code></a> n’héritent
pas de <a href="http://doc.qt.io/qt-5/qobject.html"><code>QObject</code></a>.</p>

<h2>Résumé</h2>

<div><pre><code data-lang="cpp"><span>auto</span> <span>decide</span> <span>=</span> <span>[</span><span>=</span><span>]</span> <span>{</span>
    <span>if</span> <span>(</span><span>semantics</span> <span>==</span> <span>VALUE</span><span>)</span> <span>{</span>
        <span>if</span> <span>(</span><span>!</span><span>mustAvoidCopies</span><span>)</span>
            <span>return</span> <span>"just use values"</span><span>;</span>
        <span>return</span> <span>"use PImpl + QSharedDataPointer"</span><span>;</span>
    <span>}</span>
    <span>// semantics == ENTITY</span>
    <span>if</span> <span>(</span><span>entitySemanticsIsObvious</span><span>)</span>
        <span>return</span> <span>"use PImpl + QSharedPointer"</span><span>;</span>
    <span>return</span> <span>"use smart pointers explicitly"</span><span>;</span>
<span>};</span></code></pre></div>

<p><em>C’est juste une heuristique…</em></p>

<h2>Conclusion</h2>

<p>En suivant ces principes, nous pouvons nous débarrasser des <em>owning
raw pointers</em> et des <code>new</code> et <code>delete</code> “nus”. Cela contribue à rendre le code
plus simple et plus robuste.</p>

<p>Ce sont d’ailleurs des objectifs qui guident les évolutions du langage C++ :</p>

<ul><li><a href="media/e4fb248a.resource-model.pdf" data-original-source="http://www.stroustrup.com/resource-model.pdf">A brief introduction to C++’s model for type and resource-safety</a></li>
  <li><a href="media/bbd6f8db.Stroustrup20-20CppCon20201520keynote.pdf" data-original-source="https://github.com/isocpp/CppCoreGuidelines/blob/master/talks/Stroustrup%20-%20CppCon%202015%20keynote.pdf">Writing good C++14</a></li>
  <li><a href="https://herbsutter.com/elements-of-modern-c-style/">Elements of Modern C++ Style</a></li>
</ul><p><code>return 0;</code></p>
<p><img src="media/7cefb81c.1a63f34b9244a38a08fd9b3e5a4aa85e" data-original-source="http://cdn.libravatar.org/avatar/1a63f34b9244a38a08fd9b3e5a4aa85e" alt="Gravatar de &reg;om" class="gravatar" /><br/><i>Original post of <a href="http://blog.rom1v.com/2017/01/cpp-sans-pointeurs/" title="Visit the source">®om</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>


feed_id: http://15minutesoffame.be/nico/blog2/index.php?article27/koozic-sortie-de-la-v0-3-0
title: Marty : KooZic: sortie de la v0.3.0
uri: Marty-KooZic-sortie-de-la-v0-3-0
url: http://15minutesoffame.be/nico/blog2/index.php?article27/koozic-sortie-de-la-v0-3-0
content:
<p>Dans le <a href="http://15minutesoffame.be/nico/blog2/index.php?article26/koozic-sortie-de-la-v0-2-0">dernier billet</a> sur KooZic, j'annonçais un support de l'API de Subsonic. Voilà qui est fait pour la v0.3.0.</p><h1>Support de l'API Subsonic</h1>

<p>Cette version 0.3.0 apporte en priorité le support de l'API de Subsonic. En pratique, cela signifie que toutes les applications compatibles avec un serveur Subsonic, comme les applications mobiles, sont désormais compatibles avec KooZic. La compatibilité a été poussée au maximum, dans les limites de ce qui est supporté par KooZic. Par exemple, pas de gestion des podcasts ou des partages, vu que ce n'est pas implémenté dans KooZic. Mais pas de frais de licence non plus ;-) Le support de l'API est totalement libre et gratuit.</p>

<h4>Supporté</h4>
<ul><li>Streaming audio</li>
  <li>Parcours de la bibliothèque avec ou sans tags ID3</li>
  <li>Listes prédéfinies, comme les derniers albums ou titres ajoutés, les plus joués, etc.</li>
  <li>Liste des albums par genre</li>
  <li>Récupération et suppression de playlists</li>
  <li>Infos des artistes et albums</li>
</ul><h4>Partiellement supporté</h4>
<ul><li>Modification de playlists (dû à une contrainte technique)</li>
</ul><h4>Non supporté</h4>
<ul><li>Podcasts</li>
  <li>Partages</li>
  <li>Chat</li>
  <li>Gestion d'utilisateurs (voulu pour une question de sécurité)</li>
  <li>Streaming vidéo</li>
</ul><p>Seul le streaming vidéo sera probablement implémenté dans un avenir plus ou moins proche. Le reste des fonctionnalités me parait un peu inutile en 2017...</p>

<h2>Applications mobiles compatibles</h2>

<p>Voilà une liste exhaustive des apps testées et de leur compatibilité avec KooZic.</p>

<h4>Android</h4>
<p>Trois apps ont été testées parmi les plus populaires. Leur compatibilité avec KooZic est excellente, quelque soit le choix.</p>
<ul><li><a href="https://f-droid.org/repository/browse/?fdid=github.daneren2005.dsub">DSub</a> : le meilleur choix, encore activement développé. De nombreuses fonctionnalités qui en font une référence.</li>
  <li><a href="https://play.google.com/store/apps/details?id=org.moire.ultrasonic">UltraSonic</a> : un très bon choix également, un peu moins fourni en fonctionnalités "fancy" que DSub, mais agréable au quotidien.</li>
  <li><a href="https://play.google.com/store/apps/details?id=net.sourceforge.subsonic.androidapp">Subsonic Music Streamer</a> : le client officiel. Basique, on sent que c'est plus un "proof-of-concept" qu'une application encore maintenue.</li>
</ul><h4>iOS</h4>
<p>Mon accès à des appareils Apple étant limité (et les apps étant presque toutes payantes), les tests ont été plus limités.</p>
<ul><li><a href="https://itunes.apple.com/us/app/play-sub-subsonic-music-streamer/id955329386?mt=8">play:Sub</a> : le meilleur choix, encore activement développé. Une vraie référence pour les appareils iOS, et subjectivement un cran au-dessus de DSub, tous OS confondus.</li>
  <li><a href="https://itunes.apple.com/us/app/avsub/id923424694?mt=8">AVSub</a> : bof bof... L'interface est assez moche, en tous cas pas du tout en ligne avec le design iOS. Globalement, pas mal de petits soucis dans l'interface, peut-être dû à des spécificités que je n'aurais pas implémentées.</li>
  <li><a href="https://itunes.apple.com/app/soundwaves/id736139596?mt=8">Soundwaves</a> : une des seules apps gratuite. Les fonctionnalités sont limitées mais l'essentiel, à savoir le streaming musical, est bel et bien là. Une bonne alternative à play:Sub.</li>
</ul><p>Il est possible de tester ces applications avec le serveur de démonstration. Voici les infos pour s'y connecter :</p>
<ul><li>URL : http://demo.koozic.net:8069</li>
  <li>login : demo</li>
  <li>password : demo</li>
</ul><h1>Autres nouveautés</h1>

<p>Un nouveau menu permet d'accéder au classement par genre musical plus facilement. Pour un genre musical, on trouve les artistes et les albums qui y sont associés.</p>

<center><a href="media/86c6e09b.koozic_06.png" data-original-source="http://15minutesoffame.be/nico/images/koozic_06.png"><img src="media/86c6e09b.koozic_06.png" data-original-source="http://15minutesoffame.be/nico/images/koozic_06.png" width="500"></a></center>
<center><a href="media/6e1fab9f.koozic_07.png" data-original-source="http://15minutesoffame.be/nico/images/koozic_07.png"><img src="media/6e1fab9f.koozic_07.png" data-original-source="http://15minutesoffame.be/nico/images/koozic_07.png" width="500"></a></center>

<p>Le reste des nouveautés est plutôt invisible pour l'utilisateur. Des améliorations ont été apportées au niveau des performances, et quelques détails visuels ont été appliquées. Certaines parties ont été réécrites pour être plus facilement maintenables dans le futur, comme la récupération des données via LastFM.</p>

<h1>Mise-à-jour d'une installation existante</h1>

<p>La nouvelle version est disponible sur le <a href="https://koozic.net/">site du projet</a>. Pas de crainte à avoir, les sources précédentes peuvent être supprimées. On extrait la nouvelle version, et on lance la mise-à-jour à partir du répertoire:</p>

<pre>./odoo-bin -u oomusic -d koozic --stop-after-init</pre>

<p>On peut relancer ensuite avec la commande habituelle.</p>
<p><img src="media/74594f67.a18b704dbeccb150871d41ebac83318b" data-original-source="http://cdn.libravatar.org/avatar/a18b704dbeccb150871d41ebac83318b" alt="Gravatar de Marty" class="gravatar" /><br/><i>Original post of <a href="http://15minutesoffame.be/nico/blog2/index.php?article27/koozic-sortie-de-la-v0-3-0" title="Visit the source">Marty</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>


feed_id: https://blog.genma.fr/?Yunohost-Supervision-du-trafic-reseau
title: genma : Yunohost - Supervision du trafic réseau
uri: genma-Yunohost-Supervision-du-trafic-réseau
url: https://blog.genma.fr/?Yunohost-Supervision-du-trafic-reseau
content:
<img alt="" src="https://blog.genma.fr/IMG/arton2610.jpg?1482911909" width="150" height="79"><div><p>Dans mon billet <a href="https://blog.genma.fr/?Yunohost-Supervision-en-ligne-de-commande" title="Yunohost - Supervision en ligne de commande">Yunohost - Supervision en ligne de commande</a>, je parlais de quelques commandes que j'utilise pour faire de la supervision / monitoring de ma machine Yunohost (les commandes étant des commandes génériques d'administration d'un système GNU/Linux). Dans ce billet, je m'attarderai plus sur les commandes liées au réseau que j'utilise.</p>
<p>Ces commandes ont été testée sur Debian dans mon cas, mais devraient marcher sur n'importe quel distribution Linux.</p>
<p><strong>netstat</strong></p>
<p>Outil qui permet de voir les ports et connexions en cours :</p>
<div dir="ltr"><code>$ netstat -puant<br> $ netstat -lapute</code></div>
<p>Oui l'ordre des options donne un mot explicite, mais au moins c'est facile à retenir et on a là un bonne combinaison des options de la commande.</p>
<p>Ce type de commande donne un résultat comme</p>
<div dir="ltr"><code>Proto Recv-Q Send-Q Adresse locale Adresse distante Etat PID/Program name<br> tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN - </code></div>
<p>Cette commande est intéressante car elle permet de très rapidement voir quels sont les ports ouverts et utilisés et d'alors régler / affiner le paramétrage de son pare-feu / firewall.</p>
<p><strong>Nethogs</strong></p>
<p>Nethogs permet de surveiller par processus, l'usage de la bande passante en temps réel. Par processus ce sont tous les logiciels utilisant le réseau : client SSH, navigateur etc.</p>
<p>Si en lançant la commande</p>
<div dir="ltr"><code>sudo nethogs eth0<br> creating socket failed while establishing local IP - are you root?</code></div>
<p>vous avez une erreur, c'est liée au fait que la version packagée dans Debian n'est pas la dernière version et pour ne pas avoir cette erreur, il faut compiler la dernière version. C'est très rapide eFt ça se fait depuis les sources <a href="https://askubuntu.com/questions/726601/nethogs-%E2%86%92-creating-socket-failed-while-establishing-local-ip-are-you-root" title="">en suivant ce tutoriel par exemple</a>.</p>
<p>Une fois que c'est fait, on peut lancer la commande et on a alors le résultat :</p>
<div dir="ltr"><code>netHogs version 0.8.5<br> PID USER PROGRAM DEV SENT RECEIVED <br> 11145 genma sshd: genma@pts/0 eth0 0.131 0.064 KB/sec<br> ? root unknown TCP 0.000 0.000 KB/sec<br> (...)<br> TOTAL 0.131 0.064 KB/sec</code></div>
<p><strong>iftop</strong></p>
<p>Iftop est une commande qui est au réseau ce que Htop est au processus. Iftop liste toutes les connexion en IPv4 et IPv6 que la machine fait et indique l'adresse IPv4 ou IPv6 cible avec laquelle le serveur (ici une machine Yunohost) communique. On n'a pas le type de connexion, juste Ip source / Ip Cible et les consommations en bande passante / quantité de données échangées en temps réel.</p>
<p>Si vous voulez par exemple voir le trafic sous forme d'adresses IP, il suffit d'ajouter l'option -n. On peut afficher les différents ports impliqués dans le trafic grâce à l'options -P.</p>
<p>Il y a d'autres options mais ceux sont les deux que j'utilise principalement.</p>
<p>Dans la liste des connexions, je vois par exemple
<br><img src="https://blog.genma.fr/local/cache-vignettes/L8xH11/puce-32883.gif?1475396778" width="8" height="11" alt="-"> ma connexion SSH
<br><img src="https://blog.genma.fr/local/cache-vignettes/L8xH11/puce-32883.gif?1475396778" width="8" height="11" alt="-"> une connexion vers freeplayer.freebox.fr, ce qui correspond au fait que je monte le répertoire partagé de la freebox v6 (fonction NAS)
<br><img src="https://blog.genma.fr/local/cache-vignettes/L8xH11/puce-32883.gif?1475396778" width="8" height="11" alt="-"> ...</p>
<p>J'ai par exemple pu voir avec la commande iftop un certain nombre de connexion établie dans le sens locale vers des serveurs de cache DNS, en IPv4 et IPv6. C'est toujours marrant de voir que le résolveur de DNS locale travaille...</p>
<p><strong>Conclusion</strong></p>
<p>Netstat, Nethogs et Iftop, trois commandes que j'utilise régulièrement et de façon complémentaire. Si vous avez d'autres outils du même type, les commentaires du billet sont ouverts pour recevoir vos conseils et suggestions.</p></div>
<p><img src="media/42493842.dd4318d0d3a7d2ffb13756f63b76d85d" data-original-source="http://cdn.libravatar.org/avatar/dd4318d0d3a7d2ffb13756f63b76d85d" alt="Gravatar de genma" class="gravatar" /><br/><i>Original post of <a href="https://blog.genma.fr/?Yunohost-Supervision-du-trafic-reseau" title="Visit the source">genma</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>genma : <a href="">Yunohost - Supervision en ligne de commande</a> (15/07/2016)</li><li>genma : <a href="">SSH derri&egrave;re un proxy, Sslh</a> (23/02/2016)</li><li>genma : <a href="">Yunohost - ShelInABox - Astuces</a> (01/12/2016)</li></ul></div></p>


feed_id: https://blog.nizarus.tn/2017/01/faire-le-menage-dans-son-repertoire-personnel
title: Nizar Kerkeni : Faire le ménage dans son répertoire personnel
uri: Nizar-Kerkeni-Faire-le-ménage-dans-son-répertoire-personnel
url: https://blog.nizarus.tn/2017/01/faire-le-menage-dans-son-repertoire-personnel
content:
<p><a href="media/6e9e2730.Broom_icon.png" data-original-source="https://blog.nizarus.tn/wp-content/uploads/2017/01/Broom_icon.png" rel="lightbox[3998]" title="Faire le ménage dans son répertoire personnel"><img src="media/a5f63e67.Broom_icon-150x150.png" data-original-source="https://blog.nizarus.tn/wp-content/uploads/2017/01/Broom_icon-150x150.png" alt="Broom Icon" width="150" height="150" srcset="https://blog.nizarus.tn/wp-content/uploads/2017/01/Broom_icon-150x150.png 150w, https://blog.nizarus.tn/wp-content/uploads/2017/01/Broom_icon-300x300.png 300w, https://blog.nizarus.tn/wp-content/uploads/2017/01/Broom_icon-250x250.png 250w, https://blog.nizarus.tn/wp-content/uploads/2017/01/Broom_icon.png 480w" sizes="(max-width: 150px) 100vw, 150px"></a>Voici un petit script shell qui permet de supprimer des fichiers inutiles dans mon répertoire personnel. Je lance ce script régulièrement avant d’effectuer la synchronisation de mes répertoires de travail avec mon disque externe.</p>
<p>Ce script recherche des fichiers dans mon répertoire personnel qui ne sont pas intéressants à sauvegarder et les supprime. Dans la version ci-dessous les fichiers supprimés sont :</p>
<ul><li>Les fichiers avec extension « <em><strong>aux</strong></em> » : fichiers auxiliaires de référence pour LaTeX.</li>
<li>Les fichiers <em><strong>core</strong></em> : faut-il présenter ces fameux fichiers <em><strong>core</strong></em> ?</li>
<li>Les fichiers qui se terminent par « <em><strong>~</strong></em> » ou « <em><strong>#</strong></em> » : généralement des fichiers temporaires de sauvegarde générés par différents éditeurs de texte.</li>
</ul><p>Chacun, selon son utilisation peut ajouter ou supprimer d’autres types de fichiers dans le script.</p>
<p><strong><span>Attention ce script supprime des fichiers et il sera impossible de les récupérer il faut l’utiliser avec précaution.</span></strong></p>
<p><code>#! /bin/sh<br>
find $HOME -type f \\( -name "*.aux" -or -name "core" -or -name "*~" -or -name "*\\#" \\) -exec /bin/rm -f {} \\;<br></code></p>
<a href="https://blog.nizarus.tn/wp-content/plugins/share-on-diaspora/new_window.php?url=https%3A%2F%2Fblog.nizarus.tn%2F2017%2F01%2Ffaire-le-menage-dans-son-repertoire-personnel&amp;title=Faire%20le%20m%C3%A9nage%20dans%20son%20r%C3%A9pertoire%20personnel" target="_blank"><span><font>share this</font> <span><img src="media/07217359.asterisk-20.png" data-original-source="https://blog.nizarus.tn/wp-content/plugins/share-on-diaspora/images/asterisk-20.png" alt=""></span></span></a>
<p><img src="media/4da0db29.c95abbe635ee523736045a72e01c3660" data-original-source="http://cdn.libravatar.org/avatar/c95abbe635ee523736045a72e01c3660" alt="Gravatar de Nizar Kerkeni" class="gravatar" /><br/><i>Original post of <a href="https://blog.nizarus.tn/2017/01/faire-le-menage-dans-son-repertoire-personnel" title="Visit the source">Nizar Kerkeni</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>theClimber : <a href="">Trics &amp;amp; Tips : configurer son client ssh</a> (17/06/2009)</li><li>theClimber : <a href="">Arr&ecirc;tez de spammer vos amis avec vos tests</a> (06/04/2009)</li><li>Samuel Martin : <a href="">Quelques outils utiles pour django sous Ubuntu - &amp;quot;Debugging&amp;quot;</a> (20/01/2010)</li><li>&reg;om : <a href="">Chiffrer son dossier personnel (/home) sous Ubuntu</a> (16/05/2010)</li><li>Malangot : <a href="">[STREAMER] &ndash; Outils de capture video</a> (08/08/2011)</li></ul></div></p>


feed_id: http://raspbian-france.fr/orange-pi-zero/
title: RaspbianFrance : Orange Pi Zero, la concurrente de la Raspberry Pi à seulement 7€ !
uri: RaspbianFrance-Orange-Pi-Zero-la-concurrente-de-la-Raspberry-Pi-à
url: http://raspbian-france.fr/orange-pi-zero/
content:
<p>Il y a quelques temps nous vous présentions plusieurs concurrents à la Raspberry Pi dont notamment la carte C.H.I.P., la Banana Pi ou encore l’Archos Stick. Aujourd’hui, nous allons parler d’une nouvelle carte de développement, <strong>l’Orange Pi Zero</strong> !</p>
<p>Comme vous pouvez le constater cette Orange Pi se place en concurrence directe avec la Raspberry Pi en reprenant même le terme Zéro dans son nom. Néanmoins, l’Orange Pi ce n’est pas qu’un nom, elle possède également des caractéristiques intéressantes que nous allons tâcher de vous présenter.</p>
<p>Alors voyons ensemble si l’Orange Pi Zero se place comme une alternative réelle à notre belle framboise.</p>
<h2>Orange Pi Zero, une carte puissante à moindre coût</h2>
<p>Tout d’abord, il faut savoir que l’Orange Pi ne date pas d’aujourd’hui. En effet la première carte estampillée Orange est sortie début 2015 avec l’Orange Pi très proche techniquement de notre Pi à nous. Depuis, plusieurs cartes ont été produites afin d’améliorer et de perfectionner la Pi version Orange.<br>
Cette nouvelle version ne déroge pas à la règle, et amène son lot de nouveautés.</p>
<p>Je pense que vous l’avez compris, l’<strong>Orange Pi Zéro vise le même public que la Raspberry Pi Zéro</strong>. Elle répond donc globalement aux mêmes problématiques, c’est à dire la domotique et l’embarqué. Malgré tout, cette carte devrait également être parfaitement efficace pour monter des petits serveurs de développement et même, pourquoi pas, servir d’émulateur de jeux vidéo (toutefois l’utilisation d’une Raspberry Pi 3 sera alors préférable).</p>
<p>Côté prix, l’Orange Pi Zéro est vendue aux alentours <a href="http://raspbian-france.fr/recommends/orange-pi-zero-256-ali-fr/" target="default" rel="nofollow">de 7€ sur le site AliExpress.</a><br>
Notez néanmoins que comme pour la Raspberry Pi, vous aurez également besoin, au minimum, <a href="http://raspbian-france.fr/recommends/alimentation-raspberry-pi-3/" target="default" rel="nofollow">d'une alimentation électrique</a>, ainsi que <a href="http://raspbian-france.fr/recommends/16-go-microsd/" target="default" rel="nofollow">d'une carte MicroSD</a>.</p>
<h3>La connectique de l’Orange Pi</h3>
<p>Commençons par la connectique de la bête. Si l’Orange Pi Zéro est <strong>relativement compacte (48x46mm pour 26 grammes)</strong>, elle possède néanmoins une connectique relativement fournie, lui permettant ainsi de s’adapter à de nombreux périphériques pour un encombrement minimal, idéal pour l’embarqué.</p>
<p>On retrouve donc les ports suivants :</p>
<ul><li>Un mini port USB dédié à l’alimentation</li>
<li>Un port USB 2.0 (qui permet donc de brancher un périphérique de type disque dur)</li>
<li>Un port Ethernet 10/100 (qui est également compatible PoE power Supply, désactivé par défaut)</li>
<li>26 pins (à souder, le schéma correspond à celui de Raspberry Pi)</li>
<li>13 pins (également à souder, utile pour ajouter une extension audio)</li>
</ul><p>Avec cette version, Orange Pi Zero est clairement<strong> orientée Iot</strong> (Internet des Objets), d’où l’absence d’un port HDMI. La carte dispose toutefois de 13 pins qui permettront d’ajouter un support vidéo.</p>
<div><img src="media/f98ed66d.orange-pi-zero-939x528.jpg" data-original-source="http://raspbian-france.fr/wp-content/uploads/2016/12/orange-pi-zero-939x528.jpg" alt="L'orange Pi Zéro dispose même d'une antenne Wi-Fi" width="939" height="528" srcset="http://raspbian-france.fr/wp-content/uploads/2016/12/orange-pi-zero-939x528.jpg 939w, http://raspbian-france.fr/wp-content/uploads/2016/12/orange-pi-zero-626x352.jpg 626w, http://raspbian-france.fr/wp-content/uploads/2016/12/orange-pi-zero-404x227.jpg 404w" sizes="(max-width: 939px) 100vw, 939px"><p>Un petit schéma de l’Orange Pi Zéro, avec ses différents ports</p></div>
<p>Bon point, <strong>un module WiFi</strong> est également présent et vous permettra donc de brancher l’Orange Pi en mode sans-fil.</p>
<h3>Les performances de l’Orange Pi Zero</h3>
<p>Du côté des performances, l’Orange Pi Zero n’a pas à pâlir face à sa concurrente la Raspberry Pi Zero, en effet, bien que la version standard de l’orange pi ne dispose que de <strong>256MB de mémoire RAM</strong>, il existe <strong>une seconde version (que vous trouverez, elle aussi, <a href="http://raspbian-france.fr/recommends/orange-pi-zero-512-ali-fr/" target="default" rel="nofollow">chez Aliexpress</a>) avec 512MB soit le double.</strong></p>
<p>Pour ce qui est du processeur, l’Orange Pi Zero propose un <strong>Allwinner H2+ de quatre cœurs cadencés à 1200Mhz</strong>, une assez bonne surprise donc, avec des performances à attendre probablement supérieures à celles de sa concurrente. Point intéressant, il semblerait que ce processeur permette à la Orange Pi Zéro le support de l’<strong>encodage X265</strong> (ou HEC) 1080p. Ce dernier détail étant particulièrement intéressant pour les média-centers.</p>
<p>La concurrente de la Raspberry Pi dispose également d<strong>’un port Ethernet</strong> et d’<strong>un module WiFi</strong> donnant ainsi un avantage à l’Orange Pi Zero puisque rappelons-le, la Raspberry Pi Zero ne possède ni port Ethernet ni carte WiFi. Avantage à l’orange donc.</p>
<p>Enfin, notons que le port Ethernet de l’Orange Pi reste à seulement 100Mo/s. Toutefois, en pratique, cela ne devrait pas vraiment être un problème, d’autant plus que la plupart d’entre-nous ne disposons pas de connexions qui ne fassent ne serait-ce qu’approcher ces vitesses (pour une raison étonnante, il semble qu’il soit plus facile d’avoir de la fibre dans la Creuse qu’en centre ville…).</p>
<h2>Une bonne alternative à la Raspberry Pi Zero</h2>
<p>L’orange Pi Zero se révèle donc être <strong>une excellente concurrente à la Raspberry pi</strong>, à la fois <strong>compacte et puissante</strong> mais surtout en termes de disponibilité.<br>
Enfin, il faut bien le dire, le plus gros avantage de l’Orange Pi Zéro face à sa concurrente reste sa disponibilité. En effet, là où la Raspberry Pi Zéro est presque impossible à trouver à un prix normal, l’Orange Pi Zéro, elle, est disponible en ligne chez le vendeur Aliexpress :</p>
<ul><li><a href="http://raspbian-france.fr/recommends/orange-pi-zero-256-ali-fr/" target="default" rel="nofollow">dans sa version 256 Mo</a>, à 7€</li>
<li><a href="http://raspbian-france.fr/recommends/orange-pi-zero-512-ali-fr/" target="default" rel="nofollow">dans sa version 512 Mo</a>, à 10€</li>
</ul><h3>Voici le tableau récapitulatif de l’Orange Pi Zero</h3>
<style>#go-pricing-table-2417 .gw-go-col-wrap { min-width:130px; } #go-pricing-table-2417 .gw-go-col-inner { border-radius:0 0 0 0; } #go-pricing-table-2417 ul.gw-go-body, #go-pricing-table-2417  ul.gw-go-body li { border:none !important; padding-top:1px; } #go-pricing-table-2417 ul.gw-go-body li .gw-go-body-cell { padding-top:1px; } #go-pricing-table-2417 ul.gw-go-body { padding-bottom:1px; } #go-pricing-table-2417 .gw-go-tooltip-content { background-color:#9D9D9D;color:#333333;max-width:130px; } #go-pricing-table-2417 .gw-go-tooltip:before { border-top-color:#9D9D9D; } #go-pricing-table-2417 .gw-go-col-wrap-0.gw-go-hover .gw-go-header-top { background-color:#3498db; } #go-pricing-table-2417 .gw-go-col-wrap-0 .gw-go-price-wrap span, #go-pricing-table-2417 .gw-go-col-wrap-0 .gw-go-coinf div, #go-pricing-table-2417 .gw-go-col-wrap-0 .gw-go-coinb div { color:#3498db; } #go-pricing-table-2417 .gw-go-col-wrap-1.gw-go-hover .gw-go-header-top { background-color:#3498db; } #go-pricing-table-2417 .gw-go-col-wrap-1 .gw-go-price-wrap span, #go-pricing-table-2417 .gw-go-col-wrap-1 .gw-go-coinf div, #go-pricing-table-2417 .gw-go-col-wrap-1 .gw-go-coinb div { color:#3498db; } #go-pricing-table-2417 .gw-go { visibility:visible; }</style><div><div data-id="2417" data-colnum="2" data-equalize='{"column":1,"body":1,"footer":1}' rr><div data-col-index="0"><div><div><div><div><h3>Raspberry Pi Zero</h3><div><div><div><span>5€</span><small></small></div></div><div><div><span>5€</span><small></small></div></div></div></div><div></div></div><ul><li data-row-index="0"><div>Processeur : BCM2835 ARM(v6)</div></li><li data-row-index="1"><div>Cadence : 1000MHz</div></li><li data-row-index="2"><div>RAM : 512Mo</div></li><li data-row-index="3"><div>Stockage : Carte MicroSD</div></li><li data-row-index="4"><div>Carte réseau : Pas de carte réseau</div></li><li data-row-index="5"><div>Ports USB : 1 (microUSB On The Go)</div></li><li data-row-index="6"><div>Sorties vidéos : Mini HDMI + composite possible</div></li><li data-row-index="7"><div>GPIO : 40 Pics (non inclus)</div></li></ul><div><div></div><div><div><div data-row-index="0"><div><a href="http://raspbian-france.fr/#" target="_blank">Non disponible</a></div></div></div></div></div></div></div></div><div data-current="1" data-col-index="1"><div><div><div><div><h3>Orange Pi Zero</h3><div><div><div><span>7€</span><small></small></div></div><div><div><span>7€</span><small></small></div></div></div></div><div></div></div><ul><li data-row-index="0"><div>Processeur : Allwinner H2+ Quad-core Cortex-A7</div></li><li data-row-index="1"><div>Cadence : 1200MHz</div></li><li data-row-index="2"><div>RAM : 256Mo/512Mo</div></li><li data-row-index="3"><div>Stockage : Carte MicroSD</div></li><li data-row-index="4"><div>Carte réseau : port Ethernet 10/100 (compatible PoE) + Module WiFi</div></li><li data-row-index="5"><div>Ports USB : 2 ( 1 micro-USB et 1 USB 2.0)</div></li><li data-row-index="6"><div>Sorties vidéos : aucunes ou via pin</div></li><li data-row-index="7"><div>GPIO : 39 Pics</div></li></ul><div><div></div><div><div><div data-row-index="0"><div><a href="http://raspbian-france.fr/recommends/orange-pi-zero-256-ali-fr" target="_blank">Acheter le Orange Pi Zero</a></div></div></div></div></div></div></div></div></div></div>
<p>Nous pouvons remarquer que les deux Pi Zero sont <strong>très similaires</strong> en termes de spécifications, avec toutefois un avantage à l’Orange Pi, que ce soit par la connectivité internet ou par la disponibilité à la vente.</p>
<p>En résumé, si vous cherchez à acheter la Pi Zéro mais que vous ne la trouvez pas, n’hésitez pas, et allez plutôt acheter une Orange Pi Zéro.</p>
<p>Cet article <a rel="nofollow" href="http://raspbian-france.fr/orange-pi-zero/">Orange Pi Zero, la concurrente de la Raspberry Pi à seulement 7€ !</a> est apparu en premier sur <a rel="nofollow" href="http://raspbian-france.fr/">Raspbian-France</a>.</p>
<p><img src="media/70caad1d.7cdb6ce9a9a728b66bcfdc9db75842c8" data-original-source="http://cdn.libravatar.org/avatar/7cdb6ce9a9a728b66bcfdc9db75842c8" alt="Gravatar de RaspbianFrance" class="gravatar" /><br/><i>Original post of <a href="http://raspbian-france.fr/orange-pi-zero/" title="Visit the source">RaspbianFrance</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>RaspbianFrance : <a href="">Bien choisir vos accessoires pour la Raspberry Pi B+.</a> (29/10/2014)</li><li>RaspbianFrance : <a href="">Banana Pi, un clone plus puissant de la Raspberry Pi</a> (28/01/2015)</li><li>RaspbianFrance : <a href="">La Raspberry Pi 2, une vraie r&eacute;volution&nbsp;!</a> (20/02/2015)</li><li>RaspbianFrance : <a href="">Bien choisir les accessoires pour votre Raspberry Pi 2.</a> (10/04/2015)</li><li>RaspbianFrance : <a href="">Les accessoires officiels de la Raspberry Pi Fondation</a> (03/11/2015)</li></ul></div></p>


feed_id: https://raphaelhertzog.fr/2017/01/14/mes-activites-libres-en-decembre-2016/
title: Raphaël Hertzog : Mes activités libres en décembre 2016
uri: Raphaël-Hertzog-Mes-activités-libres-en-décembre-2016
url: https://raphaelhertzog.fr/2017/01/14/mes-activites-libres-en-decembre-2016/
content:
<p><img title="Activity report" src="media/18908eaa.activity-report-300x300.jpg" data-original-source="https://raphaelhertzog.com/files/2012/07/activity-report-300x300.jpg" alt="" width="300" height="300">Mon rapport mensuel couvre une grande partie de mes contributions au logiciel libre. Je l’écris pour <a href="https://raphaelhertzog.fr/go/donate/">mes donateurs</a> (merci à eux !) mais aussi pour la communauté Debian au sens large parce que cela peut donner des idées aux nouveaux venus et que c’est également un des moyens les plus effectifs de trouver des volontaires pour travailler sur les projets qui me tiennent à cœur.</p>
<h3>Debian LTS</h3>
<p>Ce mois-ci ce sont 10 heures de travail sur les mises à jour de sécurité pour Debian 7 <em>Wheezy</em> qui ont été subventionnées. Elles ont été consacrées aux tâches suivantes :</p>
<ul><li>J’ai publié la <a href="https://lists.debian.org/debian-lts-announce/2016/12/msg00016.html">DLA-741-1</a> concernant unzip. Ce fut une mise à jour facile;</li>
<li>J’ai <a href="https://lists.debian.org/debian-lts/2016/12/msg00087.html">passé en revue</a> le patch de Roberto Sanchez pour la CVE-2014-9911 concernant ICU; </li>
<li>J’ai publié la <a href="https://lists.debian.org/debian-lts-announce/2016/12/msg00034.html">DLA-759-1</a> concernant nss, en collaboration avec Antoine Beaupré. J’ai fusionné et mis à jour le travail de Guido pour activer la suite de tests au cours de la compilation, et pour ajouter les tests DEP-8;</li>
<li>J’ai créé le <a href="https://anonscm.debian.org/cgit/collab-maint/debian-lts/php5.git">dépôt Git</a> qui sera utilisé pour la maintenance de php5 dans Debian LTS, et j’ai commencé à travailler sur une mise à jour. J’ai ajouté les patchs pour 2 CVE (CVE-2016-3141 et CVE-2016-2554), ainsi que quelques fichiers binaires requis par certains tests (qui échouent, à l’heure actuelle).</li>
</ul><h3>Empaquetages divers</h3>
<p>Avec l’approche du gel définitif de <em>Stretch</em>, certains clients m’ont demandé de pousser des paquets dans Debian et/ou de corriger des paquets sur le point d’être retirés de cette distribution.</p>
<p>Alors que j’essayais de ramener uwsgi dans <em>testing</em>, j’ai créé les rapport de bogue <a href="https://bugs.debian.org/847095">n°847095</a> (libmongoclient-dev: Ne devrait pas rentrer en conflit avec le paquet de transition mongodb-dev) et <a href="https://bugs.debian.org/847207">n°847207</a> (uwsgi: FTBFS sur de multiples architectures avec des références indéfinies à des symboles uwsgi_*), de même que j’ai travaillé sur quelques-uns des bogues critiques pour la publication qui maintenaient le paquet hors de <em>testing</em>.</p>
<p>J’ai également travaillé sur quelques nouveaux paquets (lua-trink-cjson, lua-inotify, lua-sandbox-extensions) qui améliorent le paquet « hindsight » dans certains cas d’usage, et j’ai parrainé une mise à jour de rozofs dans <em>experimental</em>, afin de corriger un conflit de fichiers avec inn2 (<em>cf.</em> le <a href="https://bugs.debian.org/846571">n°846571</a>).</p>
<h3>Travaux Debian divers</h3>
<p><strong>Debian Live</strong> J’ai publié deux mises à jour de live-build. Avec la seconde ont été ajoutées plusieurs options de personnalisation de la configuration GRUB (que nous utilisons dans Kali pour surcharger le thème, et ajouter de nouvelles entrées au menu), à la fois pour le boot EFI et pour le boot normal.</p>
<p><strong>Rapports de bogue divers</strong> <a href="https://bugs.debian.org/846569">Rapport de bogue n°846569</a> concernant libsnmp-dev, afin de tenir compte de la transition libssl (j’avais remarqué que le paquet n’était pas maintenu, j’ai en conséquence <a href="https://lists.debian.org/debian-devel/2016/12/msg00024.html">fait appel aux nouveaux mainteneurs potentiels</a> sur la liste debian-devel). Le <a href="https://bugs.debian.org/847168">n°847168</a> sur devscripts pour debuild qui a commencé à échouer lorsque lintian échouait (régression inattendue). Le <a href="https://bugs.debian.org/847318">n°847318</a> concernant lintian, afin d’éviter les faux-positifs sur les paquets Kali (ce qui était ennuyeux du fait de la régression debuild précédemment mentionnée). Le <a href="https://bugs.debian.org/847436">n°847436</a> concernant un problème de mise à jour avec tryton-server. Le <a href="https://bugs.debian.org/847223">n°847223</a> concernant firefoxdriver, dans la mesure où il dépendait toujours d’iceweasel au lieu de firefox.</p>
<p><strong>Parrainage</strong> J’ai parrainé une nouvelle version d’asciidoc (<a href="https://bugs.debian.org/831965">rapport de bogue n°831965</a>), ainsi que de ssldump (version 0.9b3-6), pour la transition libssl. J’ai également poussé une nouvelle version de mutter, afin de corriger le <a href="https://bugs.debian.org/846898">n°846898</a> (elle était déjà prête dans SVN).</p>
<h3>Distro Tracker</h3>
<p>Pas grand chose de nouveau, j’ai corrigé le <a href="https://bugs.debian.org/814315">n°814315</a> en basculant quelques URLs restantes vers https. J’ai fusionné les patchs d’efkin pour corriger la suite de tests fonctionnels (<em>cf.</em> le <a href="https://bugs.debian.org/814315">n°814315</a>), ce qui constitue une contribution vraiment très utile ! Ce même contributeur s’est attaqué à un autre ticket (le <a href="https://bugs.debian.org/824912">n°824912</a>) concernant l’ajout d’une API pour récupérer les objets d’action. Cela représente une tâche plus importante et demande quelques réflexions. Je dois encore lui faire mes retours sur ses derniers patchs (après déjà deux itérations).</p>
<h3>Travaux divers</h3>
<p>J’ai mis à jour <a href="https://github.com/saltstack-formulas/letsencrypt-sh-formula">la formule salt letsencrypt-sh</a> pour la version 0.3.0, et ajouté la possibilité de personnaliser le script hook pour recharger le serveur Web.</p>
<p>Le compte Twitter <a href="https://twitter.com/planetdebian">@planetdebian</a> n’est plus actif depuis que twitterfeed.com a fermé ses portes, et que son remplaçant (dlvr.it) n’apprécie pas le fil RSS de planet.debian.org. J’ai créé le <a href="https://bugs.debian.org/848123">n°848123</a> concernant planet-venus, ce dernier ne préservant pas l’attribut isPermalink dans le tag guid.</p>
<h3>Merci</h3>
<p>Rendez-vous au mois prochain pour un nouveau résumé de mes activités !</p>
<blockquote><p>Ceci est une traduction de mon article <a href="https://raphaelhertzog.com/2017/01/04/my-free-software-activities-in-december-2016/">My Free Software Activities in December 2016</a> contribuée par Weierstrass01.</p></blockquote>
<p><a href="https://raphaelhertzog.fr/2017/01/14/mes-activites-libres-en-decembre-2016/#comments">Aucun commentaire pour le moment</a> | Vous avez aimé ? <a href="http://raphaelhertzog.fr/soutenir/">Cliquez ici</a>. | Ce blog utilise <a href="http://flattr.com/thing/26572/Destination-Debian" target="_blank">Flattr</a>.</p>
<p><img src="media/89661d5a.e18b309867dcb66e83358b9a6297e54b" data-original-source="http://cdn.libravatar.org/avatar/e18b309867dcb66e83358b9a6297e54b" alt="Gravatar de Rapha&euml;l Hertzog" class="gravatar" /><br/><i>Original post of <a href="https://raphaelhertzog.fr/2017/01/14/mes-activites-libres-en-decembre-2016/" title="Visit the source">Raphaël Hertzog</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>Rapha&euml;l Hertzog : <a href="">Mes activit&eacute;s libres en avril 2016</a> (17/05/2016)</li><li>Rapha&euml;l Hertzog : <a href="">Mes activit&eacute;s libres en mai 2016</a> (16/06/2016)</li><li>Rapha&euml;l Hertzog : <a href="">Mes activit&eacute;s libres en septembre 2016</a> (17/10/2016)</li><li>Rapha&euml;l Hertzog : <a href="">Mes activit&eacute;s libres en octobre 2016</a> (14/11/2016)</li><li>Rapha&euml;l Hertzog : <a href="">Mes activit&eacute;s libres en f&eacute;vrier et mars 2016</a> (18/04/2016)</li></ul></div></p>


feed_id: https://www.tifred.fr/script-post-installation-fedora-25/
title: TheLinuxFr : Script post-installation Fedora 25
uri: TheLinuxFr-Script-post-installation-Fedora-25
url: https://www.tifred.fr/script-post-installation-fedora-25/
content:
<p>Suite à la sortie de Fedora <a href="https://fedoramagazine.org/fedora-25-released/" target="_blank"> en version 25</a> voici mon script de post-installation. Le script est conçu pour le bureau Gnome fournis par défaut dans Fedora.<span></span></p>
<h2>Fonctionnalités</h2>
<ul><li>installer les dépôts RPMFusion</li>
<li>mettre à jour le système</li>
<li>installer mon profit <a href="https://git.lietart.fr/tifredfr/postinstallfedora/blob/master/postinstallfedora25#L52">bashrc</a></li>
<li>installer Skype, TeamViewer, Atom, Fedy…</li>
<li>faire un peu de nettoyage</li>
<li>installer le thème Arc</li>
<li>installer les polices Microsoft</li>
<li>installer FishShell</li>
<li>installer Terminix</li>
<li>installation de : nano wget langpacks-fr htop ccze most bash-completion gnome-tweak-tool gnome-shell-extension-user-theme alacarte</li>
<li>…</li>
</ul><p><em>Une validation vous sera demandée avant l’installation d’application.</em></p>
<p>N’hésitez pas à <a href="https://git.lietart.fr/tifredfr/postinstallfedora/issues" target="_blank">rapporter les divers problèmes</a>.</p>
<h2>Installation</h2>
<p></p><pre>curl https://git.lietart.fr/tifredfr/postinstallfedora/raw/master/postinstallfedora25 -o postinstallfedora25 &amp;&amp; chmod +x postinstallfedora25 &amp;&amp; ./postinstallfedora25</pre><p><strong>Source</strong> : <a href="https://git.lietart.fr/tifredfr/postinstallfedora" target="_blank">https://git.lietart.fr/tifredfr/postinstallfedora</a></p>
<p>Cet article <a rel="nofollow" href="https://www.tifred.fr/script-post-installation-fedora-25/">Script post-installation Fedora 25</a> est apparu en premier sur <a rel="nofollow" href="https://www.tifred.fr/">TiFredFr</a>.</p>
<p><img src="media/cdeb7306.e83752f809480dbbc43f6da84f3bdf98" data-original-source="http://cdn.libravatar.org/avatar/e83752f809480dbbc43f6da84f3bdf98" alt="Gravatar de TheLinuxFr" class="gravatar" /><br/><i>Original post of <a href="https://www.tifred.fr/script-post-installation-fedora-25/" title="Visit the source">TheLinuxFr</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>TheLinuxFr : <a href="">Script post-installation Fedora 24</a> (29/06/2016)</li><li>One More Blog : <a href="">Zenity, pour rendre ses scripts plus interactifs</a> (14/03/2011)</li></ul></div></p>


title: Journal du hacker : Liens intéressants Journal du hacker semaine #02
uri: Journal-du-hacker-Liens-intéressants-Journal-du-hacker-semaine-02
feed_id:
https://blog.journalduhacker.net/index.php?article84/liens-interessants-journal-du-hacker-semaine-02

url:
https://blog.journalduhacker.net/index.php?article84/liens-interessants-journal-du-hacker-semaine-02

content:
<p>Pour la seconde semaine de 2017, voici 5 liens intéressants que vous avez peut-être ratés, relayés par <a href="https://www.journalduhacker.net/">le Journal du hacker</a>, votre source d’informations pour le Logiciel Libre francophone !</p>

<a href="https://www.journalduhacker.net/"><img src="media/01f45034.logo-journal-du-hacker.png" data-original-source="https://blog.journalduhacker.net/data/medias/logo-journal-du-hacker.png"></a>

<ul><li><a href="https://www.journalduhacker.net/s/zyqdmx/journal_du_hacker_et_francophonie">Journal du hacker et francophonie</a></li>
<li><a href="https://www.journalduhacker.net/s/yezgjl/openmailbox_y_a-t-il_un_pilote_dans_l_avion">OpenMailBox : Y a-t-il un pilote dans l'avion ?</a></li>
<li><a href="https://www.journalduhacker.net/s/gy2xbi/au_revoir_synology_bonjour_open_media_vault_1">Au revoir Synology, bonjour Open Media Vault #1</a></li>
<li><a href="https://www.journalduhacker.net/s/nknnoo/une_installation_domotique_de_geek">Une installation domotique de geek</a></li>
<li><a href="https://www.journalduhacker.net/s/slm6nr/linux_en_forte_croissance">Linux en forte croissance !</a></li>
</ul><p>Pour ne plus rater aucun article de la communauté francophone, voici :</p>

<ul><li><a href="https://www.journalduhacker.net/rss">Le flux RSS du Journal du hacker</a></li>
<li><a href="https://twitter.com/journalduhacker">Le compte Twitter du Journal du hacker</a></li>
<li><a href="https://framasphere.org/u/journalduhacker">Le compte Diaspora* du Journal du hacker</a></li>
</ul><p>De plus le site web du Journal du hacker est « adaptatif (responsive) ». N’hésitez pas à le consulter depuis votre smartphone ou votre tablette !</p>

<p>Le Journal du hacker fonctionne de manière collaborative, grâce à la participation de ses membres. <a href="https://www.journalduhacker.net/invitations/request">Rejoignez-nous</a> pour proposer vos contenus à partager avec la communauté du Logiciel Libre francophone et faire connaître vos projets !</p>

<p><strong>Et vous ? Qu’avez-vous pensé de ces articles ?</strong> N’hésitez pas à réagir directement dans les commentaires de l’article sur le Journal du hacker ou bien dans les commentaires de ce billet :)</p>
<p><img src="media/ffe97a17.7916ee3cafa0bc3e9583bedad876dcd5" data-original-source="http://cdn.libravatar.org/avatar/7916ee3cafa0bc3e9583bedad876dcd5" alt="Gravatar de Journal du hacker" class="gravatar" /><br/><i>Original post of <a href="https://blog.journalduhacker.net/index.php?article84/liens-interessants-journal-du-hacker-semaine-02" title="Visit the source">Journal du hacker</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>


feed_id: https://blog.genma.fr/?Plusieurs-Firefox-et-plusieurs-profils-en-meme-temps
title: genma : Plusieurs Firefox et plusieurs profils en même temps
uri: genma-Plusieurs-Firefox-et-plusieurs-profils-en-même-temps
url: https://blog.genma.fr/?Plusieurs-Firefox-et-plusieurs-profils-en-meme-temps
content:
<img alt="" src="https://blog.genma.fr/IMG/arton2616.jpg?1484319958" width="150" height="79"><div><p>Ce billet parlera d'une astuce ancienne mais tout le monde ne la connaît pas forcément.</p>
<p>Rendons à César etc. l'astuce du billet de Pascal Chevrel qui date d'il y a quelques années, <a href="https://www.chevrel.org/carnet/?post/2010/01/14/Tester-Firefox-avec-un-profil-klinex" title="Tester Firefox avec un profil kleenex">Tester Firefox avec un profil kleenex</a> m'est très utile.</p>
<p>Dans le cadre de mon nouvel emploi, j'ai le besoin de lancer plusieurs versions de Firefox en parallèle et idéalement, chacune sur un profil dédié.</p>
<p>J'ai donc créé plusieurs profils pour Firefox permanents. <a href="https://www.chevrel.org/carnet/?post/2010/01/14/Tester-Firefox-avec-un-profil-klinex" title="Tester Firefox avec un profil kleenex">Contrairement au billet mentionné où les profils sont détruits</a>, j'ai plusieurs Firefox (version ESR, version de la distribution, version Nightly build) dans un dossier (les archives zip des dernières versions ont été téléchargées depuis le site de Mozilla). Et j'ai créé des alias dans le fichier .bash_aliases (qui est à la racine de mon /home/genma) qui me permet de lancer rapidement le Firefox que je veux depuis la ligne de commande.</p>
<div dir="ltr"><code># ============================<br>
# Alias Firefox<br>
# ============================<br>
alias firefoxDevelopper='~/LOGICIELS/Firefox_Developper_Edition/firefox -no-remote'<br>
alias firefoxNightly='~/LOGICIELS/Firefox_Nigthly/firefox -no-remote'<br>
alias firefoxESR='~/LOGICIELS/Firefox_ESR/firefox -no-remote'</code></div>
<p>Ainsi si je tape firefoxNightly dans un terminal, ça m'ouvre la fenêtre qui me demande de choisir le profil (je peux avoir plusieurs profils pour une même version de navigateur donc je ne passe pas un profil précis en argument).<br>
Rq : sur le pourquoi de Nighthly, il y a mon billet <a href="https://blog.genma.fr/?Pourquoi-j-utilise-Firefox-nightly" title="Pourquoi j'utilise Firefox nightly ?">Pourquoi j'utilise Firefox nightly ?</a></p>
<p>Pour m'y retrouver entre les différentes fenêtres des navigateurs et savoir qui est qui <a href="https://addons.mozilla.org/fr/firefox/themes/" title="Thèmes :: Modules pour Firefox">j'ai mis des thèmes colorés</a>.</p>
<p>Et ça marche aussi pour Thunderbird. Là encore, on crée deux profils : un pour les boites mails pro, un pour les boites mails persos. Et je lance ça via un</p>
<div dir="ltr"><code>thunderbird -no-remote &amp;</code></div>
<p>Enfin, pour tout ce qui concerne la sécurité, les profils sont stockés en environnement chiffrés (le home est chiffré et il y a un conteneur veracrypt dans lequel je mets les profils).</p></div>
<p><img src="media/42493842.dd4318d0d3a7d2ffb13756f63b76d85d" data-original-source="http://cdn.libravatar.org/avatar/dd4318d0d3a7d2ffb13756f63b76d85d" alt="Gravatar de genma" class="gravatar" /><br/><i>Original post of <a href="https://blog.genma.fr/?Plusieurs-Firefox-et-plusieurs-profils-en-meme-temps" title="Visit the source">genma</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>La vache libre : <a href="">nbwmon &ndash; Un outil de monitoring tr&egrave;s pratique, pour analyser le d&eacute;bit de vos connexions en temps r&eacute;el</a> (12/08/2014)</li><li>La vache libre : <a href="">Key-mon &ndash; Visualisez en temps r&eacute;el les entr&eacute;es clavier/souris</a> (02/12/2014)</li></ul></div></p>


feed_id: https://www.dadall.info/blog/index.php?article582/un-stand-diaspora-au-fosdem-2017
title: dada : Un stand diaspora* au FOSDEM 2017
uri: dada-Un-stand-diaspora-au-FOSDEM-2017
url: https://www.dadall.info/blog/index.php?article582/un-stand-diaspora-au-fosdem-2017
content:
<br>C'est enfin officiel ! Nous seront au <a href="https://fosdem.org/2017/" title="FOSDEM">FOSDEM</a> ce premier week-end de février ! Les bénévoles sont au courant depuis un bout de temps mais j'attendais d'avoir mes billets de train pour vous l'annoncer officiellement.<br><br>C'est donc maintenant certain : Augier et moi, podmins de diaspote.org, seront pour la troisième année consécutive au <em>Free and Open Source Software Developers' European Meeting</em> à Bruxelles. Ça se passera du samedi 4 au dimanche 5 février. <br><br>Nous y retrouverons une équipe de bénévoles internationaux formée de français, d'allemands. d'un suisse, un américain, un finlandais et j'en passe. De mémoire, je crois que nous seront une petite dizaine pour vous accueillir et parler pendant deux jours de diaspora* et de l'univers des réseaux sociaux libres.<br><br>Nous seront dans le bâtiment K :<br><br><div align="center"><img src="media/3cd3eddc.stand2017.png" data-original-source="https://www.dadall.info/blog/data/images/fosdem/stand2017.png" alt=""><br></div><br><br>C'est un sacré plaisir de se retrouver là-bas avec les copains. Les belges nous offrent vraiment un super événement où il fait bon traîner et faire des rencontres. L'année dernière, le stand diaspora* s'était transformé en vrai outil de fédération avec des gars de Framasoft, de Movim et d'autres. A priori, ça devrait être un peu la même cette année !<br><br>Belgique oblige, la dégustation de bière sera aussi de la partie : viendez trinquer, on n'est pas méchant !<br><br>A tantôt !<br><br><br><noscript><!-- Piwik Image Tracker--><img src="http://www.dadall.info/piwik/piwik.php?idsite=1&amp;rec=1&amp;action_name=RSS" alt=""><!-- End Piwik --></noscript>
<p><img src="media/48d98f88.9bcde41f0ceee54d4588bb741ab92e6f" data-original-source="http://cdn.libravatar.org/avatar/9bcde41f0ceee54d4588bb741ab92e6f" alt="Gravatar de dada" class="gravatar" /><br/><i>Original post of <a href="https://www.dadall.info/blog/index.php?article582/un-stand-diaspora-au-fosdem-2017" title="Visit the source">dada</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>


title: Tuxicoman : Mise à jour Debian 8.7
uri: Tuxicoman-Mise-à-jour-Debian-8-7
feed_id:
https://tuxicoman.jesuislibre.net/2017/01/mise-a-jour-debian-8-7.html?pk_campaign=feed&amp;pk_kwd=mise-a-jour-debian-8-7

url:
https://tuxicoman.jesuislibre.net/2017/01/mise-a-jour-debian-8-7.html?pk_campaign=feed&amp;pk_kwd=mise-a-jour-debian-8-7

content:
<p><a href="media/9448940c.openlogo-50.png" data-original-source="https://tuxicoman.jesuislibre.net/blog/wp-content/uploads/openlogo-50.png"><img src="media/9448940c.openlogo-50.png" data-original-source="https://tuxicoman.jesuislibre.net/blog/wp-content/uploads/openlogo-50.png" alt="" width="50" height="61"></a><a href="https://www.debian.org/News/2017/20170114">Debian 8.7</a> vient de sortir. Il s’agit d’une mise à jour mineure pour la version stable de Debian nommée actuellement « Jessie ».</p>
<p>Comme d’habitude sur Debian stable, il n’y a <a href="https://www.debian.org/News/2017/20170114">pas de mise à jour majeure des logiciels, juste des correctifs très localisés et de sécurité</a>. C’est bien là l’intérêt de la version « stable » de Debian, des changements mineurs qui assurent le moins d’introduction de bugs possible. Ça permet de faire la mise à jour en étant confiant que la machine marchera toujours demain, sans régression.</p>
<p>La mise à jour est transparente, il suffit de suivre d’installer les nouveaux paquets proposés par votre outil de mise à jour préféré.</p>
<p>Sinon, en ligne de commande :</p>
<p><code># apt update; apt upgrade</code></p>
<h3>Related Posts:</h3>
<ul><li><a href="https://tuxicoman.jesuislibre.net/2016/12/bonnes-resolutions-2017.html" title="Bonnes résolutions 2017">Bonnes résolutions 2017</a></li>
<li><a href="https://tuxicoman.jesuislibre.net/2016/11/migration-owncloud-nextcloud.html" title="Migration owncloud -> nextcloud">Migration owncloud -> nextcloud</a></li>
<li><a href="https://tuxicoman.jesuislibre.net/2016/10/bloquer-les-publicites-et-traqueurs-au-niveau-du-dns-avec-unbound.html" title="Bloquer les publicités et traqueurs au niveau du DNS avec Unbound">Bloquer les publicités et traqueurs au niveau du DNS avec Unbound</a></li>
<li><a href="https://tuxicoman.jesuislibre.net/2016/04/7891.html" title="Samba serveur dans une mise à jour sécurité de Debian?">Samba serveur dans une mise à jour sécurité de Debian?</a></li>
<li><a href="https://tuxicoman.jesuislibre.net/2015/08/mise-a-jour-automatique-des-patch-de-securite-sur-debian.html" title="Installation automatique des mises à jour de sécurité sur Debian">Installation automatique des mises à jour de sécurité sur Debian</a></li>
</ul><img src="https://espion.jesuislibre.net/piwik.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Ftuxicoman.jesuislibre.net%2F2017%2F01%2Fmise-a-jour-debian-8-7.html%3Fpk_campaign%3Dfeed%26pk_kwd%3Dmise-a-jour-debian-8-7&amp;action_name=Mise+%C3%A0+jour+Debian+8.7&amp;urlref=https%3A%2F%2Ftuxicoman.jesuislibre.net%2Ffeed" width="0" height="0" alt="">
<p><img src="media/a4176171.d01ce01523a0434fc1c413922f7fd8a2" data-original-source="http://cdn.libravatar.org/avatar/d01ce01523a0434fc1c413922f7fd8a2" alt="Gravatar de Tuxicoman" class="gravatar" /><br/><i>Original post of <a href="https://tuxicoman.jesuislibre.net/2017/01/mise-a-jour-debian-8-7.html?pk_campaign=feed&amp;pk_kwd=mise-a-jour-debian-8-7" title="Visit the source">Tuxicoman</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>Tuxicoman : <a href="">Fail2ban pour votre installation WordPress</a> (03/04/2013)</li><li>Tuxicoman : <a href="">Ins&eacute;rer des vid&eacute;os dans WordPress 3.6</a> (20/08/2013)</li><li>Tuxicoman : <a href="">Bloquer les publicit&eacute;s et traqueurs au niveau du DNS avec Unbound</a> (15/10/2016)</li><li>Tuxicoman : <a href="">Migration owncloud -&amp;gt; nextcloud</a> (06/11/2016)</li><li>Tuxicoman : <a href="">Bonnes r&eacute;solutions 2017</a> (31/12/2016)</li></ul></div></p>


feed_id: https://wodric.com/backup-base-avec-git/
title: Wodric : Backup une base de données avec Git
uri: Wodric-Backup-une-base-de-données-avec-Git
url: https://wodric.com/backup-base-avec-git/
content:
<p>Dans ce post, nous allons aborder une solution possible pour backup une base de données. Cet article est fortement inspiré d’<a href="https://www.viget.com/articles/backup-your-database-in-git">un article anglophone</a>, n’hésitez pas à y jeter un œil.</p>
<p>L’exemple donné dans l’article se base sur une distribution Débian et une base de données MySQL.</p>
<p>Disclamer : Je n’ai pas testé cette solution en production. Je vous laisse le soin de vérifier les impacts possibles de cette mise en place.</p>
<h2>Backup une base de données en production, un enjeu majeur</h2>
<p>Faire le backup de vos bases de données de production est un challenge. Pour énormément de raisons, il s’agit d’une réflexion complexe. Il existe beaucoup de besoins différents, appelant à autant de réponses possibles.</p>
<p>Cependant, il existe plusieurs contraintes:</p>
<ul><li>la fréquence des backups</li>
<li>les problèmes de performances durant le backup</li>
<li>l’espace disque utilisé par les backups</li>
<li>la stratégie de conservation des backups</li>
</ul><p>Je n’irai pas plus loin dans l’analyse, cet article n’est pas là pour définir qu’elle est l’approche la plus adaptée en fonction de votre situation, mais pour proposer une solution possible à cette problématique.</p>
<h2>Utiliser Git pour historiser sa base de données</h2>
<p>L’idée d’utiliser Git pour stocker ces backups SQL a du sens. En effet, le SQL est un langage, un backup de base n’est rien d’autre que du code, pourquoi ne pas le stocker directement grâce à Git … comme le reste de votre code.</p>
<p>J’y vois deux avantages :</p>
<ul><li>la simplicité de l’automatisation d’un tel processus</li>
<li>bénéficier de la performance de stockage de Git qui ne stocke pas l’ensemble des versions des fichiers, mais les différences entre ces versions</li>
</ul><h3>Préparation du répertoire</h3>
<p>Dans un premier temps, après avoir installé et configuré git, il faut préparer le répertoire dans lequel vous allez gérer votre backup :</p>
<pre data-enlighter-language="shell" data-enlighter-linenumbers="false"># création du répertoire de backup et création du backup initial
mkdir -p /path/to/backup
cd /path/to/backup 
mysqldump -u [user] -p[pwd] --skip-extended-insert [database] > [database].sql 
# initialisation de git
git init 
git add [database].sql 
git commit -m "Initial commit backup database" 

# paramétrer le dépôt git distant
git remote add origin [git-depot-url]
git push -u origin --all
git push --tags</pre>
<p>avec :</p>
<ul><li>[database] : le nom de base à backup</li>
<li>[user] et [pwd] : le nom d’utilisateur et le password de l’utilisateur de la base utilisée pour le backup</li>
<li>[git-depot-url] : l’URL du dépôt sur lequel déposer votre base</li>
</ul><p>L’utilisation de l’option « –skip-extended-insert » de mysqldump, permet de rendre beaucoup plus lisible les commits. Chaque commit laissera ainsi apparaître uniquement les lignes ajoutées, modifiées ou supprimés dans la base. De plus, git appréciera, car il devra gérer un dépôt de taille plus raisonnable.</p>
<h3>Automatisation des backups</h3>
<p>Maintenant que tout est initialisé, il faut passer à l’automatisation des backups, pour cela éditer le fichier crontab avec la commande :</p>
<pre data-enlighter-language="shell" data-enlighter-linenumbers="false">crontab -e</pre>
<p>Ajouter la ligne suivante :</p>
<pre data-enlighter-language="shell" data-enlighter-linenumbers="false">0 0 * * * cd /path/to/backup &amp;&amp; \\ mysqldump -u [user] -p[pwd] --skip-extended-insert [database] > [database].sql &amp;&amp; \\ git commit -am "Updating DB backup" &amp;&amp;  \\ git push</pre>
<p>Elle créée le backup et le commit et le push sur Git toutes les heures. La fréquence de backup est à adapter au projet, <a href="https://doc.ubuntu-fr.org/cron">cron offre de nombreuses possibilités de planification</a>.</p>
<p>En bonus, quelques conseils et astuces pour mettre en place cette solution:</p>
<ul><li>Mettre en place la <a href="https://www.martar.fr/articles/se-connecter-a-gitlab-en-ssh">connexion SSH avec le dépôt Git</a> avec une paire de clef public/privé</li>
<li>Optimisez les performances de Git en ajoutant un cron hebdomadaire avec la commande <a href="https://git-scm.com/docs/git-gc">« git gc »</a></li>
<li>Créer un utilisateur spécifique dans la base de données ayant uniquement les droits en lecture sur la base de données depuis la machine</li>
<li>Faire les backups sur un autre point de montage, pour éviter de grignoter l’espace disque du point de montage de la base de données</li>
<li>Utiliser bitbucket, ce dernier permet d’avoir des dépôts privés gratuits</li>
</ul><h2>Pour conclure</h2>
<p>D’après moi, cette solution peut être efficace dans le cadre de base de données pas trop volumineuse, permettant ainsi de réaliser des backups fréquents sans consommer énormément d’espaces disques grâce à Git.</p>
<p>Si vous avez déjà mis en place un système similaire ou que vous être plus compétent que moi, n’hésitez pas à faire des remarques! Je suis tout ouïe!</p>
<p>N’hésitez pas à me<strong> laisser un feedback</strong> sur cet article en attribuant une note (système d’étoiles en dessous de l’article) ou en me commentant vos impressions. Si vous l’avez apprécié, vous pouvez également <strong><a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fwodric.com%2Fbackup-base-avec-git&amp;text=Une%20solution%20pour%20backup%20vos%20bases%20gr%C3%A2ce%20%C3%A0%20git%20:">le partager</a></strong> pour mon plus grand plaisir ;).</p>
<p><strong>Sources :</strong></p>
<ul><li><a href="https://www.viget.com/articles/backup-your-database-in-git">[EN] Backup votre base avec Git</a></li>
<li><a href="https://www.martar.fr/articles/se-connecter-a-gitlab-en-ssh">[FR] Se connecter à Git en SSH</a></li>
<li><a href="https://doc.ubuntu-fr.org/cron">[FR] Documentation cron</a></li>
<li><a href="https://git-scm.com/docs/git-gc">[EN] documentation Git GC</a></li>
</ul><table><tr><td><nobr> </nobr></td><td><div><div data-img="https://wodric.com/wp-content/uploads/2016/12/backup_restore.jpg"></div></div></td></tr></table><p>The post <a rel="nofollow" href="https://wodric.com/backup-base-avec-git/">Backup une base de données avec Git</a> appeared first on <a rel="nofollow" href="https://wodric.com/">Wodric</a>.</p>
<p><img src="media/12b79bd3.21f2b7f4d244dc2f786fe4254d935e89" data-original-source="http://cdn.libravatar.org/avatar/21f2b7f4d244dc2f786fe4254d935e89" alt="Gravatar de Wodric" class="gravatar" /><br/><i>Original post of <a href="https://wodric.com/backup-base-avec-git/" title="Visit the source">Wodric</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>Wodric : <a href="">Les commandes Git : se faciliter la vie  (3/3)</a> (04/07/2016)</li><li>Wodric : <a href="">Les commandes Git &ndash; branches, rebase&hellip; (2/3)</a> (27/06/2016)</li><li>Wodric : <a href="">Les commandes Git : De bonnes bases (1/3)</a> (20/06/2016)</li><li>Wodric : <a href="">Git: Workflow de dev</a> (01/06/2016)</li><li>theClimber : <a href="">G&eacute;rer une communaut&eacute; de d&eacute;veloppeurs, les bonnes raisons pour quitter SVN</a> (21/09/2010)</li></ul></div></p>


feed_id: https://philippe.scoffoni.net/comment-choisir-owncloud-nextcloud/
title: Philippe Scoffoni : Comment choisir entre Owncloud et Nextcloud ?
uri: Philippe-Scoffoni-Comment-choisir-entre-Owncloud-et-Nextcloud
url: https://philippe.scoffoni.net/comment-choisir-owncloud-nextcloud/
content:
<p>Le <a rel="nofollow" href="https://fr.wikipedia.org/wiki/Fork_(d%C3%A9veloppement_logiciel)" target="_blank">fork</a>, bifurcation, fourchette ou embranchement (choisissez le terme qui vous plaît le mieux) <a href="https://philippe.scoffoni.net/owncloud-fork-nextcloud/" target="_blank">a eu lieu il y a maintenant plus de six mois</a>. Un délai que l’on peut juger raisonnable pour pouvoir essayé de se prononcer sur un choix entre les deux branches divergentes de ce projet. Reste la question de savoir sur quel critère. Voici les éléments qui à ce jour me permettent de trancher.</p><h2>Activité du projet</h2><p>Ce critère est particulièrement important. Il est toujours bon à l’heure du choix d’un <strong>logiciel libre</strong> de se poser la question de l’activité visible du projet. Dans le cas qui nous occupe, il suffit de se rendre sur le site GitHub, et d’étudier les statistiques des deux projets.</p><p>Tout d’abord l’activité sur le dernier mois pour Owncloud</p><p><img src="media/c981d0fa.SC3A9lection_422.png" data-original-source="https://philippe.scoffoni.net/wp-content/uploads/2017/01/S%C3%A9lection_422.png" width="994" height="433" srcset="https://philippe.scoffoni.net/wp-content/uploads/2017/01/Sélection_422.png 994w, https://philippe.scoffoni.net/wp-content/uploads/2017/01/Sélection_422-300x131.png 300w, https://philippe.scoffoni.net/wp-content/uploads/2017/01/Sélection_422-768x335.png 768w, https://philippe.scoffoni.net/wp-content/uploads/2017/01/Sélection_422-600x261.png 600w" sizes="(max-width: 994px) 100vw, 994px"></p><p>Et Nextcloud<img src="media/1802b544.SC3A9lection_423.png" data-original-source="https://philippe.scoffoni.net/wp-content/uploads/2017/01/S%C3%A9lection_423.png" width="994" height="387" srcset="https://philippe.scoffoni.net/wp-content/uploads/2017/01/Sélection_423.png 994w, https://philippe.scoffoni.net/wp-content/uploads/2017/01/Sélection_423-300x117.png 300w, https://philippe.scoffoni.net/wp-content/uploads/2017/01/Sélection_423-768x299.png 768w, https://philippe.scoffoni.net/wp-content/uploads/2017/01/Sélection_423-600x234.png 600w" sizes="(max-width: 994px) 100vw, 994px"></p><p>Les chiffres parlent d’eux même, l’activité en terme de modifications intégrées (Merged Pull Requests) est bien plus importante chez Nextcloud que Owncloud : 37 contre 152 respectivement.</p><p>Si on compare l’activité depuis le mois de juin 2016 (la zone encadrée dans les images), date du fork en commençant par Owncloud</p><p><img src="media/d4863ce9.SC3A9lection_424.png" data-original-source="https://philippe.scoffoni.net/wp-content/uploads/2017/01/S%C3%A9lection_424.png" alt="" width="993" height="192" srcset="https://philippe.scoffoni.net/wp-content/uploads/2017/01/Sélection_424.png 993w, https://philippe.scoffoni.net/wp-content/uploads/2017/01/Sélection_424-300x58.png 300w, https://philippe.scoffoni.net/wp-content/uploads/2017/01/Sélection_424-768x148.png 768w, https://philippe.scoffoni.net/wp-content/uploads/2017/01/Sélection_424-600x116.png 600w" sizes="(max-width: 993px) 100vw, 993px"></p><p>puis Nextcloud</p><p><img src="media/ef348df7.SC3A9lection_425.png" data-original-source="https://philippe.scoffoni.net/wp-content/uploads/2017/01/S%C3%A9lection_425.png" alt="" width="992" height="198" srcset="https://philippe.scoffoni.net/wp-content/uploads/2017/01/Sélection_425.png 992w, https://philippe.scoffoni.net/wp-content/uploads/2017/01/Sélection_425-300x60.png 300w, https://philippe.scoffoni.net/wp-content/uploads/2017/01/Sélection_425-768x153.png 768w, https://philippe.scoffoni.net/wp-content/uploads/2017/01/Sélection_425-600x120.png 600w" sizes="(max-width: 992px) 100vw, 992px"></p><p>Là on voit clairement où sont passé les nouvelles lignes de code. Évidement, je ne suis pas allé analyser le contenu des modifications apportées à Nextcloud et si il s’agit bien de « vraies modifications ». Un point pour Nextcloud.</p><h2>Les évolutions</h2><p>Je me suis penché sur les « changelog ». Ces longues listes en anglais qui détaillent les nouvelles fonctionnalités et les corrections apportées par une version. Je ne me lancerais pas dans un comparatif détaillé. Mon impression a cette heure est la suivante : les évolutions d’Owncloud semblent plus tournées vers les besoins des administrateurs systèmes confrontés à des problématiques de montés en charge et d’infrastructure pour « gros ». Côté Nextcloud, je vois beaucoup d’améliorations pour les utilisateurs. Un nouveau point pour Nextcloud.</p><p>En ce qui concerne la maintenance des versions, <a rel="nofollow" href="https://nextcloud.com/changelog/" target="_blank">Nextcloud a sorti des versions correctives</a> pour 3 versions le 16 janvier (il est noté 2016 sur la page du changelog, une coquille à mon avis) : les 9, 10 et 11.  Côté Owncloud, la dernière mise à jour date du 13 décembre avec des mises à jour pour les versions 9.1, 9.0. Nextcloud continue la politique de mise à jour d’Owncloud avec une version de plus semble-t-il.</p><h2>Le modèle économique</h2><p>Oserais-je dire copie conforme ? Il me semble que c’est le cas. Les offres visibles concernent essentiellement le support avec des tarifs qui démarrent à <a rel="nofollow" href="https://nextcloud.com/pricing/" target="_blank">1900 $ pour Nextcloud</a> et <a rel="nofollow" href="https://owncloud.com/pricing/" target="_blank">3600 $ pour Owncloud</a>. Si on compare les offres à services équivalents, les tarifs se tiennent. Ce n’est pas sur ce critère que se fera la différence.</p><h2>Au final ?</h2><p>A ce jour, il n’y a pas trop de raison d’hésiter, <strong>Nextcloud s’impose</strong>, la communauté a visiblement suivi le créateur d’Owncloud dans son fork. Si vous avez des arguments en faveur d’Owncloud, ils sont les bienvenus <img src="media/78924bcd.1f642.png" data-original-source="https://s.w.org/images/core/emoji/2.2.1/72x72/1f642.png" alt="🙂"></p><hr><a href="https://philippe.scoffoni.net/comment-choisir-owncloud-nextcloud/#comments">Réagir à cet article</a><p><small>Article original écrit par Philippe Scoffoni le 17/01/2017. | <a href="https://philippe.scoffoni.net/comment-choisir-owncloud-nextcloud/">Lien direct vers cet article</a><br><br>Cette création est mise à disposition sous un <a rel="license" href="http://creativecommons.org/licenses/by/2.0/fr/">contrat Creative Commons BY</a>  à l'exception des images qui l'illustrent (celles-ci demeurent placées sous leur mention légale d'origine).</small></p>.

<p><img src="media/59ec0aeb.ee4bb1c08ac2d03c76f391d4b26c812a" data-original-source="http://cdn.libravatar.org/avatar/ee4bb1c08ac2d03c76f391d4b26c812a" alt="Gravatar de Philippe Scoffoni" class="gravatar" /><br/><i>Original post of <a href="https://philippe.scoffoni.net/comment-choisir-owncloud-nextcloud/" title="Visit the source">Philippe Scoffoni</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>Philippe Scoffoni : <a href="">8 logiciels libres ou open source pour consultants et soci&eacute;t&eacute;s de conseils</a> (08/06/2015)</li><li>Philippe Scoffoni : <a href="">Le logiciel libre pour TPE : t&eacute;moignage</a> (27/10/2016)</li><li>Philippe Scoffoni : <a href="">Comparatif Owncloud vs Pydio</a> (06/12/2014)</li><li>Philippe Scoffoni : <a href="">Owncloud 8.2 vient de sortir, la course &agrave; la mise &agrave; jour ?</a> (20/10/2015)</li><li>Philippe Scoffoni : <a href="">OpenStack, (re)d&eacute;couverte</a> (15/06/2016)</li></ul></div></p>


feed_id: http://www.tomzone.fr/mon-bashrc/
title: Tom : Mon bashrc
uri: Tom-Mon-bashrc
url: http://www.tomzone.fr/mon-bashrc/
content:
<p>Suite à l’article sur mon motd dynamique, je vous propose en téléchargement mon fichier bashrc personnalisé.</p>
<p>Explication de la personnalisation de Bash (source : <a title="Mistra.fr" href="https://www.mistra.fr/tutoriel-bash-personnaliser-prompt.html" target="_blank">Mistra.fr</a>)</p>
<p>Pour personnaliser l’invite de commande bash nous allons devoir modifier quelques fichiers de configuration relatifs à bash.</p>
<p> </p>
<p>Voici les fichiers qui configurent un bash à son lancement :</p>
<ul><li><em>/etc/profile</em> : ce fichier est chargé quel que soit le shell utilisé (en particulier bash) et quel que soit l’utilisateur. Il ne doit pas contenir d’instruction spécifiques à bash, car sinon cela risque de perturber les autres shells.</li>
<li><em>/etc/bash.bashrc</em> : ce fichier est chargé par tous utilisateurs au lancement d’un bash. Selon la distribution Linux ce fichier peut porter un nom légèrement différent, par exemple /etc/bash/bashrc.</li>
<li><em>~/.bash_login</em> : ce fichier est spécifique à un utilisateur (en tant que fichier situé dans son home directory) quand il se loggue. Ce fichier n’existe pas forcément, donc si vous en avez besoin n’hésitez pas à le créer.</li>
<li><em>~/.bashrc</em> : ce fichier est chargé au lancement d’un bash par cet utilisateur. C’est un contexte un peu plus général que se logguer (typiquement lorsqu’on lance la commande « bash »).</li>
</ul><p>Concrètement nous allons travailler dans ~/.bashrc car nous ne souhaitons pas forcément modifier le prompt des autres utilisateurs. On aurait pu travailler dans /etc/bash.bashrc  pour modifier tous les prompts d’un coup.</p>
<p><span></span></p><pre>[ -z "$PS1" ] &amp;&amp; return

# source du bashrc système
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# source du fichier des alias personnalisé
if [ -f ~/.bash_aliases ]; then
        . ~/.bash_aliases
fi

# Meilleure completion du bash
# Installer le package bash-completion
if [ -f /etc/bash_completion ] &amp;&amp; ! shopt -oq posix; then
        . /etc/bash_completion
fi

# n'affiche pas les commandes tapées en double dans l'historique.
export HISTCONTROL=ignoredups:ignorespace
# nombre de lignes dans l'historique, par session bash
export HISTSIZE=5000
# nombre de lignes conservées dans l'historique
export HISTFILESIZE=20000
# ajout de la date et de l'heure dans l'historique
export HISTTIMEFORMAT="%d/%m/%Y - %T : "
# supporte des terminaux redimensionnables (xterm et screen -r)
shopt -s checkwinsize

# lesspipe.sh is an input filter for the pager less as described in less's man page.
[ -x /usr/bin/lesspipe ] &amp;&amp; eval "$(SHELL=/bin/sh lesspipe)"

# ajout de la colorisation syntaxique
if [ -x /usr/bin/dircolors ]; then
        test -r ~/.dircolors &amp;&amp; eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
fi

# Mes alias BASHRC
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias ls='ls --color=auto'
alias dir='dir --color=auto'
alias vdir='vdir --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
alias ll='ls -alFh --color=auto'
alias la='ls -A --color=auto'
alias l='ls -CF --color=auto'
alias miseajour='sudo apt-get update &amp;&amp; sudo apt-get upgrade &amp;&amp; sudo apt-get dist-upgrade &amp;&amp; sudo  apt-get autoclean &amp;&amp; sudo apt-get clean &amp;&amp; sudo apt-get autoremove'
alias saidar='sudo saidar -c -d 1'
alias htop='sudo htop'
alias calendrier='var=$(cal); echo "${var/$(date +%-d)/$(echo -e "\\033[1;31m$(date +%-d)\\033[0m")}"'
alias du='du -h --max-depth=1'
alias dusort='du -x --block-size=1048576 | sort -nr'
alias df='df -h'
alias passgen='pwgen  -y -n  20 1'


# Mes exports
export EDITOR=vim
export VISUAL=vim

# Affichage du prompt
PS1="\\n\\$(if [[ \\$EUID == 0 ]]; then echo \\"\\[\\033[0;31m\\]\\"; else echo \\"\\[\\033[0;33m\\]\\"; fi)\\342\\226\\210\\342\\226\\210 [ \\u@\\h ] [ \\w ] [ \\t ]\\n\\[\\033[0m\\]\\342\\226\\210\\342\\226\\210 "

# lecture colorée de logs
# installer le package ccze
logview()
{
        ccze -A < $1 | less -R
}

# lecture colorée de logs en direct logview()
logtail()
{
        tail -f $1 | ccze
}</pre><p><a href="http://www.tomzone.fr/wp-content/uploads/2015/02/bashrc.txt">Téléchargez le fichier .bashrc</a></p>
<p>Voici à quoi ressemble mon interface, avec un putty en mode Solarized (source : <a href="https://github.com/altercation/solarized/tree/master/putty-colors-solarized" target="_blank">https://github.com/altercation/solarized/tree/master/putty-colors-solarized</a>)</p>
<p>Lorsque l’utilisateur est <strong>root</strong> le prompt devient rouge, c’est juste une manière de me repérer lorsque je travaille.</p>
<p><a href="media/1e3d5788.bashrc.jpg" data-original-source="http://www.tomzone.fr/wp-content/uploads/2015/02/bashrc.jpg" data-rel="lightbox-0" title=""><img src="media/1e3d5788.bashrc.jpg" data-original-source="http://www.tomzone.fr/wp-content/uploads/2015/02/bashrc.jpg" alt="bashrc" width="771" height="376" srcset="http://www.tomzone.fr/wp-content/uploads/2015/02/bashrc.jpg 771w, http://www.tomzone.fr/wp-content/uploads/2015/02/bashrc-300x146.jpg 300w" sizes="(max-width: 771px) 100vw, 771px"></a></p>
<p><img src="media/50bead6f.4cb7a6eb5c5c5b740244e59020d13849" data-original-source="http://cdn.libravatar.org/avatar/4cb7a6eb5c5c5b740244e59020d13849" alt="Gravatar de Tom" class="gravatar" /><br/><i>Original post of <a href="http://www.tomzone.fr/mon-bashrc/" title="Visit the source">Tom</a>.Votez pour ce billet sur <a href="http://www.planet-libre.org" title="Aller sur le planet">Planet Libre</a>.</i></p>
<p><div class="similar-block"><h3>Articles similaires</h3><ul><li>Brice Capelle : <a href="">BASH &ndash; Rajouter la date dans l&rsquo;historique des commandes</a> (18/04/2009)</li><li>ChEza : <a href="">Partager le bashrc entre quelques utlisateurs</a> (13/11/2010)</li><li>Macsim : <a href="">Proteger la fermeture du terminal lors d&rsquo;un ctrl+d</a> (19/01/2012)</li><li>David Mercereau : <a href="">Script de sauvegarde Mysql par base &laquo;&nbsp;mysql_dump.sh&nbsp;&raquo;</a> (05/12/2012)</li><li>David Mercereau : <a href="">Backup chiffr&eacute; avec duplicity sur HubiC</a> (21/10/2013)</li></ul></div></p>


