PROJET AUTOBLOG


Planet-Libre

source: Planet-Libre

⇐ retour index

Hobbestigrou : Activer le mode vi pour le shell et application en mode texte.

jeudi 20 décembre 2012 à 00:32

Introduction

J'utilise presque uniquement des applications en ligne de commande ou mode texte. Actuellement, je n'avais pas activé l'option pour que mon shell soit en mode Vi. Tant-donné que je suis un utilisateur de Vim, je me suis dis que ça serait plus sympa.

Activation

Pour l'activer uniquement pour le shell bash, zsh ou autre, il suffit d'ajouter une ligne au fichier de configuration *.rc:

set -o vi

Ensuite il faut relancer un terminal ou faire un source *.rc dans le terminal courant.

Pour l'activer de manière global et que ça fonctionne aussi avec les applications en mode texte, il faut ajouter une ligne dans le fichier .inputrc:

set editing-mode vi

Attention ça fonctionne uniquement avec les applications qui utilise readline.

Fixe pour zsh

Avec zsh, il faut ajouter une ligne dans son zshrc pour que ça fonctionne correctement:

bindkey -v

Autrement, il y aura des petits problème, par exemple lorsqu'on active le mode normal qu'on fait un mouvement, il repasse directement en mode insertion, ce qui est très embêtant à l'utilisation.

Indication du mode

Pour avoir une indication du mode, insertion ou normal, il est possible d'ajouter une fonction:

function zle-line-init zle-keymap-select {
    RPS1="${${KEYMAP/vicmd/-N-}/(main|viins)/-I-}"
    RPS2=$RPS1
    zle reset-prompt
}
zle -N zle-line-init
zle -N zle-keymap-select

Ceci ajoutera N pour le mode normal et I pour le mode insertion. Par défaut lorsqu'on ouvre un shell le mode est insertion.

Conclusion

Pour le moment, je suis assez satisfait, et c'est plutôt intéressant d'avoir les même raccourcis dans son shell et dans Vim. Merci à gdott9 pour m'avoir indiquer la fonction et la ligne à ajouter dans mon zshrc pour que ça fonctionne correctement, et à Marmotte pour m'avoir donné l'idée d'utiliser ce mode.

Gravatar de Hobbestigrou
Original post of Hobbestigrou.Votez pour ce billet sur Planet Libre.

La bande des Geexxx : Trop d’informations tue l’information

mercredi 19 décembre 2012 à 21:00

2012. Je ne sais pas si c’est la fin du monde, mais ce que je vois, c’est que nous sommes submergés. Pas de météorites, de laves, de tsunamis ou je ne sais quoi d’autres. Nous sommes submergés d’informations. Il ne se passe pas une minute dans la journée sans que nous apprenions une information. Je parle de l’information sous n’importe quelle forme, de « il va pleuvoir demain » à « la BCE va prêter à la Grèce » en passant par « Gérard vous invite à passer le réveillon chez lui » ou encore « Le saucisson est 1 euro moins cher dans ce nouveau supermarché ». Que ce soit chez soi ou dans la rue, au travail ou durant les loisirs, il y a toujours quelque chose qui entre en interaction avec nous et cela a pris des proportions que nous n’imaginions même pas il y a 20 ans.

Cette situation peut être imputée à l’arrivée d’un nouvel acteur : le smartphone. Car je ne dis pas 20 ans au hasard. Il y a 20 ans, c’est la date de création du World Wide Web. Et avec l’apparition du smartphone, le web, il est constamment avec nous, dans notre poche (soit dit en passant, mettez-le plutôt dans votre sac, les ondes GSM, c’est vraiment pas terrible). Ce qui est au début une bonne nouvelle est en train de se transformer en un semi cauchemar, car il faut à présent apprendre à gérer l’information. En effet, même si on met de côté celle qui nous arrive sans que nous l’ayons demandé (comprendre, à 90 %, la publicité), nous recevons trop d’informations. Nous ne sommes aujourd’hui qu’à une requête sur un moteur de recherche de n’importe quelle information.

Peut-être ne voyez-vous pas encore le problème dont je parle. Peut-être pensez-vous « bah, s’il trouve qu’il reçoit trop d’informations, il n’a cas arrêter d’utiliser internet sur son téléphone. » Dans l’idée, oui, bien sûr. Rien ne nous empêche de couper Internet, il ne s’impose pas encore à nous à ce point. Mais ce qui fait que l’information est aujourd’hui à la limite du harcèlement, c’est que ce n’est pas une information brute. C’est une information exactement adaptée à son lecteur. L’information a sur Internet une dimension sociale et personnelle que l’on ne retrouve nul part ailleurs. Ce n’est pas une simple publicité affichée sur le site qu’on visite. C’est une publicité qui tient compte des sites que l’on a affiché, des articles que l’on a lu, des produits que l’on a consulté, des pages que l’on a aimé ou approuvé. Tout comme ce n’est pas un simple article de journal. C’est un article qui a été sélectionné pour nous par le site du journal, comme pouvant nous intéresser. C’est un article qui nous a été recommandé par un ami. Par quelqu’un que l’on connaît. Ce qui n’était qu’un phénomène très marginal il y a encore dix ans (« Tu devrais regarder cette émission ce week-end, elle a l’air intéressante ») est devenu aujourd’hui une des plus grosses sources d’information. Réfléchissez au nombre de liens, articles, vidéos, images ou même pétitions que vous partagez et repartagez chaque jour. Le côté personnalisé de cette information qui nous arrive est impressionnant. Et si, techniquement, quitter internet est aussi facile que d’éteindre une télévision, un simple clic sur un bouton, il est en pratique nettement plus difficile d’ignorer un contenu qui nous est spécialement destiné.

Nous recevons trop d’informations. Il n’est pas rare aujourd’hui de consacrer plusieurs heures par jour à lire ses mails, ses flux RSS, et surtout, pour la majorité des gens, son (ses ?) réseaux sociaux. Cela nous prend du temps, beaucoup de temps, pour quelque chose qui n’est pas forcément intéressant, en tout cas pas plus que ce que nous étions en train de faire. J’ai été interrompu par 9 mails différents dans la demi heure qu’il m’a fallu pour écrire le début de cet article. Je suis obligé de me retenir de ne pas aller les consulter pour ne pas perdre le fil de mes idées. Je considère que ma tâche principale est plus importante dans l’instant que l’information que j’ai pu recevoir, mais je suis obligé de faire un effort pour ça. Alors je pense à ces cadres, de plus en plus nombreux, qui reçoivent les mails de leur boulot à n’importe quel instant sur leur ordinateur comme sur leur smartphone, à 8h comme à 23h, au travail comme en vacances, et qui ne peuvent pas faire semblant de ne rien avoir reçu. Ils ont réussi le miracle de ne jamais quitter le travail, ne jamais quitter leur responsabilité.

Alors je me pose la question, quelles conséquences cette overdose d’informations va avoir à l’avenir ? Ce dernier cas du travail qui s’insère dans la vie privée mériterait une étude à lui seul, mais ce n’est pas le sujet qui m’intéresse car, comme pour la publicité citée au début, je considère cette information comme imposée. Ce qui m’intéresse, c’est de voir le temps passé par jour à regarder des chatons alors que nous avions allumé l’ordinateur pour travailler. C’est de voir que même en vacances, on ne peut s’empêcher de passer une heure par jour sur Facebook à découvrir tout ce que les gens partagent. Finalement, à coup de mentions, cette information là ne nous est-elle pas imposée, elle aussi ? Qu’est ce qui fait que nous n’arrivons pas à « décrocher » ? Je note d’ailleurs ici l’utilisation du champ lexical propre à la drogue..

Je n’ai bien évidemment pas la réponse à toutes ces questions, mais je pense qu’en avoir conscience est déjà un premier pas.

Gravatar de La bande des Geexxx
Original post of La bande des Geexxx.Votez pour ce billet sur Planet Libre.

mart-e : SMailArchiver : script de backup sécurisé d’email

mercredi 19 décembre 2012 à 17:04

Faisant un peu le nettoyage dans mes boites à emails, j’ai voulu sauver tous mes vieux messages avant suppression. Cependant, je voulais un moyen de faire cela de manière automatisée (possible d’utiliser cron), incrémental (ne pas tout retélécharger à chaque fois), supportant la compression et surtout garder une certaine confidentialité (chiffrement).

J’ai trouvé des bouts de codes pour faire chaque partie séparément (ici et ici par exemple) mais pas de programme permettant de faire tout cela ensemble. A que cela ne tienne, j’ai donc créé un petit script python contentant mes besoins. Ainsi est né SMailArchiver (avec S pour Secured ou Suicide, question de point de vue) que je partage ici.

Ce petit bout de code (approchant des 400 lignes de python) permet facilement de faire des backup de plusieurs comptes emails avec toute une série d’option comme la compression des mails avant le chiffrement (une compression après le chiffrement peut également être utile mais est moins efficace) ou le choix d’une clef constituée uniquement de bytes aléatoires ou renforcée par un mot de passe de votre choix. Le chiffrement se fait avec AES 256 avec une signature HMAC-SHA256 histoire d’empêcher les manipulations. C’est pas Truecrypt mais ça suffit pour cacher les conversations avec votre maitresse des yeux indiscrets de madame votre femme (ou inversement).

big mess

Avant d’utiliser SMailArchiver, ma gestion des emails ressemblait à ça… et mes cheveux étaient secs et cassants.

Le programme peut recevoir les paramètres nécessaires par la console, via des arguments ou via un fichier de config (regardez le fichier d’exemple dans le dépot).

$ python smailarchiver.py 
Enter your email username: foo@bar.com
Enter your imap server: imap.bar.com
Enter your password: 
Enc key: 6MIiWqNiJ4h1qDmp5Z4OpWKRLst7eAbirWOPHIm9zqk=
Sig key: 9JmR0593CWwtnJhRWqdLHk7tXvX/h6l6A2GLKA4iVq4=
$ python smailarchiver.py --user foo@bar.com --imap imap.bar.com --passwd monkey1 --key foo@bar.com.keys --promp --compress
Enter your encryption/signature password: 
Enc salt: KNwhv7kuNs0/iCZZTUyd05IuOylzG/n2oBALj1UMJ0c=
Sig salt: A99CxfzwRbU4P4lse6eN5O+g2wethRzL4gMH7xqFkgE=
Hash: oNcX7GAyHsS+bNOT8UCYAYM/ltCmx34E9Gmmpky02AE=
$ python2 smailarchiver.py -c config.json
Enter your encryption/signature password: 
Enc salt: m87TeE9fmr5XPf7yvN0w3PYOv3ivlNKpKGp35hC+N/k=
Sig salt: 2k9Wu5HBEo7G0J0EzlglOqV0Zko1LmhfiGnxD2QEzhE=
Hash: FA3TdkhWNZqy9BjGOk2UVZ6AeqgHSrparH3ynHdvj38=
$ python2 smailarchiver.py --decrypt foo@bar.com/ --key foo@bar.com.keys --promp
Enter your encryption/signature password: 
Decrypting 16.gz.mbox
Decrypting 11.gz.mbox
Decrypting 45.gz.mbox
...

Code évidement open source que vous pouvez trouver le code sur mon dépot gitorious. C’est compatible python 2.7 et plus (python 3 c’est l’avenir !) et nécessite pycrypto (qui est compatible python 2.1 et 3.2, j’imagine même pas le bordel que ça doit être). Mes tests très scientifiques type àvuedenezçapasse montrent que le programme fonctionne mais on est jamais à une erreur prêt, n’hésitez pas à me communiquer vos idées d’améliorations ou corrections.

PS: fait amusant concernant AES 256, saviez vous que l’énergie contenue dans une supernova ne suffirait pas rien que pour énumérer les 2²⁵⁶ états possibles (calcul non compris donc). A moins de trouver une faille de sécurité, il est donc impossible, avec les notions de la physique actuelle, de faire un brute force sur une clef AES 256. Source: Applied Cryptography, Bruce Schneier (extrait en question).

Gravatar de mart-e
Original post of mart-e.Votez pour ce billet sur Planet Libre.

Jonathan Le Lous : Charte Libre Emploi - Pour un emploi durable dans le logiciel libre

mercredi 19 décembre 2012 à 16:23

Bonjour,

Voici un projet qui me semble particulièrement pertinent pour valoriser notre écosystème d'entreprises (j'avoue je suis pas neutre ;-)). Comme toute charte elle a des qualités et des défauts mais a surtout le mérite d'exister !

Vous avez la possibilité de signer la charte en ligne !

A l’initiative de PLOSS, du GTLL et du CNLL et en étroite collaboration avec l’Irill, une Charte Libre Emploi a été lancée. Cette charte vise à promouvoir un emploi responsable dans le secteur des logiciels libres. Elle se base sur des engagements concrets qui favoriseront la reconnaissance des entreprises actives au sein de la communauté du logiciel libre.

Charte Libre Emploi

Elle doit ainsi permettre à des étudiants et aux professionnels désireux de travailler dans le domaine du logiciel libre de connaître les entreprises qui s’inscrivent dans une démarche durable au sein de l’écosystème:

  1. Fournir un environnement professionnel - système d'exploitation et logiciels applicatifs - libre à chacun de nos collaborateurs qui le souhaite.
  2. Favoriser la contribution de nos collaborateurs aux communautés du logiciel libre, notamment en encourageant la redistribution des modifications sur des logiciels libres existants effectuées dans le cadre notre activité.
  3. Participer, via nos collaborateurs et/ou un soutien financier, aux événements de l'écosystème du libre.
  4. Permettre à ses collaborateurs de se former tout au long de leur carrière sur des technologies libres afin de leur assurer une évolution professionnelle dans le domaine du libre.
  5. Lors du versement de la taxe d'apprentissage obligatoire, considérer en priorité les formations supérieures qui proposent un enseignement des méthodes, des techniques et des outils propres au logiciel libre.

Les signataires de la charte: Abilian, AF83, Alter Way, BibLibre, Altic, Capentis, Dotriver, Genymobile, Globalis, Hedera technology, HENIX, Inno3, Logical Soft, Logilab, Nereide, Nexedi, Open Wide, Oslandia, oXFoZ, Qualixo, Smile, Vifib, Zenika, Enalean, Objectif libre, Xwiki, Suse, Simple IT, No Parking

Plus d’informations, télécharger et signer la charte en ligne.

+++ Jonathan

Gravatar de Jonathan Le Lous
Original post of Jonathan Le Lous.Votez pour ce billet sur Planet Libre.

Artisan Numérique : VIM et les feuilles de style

mercredi 19 décembre 2012 à 01:22
VIM CSS mapping
VIM et les feuilles de style
Le 19 décembre, 2012 - 02:22 | Ulhume

Bien évidemment, VIM connaît déjà les fichiers CSS. Votre code sera coloriés et vous disposez de l'auto-complètement des propriétés ET de leurs valeurs par Control-x Control-o. Mais cet éditeur permet de faire tellement plus pour nous simplifier la vie qu'il serait dommage de ne pas pousser tout cela un peu plus loin...

Faire ses courses

Avant de commencer à personnaliser, voyons un peu ce qu'offre l'écosystème VIM concernant les feuilles de style.

  • Pour gagner un peu de temps, vous pouvez utiliser l'incontournable Snipmate pour définir des portions de code utilisées de manière récurrente.
  • Par défaut, VIM comprend la syntaxe CSS 2.0. Pour monter d'un cran, vous devrez installer un plugin comme VIM CSS3 Syntax qui est plutôt complet. Un autre plugin sans doute plus léger, Better CSS Syntax for VIM. C'est celui que j'utilise. En revanche, cela va upgrader la syntaxe (colorisation), mais pas l'auto-complètement.
  • vim css color va quant à lui générer dynamiquement le rendu visuel des couleurs que vous saisissez. Ainsi, sous gVim, #FF0000 apparaîtra en rouge, #00FF00 en vert, etc. Attention cependant, cela peut vite devenir lourdingue avec des fichiers CSS fleuves ;-). Une version alternative à ce plugin est Color Highlight qui lui fonctionne avec tous les types de fichiers. Il suffit de tapper LEADER cC pour activer/désactiver la colorisation. Et cerise sur le gâteau, il fonctionne aussi avec Vim en mode terminal (aux approximation prés évidemment).

Configuration d'un plugin pour le type de fichier CSS

Bon tout ceci est bien beau, mais comment aller un peu plus loin et ajouter sa touche perso là-dedans.

Comme vous le savez peut-être déjà, VIM dispose d'un mécanisme bien pratique permettant de déclarer un script qui se lancera uniquement à l'ouverture d'un type de fichier donné. Ce genre de script est à ranger dans le dossier ~/.vim/ftplugin/.

Pour que ceci fonctionne, il faut que vous ayez Proprement configuré vim avec la ligne suivante dans votre ~/.vimrc

filetype plugin indent on

Définition des mots-clefs

Première chose qui agace, la sélection d'un sélecteur sous le curseur ne prend pas le # ou le .. La sélection d'un mot en VIM, consiste à taper la commande viw (v passe en sélection visuelle, et iw pour Inner Word). Un raccourcis connu de cette sélection consiste à double-cliquer sur le mot.

Le concept de "mot" en VIM, est régit par le réglage iskeyword. Ce réglage contient tous les caractères qui définissent un mot. Nous allons donc y ajouter les caractères -, # et .. Pour cela, nous allons créer notre fichier ~/.vim/ftplugin/css.vim

setlocal iskeyword+=.,-,#

Notez l'usage de setlocal au lieu du classique set qui permet d'appliquer le réglage uniquement sur le buffer en cours. Ensuite le += qui permet non pas d'écraser ce que contient déjà le réglage mais juste d'y ajouter des choses. Et enfin les 3 caractères séparés par des virgules.

Une fois le fichier sauvegardé, il vous suffit de retourner sur le fichier CSS et de forcer sa relecture (commande e!) pour que le ftplugin/css.vim soit lu et la variable définie pour le buffer. Maintenant si vous double-cliquez sur un sélecteur, il doit être sélectionné en entier.

Contracter - Décontracter

En bon développeur Java de base, lorsque je voyais des fichiers CSS arriver avec toutes les propriétés d'un sélecteur sur une seule ligne, je hurlais au scandale. Avec le temps je me suis rendu compte que c'était finalement bien pratique comme notation, sous réserve de pouvoir facilement développeur une ligne puis la re-compresser.

/* version compressée */
#mon-selecteur { border:1px solid red; background-color:green }

/* version décompressée */
#mon-selecteur {
  border:1px solid red;
  background-color:green
}

Nous allons donc créer deux mappings permettant d'effectuer ces opérations. D'abord la compression :

map <buffer> Π/}<CR>V?{<CR>J:let @/=""

le choix de Œ (aka Shift-œ) est très personnel. C'est la touche au dessus du Tab qui ne me sert pas à grand chose en mode "normal".

La commande map permet de définir un mapping, c'est à dire la correspondance entre une série de touches (ici œ) et un série de commandes. Vous pouvez voir cela comme une macro car vous pourriez aussi bien taper tout ce qui suit après le œ à la main.

map s'applique au mode "normal" de VIM. C'est à dire que la touche œ reste disponible en mode "insertion" (ouf ! ;-).

silent demande à VIM de ne pas afficher chaque séquence composant la macro. Enfin buffer indique à VIM que ce mapping doit être local au buffer en cours. Cette macro ne fonctionnera donc que dans un fichier CSS.

Maintenant voyons la macro à proprement parler. /} demande à VIM de chercher (/) l'accolade qui suit le curseur. Le CR indique un retours chariot, comme vous le feriez au clavier.

La commande V passe en mode "sélection visuel par ligne". La commande ?{ fonctionne comme /} mais à l'envers. C'est à dire que VIM va chercher la première accolade ouvrant qui se trouve avant le curseur. Comme on est en mode visuel, cela revient à sélectionner toutes les lignes entre les deux accolades, celles-ci comprises.

La commande J va fusionner les lignes de la sélection et tout mettre donc sur une seule. J a en plus le bon goût de compresser les espaces de sorte à n'en laisser qu'un seul entre chaque fusion. Ainsi nous compressions les éventuelles indentations.

Pour finir, la commande :let @/="" affecte une chaine vide au registre de recherche /. Ce n'est utile que si vous avez activé la colorisation de la recherche par set hlsearch.

Pour la décompression de la ligne, le travail est un peu plus simple.

map <buffer> œ V:s/\\v[{;]\\s*/\\0\\r<CR>V%=:let @/=""

La commande V passe en mode visuel et sélectionne du coup la ligne à décompresser. Ensuite une simple commande de remplacement pour rajouter des retours chariot après les ; et les {. Petites astuces, le \\v permet de contraindre VIM à ne pas utiliser son mode "magique" pour les expressions régulières, adoptant ainsi une syntaxe plus classique et plus simple (à mon goût). Enfin \\0 renvoie ce qui a été trouvé, soit ; ou { selon les cas.

Pour terminer, V%=. Vous l'aurez maintenant compris, le V passe en sélection par ligne. La commande % permet de sauter d'une accolade à l'autre. Comme le traitement précédent s'achève sur l'accolade finale, ça va sélectionner le bloc de propriétés décompressées. Enfin le = permet de ré-indenter le bloc de code. Le mapping se termine ici aussi sur un let @/="" pour vider le registre de recherche.

C'est toujours assez impressionnant de voir le volume de texte nécessaire pour décrire une simple série de commandes VIM :-).

Gérer les "vendor-prefixes"

Si vous manipulez régulièrement des feuilles de styles, je ne vais pas présenter les -moz-machin-chose et autre joyeusetés qui les polluent régulièrement. Vous savez déjà que c'est un petit enfer à gérer car on se retrouve à décrire 10 fois le même comportement, une fois par navigateur et parfois par version de navigateur.

Pour les vendor prefixes qui correspondent à des propriétés CSS 3.0 (box-shadow, linear-gradient, etc.), il existe un petit outil bien pratique, cssprefixer, qui permet de n'avoir QUE le CSS3 à saisir, cette moulinette se chargeant de compléter avec tout le reste. Magique et bien moins casse-figure que des outils en javascript comme prefixfree.

CssPrefixer a cependant deux soucis. Le premier est qu'il n'aime pas qu'il y ait déjà des vendor prefixes avant d'opérer. Le second est qu'il ne bosse que sur des fichiers css et nom sur des portions.

Nous allons commencer par un petit mapping pour supprimer mes -moz-machin-chose.

map <buffer> - /}<CR>V?{:g/\\v-(moz\\|webkit\\|o)-/d<CR>

Cette fois le mapping est associé à la touche - (pour "supprimer les préfixes"). Le début est le même que pour la compression. La différence ici est la commande :g qui au lieu de substituer va appliquer une commande à toutes les lignes qui vont être trouvées. Ici la commande est d pour "supprimer". Ce mapping va donc, curseur placé dans un bloc de propriétés contenant des vendor prefixes, les supprimer sans pitié.

Maintenant pour le mapping qui va faire appel à cssprefixer :

map <buffer> + -:call writefile(split(@*,"\\n"),"/tmp/css-source")<CR>gv!cssprefixer /tmp/css-source<CR>

Bon c'est du lourd, petite explication :-)

Commençons par la commande - qui n'est autre que notre précédent mapping de suppression de vendor prefixes. On aurait pu faire un seul mapping mais il est pratique de pouvoir "nettoyer" ainsi les blocs des préfixes parasites, ne serait-ce pour y voir clair.

Suit la commande :call writefile(split(@*,"\\n"),"/tmp/css-source"). C'est la fameuse création de fichier (writefile). Les données de ce fichier sont issues du registre *, celui de la sélection. @* renvoie le contenu de ce registre (comme @/ vu plus haut). Quelle sélection me direz-vous ? Et bien celle crée par le mapping - pardi :-)

Ensuite nous faisons appel à la commande gv qui rend à nouveau active cette fameuse dernière sélection (très pratique !!). Ensuite nous appelons la commande cssprefixer avec le fichier temporaire en paramètre. Le bang ! utilisé sur une sélection, permet de remplacer la dite sélection par le texte renvoyé par la commande. Le tour est donc joué.

Conclusion

Vous l'aurez compris, le thème "CSS" de cet article est avant tout un prétexte pour présenter ce que l'on peut faire avec VIM. Tout ce qui se trouve ici peut être appliqué à n'importe quel type de fichier pour fluidifier au mieux votre workflow. De même toute les commandes encapsulées dans mappings peuvent être utilisées individuellement pour votre édition quotidienne.

Maintenant, je m'arrête un peu avant l'indigestion, mais il y aurait encore pas mal de chose à dire. Il est ainsi possible de modifier l'auto-complètement de VIM juste pour le CSS de sorte à déclencher sur une propriété *-color: l'affichage d'un sélecteur de couleur. Il est aussi possible de connecter VIM et firefox de sorte à ce qu'en pressant F5 dans une feuille de style, cela recharge juste cette feuille dans le navigateur. Si cela vous intéresse je pourrais vous en parler une prochaine fois.

Gravatar de Artisan Numérique
Original post of Artisan Numérique.Votez pour ce billet sur Planet Libre.

Articles similaires