Le blog de Passionaqua

Mon p'tit chez moi où je raconte des p'tites choses

Essai et installation de Gogs, votre futur front-end pour Git

Rédigé par Passionaqua.Web Aucun commentaire

Attention, cet article est assez vieux et peut ne plus être d'actualité.

Logo de Gogs J'ai de plus en plus envie de m'auto-héberger, c'est vrai pour une partie de mes services web, comme mon lecteur de flux RSS.

Comme tout bon développeur, ahem, j'utilise un système de gestion de versions de fichiers, pour ma part je suis friand de git.

Tout le monde connait Github, qui ne permet que des dépôts publics pour les utilisateurs n'ayant pas de compte payant, sans parler du fait que le coeur de Github n'est pas open-source ni libre de droit, du coup. Il y a aussi Bitbucket sur le marché, qui eux propose des dépôts privés gratuitement.

Il existe aussi quelques autres gestionnaires de dépôts git, généralement associatif, mais je ne compte pas en parler ici.

Aussi, il y a quelques semaines Google a émis sa décision de fermer Google Code, qui faisait partie au même titre que SourceForge ou Github du club des gestionnaires de versions / espaces de téléchargements de vos logiciels libres préférés.

Framablog en a profité pour annoncer l'ouverture de sa forge, basée sur Gitlab.

C'est à ce moment là que je me suis rappelé que mon code est sur Github ou Bitbucket pour mes projets "secrets" et que j'ai entrepris la recherche d'une solution alternative auto-hébergée à ces piliers du web.

Après mes recherches, j'ai tenté l'utilisation de git avec un front-end cgit, que je n'ai pas réussi à installer. J'ai voulu orienter mes envies vers Gitlab, mais il s'est avéré que son utilisation sur un Raspberry Pi est impossible : trop lourd.

Je me suis rabattu sur son petit cousin : Gogs. Il est écrit en Golang (oui oui le langage de Google) et n'est pas trop lourd pour fonctionner sur mon Raspberry Pi. L'installation demande juste un peu de temps, mais cela vaut le coup puisque vous obtiendrez une interface assez similaire à Github.

Découverte de Gogs

Screenshot de Gogs

Gogs est présenté sur son site comme étant "A self-hosted Git service written in Go" que l'on peut traduire en « Un service Git auto-hébergé écrit en Go ». Vous pouvez l'essayer sur une instance de démonstration. Les principaux points indiqués en page d'accueil sont les suivants :

  • Simple à installer : il y a des binaires d'installation, voire même des paquets. (On verra plus tard que pour le Raspberry Pi c'est particulier)
  • Multiplateforme : Gogs étant en Go, tant que Go peut être compilé, Gogs peut fonctionner ! Windows, Mac, Linux, ARM ...
  • Léger : peu d'exigence système, et c'est vrai, mon Raspberry Pi n'est pas ralenti !
  • Open-source : OUI OUI et OUI. Le tout est sous licence MIT, les sources sont sur GitHub.

Après une rapide utilisation, Gogs est vraiment simple à prendre en main si on a déjà utilisé GitHub.

Installation de Gogs sur un Raspberry Pi

Je vais détailler l'installation de Gogs sur un Raspberry Pi (B+ dans mon cas, mais normalement ça ne change rien). Pour les autres possibilités d'installation je vous propose d'aller sur le site officiel, il y a des binaires.

Dans un premier temps on va réserver un compte sur notre Raspberry Pi pour l'instance Gogs.

$ sudo adduser git #Crée l'utilisateur git

Ensuite il faudra installer MySQL et Git si ce n'est toujours pas le cas (sudo apt-get install mysql-server git). Pendant que l'on parle de MySQL, vous pouvez créer un compte pour Gogs et sa base de données, en utf8.

Installation de Golang

Pour installer Golang il va nous falloir nous connecter en tant que l'utilisateur git, puisque nous devons compiler Golang.

$ su - git #Se connecte en tant que git
$ cd ~/ #On revient à la racine de git
$ mkdir local && cd ./local

Puis on va chercher les sources :

$ git clone https://go.googlesource.com/go
$ cd go
$ git checkout go1.4.2

Il faut à présent lancer la compilation de Golang, qui est très longue sur le Raspberry Pi (1h environ).

$ cd src
$ ./all.bash

Une fois que c'est compilé, il faudra rajouter quelques variables d'environnements dans le bashrc de l'utilisateur git :

export GOARM=5 #lignes à rajouter à la fin de ~/.bashrc
export GOROOT=$HOME/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

N'oubliez pas de faire un p'tit source ~/.bashrc pour recharger les variables.

Maintenant on peut vérifier si Golang fonctionne, pour cela on va demander sa version :

$ go version

Si vous obtenez go version go1.4.2 linux/arm ou quelque chose de similaire, alors c'est tout bon. :)

Compilation de Gogs

Maintenant, on va s'occuper de l'installation de Gogs.

$ go get -u github.com/gogits/gogs
$ cd $GOPATH/src/github.com/gogits/gogs
$ go build

Cela va télécharger Gogs puis le compiler. :)

Configuration

La configuration s'effectue en ligne. Au premier démarrage du serveur, on nous redirigera obligatoirement vers une page d'installation.

Déjà, on va lancer le serveur !

$ cd /home/git/go/src/github.com/gogits/gogs
$ ./gogs web

Maintenant on peut accéder à la page en allant à l'adresse http://ip.de.votre.raspberry:3000/, notez bien le port 3000.

La page d'installation doit s'afficher. Vous devrez choisir le type de BDD et des informations relatives à cette dernière, le Repository Root Path qui est le lieu où seront enregistrés les repos' Git, le domaine éventuellement et l'URL de Gogs. Ensuite, des informations relatives à l'administration (nom d'utilisateur, mot de passe, etc).

Pour ma part, Repository Root Path a pour valeur /Linukey/git_repos/, qui correspond à un dossier dans une clef USB. Run User a pour valeur git, Domain a pour valeur quelque chose similaire à git.passionaqua.me et l'URL a pour valeur https://git.passionaqua.me/gogs/ (j'ai de l'HTTPS sur ce domaine).

L'URL donnée sera la future adresse qu'aura Gogs, puisque je vais montrer comment faire passer Gogs via NGinx.

Configuration de NGinx

Pour cela, il faut modifier le fichier de configuration NGinx de votre site (dans mon cas /etc/nginx/sites-available/git.passionaqua.me).

Il faudra donc ajouter ces lignes :

location /gogs/ {
    proxy_pass http://127.0.0.1:3000/;
}

Elles indiquent que tout ce qui passe par /gogs/ devra passer par Gogs.

Et un service pour gérer le bouzin ?

Gogs nous fourni déjà des services tout fait pour Debian ! Donc totalement compatible avec un Raspberry Pi.

Pour commencer, toujours en tant qu'utilisateur git, il faut copier le script d'init :

cd ~
cd $GOPATH/src/github.com/gogits/gogs/scripts/init/debian/gogs ./gogs.init

Il faut maintenant configurer un peu plus le code avec un p'tit coup de nano ~/gogs.init.

Faites les changements suivants :

# Required-Start:    $syslog $network $local_fs nginx postgresql
# Required-Stop:     $syslog $local_fs

et aussi :

WORKINGDIR=/home/git/go/src/github.com/gogits/gogs

Maintenant il n'y a plus qu'à mettre le petit fichier dans la pile init :

# On retourne à l'utilisateur "normal" pi
exit
# Bouge le fichier et met à jour la pile init
sudo mv /home/git/gogs.init /etc/init.d/gogs
sudo chmod ug+x /etc/init.d/gogs
sudo update-rc.d gogs defaults 30 70

Maintenant vous pouvez gérer Gogs avec un p'tit sudo service gogs start, avec start, restart et stop comme option possible.

J'espère que ce petit tutoriel vous a bien aidé ! :)

SOURCES :

Les commentaires sur un site statique : Isso ?

Rédigé par Passionaqua.Web Aucun commentaire

Attention, cet article est assez vieux et peut ne plus être d'actualité. NB: ce moteur de commentaire n'est plus utilisé chez moi.

Et oui ! Quand on passe à un blog statique, on a bien évidemment plus de gestion "automatisée" des commentaires ! Il y a alors plusieurs choix qui s'offrent à vous :

  • Vous laissez une adresse mail à laquelle les visiteurs vous laissent un commentaire, et vous le mettez manuellement sur le billet concerné.
  • Vous installez une solution qui aime beaucoup les données de vos visiteurs comme Disqus.
  • Vous faites comme moi, et beaucoup d'autre, vous installez une solution qui respecte la vie privée de vos visiteurs.

Mon choix s'est donc tourné vers Isso, un serveur de commentaires en Python créé par Martin Zimmermann.

Capture d'écran de Isso
Exemple d'utilisation d'Isso

Qu'est-ce qu'a Isso dans le ventre ?

Isso c'est :

  • Léger
  • Des commentaires en Markdown
  • La possibilité de poster anonymement
  • Une base de données en SQLite, argument du développeur : « Les commentaires ne sont pas de grandes données »
  • Pas fait pour des sites à très fort trafic, genre 01Net, nop nop nop : à voir plus bas, il est préférable d'avoir, malheureusement, une instance Disqus.

L'utilisation d'Isso peut perturber au début, mais une fois pris en main et bien configuré, vous pouvez presque l'oublier !

Installation de Isso

Pour l'installer, c'est plutôt simple : c'est du Python, on fait simplement appel à PyPI ! Vous pouvez trouver la documentation officielle, en anglais, en cliquant ici.

Il faut quelques outils utiles à Python et à la compilation d'outils annexes, dans un premier temps :

apt-get install python-setuptools python-virtualenv python-dev sqlite3 build-essential #commande à exécuter sous root

Puis on crée l'environnement virtuel :

virtualenv /chemin/ou/vous/voulez/installer/isso
source /chemin/ou/vous/voulez/installer/isso

Il faut ensuite passer par pip :

pip install isso

On peut créer un symlink si vous le désirer, pour pouvoir lancer plus facilement Isso si besoin :

ln -s /chemin/vers/isso /usr/local/bin/isso #Commande à exécuter sous root

Pour faire une mise à jour, elles sont publiées régulièrement (entre autre quand vous faites remonter des bugs sur le Github du projet), il suffit de re-rentrer dans l'environnement, puis de faire appel à pip :

source /chemin/vers/linstallation/isso
pip install --upgrade isso

Configuration d'Isso

La configuration d'Isso repose sur un fichier au format INI. Pour ma part, après avoir lue la partie configuration du site officiel, j'ai fait ma petite sauce.

Voici donc mon fichier isso.cfg, je l'ai commenté donc il devrait être compréhensible :

[general]
; Le chemin vers la base de donnée SQLite, si le fichier n'existe pas il sera créé
dbpath = /home/pi/isso/blog.passionaqua.me.comments.db

; Le nom de l'instance Isso
name = blog.passionaqua.me

; Les noms de domaines autorisés : mes adresses de tests, et l'adresse du blog
host =
    http://localhost:5001/
    http://192.168.1.12:5001/
    http://blog.passionaqua.me/

; Je veux recevoir les notifications par EMAIL (pour avoir les liens de suppression entre autre)
notify = smtp

; Le temps de modification autorisé d'un commentaire, par son auteur
max-age = 1h

[moderation]
; Si activé, il faudra que vous validiez les commentaires pour qu'ils soient publics.
enabled = false

; Purger les non-validés au bout de 30 jours, dans ce cas inutile, puisqu'ils sont tous validés par défaut.
purge-after = 30d

[guard]
; Permet de limiter des actions par IP : un antispam simple on va dire.
enabled = true
ratelimit = 3
direct-reply = 3
reply-to-self = true

[smtp]
; Cette partie est simple : ce sont les paramètres d'accès pour SMTP.
username = w*****@passionaqua.me
password = MOTDEPASSE
host = mail.gandi.net
port = 465
security = ssl
to = w*****+commentairesblog@passionaqua.me
from = w*****@passionaqua.me
timeout = 10

Vous devez donc avoir un fichier de configuration similaire au mien à présent, je vous conseille aussi de lire la section à props de la configuration du serveur pour pouvoir ajouter ou modifier si besoin des paramètres !

Importation des commentaires de votre ancien blog

Quelque chose de bien sympa, vous pouvez importer les commentaires de Disqus ou Wordpress au format XML !

Je n'en ai pas eu besoin personnellement, n'ayant pas de commentaires au format XML. Et j'avais un peu la flemme de retranscrire les 5 commentaires que j'avais en XML. :p

isso -c /chemin/vers/isso.cfg import disqus-or-wordpress.xml

Lancement d'Isso

Le lancement est simple, suffit de lui demander de se lancer !

isso -c /chemin/vers/isso.cfg run

Ensuite, il faut rendre Isso accessible depuis l'extérieur. Pour cela, la documentation nous propose de faire un proxy NGinx, ayant un serveur NGinx je n'ai pas hésité plus longtemps !

En effet, Isso repose sur le contrôle d'accès HTTP, d'où le fait de mettre une liste de host autorisé dans la configuration d'Isso !

Il faut donc créer un host spécial, pour moi c'est commentaires.passionaqua.me : il vous faut créer un sous nom de domaine chez votre Registrar (ou hébergeur de vos DNS) qui pointe sur votre serveur où Isso est installé, etc. Ensuite, j'ai donc créé un fichier /etc/nginx/sites-available/commentaires.passionaqua.me :

server {
        listen 80;
        server_name commentaires.passionaqua.me;

        location / {
                proxy_pass http://localhost:8080;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-Proto $scheme;
        }
}

proxy_pass a pour valeur localhost:8080, parce qu'Isso écoute par défaut sur le port 8080. Il faut activer votre nouveau host, en faisant un lien : ln -s /etc/nginx/sites-available/commentaires.passionaqua.me /etc/nginx/sites-enabled/commentaires.passionaqua.me.

Intégration

Et pour finir : on intègre un p'tit bout de code à la fin de votre template qui gère les billets.

<script data-isso="//comments.example.tld/"
    src="//comments.example.tld/js/embed.min.js"></script>

<section id="isso-thread"></section>

Il faut penser à modifier les URL dans le code, pour les faire pointer sur votre Isso à vous.

Utiliser Isso

L'utilisation d'Isso est assez spéciale, je parle ici de la partie modération. En effet, Isso est très léger et assez jeune : il ne comporte pas de panel admin, même si l'idée est dans les cartons du développeur. Ce sera peut-être pour un jour ? :D

Anyway, vous avez dû le remarquer, dans ma configuration j'ai décidé de recevoir une notification par mail, pour pouvoir recevoir les urls pour supprimer, si besoin, un commentaire n'ayant pas d'utilité (genre un truc sur le Viagra).

Capture d'écran d'un mail
Exemple de mail

Voilà donc le genre d'email que vous pouvez obtenir, vous apercevez dans l'ordre :

  • Le nom avec l'adresse mail (s'ils ont été fourni),
  • Le commentaire posté,
  • L'adresse du site de l'auteur, si elle a été fourni,
  • L'adresse IP de l'auteur,
  • Le lien pour aller voir le commentaire sur le site,
  • Le lien pour supprimer le commentaire.

Pour aller plus loin

Concrètement, si vous allez sur votre site Internet, vous devriez pouvoir voir un formulaire de commentaire s'ouvrir. Vous pouvez le personnaliser, notamment via les attributs data-isso. Ce système est expliqué dans la documentation ici. Ensuite, il faut que Isso se lance à chaque démarrage de votre serveur, pour cela il suffit de faire un init script, moi j'ai une façon de le faire assez sommaire donc je ne vais pas vous en parler, mais vous avez de bons exemples ici. Pour une utilisation d'Isso sur un serveur à fort trafic, le développeur conseille d'avoir une vraie interface web, il explique tout ça ici.

J'espère avoir réussi à vous présenter ce serveur de commentaires, que je trouve vraiment sympathique : il est léger, rapide et fait ce qu'on lui demande. :)

Mon passage à PyKwiki

Rédigé par Passionaqua.Web Aucun commentaire

Attention, cet article est assez vieux et peut ne plus être d'actualité. CE BLOG N'UTILISE PLUS CE MOTEUR DE RENDU, mais je laisse quand même une trace de mes anciens écrits.

Voilà, c'est maintenant fait. Je suis passé à un format statique pour mon blog. L'intérêt est multiple : pour moi, je trouve ça juste plus fun, mais ça me permet aussi de réduire la charge serveur au niveau du blog. Je vais peut-être pouvoir déplacer mon blog dans ma chambre, sur mon Raspberry Pi !

Donc ton blog, il tourne avec quoi là ?

Concrètement, juste un serveur HTTP. Pour ce faire, j'utilise PyKwiki, que j'ai découvert grâce à Julien Biaudet, qui a migré son blog Hal-9000.fr sous ce moteur de blog.

Utilisation de PyKwiki

PyKwiki, c'est simple : vous écrivez vos articles en Markdown puis vous exécutez PyKwiki qui génèrera le site HTML.

Il faut commencer par installer PyKwiki avec un simple # pip install pykwiki, ensuite il faut créer son projet avec $ pykwiki new TonProjet. Cette commande va créer l'environnement de base de votre projet.

Par la suite, il suffit d'aller dans le dossier créé TonProjet si on reste avec l'exemple. L'architecture est assez simple :

  • un dossier docroot/, qui est la racine à mettre sur Internet. Vous pouvez uploader le contenu du dossier sur un serveur, ou configurer un VirtualHost (ou autre, selon le serveur) qui pointe sur ce dossier.
  • un dossier source/, dossier qui contiendra vos fichiers .md, c'est-à-dire vos billets. Je vous conseille de nommer les fichiers en y indiquant la date, ça pourrait être plus pratique pour s'y retrouver.
  • un dossier themes/, qui contient le thème par défaut de PyKwiki. Je vous parle plus bas des thèmes.
  • Trois fichiers de configuration config.yaml, links.yaml et social.yaml. Ces trois fichiers servent simplement à configurer différents aspects de PyKwiki, comme les titres, descriptions, extension de fichiers, le menu et les différents liens sociaux.

Je vous fait part de mon petit problème avec Vim, qui ne me faisait pas du markdown syntax highlight pour les fichiers en .md, puisqu'il le fait par défaut que sur les .markdown. Il suffit de faire un :set syntax=markdown ou plus généralement d'éditer le .vimrc en y ajoutant cette ligne :

au BufRead,BufNewFile *.md set filetype=markdown

Configuration de PyKwiki

Les paramètres par défaut devrait fonctionner, mais c'est plus sympa d'avoir quelque chose de propre à soi même ! Concernant le fichier config.yaml je n'ai pas modifié grand chose à part author, description, keywords et title.

Pour avoir la page d'accueil avec la liste des posts, il faut initiliser home_page avec posts.html.

Concernant links.yaml, la structure est très simple : le nom du lien à afficher, le type d'URL (si c'est un post, mettre post: NomDuPost ; une adresse, href: /cequejeveux.html). Je vous laisse vous référer à la documentation sur links.yaml pour plus d'options.

Ensuite, pour social.yaml c'est assez simple à remplir, il suffit de remplacer la valeur null en face des variables que vous souhaitez remplir, ce qui donne par exemple twitter_name: passionaqua dans mon cas. À noter que l'on peut renseigner des IDs Google Analytics, il serait intéressant de voir s'il est possible de modifier tout ça pour avoir Piwik à la place !

Les thèmes

Pour les thèmes, c'est simple, jetez un oeil sur la page les mettant en avant sur le site officiel, choisissez en un et faite un simple $ pykwiki theme install <nom du thème>. Il faut penser ensuite à modifier config.yaml pour sélectionner le thème !

Pour exécuter PyKwiki, il suffit de faire $ pykwiki cache. Vous pouvez visualiser rapidement le résultat en faisant fonctionner un serveur HTTP Python : dans le dossier docroot/ exécuter $ python -m SimpleHTTPServer 5000 puis se rendre à l'adresse http://localhost:5000/.

Voilà c'est tout pour moi, je vous laisse jeter un oeil sur le site de PyKwiki pour de plus larges informations. :)

Un client mail : Mutt

Rédigé par Passionaqua.Web Aucun commentaire

Attention, cet article est assez vieux et peut ne plus être d'actualité.

Bonjour à tous !

Cela fait un millénaire que l'on me dit sur les chans IRC ou les muc XMPP que Mutt ça rox du poney. Je veux bien croire ces personnes, mais d'abord je dois me convertir !

On ne change pas ses habitudes en claquant des doigts, même si je suis habitué à une interface en ligne de commande. :D

Qu'est-ce que Mutt ?

Mutt.png
Capture d'écran de « Mutt ».
Sous licence GPL via Wikimedia Commons.

Mutt est un client mail créé en 1995 par Michael Elkins et est publié sous licence GPLv2+ (GPLv2 et supérieure). Ce client mail s'utilise comme je l'ai dit plus haut, dans votre terminal. Il supporte nativement la plupart des protocoles ainsi que GPG/PGP et maildir. Je vous laisse voir par vous même sur le site officiel ou sur la page Wikipédia pour de plus amples informations. :)

Pourquoi ne pas avoir changé de client mail plus tôt ?

La réponse est simple : qui aujourd'hui n'a qu'une seule boîte mail ? C'est très loin d'être mon cas. Le multi-comptes avec Mutt est possible, mais assez difficile à mettre en place si on ne trouve pas de tutoriel qui correspond aux versions récentes de Mutt (il existe des tutos qui datent de 2005, je ne sais pas si vous voyez ô comment c'est utile). Bref, après avoir remué toute la toile à la recherche d'un tutoriel ou de quelques informations qui pourraient m'aider, j'ai enfin trouvé bonheur ! Du coup, je viens partager ma découverte avec vous. :D

Dans un premier temps, il faut installer Mutt (sans blague !) via votre gestionnaire de paquets, ou toute autre manière.

# apt-get install mutt

Vous pouvez dans votre terminal lancer Mutt en l'appelant tout simplement par son nom : $ mutt. Il devrait normalement ronchonner ou essayer d'ouvrir les maildirs : c'est normal, rien n'a été configuré !

Pour configurer la bête, il faut utiliser des fichiers de configurations. Par défaut, Mutt va vouloir charger le fichier ~/.muttrc. Ouvrez ou créez ce fichier et rentrez ces informations :

#Folder hooks, ce sont vos différentes boîtes mails
folder-hook 'adrienpassionaqua.me' 'source ~/.mutt/adriepassionaqua.me'
folder-hook 'contactpassionaqua.me' 'source ~/.mutt/contactpassionaqua.me'

#On set les macro, pour pouvoir basculer entre les boîtes !
# <f2> et <f3> correspondent aux touches que j'ai attribué
macro index <f2> '<sync-mailbox><enter-command>source ~/.mutt/adrienpassionaqua.me<enter><change-folder>!<enter>'
macro index <f3> '<sync-mailbox><enter-command>source ~/.mutt/contactpassionaqua.me<enter><change-folder>!<enter>'

#Ensuite on choisi quelle boîte devra être chargée par défaut :
source ~/.mutt/adrienpassionaqua.me

Pensez à modifier les noms de fichiers pour qu'ils correspondent à vos comptes, ici j'ai pris user+domain pour les reconnaître facilement.

Ensuite, le travail consiste à configurer les boîtes mails : il faut créer le dossier ~/.mutt ainsi que les fichiers que vous avez mis dans le muttrc. Voici ce que cela donne pour ~/.mutt/adrienpassionaqua.me :

color status cyan default #Correspond au thème utilisé pour cette boîte, pour mieux les distinguer.

# IMAP
set imap_user = '__USER__'
set imap_pass = '__PASSWORD__'
set folder = imaps://mail.gandi.net:993/
set realname = "Adrien ______"
set from = "tonmail@machin.tld"
set use_from = yes
set spoolfile = "+INBOX"
set postponed ="+Drafts"
set record = "+Sent"
set trash = "+Trash"

#Si vous utilisez PGP, pour fournir votre clef.
set my_header = "X-PGP-Key: http://passionaqua.me/public.asc"

# SMTP
set smtp_url = "smtp://user%40passionaqua.me:__PASSWORD__@mail.gandi.net:587"

L'exemple montre une connexion sur un compte chez Gandi. :)

Pour configurer votre deuxième compte, faite de même (ou à peu près, suivant les fournisseurs mails, je vous laisse regarder sur Internet pour le comment faire. Vous pouvez utiliser la couleur : color status green default pour vous y retrouver. :)

À présent, si vous lancez Mutt, en appuyant sur la touche F3 et F2 vous pourrez changer de boîte presque instantanément. :)

Voilà pour cet article, je n'ai pas fait à vrai dire un article "clef en main" pour utiliser Mutt, mais j'ai montré comment on peut faire un multi-comptes dans Mutt.

Source qui m'a aidé à faire mon multi-comptes chez moi : https://gist.github.com/miguelmota/9456162

Fil RSS des articles de ce mot clé