Planet Asrall

January 20, 2019

Florent Peterschmitt

Namasté Népal - #4.2

Article précédent

La suite des photos de montagne, le 23 avril 2017 ^^

photo photo photo

Notre pote singe blanc de la vielle ? Nah, il y en avait tout de même plusieurs ^^

photo photo

La personne en bas à droite c’était mon guide. On parlait tout deux suffisemment d’anglais pour pouvoir discuter de choses et d’autres, de la situation du pays, de sa vie etc…

photo photo photo photo photo photo

On commence à sortir de la forêt où la température était écrasante et l’absence de circulation d’air rendait la marche franchement difficile.

Maintenant c’est tout l’inverse : le vent souffle et il est froid ! Je me suis sévèrement enrhumé à ce moment là d’ailleurs… avec fièvre et tout le tintouin.

photo photo photo

photo photo photo photo photo photo

Sur les prochaines photos, on observe ce qu’il reste de la montagne qui s’est effondrée lors du tremblement de terre du 25 avril 2015 dans le pays.

Un village d’environ 200 habitants a été rasé et beaucoup y sont morts.

photo photo photo

Le village a été reconstruit plus haut et c’est là qu’on passera la nuit.

photo

Article suivant

by Florent Peterschmitt at January 20, 2019 08:30 PM

January 14, 2019

Luc Didry

Instal­ler un serveur Bitwar­den_rs

Avoir des mots de passe solides, c’est bien (et même indis­pen­sable), mais s’en souve­nir… c’est dur. On serait tenté de tout enre­gis­tré dans son navi­ga­teur, avec un mot de passe maître pour stocker les mots de passe de façon chif­frée mais… Fire­fox par exemple a un système de chif­fre­ment par mot de passe maître tout pourri.

Il existe un paquet de gestion­naire de mot de passe libre. Évacuons tous ceux basé sur KeePass ou ses succes­seurs : pour utili­ser ses mots de passe sur un autre PC ou sur son télé­phone, il faut synchro­ni­ser le fichier conte­nant les mots de passe et s’il y a un souci de synchro et que le fichier se retrouve corrom­pu… paf, pastèque !.

J’ai essayé Pass­bolt ou encore l’ap­pli­ca­tion Pass­man de Next­cloud mais quand j’uti­li­sais la sécu­rité maxi­male qu’ils propo­sent… mon Fire­fox plan­tait (oui, quand on me propose des réglages de parano, je les utilise). Sans comp­ter qu’ils ne proposent pas d’ap­pli Android.

Et puis, j’ai testé Bitwar­den. Et c’est pas mal du tout, mais… c’est du C# et ça utilise une base de données SQL Server. Deux trucs Micro­soft.

Bon, passant outre mon aver­sion, j’ai testé. Dans du Docker (quand je vous dis que je suis passé outre mon aver­sion !). C’était pas mal du tout.

Mais en voulant tester le partage de mot de passe (dans l’hy­po­thèse d’une utili­sa­tion chez Frama­soft), j’ai rencon­tré une limi­ta­tion : pour créer une orga­ni­sa­tion (un groupe de personnes qui se partagent des mots de passe) de plus de deux personnes, il faut payer, même quand on héberge soi-même le serveur Bitwar­den. Pourquoi pas. C’est un busi­ness model comme un autre (mais bon, grmpf).

Par contre, les tarifs, c’est un très gros grmpf : 3 dollars par utili­sa­teur et par mois. Pour Frama­soft, cela ferait 3$ * 35 personnes * 12 mois = 1 260$ par an. Y a un autre plan qui pour­rait conve­nir, qui nous revien­drait à 780$ par an. C’est quand même pas négli­geable (surtout pour une asso­cia­tion qui ne vit quasi­ment que de vos dons) alors qu’on héber­ge­rait nous-même le service.

J’avais laissé tombé quand ces derniers jours, une implé­men­ta­tion en Rust de Bitwar­den est passée dans ma time­line Masto­don : https://github.com/dani-garcia/bitwar­den_rs. Et celle-ci n’a pas la limi­ta­tion sur les équipes (mais il encou­rage à donner des sous au projet upstream).

J’ai d’abord testé avec le contai­ner Docker fourni par le déve­lop­peur puis j’ai tenté la compi­la­tion pour voir si ça passait, et ça passe crème !

La grosse diffé­rence, outre la non-limi­ta­tion des orga­ni­sa­tions, c’est que la base de données est, pour l’ins­tant, SQLite. Ce qui peut avoir des consé­quences sur les perfor­mances lorsque la base est très solli­ci­tée.

Ceci dit, Frama­drop tourne toujours avec une base SQLite et ça fonc­tionne bien, et mon instance Lutim, ainsi que Frama­pic ont long­temps utilisé SQLite.

Bref, voyons comment compi­ler et instal­ler cette version de Bitwar­den en Rust.

Compi­la­tion

On va avoir besoin des back­ports Debian pour instal­ler npm (pour compi­ler l’in­ter­face web) :

echo "deb http://ftp.debian.org/debian stretch-backports main" | sudo tee /etc/apt/sources.list.d/backports.list
sudo apt update

Instal­la­tion des dépen­dances :

sudo apt install pkg-config libssl-dev
sudo apt install -t stretch-backports npm

Instal­la­tion de rustup, qui nous four­nira le compi­la­teur Rust :

curl https://sh.rustup.rs -sSf > rustup.sh

On n’exé­cute pas direct un script tiré du web ! On regarde d’abord s’il ne va pas faire de salo­pe­ries :

vi rustup.sh

On le rend exécu­table :

chmod +x rustup.sh

On installe le compi­la­teur Rust (il sera dans notre $HOME) :

./rustup.sh --default-host x86_64-unknown-linux-gnu --default-toolchain nightly

On source un fichier qui nous permet de l’ap­pe­ler

source $HOME/.cargo/env

Gagnons du temps en clonant le projet bitwar­den_rs et l’in­ter­face web (qu’il faut compi­ler aussi) en même temps .

git clone https://github.com/dani-garcia/bitwarden_rs
git clone https://github.com/bitwarden/web.git web-vault

Compi­la­tion de Bitwar­den_rs :

cd bitwarden_rs
cargo build --release

Le résul­tat de la compi­la­tion est dans bitwarden_rs/target/release/.

Compi­la­tion de l’in­ter­face web :

cd ../web-vault
# On se positionne sur le dernier tag en date
git checkout "$(git tag | tail -n1)"
# Un petit patch pour que ça fonctionne avec notre installation
wget https://raw.githubusercontent.com/dani-garcia/bw_web_builds/master/patches/v2.8.0.patch
# On vérifie le patch
cat v2.8.0.patch
git apply v2.8.0.patch
npm run sub:init
npm install
npm run dist

ATTENTION : on m’a dit que la compi­la­tion de l’in­ter­face web prenait 1,5Gio de RAM, assu­rez-vous que vous en avez assez de libre.

Et on copie l’in­ter­face web dans le dossier où attend le résul­tat de la compi­la­tion de bitwar­den_rs :

cp -a build/ ../bitwarden_rs/target/release/web-vault/

Instal­la­tion

On va instal­ler Bitwar­den_rs dans /opt/bitwarden et on le fera tour­ner avec l’uti­li­sa­teur www-data :

cd ..
sudo rsync -a --info=progress2 bitwarden_rs/target/release/ /opt/bitwarden/
chown -R www-data: /opt/bitwarden

Puis on va créer un service systemd, /etc/systemd/system/bitwarden.service :

[Unit]
Description=Bitwarden Server (Rust Edition)
Documentation=https://github.com/dani-garcia/bitwarden_rs
After=network.target

[Service]
# The user/group bitwarden_rs is run under. the working directory (see below) should allow write and read access to this user/group
User=www-data
Group=www-data
# The location of the .env file for configuration
EnvironmentFile=/etc/bitwarden_rs.env
# The location of the compiled binary
ExecStart=/opt/bitwarden/bitwarden_rs
# Set reasonable connection and process limits
LimitNOFILE=1048576
LimitNPROC=64
# Isolate bitwarden_rs from the rest of the system
PrivateTmp=true
PrivateDevices=true
ProtectHome=true
ProtectSystem=strict
# Only allow writes to the following directory and set it to the working directory (user and password data are stored here)
WorkingDirectory=/opt/bitwarden/
ReadWriteDirectories=/opt/bitwarden/

[Install]
WantedBy=multi-user.target

Pour l’in­ter­face d’ad­mi­nis­tra­tion, on va créer un token avec :

openssl rand -base64 48

La confi­gu­ra­tion se fait via des variables d’en­vi­ron­ne­ment qu’on va mettre dans /etc/bitwarden_rs.env :

SIGNUPS_ALLOWED=false
WEBSOCKET_ENABLED=true
ADMIN_TOKEN=Un token généré avec `openssl rand -base64 48`
ROCKET_ADDRESS=127.0.0.1
WEBSOCKET_ADDRESS=127.0.0.1
SMTP_HOST=127.0.0.1
SMTP_FROM=bitwarden@example.org
SMTP_PORT=25
SMTP_SSL=false

Vous remarque­rez que je dis à Bitwar­den d’en­voyer les mails via le serveur SMTP local. À vous de faire en sorte qu’il fonc­tionne. Allez voir le wiki du projet pour voir quelles variables vous pour­riez ajou­ter, enle­ver, modi­fier…

Puis :

sudo systemctl daemon-reload
sudo systemctl enable bitwarden
sudo systemctl start bitwarden
sudo systemctl status bitwarden

Nginx

On installe Nginx s’il n’est pas déjà installé :

sudo apt install nginx

Confi­gu­ra­tion du virtual­host :

server {
    listen 80;
    listen [::]:80;
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name bitwarden.example.org;

    access_log /var/log/nginx/bitwarden.access.log;
    error_log /var/log/nginx/bitwarden.error.log;

    ssl_certificate      /etc/letsencrypt/live/bitwarden.example.org/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/bitwarden.example.org/privkey.pem;

    ssl_session_timeout 5m;
    ssl_session_cache shared:SSL:5m;

    ssl_prefer_server_ciphers On;
    ssl_protocols TLSv1.2;
    ssl_ciphers 'EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA';

    ssl_dhparam /etc/ssl/private/dhparam4096.pem;
    add_header Strict-Transport-Security max-age=15768000; # six months
    gzip off;

    if ($https != 'on') {
        rewrite ^/(.*)$ https://bitwarden.example.org/$1 permanent;
    }

    root /var/www/html;

    # Allow large attachments
    client_max_body_size 128M;

    location ^~ '/.well-known/acme-challenge' {
        default_type "text/plain";
        root /var/www/certbot;
    }

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://127.0.0.1:8000;
    }

    location /notifications/hub {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_pass http://127.0.0.1:3012;
    }

    location /notifications/hub/negotiate {
        proxy_pass http://127.0.0.1:8000;
    }
}

Pour créer /etc/ssl/private/dhparam4096.pem :

sudo openssl dhparam -out /etc/ssl/private/dhparam4096.pem 4096

Pour le certi­fi­cat Let’s Encrypt, on commente le brol rela­tif à ssl puis :

sudo nginx -t && sudo nginx -s reload
sudo apt install certbot
sudo mkdir /var/www/certbot/
certbot certonly --rsa-key-size 4096 --webroot -w /var/www/certbot/ --agree-tos --text --renew-hook "/usr/sbin/nginx -s reload" -d bitwarden.example.org

Une fois qu’on a le certi­fi­cat, on décom­mente le brol ssl puis :

sudo nginx -t && sudo nginx -s reload

Sauve­garde

Créer le script de sauve­garde /opt/backup_bitwarden.sh :

#!/bin/bash
function bwbackup {
    DATE=$(date '+%a%H')

    # Database
    if [[ ! -d /opt/backup_bitwarden/sqlite-backup/ ]]
    then
        mkdir -p /opt/backup_bitwarden/sqlite-backup/
    fi
    echo ".backup /opt/backup_bitwarden/sqlite-backup/db.${DATE}.sqlite3" | sqlite3 /opt/bitwarden/data/db.sqlite3 2>> /opt/backup_bitwarden/backup.log
    if [[ "$?" -ne "0" ]]
    then
        echo "Something went wrong with bitwarden database backup, please see /opt/backup_bitwarden/backup.log on verity" | mail -s "Bitwarden database backup" tech@framalistes.org
        bwbackup
    fi

    # Files
    if [[ ! -d /opt/backup_bitwarden/files-backup/ ]]
    then
        mkdir -p /opt/backup_bitwarden/files-backup/
    fi
    rsync -a --delete --exclude db.sqlite3 /opt/bitwarden/data/ /opt/backup_bitwarden/files-backup/$DATE/ 2>> /opt/backup_bitwarden/backup.org
    if [[ "$?" -ne "0" ]]
    then
        echo "Something went wrong with bitwarden files backup, please see /opt/backup_bitwarden/backup.log on verity" | mail -s "Bitwarden files backup" tech@framalistes.org
        bwbackup
    fi
}
bwbackup

Puis :

sudo chmod +x /opt/backup_bitwarden.sh
sudo mkdir /opt/backup_bitwarden
sudo chown www-data: /opt/backup_bitwarden
sudo apt install sqlite3

Puis, dans le cron de l’uti­li­sa­teur www-data :

42 4 * * * /opt/backup_bitwarden.sh

Logs

J’aime bien avoir mes logs dans un dossier dédié pour ce genre de service.

Dans /etc/rsyslog.d/bitwarden.conf :

if $programname == 'bitwarden_rs' then /var/log/bitwarden/bitwarden.log
if $programname == 'bitwarden_rs' then ~

Dans /etc/logrotate.d/bitwarden :

/var/log/bitwarden/bitwarden.log
{
        rotate 52
        dateext
        weekly
        missingok
        notifempty
        compress
        sharedscripts
        postrotate
                invoke-rc.d rsyslog rotate > /dev/null
        endscript
}

Puis :

sudo mkdir /var/log/bitwarden
sudo chown root:adm /var/log/bitwarden
sudo service rsyslog restart

Fail2­ban

Un fail2­ban qui surveille les logs, ça permet de bloquer les petits malins qui font du brute­force

Dans /etc/fail2ban/filter.d/bitwarden.conf :

[INCLUDES]
before = common.conf

[Definition]
failregex = ^.*Username or password is incorrect\. Try again\. IP: <HOST>\. Username:.*$
ignoreregex =

Dans /etc/fail2ban/jail.d/bitwarden.local :

[bitwarden]
enabled = true
port = 80,443
filter = bitwarden
action = iptables-allports[name=bitwarden]
logpath = /var/log/bitwarden/bitwarden.log
maxretry = 3
bantime = 14400
findtime = 14400

Pour la page d’ad­min, dans /etc/fail2ban/filter.d/bitwarden-admin.conf :

[INCLUDES]
before = common.conf

[Definition]
failregex = ^.*Unauthorized Error: Invalid admin token\. IP: <HOST>.*$
ignoreregex =

Dans /etc/fail2ban/jail.d/bitwarden-admin.local :

[bitwarden-admin]
enabled = true
port = 80,443
filter = bitwarden-admin
action = iptables-allports[name=bitwarden]
logpath = /var/log/bitwarden/bitwarden.log
maxretry = 3
bantime = 14400
findtime = 14400

Fina­le­ment :

sudo service fail2ban restart

Conclu­sion

Voilà, vous devriez avoir un serveur Bitwar­den_rs fonc­tion­nel. Plus qu’à aller sur l’in­ter­face web que vous venez de mettre en place ou télé­char­ger les clients et à les utili­ser !

Pour impor­ter vos mots de passe de Fire­fox, il faut passer par une appli­ca­tion pour les expor­ter, puis aller dans les outils de votre client (ou de l’in­ter­face web).

EDIT 15/01/2019 Rempla­ce­ment de la mention de l’ap­pli­ca­tion Next­cloud Pass­words par l’ap­pli­ca­tion Pass­man (je me suis trompé).

EDIT 17/01/2019 Rempla­ce­ment de npm run dist par npm run dist:selfhost dans la compi­la­tion de l’in­ter­face web. Cela désac­tive Google Analy­tics (voir https://github.com/bitwar­den/web/issues/243#issue­comment-412852726)

EDIT 18/01/2019 Rempla­ce­ment de npm run dist:selfhost par npm run dist dans la compi­la­tion de l’in­ter­face web. Google Analy­tics est déjà désac­tivé par le patch. Il semble­rait que j’ai vu passer des requêtes vers Google Analy­tics à cause du cache de mon navi­ga­teur qui gardait une version non patchée.

EDIT 18/01/2019 Ajout d’un aver­tis­se­ment sur la consom­ma­tion de RAM lors de la compi­la­tion de l’in­ter­face web.

Crédits : Photo par Matt Artz sur Unsplash

Parta­ger

by Luc at January 14, 2019 07:02 PM

January 13, 2019

Florent Peterschmitt

Namasté Népal - #4.1

Récapitulatif

Dans l’article précédent j’étais donc à Pokhara et je sortais d’une grotte remplie de chauves-souris. Une fois ressorti j’avais prévu de passer encore une journée sur place, après-demain sera donc le retour vers Kathmandu pour commencer le trekking de la vallée de Langtang.

Le départ est à Syapru Besi, un village à fond pour les touristes venant marcher dans les montagnes. Rien de très étonnant à vrai dire.

L’arrivée était prévue à 4500 mètres d’altitudes, je me suis arrêté à environ 3000 mètres, avec de la fièvre (oui, je suis retombé malade…) et le souffle coupé. Comme quoi il faut s’entraîner avant, oui bien être fumeur : d’après mon guide les fumeurs, même sans expérience de la montagne arrivent à aller au bout. Ce qui est compréhensible vu qu’un fumeur a régulièrement un manque d’oxygène dans les poumons !

J’ai découpé le trek en 4 articles à venir ; les photos sont déjà triées, reste plus qu’à en retoucher quelques unes et à publier.

Et comme toujours, un peu de shell :D

for img in $(find 2* -name "*.*"); do
    echo '![photo](/static/images/nepal2017/'${img}')' >> pics.md
done

22 Avril 2017 - Vallée de Langtang

map-trek

Démarrage à 1600 mètres environ !

photo photo photo photo photo photo photo photo

Sur la gauche de la photo, sur ce flan de montagne effondré, des nids d’abeilles. Elles font un miel qui est récolté.

photo

Premier « singe blanc », qui n’a pas voulu montrer sa tête. Impossible de l’avoir en plus gros, le zoom était déjà à son maximum.

photo photo photo

Arrivé au gîte (guest house) ce pti bonhomme parlait mieux anglais que quand j’avais son âge, et débordait d’énergie ! Il a voulu tester l’appareil photo, je l’ai laissé faire, bon, le résultat était pas probant :D

photo photo

Des rhododendrons !

photo

Soir nuageux.

photo

Matin dégagé.

Article suivant

by Florent Peterschmitt at January 13, 2019 03:15 PM

January 10, 2019

Romain Dessort

Joindre les 2 bouts de la Laurentienne

La région des Laurentides est très riche en pistes de ski nordique datant du siècle dernier, des sentiers historiques tracés en partie par des norvégiens, dont le fameux Jackrabbit, à l'époque où le ski de fond était populaire au Québec. Malheureusement aujourd'hui, beaucoup sont abandonnées, trop méconnues et réduites en morceaux à cause des développements immobilier et des propriétés privées. Découvrir et cartographier ces pistes historiques est devenu ma grande passion, et je skie plus dans le but de répertorier des nouvelles pistes que juste pour le plaisir de skier.

Si il y a un blog de ski nordique que je ne me lasse pas de lire, c'est celui de Barclay. J'ai découvert plusieurs pistes des Laurentides comme ça et c'est toujours intéressant d'avoir régulièrement les conditions des sentiers.

De mon côté jusqu'à présent, je me « contentais » de cartographier les sentiers de ski que je suivais dans OpenStreetMap. La région des Laurentides dans OSM a d'ailleurs explosé depuis quelques années, quelques autres personnes en rajoute aussi, et c'est maintenant clairement la carte la plus complète possible en terme de sentiers de ski (de fond ou de rando nordique). Mais en parler aussi ailleurs est toujours une bonne idée, donc je vais essayer de parler un peu plus de mes sorties ici. En tout cas au moins mes découvertes de pistes moins connues, car je n'aurai pas la motivation d'écrire à chaque fois, et il n'y a peu d'intérêt pour les pistes plus connues ou bien cartographiées.

Voila pour l'introduction, pour revenir à la Laurentienne, il faut retourner à la fin de saison de l'année dernière, j'avais repéré sur la carte du réseau nordique de Morin-Heights une piste qui s'en allait plein ouest, la Laurentienne (#24) puis qui s'arrêtait sans raison au milieu de nulle part. Ça a évidemment titillé ma curiosité et j'étais parti avec pour objectif de voir où elle allait. J'avais réussi à la suivre sur un bon bout au delà de la partie cartographiée, mais j'avais perdu sa trace ensuite dans une érablière et rendu sur le lac Ida. J'avais rebroussé chemin.

Samedi dernier donc, je l'ai prise en partant de Saint-Adolph, en stationnant au lac Louise, là où elle est censée arriver : la carte du réseau de Saint-Adolph montre aussi un début de piste qui a bien l'air de partir dans la bonne direction pour la connecter, mais ils ne l'ont pas cartographiée jusqu'au bout non plus.

À ma grande surprise, la piste était plutôt bien visible sur le terrain, et il y avait même quelques traces de skieurs et de raquetteurs qui m'avaient précédé. Au moins jusqu'à la route de la Montée des Quatres Lacs. Après c'était plus délicat à suivre mais la piste se devinait bien. J'ai pu retrouver l'endroit où je m'étais arrêté l'année dernière, près du lac Ida. La Laurentienne est maintenant complète dans OpenStreetMap !

Par contre des mystères persistent : sur certains sections (un peu avant le lac Ida), j'ai vu des très vieilles balises métalliques indiquant LSD, une autre piste porte déjà ce nom dans le secteur, c'est bizarre. Et après avoir passé la route de la Montée des Quatres Lacs, j'ai vu 2 panneaux dans le même style que ceux utilisés à Morin-Heights indiquant la Picher (#29) et la Dutch-Dash (#27). La Dutch-Dash est le début de la Laurentienne côté Morin-Heights. J'en déduis que ces 2 pistes restent confondues sur un bon bout. Mais après où va-t-elle ? Et la Picher, je n'en ai aucune idée de ce que c'est… Je ne la vois référencée sur aucune carte que j'ai.

Concernant l'allure de la Laurentienne, elle n'est en soit pas très difficile, il y a quelques up and down dans sa partie ouest mais la piste est suffisamment large pour pouvoir manœuvrer en descente. La partie reste essentiellement sur du plat, en passant à travers une belle forêt de cèdres à l'ouest du lac Ida, et longe des zones ruisseau et passe sur des zones marécageuses et des lacs dans sa partie est vers Morin-Heights.

J'étais parti avec l'idée que j'allais devoir débroussailler pas mal la piste, mais elle était assez propre. Il reste quand même quelques coups de scie à donner par-ci par-là si quelqu'un y retourne.

J'en ai aussi profité pour aller explorer la Castor (#6) qui connecte la Laurentienne à la Renard et traverse le lac Saint-Denis. Je me suis arrêté une fois rendu au lac car je voyais bien où est-ce que la Renard commence. C'est intéressant à avoir en tête car ça permet de faire une belle boucle entre Morin-Heights et Saint-Adolph.

January 10, 2019 07:13 PM

January 05, 2019

Romain Dessort

Patinoires de MontrĂŠal et donnĂŠes ouvertes

Dernièrement je me suis amusé à exploiter les données ouvertes que la ville de Montréal maintient sur les conditions de glace des patinoires publiques.

L'état de chaque patinoire est indiqué sur le site de la ville. Un fichier XML mis à jour quasi-quotidiennement durant la saison peut être trouvé ici, les données sont sous licence Creative Common BY 4.0.

L'idée était de pouvoir vérifier les conditions plus simplement que d'ouvrir mon navigateur, en une seule commande. Voici donc patinoires-mtl. Les cas d'usage sont mis en exemple dans le README : lister les patinoires ouvertes, afficher les conditions d'une ou plusieurs patinoires et, bonus, une sous-commande watch qui retourne les conditions seulement si elles ont changées, ce qui me permet d'envoyer ça à mail ou sendxmppet à mettre encron` pour être alerté dès qu'il y a un changement.

Lister les patinoires ouvertes :

$ ./patinoire.py list --open
Skating rink                                          Open
----------------------------------------------------  ----
Patinoire Bleu Blanc Bouge du parc Hayward (PSE)      1
Patinoire Bleu-Blanc-Bouge, Parc Confédération (PSE)  1
Patinoire réfrigérée, Lac aux Castors (PP)            1

Lister les patinoires du Plateau-Mont-Royal :

$ ./patinoire.py list --borough pmr
Skating rink                                           Open
-----------------------------------------------------  ----
Grande patinoire avec bandes, La Fontaine (PSE)        0
Patinoire avec bandes, Baldwin (PSE)                   0
Patinoire avec bandes, Jeanne-Mance (PSE)              0
Patinoire avec bandes, Sir-Wilfrid-Laurier no 1 (PSE)  0
Patinoire avec bandes, Sir-Wilfrid-Laurier no 2 (PSE)  0
Patinoire avec bandes, Sir-Wilfrid-Laurier no 3 (PSE)  0
Patinoire De Gaspé/Bernard (PSE)                       0
Patinoire de patin libre, Baldwin (PPL)                0
Patinoire de patin libre, Jeanne-Mance (PPL)           0
Patinoire de patin libre, Sir-Wilfrid-Laurier (PPL)    0
Patinoire décorative, De Lorimier (PP)                 0
Patinoire décorative, La Fontaine (PP)                 0

Afficher les conditions d'une patinoire en particulier :

$ ./patinoire.py conditions "lac aux castors"
                                            Open  Cleared  Sprayed  Resurfaced  Condition   
------------------------------------------  ----  -------  -------  ----------  ----------  
Patinoire réfrigérée, Lac aux Castors (PP)  1     1        1        1           Excellente 

Et une fonction pratique, pour être notifié d'un changement de condition sur une patinoire :

$ ./patinoire.py watch "lac aux castors"
                                            Open  Cleared  Sprayed  Resurfaced  Condition
------------------------------------------  ----  -------  -------  ----------  ----------
Patinoire réfrigérée, Lac aux Castors (PP)  1     1        1        1           Excellente
Updated on 2018-12-08 09:05:28
$ ./patinoire.py watch "lac aux castors"
$
[a few days later]
$ ./patinoire.py watch "lac aux castors"
                                            Open  Cleared  Sprayed  Resurfaced  Condition
------------------------------------------  ----  -------  -------  ----------  ----------
Patinoire réfrigérée, Lac aux Castors (PP)  1     1        1        1           Bonne
Updated on 2018-12-10 09:03:56

Comme j'adore les cartes, j'ai aussi fait patinoires-mtl-leaflet, qui permet de geolocaliser toutes les patinoires de Montréal sur un fond de carte OpenStreetMap et d'afficher leur état. Bon pour le coup, c'est de nouveau dans le navigateur forcement... La couleur des patinoires est en fonction de leur état. Un aperçu ici : https://univers-libre.net/patinoires-mtl/.

Pour la géolocalisation des patinoires, la ville de Montréal ne fournit aucune données. OpenStreetMap ne contient que très peu de patinoires non plus, et ça allait être compliqué de faire correspondre les noms des patinoires du XML de la ville avec ceux dans OpenStreetMap de toute façon. C'est alors que je suis tombé sur une application Android qui fait à peu près la même chose et qui a un fichier geojson avec la géolocalisation de toutes les patinoires. Rien n'est indiqué concernant la licence ou la provenance de ces données par contre.

L'outil en ligne de commande est en anglais et la carte est en français, ça ne fait aucune cohérence et comme ça tout le monde/personne (n')est content.

Je ne pense pas y faire d'autres modifications à part rajouter probablement la même chose pour les conditions des pistes de ski de fond.

January 05, 2019 02:29 AM

January 04, 2019

Luc Didry

Créer une boutique en ligne avec Word­press

Dans mon précé­dent article, j’évoquais le fait que j’ai ouvert ma boutique en ligne. Je vais expliquer un peu comment j’ai fait pour la mettre en place.

Le logi­ciel de base : Word­press

Pourquoi Word­press et pas Pres­ta­shop ou Magento qui sont des outils dédiés à la vente en ligne ? Plusieurs raisons à cela :

  • je connais déjà bien Word­press, je n’avais pas spécia­le­ment envie de m’enquiqui­ner à instal­ler d’autres trucs ;
  • Word­press, bien que ce soit au départ un moteur de blog, est un CMS que l’on peut tordre dans pas mal de sens. Je me suis dit que j’avais envie de voir si c’était simple d’en faire un site de vente en ligne ;
  • j’ai quand même essayé d’uti­li­ser Pres­ta­shop… sans réus­sir à passer la dernière étape d’ins­tal­la­tion : la mise en place de la base de données tombait en timeout à chaque fois (j’ai pas un énorme serveur et il est déjà bien plein de trucs).

Bref : on commence par instal­ler un Word­press. Je ne vais pas détailler, c’est un sujet fort bien traité sur les Inter­netz.

Les exten­sions

Pour trans­for­mer Word­press en boutique en ligne, il faut instal­ler quelques modules. Mais avant ça, voici ceux que j’ai installé pour la sécu­rité, les perfor­man­ces… :

  • Antis­pam Bee, pour l’an­tis­pam ;
  • iThemes Secu­rity, pour la sécu­rité ;
  • Smush, pour réduire la taille des images ;
  • WP Super Cache, pour les perfor­mances.

Ensuite, des exten­sions pour amélio­rer la boutique, mais pas obli­ga­toires :

  • Contact Form 7, pour le formu­laire de contact ;
  • Google XML Site­maps, pour amélio­rer le réfé­ren­ce­ment ;
  • Masto­don Auto­post, pour pouet­ter auto­ma­tique­ment quand on ajoute un article à la boutique.

Voici les exten­sions pour la boutique elle-même :

  • WooCom­merce, l’ex­ten­sion prin­ci­pale, propo­sée par la boîte qui déve­loppe Word­press, donc ça va, j’ai assez confiance sur la compa­ti­bi­lité ;
  • WooCom­merce Blocks, pour faire fonc­tion­ner WooCom­merce avec le nouvel éditeur de Word­press ;
  • WooS­wipe, pour avoir une gale­rie d’image sur les pages des produits (quand on clique sur l’image pour zoomer, pis pour voir les autres images, vous voyez le genre) ;
  • WooCom­merce Weight Based Ship­ping, pour gérer les frais d’en­voi selon le poids de la commande ;
  • Payment Gate­way Based Fees and Discounts for WooCom­merce, pour pouvoir ajou­ter des frais selon la méthode de paie­ment choi­sie.

Le thème

Il va de soit qu’un thème pour un blog a peu de chance d’al­ler pour faire une boutique. J’ai choisi le thème Shop Isle, que je trouve simple et bien foutu. J’en ai néan­moins fait un thème enfant pour déga­ger ces cochon­ne­ries de google fonts.

Les frais d’en­voi

L’ex­ten­sion « WooCom­merce Weight Based Ship­ping » me permet de défi­nir des frais d’en­voi selon le poids de la commande ainsi que sa desti­na­tion (vous imagi­nez bien qu’en­voyer deux cartes postales en France ne coûte pas le même prix qu’en envoyer 15 dans un autre pays).

Cette exten­sion est parfaite, à l’ex­cep­tion de l’in­ter­face pour choi­sir les pays de desti­na­tion quand on crée les règles : ça va bien quand on ajoute une ou deux desti­na­tions, mais pas quand on doit en sélec­tion­ner 12 (france métro­po­li­taine + DOM/TOM) ou plus (les pays de l’UE).

Person­nel­le­ment, j’ai choisi de faire des frais d’en­voi à prix plus ou moins coûtant : le tarif des timbres, arrondi un peu au-dessus pour faire le prix de l’en­ve­loppe. Je ne dis pas que je ne fais pas un peu de béné­fice dessus, mais ça se compte à coup de centimes.

Le paie­ment

WooCom­merce embarque déjà plusieurs moyens de paie­ments, je dois dire que c’est très bien foutu !

J’ai activé le vire­ment SEPA, parce que ça ne coûte rien, ni à l’en­voyeur, ni au desti­na­taire. Par contre, comme ça prend du temps (le vire­ment prend géné­ra­le­ment 24h pour appa­raître sur les comptes, sans comp­ter que certaines banques mettent plusieurs jours pour accep­ter un nouvel IBAN et permettre des vire­ments vers celui-ci), j’ai ajouté la possi­bi­lité d’uti­li­ser Paypal : ça propose d’uti­li­ser son compte Paypal (et c’est assez répandu pour que ça soit pratique pour un paquet de gens) pour payer ou la carte bancaire. Par contre, ça m’a fait deux blagou­nettes :

  • pour effec­ti­ve­ment pouvoir récu­pé­rer les paie­ments, j’ai du passer mon compte en compte busi­ness. Rien de bien méchant, mais la récu­pé­ra­tion des sous ne fonc­tion­nait pas et rien n’in­diquait sur Paypal que c’était ce qu’il fallait faire (il y avait juste un message d’er­reur complè­te­ment inutile). Une fois mon compte passé en busi­ness, plus de souci ;
  • mais du coup, des frais s’ap­pliquent (pas pour le client, qui paie bien ce que ma boutique lui indiquait, mais pour moi : je ne récu­père pas autant d’argent que ce qu’a payé le client). Comme je ne souhaite pas en être de ma poche, j’ai installé « Payment Gate­way Based Fees and Discounts for WooCom­merce » qui me permet d’ajou­ter le pour­cen­tage (3,4%) et le forfait (0,25€) de la commis­sion lorsqu’on choi­sit Paypal pour payer.

Condi­tions géné­rales de vente

Pour les rédi­ger, j’ai d’abord cher­ché sur le web, et je suis tombé sur https://www.donnees­per­son­nelles.fr/cgv, qui propose carré­ment une exten­sion Word­press. Après l’avoir instal­lée, je me suis contenté de repom­per les CGV qu’elle propo­sait : ça m’a permis, tout d’abord, de les lire, et ensuite de corri­ger des typos.

Après quoi, j’ai désins­tallé l’ex­ten­sion 😁

Conclu­sion

Je ne pense pas qu’il soit néces­saire pour moi de trop détailler le réglage des diffé­rentes exten­sions : les infos se trouvent assez faci­le­ment sur le web, et même si les réglages sont touf­fus, c’est assez intui­tif. La plus grosse partie du temps fut perdue dans la recherche des exten­sions et du thème kivon­bien.

Après quelques tâton­ne­ments, la mise en place de ma boutique fut assez simple. J’es­père que cet article servira à d’autres pour leur éviter de cher­cher autant que moi.

Crédits : Photo par Mike Petrucci sur Unsplash

Parta­ger

by Luc at January 04, 2019 05:09 PM

Merci à mes tipeurs 🙂

Le 14 juillet 2016, j’ai lancé mes pages Tipeee et Libe­ra­pay.

La récom­pense de base est l’ap­pa­ri­tion sur une page mensuelle de remer­cie­ments… voici celle de décembre.

Merci à :

Voici mon bilan de décembre :

EDIT : j’ai oublié de dire que j’ai bossé sur la réécri­ture de WemaWema en VueJS

Et sinon, grande annonce ! J’ai ouvert ma boutique en ligne !

Bon, pour l’ins­tant, il n’y a qu’un article, une carte postale d’une illus­tra­tion de Linux.pictures. J’avais fait un sondage sur Masto­don il y a quelques mois pour savoir quelle illus­tra­tion impri­mer, et voilà, j’ai enfin pris la peine (et les sous) de faire tirer les cartes postales. Les béné­fices, s’il y en a (vu que je vends à prix coûtant, à quelques arron­dis prêts, y en aura peut-être pas avant long­temps), iront à Linux.pictures (ou un projet libre si je n’ar­rive pas à les contac­ter).

Je compte rajou­ter prochai­ne­ment un recueil de mes mercre­dis fictions relié à la japo­naise par mes soins (vous pouvez voir ce que ça donne sur ce pouet).

Vous pouvez toujours me soute­nir via Duni­ter !

Je remets ici mon expli­ca­tion.

Disclai­mer : je vais peut-être dire des sottises parce que j’ai pas tout compris mais je m’en fous, j’aime bien l’idée

Duni­ter est un projet de crypto-monnaie mais contrai­re­ment au bitcoin où c’est la course à la puis­sance de calcul pour géné­rer la monnaie et deve­nir riche, le but est de créer une monnaie libre (le Ğ1, prononcé comme june en anglais), basée sur une toile de confiance (il faut rece­voir 5 certi­fi­ca­tions pour être membre) et où chacun des membres reçoit tous les jours un divi­dende univer­sel. Je dois dire que je suis assez curieux de ce qu’on peut faire avec un système ressem­blant forte­ment au salaire à vie 😉

C’est pourquoi j’ai créé mon compte et ait fait ce qu’il fallait pour rece­voir mes certi­fi­ca­tions (rencon­trer des gens, tous­sa…). Ma clé publique est :

 2t6NP6Fvvuok2iRWA188C6pGokWAB5Kpf1S1iGtkN9tg

Et comme un projet n’est utile que si on s’en sert, je vous propose de me soute­nir en Ğ1 tout en béné­fi­ciant des mêmes récom­penses que celles présentes sur ma page Tipeee (j’ai arbi­trai­re­ment choisi une parité euro/Ğ1 car je n’ai pas vrai­ment trouvé de page expliquant comment évaluer le cours du Ğ1 en euros, et au final, est-ce vrai­ment néces­saire ? À nous de choi­sir quelle valeur a cette nouvelle monnaie 🙂. Et puis ça me simpli­fie la vie).

Voici donc les diffé­rentes contre­par­ties et leur prix (chaque contre­par­tie comprend celles de tarif infé­rieur) :

  • 1 Ğ1 : vous appa­raî­trez sur la page mensuelle des remer­cie­ments
  • 2 Ğ1 : vous rece­vrez une photo dédi­ca­cée de mon chat
  • 3 Ğ1 : vous rece­vrez 3 stickers repre­nant les logos de Lstu, Lutim et Lufi. De quoi déco­rer son ordi et se la péter en société 😁
  • 5 Ğ1 : un commit vous sera dédié chaque mois (si je déve­loppe suffi­sam­ment pour le nombre de personnes à ce niveau)
  • 15 Ğ1 : vous pouvez me deman­der de bosser en prio­rité sur un bug ou une demande de fonc­tion­na­lité d’un de mes logi­ciels (dans la mesure du faisable, hein).
  • 100 Ğ1 : quand j’au­rais un nouveau projet, vous pour­rez en choi­sir le nom et le logo

Pour en savoir plus sur Duni­ter et Ğ1, je vous propose d’al­ler voir cet article de cgeek : https://blog.cgeek.fr/de-linte­ret-dune-monnaie-libre.html ainsi que la théo­rie rela­tive de la monnaie pour les enfants.

Crédits : Photo par Simon Migaj sur Unsplash

Parta­ger

by Luc at January 04, 2019 04:13 PM

December 24, 2018

Luc Didry

Double merci à mes tipeurs 🙂

Le 14 juillet 2016, j’ai lancé mes pages Tipeee et Libe­ra­pay.

La récom­pense de base est l’ap­pa­ri­tion sur une page mensuelle de remer­cie­ments… voici celle d’oc­to­bre… et de novembre. Du retard, toujours du retard et encore plus de retard !

Merci à :

Voici mon bilan d’oc­tobre :

Et mon bilan de novembre :

Vous pouvez toujours me soute­nir via Duni­ter !

Je remets ici mon expli­ca­tion.

Disclai­mer : je vais peut-être dire des sottises parce que j’ai pas tout compris mais je m’en fous, j’aime bien l’idée

Duni­ter est un projet de crypto-monnaie mais contrai­re­ment au bitcoin où c’est la course à la puis­sance de calcul pour géné­rer la monnaie et deve­nir riche, le but est de créer une monnaie libre (le Ğ1, prononcé comme june en anglais), basée sur une toile de confiance (il faut rece­voir 5 certi­fi­ca­tions pour être membre) et où chacun des membres reçoit tous les jours un divi­dende univer­sel. Je dois dire que je suis assez curieux de ce qu’on peut faire avec un système ressem­blant forte­ment au salaire à vie 🙂

C’est pourquoi j’ai créé mon compte et ait fait ce qu’il fallait pour rece­voir mes certi­fi­ca­tions (rencon­trer des gens, tous­sa…). Ma clé publique est :

 2t6NP6Fvvuok2iRWA188C6pGokWAB5Kpf1S1iGtkN9tg

Et comme un projet n’est utile que si on s’en sert, je vous propose de me soute­nir en Ğ1 tout en béné­fi­ciant des mêmes récom­penses que celles présentes sur ma page Tipeee (j’ai arbi­trai­re­ment choisi une parité euro/Ğ1 car je n’ai pas vrai­ment trouvé de page expliquant comment évaluer le cours du Ğ1 en euros, et au final, est-ce vrai­ment néces­saire ? À nous de choi­sir quelle valeur a cette nouvelle monnaie 🙂. Et puis ça me simpli­fie la vie).

Voici donc les diffé­rentes contre­par­ties et leur prix (chaque contre­par­tie comprend celles de tarif infé­rieur) :

  • 1 Ğ1 : vous appa­raî­trez sur la page mensuelle des remer­cie­ments
  • 2 Ğ1 : vous rece­vrez une photo dédi­ca­cée de mon chat
  • 3 Ğ1 : vous rece­vrez 3 stickers repre­nant les logos de Lstu, Lutim et Lufi. De quoi déco­rer son ordi et se la péter en société 😁
  • 5 Ğ1 : un commit vous sera dédié chaque mois (si je déve­loppe suffi­sam­ment pour le nombre de personnes à ce niveau)
  • 15 Ğ1 : vous pouvez me deman­der de bosser en prio­rité sur un bug ou une demande de fonc­tion­na­lité d’un de mes logi­ciels (dans la mesure du faisable, hein).
  • 100 Ğ1 : quand j’au­rais un nouveau projet, vous pour­rez en choi­sir le nom et le logo

Pour en savoir plus sur Duni­ter et Ğ1, je vous propose d’al­ler voir cet article de cgeek : https://blog.cgeek.fr/de-linte­ret-dune-monnaie-libre.html ainsi que la théo­rie rela­tive de la monnaie pour les enfants.

Crédits : Photo par Connor Wells sur Unsplash

Parta­ger

by Luc at December 24, 2018 04:21 PM

December 22, 2018

Romain Dessort

Safe paste in terminal

In my daily life of sysadmin, I copy-paste many chunk of text (commands, IP addresses, URLs, file paths, whole scripts or file contents sometimes because it's easier to copy-paste them rather than to scp them). I usually copy them from other servers or from my company's internal documentation (trusted sources). However, I may sometimes follow howtos or read Stackoverflow answers and copy text and commands from those less trusted websites.

I want to talk about how easy one could trick you by replacing copied text in your clipboard or inserting terminal escape sequences so that your shell will run additional and potentially malicious commands. And how I protecting myself against these tricks.

Tricks I have identified

Here is a list of tricks an attacker can use to fool you and make you paste a malicious command in your terminal.

Replacing copied text with Javascript

Dylan Ayrey demonstrates that with a few lines of Javascript, a malicious website can alter your clipboard content. The code runs on key release event (keyboard shortcut or right click) and override clipboard content with the malicious code the attacker wants you to execute.

Obviously this attack doesn't work if you disable Javascript on unstrusted websites, which is by the way always a good idea.

Hiding malicious code with CSS

But even with Javascript disabled it's easy for an attacker to put hidden text in your clipboard. The idea is to put the malicious code in the middle of the displayed command in a <span /> element and apply different CSS properties on it, so that the malicious code isn't visible for the user. For instance make it float and move it away from the viewport, make it transparent, with no height or width…

Here is an interesting article about this attack. It also show how to hide the malicious code once pasted in the victim's terminal so that the victim can't even known he has been p0wned.

What about disabling CSS then?

Inserting non-printable characters

That's no enough since you could have non-printable characters (like backspaces) in raw text. Here is an example (the whole thread is an interesting reading by the way). Basically, the idea is to insert extra characters and a backspace character after each of them to make the code appear inoffensive.

How I protect myself

So what next? What solutions I use to protect myself against those attacks?

Pasting into a text editor: the bad idea

In most shell, I can easily start $EDITOR with ^X^E to edit the current command. But that's totally ineffective since the pasted text can contain ^ESC:!<malicious code> which will work in vim, or simply send the right shortcut to close the editor and get back to the shell.

Shell's bracketed paste mode

This is an elegant solution. Bash (actually readline) can configure the terminal to enclose the pasted text between paste sequences (hence the bracketed paste mode):

enable-bracketed-paste (Off) When set to On, readline will configure the terminal in a way that will enable it to insert each paste into the editing buffer as a single string of charac‐ ters, instead of treating each character as if it had been read from the key‐ board. This can prevent pasted characters from being interpreted as editing commands.

To enable it:

$ echo "set enable-bracketed-paste on" >>~/.inputrc

If you then try to paste multi-lines commands in your terminal, the commands won't be executed unless you press enter. You have a chance to review and edit them before their execution.

But it has two main drawbacks:

  • obviously enabling bracketed paste mode will work on your own computer only, unless you enable it on all your remote servers as well.
  • you may still be vulnerable to code injection if the pasted text contains the bracketed-paste-mode end sequence, whether your terminal automatically filter this sequence or not.

You can test this here.

confirm-paste plugin in URxvt

URxvt has a nice plugin called paste-confirm. It is shipped with URxvt and can be found in its plugin directory (/usr/lib/urxvt/perl/). Once loaded, the plugin will detect multi-lines pastes and will ask you whether to really paste it to the shell or not.

To enable it, simply add it to the plugin list in your ~/.Xdefaults:

URxvt.perl-ext-common: […],confirm-paste

Print your clipboard content before you paste

It's always a good idea to double-check your clipboard content before pasting it somewhere. I sometimes don't remember or I'm not sure about what was my previous selection, and I remember pasting whole file content into my terminal a couple of times…

I now use clipster for my cliboard manager with roficlip. Thus with a simple shortcut I can quickly double-check and select the previous entries in my clipboard.

December 22, 2018 06:13 PM

December 08, 2018

Florent Peterschmitt

Femto Feed

Tous les lecteurs de flux me saoulent :

  • FreshRSS est génial, mais je ne veux pas avoir à installer tout ce qu’il demande. Actuellement mon blog est rendu via des fichiers statiques, je souhaite qu’il en aille de même pour ça.
  • Les services commerciaux comme Feedly ne m’apportent pas grand chose, je n’ai pas besoin des fonctionnalités payantes, et je me suis désinscrit récemment car ils poussent leurs offres payantes comme quelqu’un qui veut vous forcer à avaler un rat mort.
  • Il existe certainement des offres libres et gratuites, mais j’ai une idée très précise de ce que je veux, c’est très simple, alors je l’ai codé.

Femto Feed - Fonctionnalités

  • Récupérer les flux depuis une liste maintenue dans un fichier
  • Générer un fichier HTML rudimentaire avec : date | source | titre et lien

Et… c’est tout. Je le lance via une tâche planifiée et le fichier généré est servi via un serveur web. Fin de l’histoire.

Le nouveau-né s’appelle donc Femto Feed et il est disponible sur gitlab.com et github.com.

En Rust

Avec l’édition 2018 quit vient tout juste de sortir, c’était une raison suffisante pour utiliser ce langage :-P Bon, en vrai, c’est surtout parce que j’aime ça :

  • Typage statique
  • Génériques, et surtout Option et Result
  • Pattern matching
  • Gestion d’erreur sans exceptions
  • Outillage à l’image de ce qui se fait dans le monte Python et/ou Go
  • Move semantic, borrowing… (std::move et unique_ptr en C++ si je ne me trompe pas)

Enjoy !

Toute contribution sera la bienvenue, à partir du moment où on reste dans l’échelle femtomètrique, voir la TODO dans le README du projet.

by Florent Peterschmitt at December 08, 2018 09:00 PM

November 30, 2018

Florent Peterschmitt

La “règle” des 80 colonnes et variantes

Grand débat du jour, faut-il tout limiter à 80 colonnes pour son code et/ou sa documentation ? Et non j’ai rien d’autre à faire un vendredi soir :D

Il est répandu que 80 colonnes pour son code et même du texte, documentation dans le code ou non, c’est bien.

Dans le cas du code, c’est assez court pour éviter de devoir faire défiler le texte à l’horizontale, et de toute façon au de là d’une certaine limite « acceptable » c’est signe d’un code… bof. Pour du texte, cela évite aussi aux yeux de faire de grands sauts entre la fin d’une ligne et le début de la prochaine.

On trouve une réponse historique du côté des cartes performées IBM dont la largeur a été de 80 colonnes (mais pas seulement).

Sauf que les cartes perforées… je n’en ai jamais vu en vrai, alors pourquoi toujours 80 colonnes ?

Marche droit’d’vant toi !!

Cette règle n’est-elle pas un peu trop stricte compte tenu des outils (éditeurs) et supports (écrans) actuels ? Les écrans sont bien plus larges que 80 colonnes de texte taille 13 sur une résolution 1080p et les éditeurs disposent d’outils automatiques pour faire la mise en forme.

L’objectif actuel de limiter le nombre de colonnes dans du code source, ou du texte, est partagé par différents medias : des livres aux pages web, il est toujours désagréable de lire du texte qui n’en fini pas de s’étaler sur toute la largeur de l’écran et il semble donc parfaitement logique de limiter la taille du contenu.

En ce qui concerne le code, même tarif : lire une ligne qui n’en fini pas pose les mêmes problèmes que de lire du texte en bon françoy sur une page web, avec en plus d’horribles conséquences sur la mémorisation de ce qu’il s’y passe.

Le cas du code

if ((bla == truc && op == "bazar" && callMe(withaparam).attribute != someVal) || (urlu == (berlu + mochi) && shift >> it)) {
    patakess();
}

Dans cet exemple on est déjà à 124 colonnes, le blog vous affiche une barre de défilement horizontale, et franchement j’en ai eu marre assez vite. Même avec du code qui veut dire quelque chose, avec de vrais noms de variables explicites, de vrais noms de méthodes etc, c’est très, très chiant.

On préfèrera peut-être quelque chose du genre :

if ((bla == truc && op == "bazar" && callMe(withaparam).attribute != someVal)
    || (urlu == (berlu + mochi) && shift >> it))
{
    patakess();
}

C’est évidemment moins long, ça tient dans les 80 colonnes, on peut accéder à toutes les informations d’un coup et on a assez clairement la séparation des deux conditions ||.

Et pourtant il n’est pas toujours nécessaire d’avoir trouzillions de paramètres/conditions/whatever pour se retrouver avec des lignes aberrantes :

def je_documente_ma_fonction_avec_tous_les_types_de_parametres_dans_le_nom(prout):
    pass

J’ai réellement vu ce genre de cas. Rare, mais quand même…

Parfois même on obtient d’autres aberrations (à mon sens) quand on applique strictement la règle des 80 colonnes (ou toute autre limite) :

func DoStuff() {
    fmt.Println(
        "je suis une belle documentation, je prends soin de moi tous les jours mais " +
        "suis un peu trop longue, on va me concaténer au runtime comme un gros sac " +
        "alors que peut-être ya d’autres moyens de faire ça…"
    )
}

En soit, c’est lisible, mais ajouter des opérations dans un programme pour satisfaire une règle d’affichage pour nous pauvres humains, je trouve cela très exagéré. Et re-oui, c’est du déjà vu. Alors c’est vrai que comme c’est une donnée imutable, il est probable que le compilateur/interpréteur optimise ça… sauf que c’est toujours autant de travail manuel qui doit être réalisé.

Dans tous les cas, limiter manuellement la longueur des lignes de code semble nécessaire afin d’éviter de se perdre ou d’obtenir une indentation moche.

Le cas du texte

Pour moi, le pire du pire est de rédiger du texte (documentation) en appliquant la règle des 80 colonnes à la main.

Quand on écrit du texte, on obtient des paragraphes :

Division d'un texte de prose, d'un discours, d'un chapitre qui apparaît
typographiquement par un alinéa initial. (Dans les renvois, le paragraphe est
noté par le signe §, appelé lui-même « paragraphe ».)

Définition du Larousse

Petite section d'un discours, d'un chapitre. Ce paragraphe se lie mal au
paragraphe précédent.

Une définition du Littré

Et c’est exactement en ce sens que je comprends et utilise les paragraphes : des sections de texte un peu indépendantes des autres, des phrases qui ont un sens une fois regroupées sous un même paragraphe.

En terme de rendu visuel, un paragraphe peut être découpé sans intervention manuelle.

Par exemple, je vais vour reprendre ici la dernière phrase telles que je l’ai écrite :

Et c’est exactement en ce sens que je comprends et utilise les paragraphes : des sections de texte un peu indépendantes des autres, des phrases qui ont un sens une fois regroupées sous un même paragraphe.

Et telle qu’elle me l’est affichée dans le terminal :

Et c’est exactement en ce sens que je comprends et utilise les paragraphes : des 
sections de texte un peu indépendantes des autres, des phrases qui ont un sens une fois 
regroupées sous un même paragraphe.

La ligne fait bien plus que 80 colonnes, mais avec le retour à la ligne automatique on est à l’aise. En plus, comme je change régulièrement les mots utilisés, la mise en forme manuelle est à refaire à chaque relecture. Superbement chiant.

Retour à la ligne automatique, ou word wrap

Les éditeurs proposent tous (ne me citez pas nano… il n’est utile que quand tout le reste a merdé) de faire passer à la ligne automatiquement une ligne trop longue, avec des paramètres variables. On peut même choisir de couper en plein milieu d’un mot ou entre les mots.

On peut aussi demander au word wrap de “physiquement” couper la ligne en insérant un saut de ligne au moment où la ligne devient trop grande.

Bon, j’avais tenté ce paramétrage, au final ça devenait bien souvent complètement n’importe quoi. L’autre frein à ce mode est que lorsqu’on est pas encore fixé sur le texte/code que l’on veut écrire, on se retrouve à supprimer manuellement les sauts de ligne… bonet blanc et blanc bonet en fin de compte.

En revanche la forme « soft » du word wrap, à savoir que le retour à la ligne est une simple astuce d’affichage, me semble bien plus pratique :

  • On laisse chacun gérer sa largeur maximale.
  • On reste concentré sur ce qui est important : écrire son texte, écrire son code. La gestion manuelle des sauts de ligne n’a aucune plus-value dans du texte, et pour du code, la plupart du temps les sauts de ligne ont du sens et on s’arrête avant les 80 colonnes.

Oui, mais non

Je pense que si le word wrap ne fait pas l’unanimité, c’est peut-être que les éditeurs ne supportent pas tous le paramétrage parfait ou ont des comportements par défaut indésirables pour certains utilisateurs.

Par exemple dans Vim, pour avoir un word wrap automatique à ~100 colonnes, j’utilise tmux pour avoir un panneau à droite du texte. C’est pas super, mais en pratique j’ai trèèèèès souvent un second panneau à côté de Vim ou tout simplement un autre buffer Vim, et donc c’est devenu transparent.

Ensuite la navigation d’une ligne à une autre varie selon les utilisateurs. Je préfère qu’une “grande ligne” reste d’un seul morceau plutôt que de la fragmenter, mais ce n’est certainement pas l’avis de tout le monde.

Et puis sans doute d’autres raisons que je n’ai pas trouvé.

Keskonfé ?

Si t’es tout seul avec toi-même, on s’en fout. Le problème se pose lors de la collaboration, et je pense qu’on peut trouver des compromis :

  • Pour le texte : les documentations (README et autres), le word wrap me semble nécessaire, à l’image de ce qui se fait dans Word/LibreOffice.
  • Pour le code : on vote une limite que chacun sera tenu de respecter au mieux : si on choisis 80 est qu’on est à 85 colonnes, on va peut-être éviter de rendre le code moche juste pour respecter la règle.

Et si un compromis (celui-ci ou tout autre évidemment) ne peut être trouvé, il faut quand même que chacun utilise la même méthode : il n’y a rien de pire que d’avoir différentes conventions au sein d’un même fichier ou projet.

by Florent Peterschmitt at November 30, 2018 06:00 PM

October 30, 2018

Luc Didry

Lufi 0.03 est sorti !

Après plus d’un an, voici une nouvelle version de Lufi ! Cette nouvelle version aurait du être l’oc­ca­sion d’une refonte de l’in­ter­face en utili­sant VueJs mais j’ai pris énor­mé­ment de retard sur mon appren­tis­sage de celui-ci, donc ça sera pour la version suivante.

Le déve­lop­pe­ment de la nouvelle version n’a pas pris un an, loin de là, mais comme ce n’est pas le seul logi­ciel que je main­tiens (loin de là), bah voilà.

Vous pouvez tester la nouvelle version sur l’ins­tance de démons­tra­tion : https://demo.lufi.io.

Liste non exhau­sive des chan­ge­ments

Pour les utili­sa­teurs :

  • Amélio­ra­tion de la vitesse au niveau client via l’uti­li­sa­tion de mes plugins Mojo­li­cious GzipS­ta­tic et StaticCache, qui compressent les fichiers statiques et leur adjoint un en-tête de cache navi­ga­teur ;
  • Possi­bi­lité de choi­sir la langue de l’in­ter­face (là où le choix se faisait auto­ma­tique­ment via les préfé­rences du navi­ga­teur) ;
  • Affi­chage de la taille du fichier lors de l’en­voi ;
  • Affi­chage de la taille maxi­male accep­tée des fichiers ;
  • Ajout des traduc­tions en arabe et en alle­mand ;
  • Ajout d’une tâche récur­rente pour provi­sion­ner en avance des adresses de fichier. Pour les utili­sa­teurs, ça se traduit par des pages qui sont envoyées bien plus rapi­de­ment.

Pour la modé­ra­tion :

  • Il y a possi­bi­lité pour l’ad­min de modi­fier un champ en base de données pour bloquer le télé­char­ge­ment d’un fichier, tout en affi­chant la raison (contenu illé­gal, viola­tion des CGU, etc. Les raisons sont confi­gu­rables) au télé­char­geur. Cela n’est pas très pratique (bidouiller en base de données), mais c’est un pas en avant ;
  • Possi­bi­lité de signa­ler simple­ment un fichier aux admins d’une instance.

Pour la sécu­rité :

  • Mise à jour de la biblio­thèque javas­cript de chif­fre­ment SJCL ;
  • Gestion d’une éven­tuelle excep­tion si l’en­tro­pie du navi­ga­teur est trop faible pour géné­rer correc­te­ment une clé de chif­fre­ment ;
  • Ajout de jetons CSRF à la connexion et à la décon­nexion (si l’au­then­ti­fi­ca­tion est utili­sée, bien sûr) ;
  • Ajout de contraintes sur l’en­voi de mail pour éviter de se retrou­ver à envoyer des spams.

Pour les déve­lop­peurs :

  • Utili­sa­tion de Mojo::SQLite à la place d’ORLite pour l’uti­li­sa­tion d’une base SQLite. Ce chan­ge­ment de module me permet de réduire énor­mé­ment le code de la couche d’abs­trac­tion de la base de données : Mojo::SQLite a la même syntaxe que Mojo::Pg, du coup, c’est le même code pour les deux bases de données.
  • Créa­tion et utili­sa­tion de plugins Mojo­li­cious person­nels. Ces modules ne sont pas publiés sur le CPAN car très forte­ment liés à ma manière d’uti­li­ser le frame­work Mojo­li­cious. La publi­ca­tion de modules person­nels sur le CPAN est décon­seillée pour ne pas le polluer, mais Carton, le gestion­naire de dépen­dances que j’uti­lise permet de spéci­fier l’URL de télé­char­ge­ment des modules. Je peux donc utili­ser les tarballs four­nis par Frama­git. L’in­té­rêt de l’uti­li­sa­tion de modules person­nels est de mutua­li­ser le code commun à mes diffé­rents logi­ciels, de ne plus me répé­ter et de réper­cu­ter une correc­tion ou une amélio­ra­tion d’un logi­ciel à un autre bien plus faci­le­ment ;
  • Ajout d’un code de conduite ;
  • Ajout d’une suite de tests, lancée auto­ma­tique­ment à chaque push grâce à l’in­té­gra­tion conti­nue de Gitlab.

Pour les admins :

  • Support de MySQL : comme le code de la couche d’abs­trac­tion a été simpli­fié, il suffit d’uti­li­ser un module possé­dant la même syntaxe que ceux des deux autres bases de données pour ajou­ter le support d’une nouvelle base. Grâce à Mojo::mysql, ça s’est fait très faci­le­ment.
  • Ajout d’une commande pour migrer simple­ment d’une base de données SQLite à un autre type de base.
  • Il y a main­te­nant une option dans la confi­gu­ra­tion pour obli­ger tous les fichiers à être suppri­més après le premier télé­char­ge­ment.
  • Il y a main­te­nant un en-tête Content-Secu­rity-Policy par défaut, qui devrait conve­nir à la plupart des instal­la­tions. Cet en-tête est bien évidem­ment surchar­geable dans la confi­gu­ra­tion.

Hack­péro

Il est à noter que cette version a été présen­tée au Hack­péro qui a eu lieu à Paris le 26 octobre dernier (un genre de hacka­thon spécia­lisé recherche de bugs ou de vulné­ra­bi­li­tés). Je tiens à remer­cier gran­de­ment l’équipe de Bounty Factory qui m’a contacté pour me le propo­ser, ainsi que les bug hunters qui y ont parti­cipé.

Artwork Lufi

Je vous ai déjà présenté l’artwork pour Lutim dans mon article précé­dent. J’avais aussi commandé à Soniop un artwork pour Lufi !

Cliquez pour avoir l’image origi­­nelle (en grande taille)

Comme pour Lutim, c’est en CC-BY-SA (fichier source Photo­shop).

Instal­la­tion

La meilleure façon d’ins­tal­ler Lufi est de suivre les instruc­tions du wiki.

Parta­ger

by Luc at October 30, 2018 05:14 PM

October 25, 2018

Luc Didry

Merci à mes tipeurs 🙂

Le 14 juillet 2016, j’ai lancé mes pages Tipeee et Libe­ra­pay.

La récom­pense de base est l’ap­pa­ri­tion sur une page mensuelle de remer­cie­ments… voici celle de septembre. Petite forme pour la rentrée, mais je vous rassure, octobre sera un bien meilleur cru 😉

Merci à :

Voici mon bilan de septembre :

  • J’ai bossé sur Lstu :
    • au vu du nombre de spam­meurs/phisheurs qui utilisent Frama.link pour cacher des URLs véro­lées, j’ai du me résoudre à ajou­ter le support de Google Safe Brow­sing (GSB). Pas de panique, les véri­fi­ca­tions sont faites sur une copie locale de la base de Google, donc rien ne filtre vers l’ogre. Cela reste une option : Lstu n’uti­lise pas GSB par défaut. La véri­fi­ca­tion a lieu à la créa­tion d’un raccourci d’URl mais peut égale­ment être effec­tuée via une commande CLI (fort utile pour faire des véri­fi­ca­tions a poste­riori et nettoyer la base de donnée de votre instance).
    • j’ai inté­gré une merge request pour permettre d’uti­li­ser Lstu via Docker. Je ne suis pas un grand fan de Docker, mais si ça peut servir…
  • Commits dédiés

Je ne résiste pas à l’en­vie de vous offrir en avance une superbe illus­tra­tion que j’ai comman­dée à Soniop :

Cliquez pour avoir l’image origi­nelle (en grande taille)

(en avance parce que je l’ai comman­dée en octobre)

Bon, ça a pas été fait avec un logi­ciel libre (source photo­shop), mais c’est libre : libéré sous licence CC-BY-SA. Person­nel­le­ment, je l’ai mise en fond d’écran (sur le PC et sur le télé­phone 😁).

Tcit en a commandé une avec le logo de Frama­soft qu’est super aussi : https://www.devian­tart.com/soniop/art/Commis­sion-Framas­pace-768711643.

Préci­sion : j’ai payé l’illus­tra­tion, mais un tarif plus que raison­nable (mais vrai­ment raison­nable hein !). Contac­tez Soniop si vous souhai­tez comman­der une illus­tra­tion dans le style.

Vous pouvez toujours me soute­nir via Duni­ter !

Je remets ici mon expli­ca­tion.

Disclai­mer : je vais peut-être dire des sottises parce que j’ai pas tout compris mais je m’en fous, j’aime bien l’idée

Duni­ter est un projet de crypto-monnaie mais contrai­re­ment au bitcoin où c’est la course à la puis­sance de calcul pour géné­rer la monnaie et deve­nir riche, le but est de créer une monnaie libre (le Ğ1, prononcé comme june en anglais), basée sur une toile de confiance (il faut rece­voir 5 certi­fi­ca­tions pour être membre) et où chacun des membres reçoit tous les jours un divi­dende univer­sel. Je dois dire que je suis assez curieux de ce qu’on peut faire avec un système ressem­blant forte­ment au salaire à vie 😉

C’est pourquoi j’ai créé mon compte et ait fait ce qu’il fallait pour rece­voir mes certi­fi­ca­tions (rencon­trer des gens, tous­sa…). Ma clé publique est :

 2t6NP6Fvvuok2iRWA188C6pGokWAB5Kpf1S1iGtkN9tg

Et comme un projet n’est utile que si on s’en sert, je vous propose de me soute­nir en Ğ1 tout en béné­fi­ciant des mêmes récom­penses que celles présentes sur ma page Tipeee (j’ai arbi­trai­re­ment choisi une parité euro/Ğ1 car je n’ai pas vrai­ment trouvé de page expliquant comment évaluer le cours du Ğ1 en euros, et au final, est-ce vrai­ment néces­saire ? À nous de choi­sir quelle valeur a cette nouvelle monnaie 🙂. Et puis ça me simpli­fie la vie).

Voici donc les diffé­rentes contre­par­ties et leur prix (chaque contre­par­tie comprend celles de tarif infé­rieur) :

  • 1 Ğ1 : vous appa­raî­trez sur la page mensuelle des remer­cie­ments
  • 2 Ğ1 : vous rece­vrez une photo dédi­ca­cée de mon chat
  • 3 Ğ1 : vous rece­vrez 3 stickers repre­nant les logos de Lstu, Lutim et Lufi. De quoi déco­rer son ordi et se la péter en société 😁
  • 5 Ğ1 : un commit vous sera dédié chaque mois (si je déve­loppe suffi­sam­ment pour le nombre de personnes à ce niveau)
  • 15 Ğ1 : vous pouvez me deman­der de bosser en prio­rité sur un bug ou une demande de fonc­tion­na­lité d’un de mes logi­ciels (dans la mesure du faisable, hein).
  • 100 Ğ1 : quand j’au­rais un nouveau projet, vous pour­rez en choi­sir le nom et le logo

Pour en savoir plus sur Duni­ter et Ğ1, je vous propose d’al­ler voir cet article de cgeek : https://blog.cgeek.fr/de-linte­ret-dune-monnaie-libre.html ainsi que la théo­rie rela­tive de la monnaie pour les enfants.

Crédits : Photo par Nick Fewings sur Unsplash

Parta­ger

by Luc at October 25, 2018 06:21 PM

October 11, 2018

Florent Peterschmitt

Vim Setup

Micro article pour parler de ma configuration Vim, des fois que ça puisse servir à d’autres.

En réalité j’utilise neovim couplé à vim-plug pour la gestion des plugins.

Voici ce dont j’ai besoin :

  • De la complétion pour Python, Go, et parfois Rust
  • Pouvoir lancer un linter sur les fichiers en cours d’édition
  • Afficher les erreurs de compilation, de syntaxe etc…
  • Exécuter des tests depuis l’éditeur
  • Colorisation syntaxique
  • Recherche et ouverture facile de fichiers à la SublimeText

Tout ça je l’ai avec cette conf.

La doc d’installation est en haut du fichier.

Les principaux modules que j’utilise sont :

  • YouCompleteMe pour la complétion
  • ALE pour la syntaxe et certaines commandes pour corriger des imports en python, nettoyer les fins de ligne etc…
  • FZF et le plugin vim pour chercher des fichiers, dans les fichiers etc…
  • GutenTags, couplé à FZF pour chercher les fonctions, classes ou toute définition supportée par universal ctags
  • vim-go pour Go
  • Vimagit pour maniper Git directement dans un buffer dédié
  • GitGutter pour voir les lignes modifiées/ajoutées etc…

Les autres plugins sont principalement des aides, que j’utilise assez peu en fin de compte.

Alors c’est pas parfait, j’aimerais bien avoir des raccourcis pour lancer les tests en ayant le curseur dans le bloc de code de test par exemple, ce genre de trucs. Je me débrouille autrement, notemment avec watchngo, de fabrication maison ^^

Have fun !

by Florent Peterschmitt at October 11, 2018 05:00 PM

September 15, 2018

Luc Didry

Merci à mes tipeurs :-)

Le 14 juillet 2016, j’ai lancé mes pages Tipeee et Libe­ra­pay.

La récom­pense de base est l’ap­pa­ri­tion sur une page mensuelle de remer­cie­ments… voici celle d’août.

Merci à :

Voici mon bilan d’août :

Vous pouvez toujours me soute­nir via Duni­ter !

Je remets ici mon expli­ca­tion.

Disclai­mer : je vais peut-être dire des sottises parce que j’ai pas tout compris mais je m’en fous, j’aime bien l’idée

Duni­ter est un projet de crypto-monnaie mais contrai­re­ment au bitcoin où c’est la course à la puis­sance de calcul pour géné­rer la monnaie et deve­nir riche, le but est de créer une monnaie libre (le Ğ1, prononcé comme june en anglais), basée sur une toile de confiance (il faut rece­voir 5 certi­fi­ca­tions pour être membre) et où chacun des membres reçoit tous les jours un divi­dende univer­sel. Je dois dire que je suis assez curieux de ce qu’on peut faire avec un système ressem­blant forte­ment au salaire à vie 🙂

C’est pourquoi j’ai créé mon compte et ait fait ce qu’il fallait pour rece­voir mes certi­fi­ca­tions (rencon­trer des gens, tous­sa…). Ma clé publique est :

 2t6NP6Fvvuok2iRWA188C6pGokWAB5Kpf1S1iGtkN9tg

Et comme un projet n’est utile que si on s’en sert, je vous propose de me soute­nir en Ğ1 tout en béné­fi­ciant des mêmes récom­penses que celles présentes sur ma page Tipeee (j’ai arbi­trai­re­ment choisi une parité euro/Ğ1 car je n’ai pas vrai­ment trouvé de page expliquant comment évaluer le cours du Ğ1 en euros, et au final, est-ce vrai­ment néces­saire ? À nous de choi­sir quelle valeur a cette nouvelle monnaie 🙂. Et puis ça me simpli­fie la vie).

Voici donc les diffé­rentes contre­par­ties et leur prix (chaque contre­par­tie comprend celles de tarif infé­rieur) :

  • 1 Ğ1 : vous appa­raî­trez sur la page mensuelle des remer­cie­ments
  • 2 Ğ1 : vous rece­vrez une photo dédi­ca­cée de mon chat
  • 3 Ğ1 : vous rece­vrez 3 stickers repre­nant les logos de Lstu, Lutim et Lufi. De quoi déco­rer son ordi et se la péter en société 😁
  • 5 Ğ1 : un commit vous sera dédié chaque mois (si je déve­loppe suffi­sam­ment pour le nombre de personnes à ce niveau)
  • 15 Ğ1 : vous pouvez me deman­der de bosser en prio­rité sur un bug ou une demande de fonc­tion­na­lité d’un de mes logi­ciels (dans la mesure du faisable, hein).
  • 100 Ğ1 : quand j’au­rais un nouveau projet, vous pour­rez en choi­sir le nom et le logo

Pour en savoir plus sur Duni­ter et Ğ1, je vous propose d’al­ler voir cet article de cgeek : https://blog.cgeek.fr/de-linte­ret-dune-monnaie-libre.html ainsi que la théo­rie rela­tive de la monnaie pour les enfants.

Crédits : Photo par Tim Marshal sur Unsplash

Parta­ger

by Luc at September 15, 2018 12:38 PM

August 22, 2018

Luc Didry

Hey ! C’est le Ray’s day !

Pour le Ray’s day, je lance un concours avec tirage au sort pour gagner un recueil de mes mercre­dis fiction, relié à la japo­naise avec mes petites mains.

Lais­sez-moi votre nom/pseudo/whate­ver ainsi qu’une adresse mail et je vous contac­te­rai si vous avez gagné 🙂

Le nom/pseudo/whate­ver du gagnant sera annoncé sur mon compte masto­don ainsi qu’ici, sur mon blog.

Le formu­laire est sur https://frama­forms.org/concours-pour-le-rays-day-1534924436 ou direc­te­ment embarqué ci-dessous.

Parta­ger

by Luc at August 22, 2018 08:26 AM

August 11, 2018

Luc Didry

Double merci à mes tipeurs :-)

Le 14 juillet 2016, j’ai lancé mes pages Tipeee et Libe­ra­pay.

La récom­pense de base est l’ap­pa­ri­tion sur une page mensuelle de remer­cie­ments… voici celle de juin… et de juillet. Du retard, toujours du retard et encore plus de retard !

Merci à :

Aparté : j’ar­rête de propo­ser de me soute­nir en bitcoins car le bitcoin est une catas­trophe écolo­gique et je ne souhaite pas caution­ner ça. J’ai donc vidé mon porte­feuille bitcoin. J’ai mis du temps à le faire pour deux raisons : d’abord, je ne pense pas souvent à mon porte­feuille bitcoin, ensui­te… l’ap­pât du gain. Faut pas se mentir, quand on voit comme le bitcoin peut grim­per, ça fait rêver de voir combien on peut gagner. Du coup, je me trans­for­mais en un spécu­la­teur de la pire espèce. Quand je m’en suis rendu compte, j’ai décidé d’ar­rê­ter. À noter que la Ğ1, si c’est une crypto-monnaie repo­sant sur une block­chain comme le bitcoin, ne présente pas les mêmes défauts : de par le divi­dende univer­sel qui est distri­bué à tous et qui augmente avec la toile de confiance, la thésau­ri­sa­tion ne sert pas à grand-chose, et la preuve de travail de la Ğ1 est beau­coup moins consom­ma­trice de ressources que le bitcoin.

Voici mon bilan de juin :

Et mon bilan de juillet :

Vous pouvez toujours me soute­nir via Duni­ter !

Je remets ici mon expli­ca­tion.

Disclai­mer : je vais peut-être dire des sottises parce que j’ai pas tout compris mais je m’en fous, j’aime bien l’idée

Duni­ter est un projet de crypto-monnaie mais contrai­re­ment au bitcoin où c’est la course à la puis­sance de calcul pour géné­rer la monnaie et deve­nir riche, le but est de créer une monnaie libre (le Ğ1, prononcé comme june en anglais), basée sur une toile de confiance (il faut rece­voir 5 certi­fi­ca­tions pour être membre) et où chacun des membres reçoit tous les jours un divi­dende univer­sel. Je dois dire que je suis assez curieux de ce qu’on peut faire avec un système ressem­blant forte­ment au salaire à vie 🙂

C’est pourquoi j’ai créé mon compte et ait fait ce qu’il fallait pour rece­voir mes certi­fi­ca­tions (rencon­trer des gens, tous­sa…). Ma clé publique est :

 2t6NP6Fvvuok2iRWA188C6pGokWAB5Kpf1S1iGtkN9tg

Et comme un projet n’est utile que si on s’en sert, je vous propose de me soute­nir en Ğ1 tout en béné­fi­ciant des mêmes récom­penses que celles présentes sur ma page Tipeee (j’ai arbi­trai­re­ment choisi une parité euro/Ğ1 car je n’ai pas vrai­ment trouvé de page expliquant comment évaluer le cours du Ğ1 en euros, et au final, est-ce vrai­ment néces­saire ? À nous de choi­sir quelle valeur a cette nouvelle monnaie 🙂. Et puis ça me simpli­fie la vie).

Voici donc les diffé­rentes contre­par­ties et leur prix (chaque contre­par­tie comprend celles de tarif infé­rieur) :

  • 1 Ğ1 : vous appa­raî­trez sur la page mensuelle des remer­cie­ments
  • 2 Ğ1 : vous rece­vrez une photo dédi­ca­cée de mon chat
  • 3 Ğ1 : vous rece­vrez 3 stickers repre­nant les logos de Lstu, Lutim et Lufi. De quoi déco­rer son ordi et se la péter en société 😁
  • 5 Ğ1 : un commit vous sera dédié chaque mois (si je déve­loppe suffi­sam­ment pour le nombre de personnes à ce niveau)
  • 15 Ğ1 : vous pouvez me deman­der de bosser en prio­rité sur un bug ou une demande de fonc­tion­na­lité d’un de mes logi­ciels (dans la mesure du faisable, hein).
  • 100 Ğ1 : quand j’au­rais un nouveau projet, vous pour­rez en choi­sir le nom et le logo

Pour en savoir plus sur Duni­ter et Ğ1, je vous propose d’al­ler voir cet article de cgeek : https://blog.cgeek.fr/de-linte­ret-dune-monnaie-libre.html ainsi que la théo­rie rela­tive de la monnaie pour les enfants.

Crédits : Photo par Connor Wells sur Unsplash

Parta­ger

by Luc at August 11, 2018 09:20 AM

July 25, 2018

Luc Didry

Retrou­vez mes confé­rences en vidéos sur PeerTube !

Juste un p’tit mot rapide pour dire que j’ai mis les vidéos des confé­rences que j’ai pu donner à droite à gauche sur PeerTube (celles que j’ai retrou­vées sur le net tout du moins).

Ça se passe sur https://aperi.tube/accounts/luc/videos, et pour vous abon­ner à mon compte via Masto­don ou autre service fédéré qui sait le faire, mon compte est @luc@a­peri.tube.

NB : https://aperi.tube n’est pas à moi (même si j’en gère le système), donc pas la peine de me deman­der un compte dessus, désolé :/

Crédits : Photo par Tim Marshal sur Unsplash

Parta­ger

by Luc at July 25, 2018 07:58 PM

July 01, 2018

Romain Dessort

Rando-voyage dans l'ouest du Canada

Je pars aujourd'hui pour un voyage de 4 mois à la découverte de l'ouest canadien, en Colombie-Britanique principalement, un peu d'Alberta et peut-être aussi au Yukon si j'ai le temps et qu'une opportunité se présente.

Je vais essayer de publier mes photos et un récit au fur et à mesure de mon périple, mais je ne promets rien, je n'aurai pas souvent accès à Internet et encore moins à un ordinateur. Ça se passera ici (flux Atom).

July 01, 2018 12:57 PM

June 30, 2018

Luc Didry

Merci à mes tipeurs :-)

Le 14 juillet 2016, j’ai lancé mes pages Tipeee et Libe­ra­pay.

La récom­pense de base est l’ap­pa­ri­tion sur une page mensuelle de remer­cie­ments… voici celle de mai (juste à temps pour pas faire une double page de remer­cie­ments demain) !

Merci à :

Voici mon bilan de mai :

Vous pouvez toujours me soute­nir via Duni­ter !

Je remets ici mon expli­ca­tion.

Disclai­mer : je vais peut-être dire des sottises parce que j’ai pas tout compris mais je m’en fous, j’aime bien l’idée

Duni­ter est un projet de crypto-monnaie mais contrai­re­ment au bitcoin où c’est la course à la puis­sance de calcul pour géné­rer la monnaie et deve­nir riche, le but est de créer une monnaie libre (le Ğ1, prononcé comme june en anglais), basée sur une toile de confiance (il faut rece­voir 5 certi­fi­ca­tions pour être membre) et où chacun des membres reçoit tous les jours un divi­dende univer­sel. Je dois dire que je suis assez curieux de ce qu’on peut faire avec un système ressem­blant forte­ment au salaire à vie 🙂

C’est pourquoi j’ai créé mon compte et ait fait ce qu’il fallait pour rece­voir mes certi­fi­ca­tions (rencon­trer des gens, tous­sa…). Ma clé publique est :

 2t6NP6Fvvuok2iRWA188C6pGokWAB5Kpf1S1iGtkN9tg

Et comme un projet n’est utile que si on s’en sert, je vous propose de me soute­nir en Ğ1 tout en béné­fi­ciant des mêmes récom­penses que celles présentes sur ma page Tipeee (j’ai arbi­trai­re­ment choisi une parité euro/Ğ1 car je n’ai pas vrai­ment trouvé de page expliquant comment évaluer le cours du Ğ1 en euros, et au final, est-ce vrai­ment néces­saire ? À nous de choi­sir quelle valeur a cette nouvelle monnaie 🙂. Et puis ça me simpli­fie la vie).

Voici donc les diffé­rentes contre­par­ties et leur prix (chaque contre­par­tie comprend celles de tarif infé­rieur) :

  • 1 Ğ1 : vous appa­raî­trez sur la page mensuelle des remer­cie­ments
  • 2 Ğ1 : vous rece­vrez une photo dédi­ca­cée de mon chat
  • 3 Ğ1 : vous rece­vrez 3 stickers repre­nant les logos de Lstu, Lutim et Lufi. De quoi déco­rer son ordi et se la péter en société 😁
  • 5 Ğ1 : un commit vous sera dédié chaque mois (si je déve­loppe suffi­sam­ment pour le nombre de personnes à ce niveau)
  • 15 Ğ1 : vous pouvez me deman­der de bosser en prio­rité sur un bug ou une demande de fonc­tion­na­lité d’un de mes logi­ciels (dans la mesure du faisable, hein).
  • 100 Ğ1 : quand j’au­rais un nouveau projet, vous pour­rez en choi­sir le nom et le logo

Pour en savoir plus sur Duni­ter et Ğ1, je vous propose d’al­ler voir cet article de cgeek : https://blog.cgeek.fr/de-linte­ret-dune-monnaie-libre.html ainsi que la théo­rie rela­tive de la monnaie pour les enfants.

PS : j’ai aussi une adresse bitcoin si vous souhai­tez me soute­nir par ce biais

Crédits : Photo par Tim Marshal sur Unsplash

Parta­ger

by Luc at June 30, 2018 09:37 PM

June 24, 2018

Florent Peterschmitt

Namasté Népal - #3.2

Plus d’un an après le dernier article sur le sujet… alala ^^'

Et comme d’habitude, un peut de shell pour corriger les images :

for i in $(find . -namae *.jpeg); do
    convert $i -auto-orient /tmp/out.jpeg
    mv /tmp/out.jpeg $i
done

Article précédent

Vadrouille - 17 Avril… 2017, hein :D

L’objectif était de visiter le musée Gurkha la grotte « Mahendra », où je me suis rendu compte après coup avoir été correctement plumé… ah bah on est touriste ou on ne l’est pas ^_^ !

Voici donc les photos prises pendant le trajet.

photo

photo

photo

Bindabasini Temple

Endroit un peu en hauteur, vent frais. Je n’ai pas pris beaucoup de photos car j’ai une vidéo du lieu, trop lourde pour être postée ici malheureusement. J’aurais dû y penser, c’est trop tard maintenant !

photo

photo

photo

Musée Gurkha

Étant très mauvais historien, je préfère encore vous rediriger vers la page wikipedia sur les Gurkhas plutôt que de tout recopier :)

Pour faire simple, les Gurkhas sont des unités armées britanniques, entraînées sur place.

photo

photo

photo

Visite officielle et rumeurs…

photo

photo

Mousquets Martini Henry et India Pattern

photo

photo

Moderne et toujours présent

photo

photo

photo

En allant vers la grotte

photo

À l’intérieur de la grotte, à l’entrée, on trouve une roche ayant l’apparence d’une trompe d’éléphant, rapport à Ganesh, le dieu à tête d’éléphant. Peu de touristes sont présents ici, les personnes se bouscules pour faire une brève prière et s’attirer la bonne fortune.

Ce qui n’empêche pas l’endroit d’être jonché de bouteilles en plastique.

photo

Le guide m’emmène vers le reste de la grotte, où seuls les touristes vont. Il avoue lui-même que les touristes Indiens ne sont pas respectueux des lieus et qu’il ne souhaite pas que cette partie soit publiquement accessible.

Bon par contre, vous remarquerez que j’ai honteusement dérangé ces charmantes chauves-souris…

photo

photo

photo

photo

photo

À la sortie de la grotte, c’est là que le plumage a eu lieu. En grand champion, j’ai confondu, à l’orale, “1000” et “100” en anglais : le guide a annoncé 8000 roupies, j’ai compris 800. Résultat j’y ai laissé 80€ au lieu de 8 pour la visite… évidemment le guide n’allait pas refuser, et il a eu bien raison d’essayer !

En somme, une journée bien physique, crapahuter dans la grotte c’était quand même assez chouette, et puis surtout il y faisait bien frais :D

Article suivant

by Florent Peterschmitt at June 24, 2018 04:00 PM

May 01, 2018

Luc Didry

Merci à mes tipeurs :-)

Le 14 juillet 2016, j’ai lancé mes pages Tipeee et Libe­ra­pay.

La récom­pense de base est l’ap­pa­ri­tion sur une page mensuelle de remer­cie­ments… voici celle d’avril !

Merci à :

Voici mon bilan d’avril :

Sur une note un peu sombre, j’ai coupé l’en­voi d’images sur https://lut.im, l’ins­tance offi­cielle de Lutim. Je m’en suis expliqué sur un (assez) long fil Masto­don : https://frama­piaf.org/@fra­masky/99863305805130122. Ça ne veut pas dire que j’ar­rête de déve­lop­per Lutim, juste que https://lut.im n’ac­cepte plus de nouvelles images (celles qui y sont déjà reste­ront acces­sibles, rassu­rez-vous).

Vous pouvez toujours me soute­nir via Duni­ter !

Je remets ici mon expli­ca­tion du mois d’août.

Disclai­mer : je vais peut-être dire des sottises parce que j’ai pas tout compris mais je m’en fous, j’aime bien l’idée

Duni­ter est un projet de crypto-monnaie mais contrai­re­ment au bitcoin où c’est la course à la puis­sance de calcul pour géné­rer la monnaie et deve­nir riche, le but est de créer une monnaie libre (le Ğ1, prononcé comme june en anglais), basée sur une toile de confiance (il faut rece­voir 5 certi­fi­ca­tions pour être membre) et où chacun des membres reçoit tous les jours un divi­dende univer­sel. Je dois dire que je suis assez curieux de ce qu’on peut faire avec un système ressem­blant forte­ment au salaire à vie 🙂

C’est pourquoi j’ai créé mon compte et ait fait ce qu’il fallait pour rece­voir mes certi­fi­ca­tions (rencon­trer des gens, tous­sa…). Ma clé publique est :

 2t6NP6Fvvuok2iRWA188C6pGokWAB5Kpf1S1iGtkN9tg

Et comme un projet n’est utile que si on s’en sert, je vous propose de me soute­nir en Ğ1 tout en béné­fi­ciant des mêmes récom­penses que celles présentes sur ma page Tipeee (j’ai arbi­trai­re­ment choisi une parité euro/Ğ1 car je n’ai pas vrai­ment trouvé de page expliquant comment évaluer le cours du Ğ1 en euros, et au final, est-ce vrai­ment néces­saire ? À nous de choi­sir quelle valeur a cette nouvelle monnaie 🙂. Et puis ça me simpli­fie la vie).

Voici donc les diffé­rentes contre­par­ties et leur prix (chaque contre­par­tie comprend celles de tarif infé­rieur) :

  • 1 Ğ1 : vous appa­raî­trez sur la page mensuelle des remer­cie­ments
  • 2 Ğ1 : vous rece­vrez une photo dédi­ca­cée de mon chat
  • 3 Ğ1 : vous rece­vrez 3 stickers repre­nant les logos de Lstu, Lutim et Lufi. De quoi déco­rer son ordi et se la péter en société 😁
  • 5 Ğ1 : un commit vous sera dédié chaque mois (si je déve­loppe suffi­sam­ment pour le nombre de personnes à ce niveau)
  • 15 Ğ1 : vous pouvez me deman­der de bosser en prio­rité sur un bug ou une demande de fonc­tion­na­lité d’un de mes logi­ciels (dans la mesure du faisable, hein).
  • 100 Ğ1 : quand j’au­rais un nouveau projet, vous pour­rez en choi­sir le nom et le logo

Pour en savoir plus sur Duni­ter et Ğ1, je vous propose d’al­ler voir cet article de cgeek : https://blog.cgeek.fr/de-linte­ret-dune-monnaie-libre.html ainsi que la théo­rie rela­tive de la monnaie pour les enfants.

PS : j’ai aussi une adresse bitcoin si vous souhai­tez me soute­nir par ce biais

Crédits : Photo par Tim Marshal sur Unsplash

Parta­ger

by Luc at May 01, 2018 01:55 PM

April 29, 2018

Luc Didry

Merci à mes tipeurs :-)

Le 14 juillet 2016, j’ai lancé mes pages Tipeee et Libe­ra­pay.

La récom­pense de base est l’ap­pa­ri­tion sur une page mensuelle de remer­cie­ments… voici celle de mars !

En retard, comme d’hab, mais cette fois-ci, ce n’est pas de la flemme : le mois d’avril a été bien rempli, vous verrez sur la prochaine page de remer­cie­ments 😉

Merci à :

Voici mon bilan de mars :

Et vous pouvez toujours me soute­nir via Duni­ter !

Je remets ici mon expli­ca­tion du mois d’août.

Disclai­mer : je vais peut-être dire des sottises parce que j’ai pas tout compris mais je m’en fous, j’aime bien l’idée

Duni­ter est un projet de crypto-monnaie mais contrai­re­ment au bitcoin où c’est la course à la puis­sance de calcul pour géné­rer la monnaie et deve­nir riche, le but est de créer une monnaie libre (le Ğ1, prononcé comme june en anglais), basée sur une toile de confiance (il faut rece­voir 5 certi­fi­ca­tions pour être membre) et où chacun des membres reçoit tous les jours un divi­dende univer­sel. Je dois dire que je suis assez curieux de ce qu’on peut faire avec un système ressem­blant forte­ment au salaire à vie 🙂

C’est pourquoi j’ai créé mon compte et ait fait ce qu’il fallait pour rece­voir mes certi­fi­ca­tions (rencon­trer des gens, tous­sa…). Ma clé publique est :

 2t6NP6Fvvuok2iRWA188C6pGokWAB5Kpf1S1iGtkN9tg

Et comme un projet n’est utile que si on s’en sert, je vous propose de me soute­nir en Ğ1 tout en béné­fi­ciant des mêmes récom­penses que celles présentes sur ma page Tipeee (j’ai arbi­trai­re­ment choisi une parité euro/Ğ1 car je n’ai pas vrai­ment trouvé de page expliquant comment évaluer le cours du Ğ1 en euros, et au final, est-ce vrai­ment néces­saire ? À nous de choi­sir quelle valeur a cette nouvelle monnaie 🙂. Et puis ça me simpli­fie la vie).

Voici donc les diffé­rentes contre­par­ties et leur prix (chaque contre­par­tie comprend celles de tarif infé­rieur) :

  • 1 Ğ1 : vous appa­raî­trez sur la page mensuelle des remer­cie­ments
  • 2 Ğ1 : vous rece­vrez une photo dédi­ca­cée de mon chat
  • 3 Ğ1 : vous rece­vrez 3 stickers repre­nant les logos de Lstu, Lutim et Lufi. De quoi déco­rer son ordi et se la péter en société 😁
  • 5 Ğ1 : un commit vous sera dédié chaque mois (si je déve­loppe suffi­sam­ment pour le nombre de personnes à ce niveau)
  • 15 Ğ1 : vous pouvez me deman­der de bosser en prio­rité sur un bug ou une demande de fonc­tion­na­lité d’un de mes logi­ciels (dans la mesure du faisable, hein).
  • 100 Ğ1 : quand j’au­rais un nouveau projet, vous pour­rez en choi­sir le nom et le logo

Pour en savoir plus sur Duni­ter et Ğ1, je vous propose d’al­ler voir cet article de cgeek : https://blog.cgeek.fr/de-linte­ret-dune-monnaie-libre.html ainsi que la théo­rie rela­tive de la monnaie pour les enfants.

PS : j’ai aussi une adresse bitcoin si vous souhai­tez me soute­nir par ce biais

Crédits : Photo par Aaron Burden sur Unsplash

Parta­ger

by Luc at April 29, 2018 11:14 AM

April 21, 2018

Luc Didry

Signer ses commits Git et trans­fé­rer son gpg-agent sur un serveur distant

GPG, c’est bien. C’est encore ce qu’on a trouvé de mieux pour que tout un chacun puisse s’as­su­rer de l’au­then­ti­cité d’un message (non-modi­fi­ca­tion de celui-ci et que son auteur est bien celui annoncé) et chif­frer ses messages.

OK, c’est pas un exemple d’er­go­no­mie, OK, c’est pas ma mère qui va s’en servir sciem­ment tous les jours (sous le manteau, si, puisque les paquets de sa Debian sont signés avec GPG). Mais d’un autre côté, ma mère ne risque pas non plus (et je dirais même encore moins) de se payer un certi­fi­cat X509 pour signer ses mails. Ne parlons pas de mon père, à côté de lui, ma mère fait figure de hax0r.

Bon, d’ac­cord, c’est un bon gros truc de geek. OSEF, c’est cool quand même, c’était pour dire que c’était robuste et que tout le monde peut l’uti­li­ser sans bourse délier.

Que vous le sachiez (dans la colle) ou pas, on peut signer ses commits git avec GPG, histoire d’ajou­ter encore une couche de sécu­rité aux modi­fi­ca­tions qu’on apporte à un logi­ciel. Des forges comme Gitlab permettent d’ajou­ter une clé GPG à son profil permet­tant ainsi de véri­fier les signa­tures des commits d’un projet. Voyez sur ce commit le joli petit bouton « Veri­fied ».

Ceci n’est pas un cours sur GPG, on va donc consi­dé­rer que vous avez déjà une clé GPG.

Signer ses commits Git

Rien de plus simple. Il faut tout d’abord décla­rer à Git quelle clé doit être utili­sée pour signer ses commits (chan­gez l’em­preinte, ça c’est la mienne ) :

git config --global user.signingkey EA868E12D0257E3C

Main­te­nant, soit vous ajou­tez -S quand vous commit­tez :

git commit -S

Soit vous confi­gu­rez Git pour signer tous vos commits :

git config --global commit.gpgsign true

Voilà, c’est bon. Pour véri­fier un commit :

git verify-commit cce09ca

C’est bien beau, mais ça m’ar­rive de déve­lop­per direc­te­ment sur des serveurs, et surtout, je déve­loppe géné­ra­le­ment dans une machine virtuelle sur mon PC. Je ne vais certai­ne­ment pas aller copier ma clé privée sur les-dits serveurs ou dans la machine virtuelle ! C’est là qu’in­ter­vient le trans­fert du gpg-agent sur le serveur distant.

Ceci n’est toujours pas un cours sur GPG, on va donc consi­dé­rer que vous avez déjà un gpg-agent fonc­tion­nel sur votre ordi­na­teur.

Trans­fé­rer son gpg-agent sur un serveur distant

ATTENTION On ne trans­fère son agent gpg que sur une machine dans laquelle on a confiance, et dont on sait que les personnes y ayant accès ne s’amu­se­ront pas à utili­ser votre agent (rien de plus simple si on a un accès root à la machine). Cela vaut aussi pour l’agent ssh !

Premiè­re­ment, on va dire à l’agent de créer un socket supplé­men­taire en mettant dans ~/.gnupg/gpg-agent.conf (rempla­cez <user> par votre login) :

extra-socket /home/<user>/.gnupg/S.gpg-agent.extra

Ce socket a des restric­tions que n’a pas le socket habi­tuel (ne me deman­dez pas lesquelles) mais surtout, le logi­ciel qui vous deman­dera votre mot de passe (pinen­try de son petit nom géné­rique) vous présen­tera la demande de mot de passe diffé­rem­ment d’ha­bi­tude. Moi, il m’a dit en gros « Cette demande provient d’une machine distante », ce qui permet de repé­rer d’où vient la demande (déjà pas de votre machine pour déchif­frer un mail par exemple) et de réflé­chir à si c’est bien vous qui avez fait une action deman­dant la clé GPG.

On redé­marre l’agent pour prendre en compte la nouvelle confi­gu­ra­tion :

gpg-connect-agent /bye

Ensuite, il va falloir modi­fier sa confi­gu­ra­tion SSH. Comme un bon adminSys est fainéant, vous avez bien sûr utilisé concierge pour gérer votre fichier ~/.ssh/config. Il suffit d’ajou­ter dans le bloc de confi­gu­ra­tion du serveur souhaité la ligne (rempla­cez uid par votre uid (id pour le connaître) et <user> par votre login):

RemoteForward /run/user/<uid>/gnupg/S.gpg-agent /home/<user>/.gnupg/S.gpg-agent.extra

Enfin, il faut ajou­ter ceci dans le /etc/ssh/sshd_config du serveur distant (et redé­mar­rer son dæmon ssh après) :

StreamLocalBindUnlink yes

C’est fini ! Vous pouvez main­te­nant utili­ser votre clé GPG sur un serveur distant en vous y connec­tant en SSH, sans copier votre clé sur le serveur

Connec­tez-vous en SSH et testez avec

echo "test" | gpg2 --clearsign

Si, lorsque vous tentez de signer un commit sur votre serveur distant, cela échoue, assu­rez-vous que git utilise bien gpg2 :

git config --global gpg.program gpg2

Merci à Thomas Citha­rel pour avoir mis la signa­ture GPG des commits sur le tapis d’une discus­sion, ce qui m’a poussé à me pencher sur le trans­fert de l’agent GPG.

Crédit image d’en-tête de ce billet : logo de GnuPG, licence GPL, récu­péré sur Wiki­me­dia Commons

Parta­ger

by Luc at April 21, 2018 05:54 AM

April 04, 2018

Luc Didry

Utili­ser les données de Munin dans Grafana

Munin est un super outil de métro­lo­gie. Simple à instal­ler (présent dans toutes les bonnes distri­bu­tions), simple à confi­gu­rer (à un tel point que c’en est risible) et simple à étendre (on peut écrire des plugins pour tout, même pour surveiller une cafe­tière).

Mais on entend souvent « Ouais, mais les graphes RRDtool, c’est moche » (RRDtool est un outil permet­tant de faire plein de choses avec des bases de données RRD (Round Robin Data­base, bases de données tempo­relles), qui donne des graphiques au look vieillot).

Genre des graphes comme ça :

Du coup on n’en­tend plus parler que de Prome­theus, NetData et autres trucs de hips­ter bran­chouilles (mode vieux con assumé).

Ok, vous voulez du joli dash­board ? On va vous en donner.

La réfé­rence du machin qui fait des jolis graphes, c’est Grafana. Donc je suis parti sur ça.

Permettre à Grafana d’avoir accès aux données de Munin

Parce que Grafana ne sait pas taper dans des bases de données RRD, on va instal­ler Grafana RRD Server. Celui-ci va four­nir une API JSON à Grafana pour aller taper dans les bases RRD de Munin.

apt install librrd-dev

Ensuite

cd /tmp
wget https://github.com/doublemarket/grafana-rrd-server/releases/download/v0.0.5/grafana-rrd-server_linux_amd64.gz -O grafana-rrd-server.gz
gunzip grafana-rrd-server.gz
mv grafana-rrd-server /usr/bin/

On le lance ainsi (regar­dez le -h pour le détail des options) :

grafana-rrd-server -r /var/lib/munin/

Il écou­tera par défaut sur toutes les IPs, sur le port 9000. Libre à vous de le mettre derrière un Nginx ou autre, avec ou sans authen­ti­fi­ca­tion.

Pour le service systemd :

[Unit]
Description=Grafana RRD Server
Documentation=https://github.com/doublemarket/grafana-rrd-server
Requires=network.target
After=network.target

[Service]
Type=simple
User=munin
ExecStart=/usr/bin/grafana-rrd-server -r /var/lib/munin/
SyslogIdentifier=grafana-rrd-server

[Install]
WantedBy=multi-user.target

(Je ne l’ai pas testé, je viens de l’écrire à l’os)

systemctl daemon-reload
systemctl start grafana-rrd-server
systemctl status grafana-rrd-server
systemctl enable grafana-rrd-server

Instal­ler Grafana

Grafana four­nit un dépôt APT, ce qui est bien pratique :

apt install -y apt-transport-https
echo "deb https://packagecloud.io/grafana/stable/debian/ stretch main" > /etc/apt/sources.list.d/grafana.list
curl https://packagecloud.io/gpg.key | sudo apt-key add -
apt update
apt install grafana
systemctl daemon-reload
systemctl start grafana-server
systemctl status grafana-server
systemctl enable grafana-server

Hop, il écoute par défaut sur toutes les inter­faces, sur le port 3000. Encore une fois, à vous de le mettre derrière un Nginx, etc.

Le couple login / mot de passe par défaut est admin et admin.

Faire la liai­son entre les deux

Il faut encore que Grafana soit capable d’in­ter­ro­ger l’API JSON de Grafana RRD Server. Pour ça, on va lui instal­ler le plugin SimpleJ­son :

grafana-cli plugins install grafana-simple-json-datasource

Confi­gu­rer Grafana

Allez sur votre Grafana, allez dans la section « Data sources », cliquez sur « Add data source », choi­sis­sez le type SimpleJ­son, mettez l’adresse de votre Grafana RRD Server et hop, c’est tout bon. Vous n’avez plus qu’à ajou­ter des graphes prove­nant de cette source de données dans vos dash­boards.

Bon pis voilà, ça permet d’avoir un truc comme ça :

Conclu­sion

J’ai fait ça pour le fun, parce que j’en avais marre d’en­tendre des critiques sur Munin et des « Nan mais Prome­theus, c’est vache­ment mieux tu vois ». Non, je ne vois pas. Oui, les nouveaux outils sont jolis. Oui, ils ont une super granu­la­rité. Mais des points qu’on oublie souvent, c’est :

  • Munin est telle­ment simple à instal­ler et confi­gu­rer ;
  • Des jolis graphes, ouais, c’est cool, mais sérieux, qui se touche la nouille sur ses graphes toute la jour­née ? Ok, Munin, c’est assez moche, mais ça fait le job, je suis informé en regar­dant les graphes, et c’est tout ce que je lui demande ;
  • Prome­theus, NetData et compa­gnie, ça surveille telle­ment de trucs en perma­nence que ça ne se fait pas oublier sur le serveur. Si, si, j’ai bien vu ces outils me ralen­tir mes serveurs. Quand le serveur est à la peine, ces deux outils ont empiré les choses, là où Munin ne fait ses checks que toutes les cinq minutes. #TrueS­tory

Donc voilà : on est capable d’avoir de jolis graphes avec Munin, avec un mini­mum de taf. Bon, c’est en place, je vais pas jeter le boulot que j’ai fait, mais à moins qu’on me dise au boulot « C’est méga top, je vais m’en servir tout le temps », je vais le désac­ti­ver.

Bon, y a quand même un truc pas mal avec cette histoire, c’est qu’on peut affi­cher sur le même graphe des données qui ne sont pas agré­gées sur Munin. Genre empi­ler les nombres de mails envoyés par jour par toutes les machines qui envoient du mail, comme sur le graphe en bas à gauche de l’image ci-dessus. C’est pas complè­te­ment dénué d’in­té­rêt.

NB : Prome­theus et NetData ont d’autres quali­tés que les jolis graphes, comme par exemple des alertes intel­li­gentes. Contrai­re­ment à Munin (ou Nagios, ou autre système de moni­to­ring clas­sique) qui alerte quand les valeurs dépassent un certain seuil, ces nouveaux outils vont dire « Atten­tion, si le disque conti­nue à se remplir à ce rythme là, il sera plein dans 4h », même si le disque n’est rempli qu’à 50%. Et c’est bien. Mais pour moi, Munin, c’est de la métro­lo­gie (on enre­gistre, on peut consul­ter le passé et le présent), pas de la super­vi­sion au sens Nagios. Il peut le faire, mais c’est clai­re­ment pas son usage premier. Donc du coup, les nouveaux outils vont se compa­rer à mon instal­la­tion de Shin­ken, pas à mon Munin. Compteur Dolomon

Parta­ger

by Luc at April 04, 2018 05:00 AM

March 10, 2018

Luc Didry

Un vilain double oubli 🙁

Honte à moi ! Ça fait deux fois que j’ou­blie quelqu’un dans mes remer­cie­ments mensuels 🙁

Bah comme ça, il aura droit à un article rien que pour lui ! 😁

Merci donc à Lian­dri pour son colis de victuailles bretonnes : bière, cara­mel au beurre salé, rillettes de St-Jacques, galettes apéro et j’en passe !

Hé oui, y a pas que les tips en numé­raire qui font plai­sir, bien au contraire !

Voilà son commit dédié rien qu’à lui : https://frama­git.org/luc/last/commit/a978f044096116bd6c26c89a6a3211c7582b468e

Encore merci !

Parta­ger

by Luc at March 10, 2018 09:44 AM

Une nouvelle version de Lutim !

Lutim, mon logi­ciel d’hé­ber­ge­ment d’images est sorti en version 0.9 hier soir !

Huit mois après la version 0.8, cette nouvelle version n’ap­porte pas grand chose à l’uti­li­sa­teur, si ce n’est une inter­face par défaut légè­re­ment modi­fiée, moins char­gée (j’es­père) et une gale­rie (norma­le­ment) plus perfor­mante, par contre cette version améliore un certain nombre de choses sous le capot.

Voici la liste des modi­fi­ca­tions :

  • Le thème par défaut a été modi­fié ;
  • Un nouveau moteur de gale­rie, qui me permet, entre autres, de n’af­fi­cher que des minia­tures des images, et de n’ap­pe­ler l’image origi­nelle qu’en la visua­li­sant en diapo­rama : cela devrait accé­lé­rer l’af­fi­chage de la gale­rie ;
  • Utili­sa­tion de Mojo::SQLite à la place de l’ORM ORLite. Ceci permet d’avoir une syntaxe de la couche d’abs­trac­tion SQLite beau­coup plus proche de celle de Post­greSQL, ce qui me faci­li­tera les évolu­tions. De plus, Mojo::SQLite permet de faire des migra­tions de schéma de base de données beau­coup plus simple­ment (c’est juste­ment un chan­ge­ment de schéma qui m’a fait bascu­ler vers Mojo::SQLite) ;
  • La possi­bi­lité de forcer la langue d’af­fi­chage. Précé­dem­ment, le système de traduc­tion se basait sur les en-têtes envoyés par le navi­ga­teur ;
  • Ajout d’une traduc­tion (partielle) en arabe (merci à Butter­flyOfFire) ;
  • Inté­gra­tion de la plate­forme de traduc­tion Zanata ! Plus besoin de bidouiller des fichiers .po pour contri­buer à une langue : créez-vous un compte sur https://trad.frama­soft.org, rejoi­gnez une équipe de langue et allez sur https://trad.frama­soft.org/zanata/project/view/lutim/ pour commen­cer à traduire 🙂 (envoyez-moi un message si votre langue n’est pas dans la liste propo­sée) ;
  • Amélio­ra­tion de la cryp­to­gra­phie avec l’uti­li­sa­tion d’un vecteur d’ini­tia­li­sa­tion aléa­toire ;
  • Les gens d’Infini ont ajouté une option pour person­na­li­ser les délais de réten­tions.
  • Des correc­tions de bugs (dont le collage d’image qui avait sauté lors de la correc­tion d’une faille de sécu­rité il y a peu)

Ça ne fait pas grand chose dit comme ça, mais cela repré­sente mine de rien 74 fichiers modi­fiés, 1030 ajouts et 243 suppres­sions de lignes.

Si seule­ment j’avais plus de temps et moins de logi­ciels à main­te­nir… 😛

Parta­ger

by Luc at March 10, 2018 09:22 AM

Merci à mes tipeurs :-)

Le 14 juillet 2016, j’ai lancé mes pages Tipeee et Libe­ra­pay.

La récom­pense de base est l’ap­pa­ri­tion sur une page mensuelle de remer­cie­ments… voici celle de février !

Merci à :

Voici mon bilan de février :

  • J’ai bossé sur MyPads. Il est diffi­cile de diffé­ren­cier sur la liste des commits la part de mes contri­bu­tions sur mon temps de travail (Frama­soft m’al­loue une jour­née par semaine pour bosser sur MyPads) de celles sur mon temps person­nel, mais je vous assure qu’il y en a !
  • Lufi-cli, le client en ligne de commande pour Lufi, est sorti en version 0.3. Pas de modi­fi­ca­tions de compor­te­ment, mais un simple fix pour forcer l’uti­li­sa­tion d’une certaine version d’une dépen­dance à l’ins­tal­la­tion, version sans laquelle lufi-cli ne fonc­tionne pas.
  • J’ai fixé une vulné­ra­bi­lité sur Lutim

En ce qui concerne les commits dédiés :

Et vous pouvez toujours me soute­nir via Duni­ter !

Je remets ici mon expli­ca­tion du mois d’août.

Disclai­mer : je vais peut-être dire des sottises parce que j’ai pas tout compris mais je m’en fous, j’aime bien l’idée

Duni­ter est un projet de crypto-monnaie mais contrai­re­ment au bitcoin où c’est la course à la puis­sance de calcul pour géné­rer la monnaie et deve­nir riche, le but est de créer une monnaie libre (le Ğ1, prononcé comme june en anglais), basée sur une toile de confiance (il faut rece­voir 5 certi­fi­ca­tions pour être membre) et où chacun des membres reçoit tous les jours un divi­dende univer­sel. Je dois dire que je suis assez curieux de ce qu’on peut faire avec un système ressem­blant forte­ment au salaire à vie 🙂

C’est pourquoi j’ai créé mon compte et ait fait ce qu’il fallait pour rece­voir mes certi­fi­ca­tions (rencon­trer des gens, tous­sa…). Ma clé publique est :

 2t6NP6Fvvuok2iRWA188C6pGokWAB5Kpf1S1iGtkN9tg

Et comme un projet n’est utile que si on s’en sert, je vous propose de me soute­nir en Ğ1 tout en béné­fi­ciant des mêmes récom­penses que celles présentes sur ma page Tipeee (j’ai arbi­trai­re­ment choisi une parité euro/Ğ1 car je n’ai pas vrai­ment trouvé de page expliquant comment évaluer le cours du Ğ1 en euros, et au final, est-ce vrai­ment néces­saire ? À nous de choi­sir quelle valeur a cette nouvelle monnaie 🙂. Et puis ça me simpli­fie la vie).

Voici donc les diffé­rentes contre­par­ties et leur prix (chaque contre­par­tie comprend celles de tarif infé­rieur) :

  • 1 Ğ1 : vous appa­raî­trez sur la page mensuelle des remer­cie­ments
  • 2 Ğ1 : vous rece­vrez une photo dédi­ca­cée de mon chat
  • 3 Ğ1 : vous rece­vrez 3 stickers repre­nant les logos de Lstu, Lutim et Lufi. De quoi déco­rer son ordi et se la péter en société 😁
  • 5 Ğ1 : un commit vous sera dédié chaque mois (si je déve­loppe suffi­sam­ment pour le nombre de personnes à ce niveau)
  • 15 Ğ1 : vous pouvez me deman­der de bosser en prio­rité sur un bug ou une demande de fonc­tion­na­lité d’un de mes logi­ciels (dans la mesure du faisable, hein).
  • 100 Ğ1 : quand j’au­rais un nouveau projet, vous pour­rez en choi­sir le nom et le logo

Pour en savoir plus sur Duni­ter et Ğ1, je vous propose d’al­ler voir cet article de cgeek : https://blog.cgeek.fr/de-linte­ret-dune-monnaie-libre.html ainsi que la théo­rie rela­tive de la monnaie pour les enfants.

PS : j’ai aussi une adresse bitcoin si vous souhai­tez me soute­nir par ce biais

Crédits : Photo par Craig White­head sur Unsplash

Parta­ger

by Luc at March 10, 2018 08:58 AM

February 27, 2018

Pierre Boesch

Isso avec HAProxy sur FreeBSD

Les commentaires sont gérés avec Isso « a commenting server similar to Disqus ». La différence avec Disqus qui est un système centralisé où les visiteurs doivent se connecter à un autre service centralisé (type Facebook) ou créer un compte chez eux (enfin bref c'est de la merde), Isso est open source, peut être auto-hébergé et fonctionne de la même manière (bref c'est bien ! :)

Installation d'Isso sur FreeBSD

Comme souvent, la documentation est inexistante pour FreeBSD et on doit donc se démerder

On se connecte à une jail, personnellement je réutilise ma jail db avec MariaDB et Redis.

ezjai-admin console db

On installe les paquets nécessaires ainsi qu'Isso.

pkg install py36-pip
pkg install py36-sqlite3
pip install isso

Il est possible de faire ça plus propre et travailler dans un virtualenv. Peu importe. On vérifie qu'on a bien le binaire :

$ whereis isso
isso: /usr/local/bin/isso

Avant de démarrer, on crée un utilisateur dédié et le fichier de configuration pour Isso :

pw groupadd isso
pw adduser isso -g isso -d /nonexistent -s /usr/sbin/nologin -c "Isso user"
[general]
dbpath = /var/db/isso/comments.db
log-file = /var/log/isso.log
host = http://isso.mondomaine.tld/
       https://isso.mondomaine.tld/
max-age = 5m

Toutes les options sont disponibles ici. On termine les préparatifs par créer l'environnement nécessaire qu'on a défini plus haut.

mkdir /var/db/isso/ && touch /var/log/isso.log
chown isso:isso /var/db/isso/ /var/log/isso.log

On peut tester :

/usr/local/bin/isso -c /usr/local/etc/isso.conf run

Si tout est fonctionnel, Isso écoute sur le port 8080.

$ sockstat -4l
USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS
isso     python3.6  59847 5  tcp4   192.168.0.4:8080      *:*

Reste à créer un daemon pour Isso. Un script rc existait mais ne fonctionnait pas. Finalement, ça n'était qu'une erreur sur une l'utilisation d'une variable, j'ai corrigé ce script. Vous pouvez trouver le fork par ici. On va s'en servir tout de suite :

fetch https://gist.githubusercontent.com/pboesch/721ab95c8ec52b1d0047af4b2b88999c/raw/40976171b494759973317aad59fb7808357bdcc7/isso -o /usr/local/etc/rc.d/isso
chmod +x /usr/local/etc/rc.d/isso
sysrc isso_enable=YES
service isso start

Isso avec HAProxy

Isso écoute actuellement localement, il faut qu'il soit accessible publiquement. J'utilise pour cela un domaine dédié - ce qui semble être la méthode recommandée - il faut donc proxyfier tout ça. Une configuration pour nginx est fournie, c'est bien mais HAProxy c'est mieux :) La soucis technique à prendre en compte est CORS.

Techniquement, je capture le header Origin et envoie les requêtes vers le backend approprié (ici ma jail db).

frontend http
  capture request header origin len 128
  acl is_isso hdr(host) -i isso.mondomaine.tld
  use_backend jail_db if is_isso

backend jail_db
  mode http
  http-response set-header Access-Control-Allow-Credentials true
  http-response set-header Access-Control-Allow-Origin %[capture.req.hdr(0)]
  server comments 192.168.0.4:8080 weight 1 check

Intégrer Isso à Pelican

Entre les balises <head> dans templates/base.html de votre thème, on peut ajouter quelque chose comme :

<head>

{% if ISSO_SERVER %}
<!-- Comments powered by Isso -->
<script data-isso="{{ ISSO_SERVER }}/"
        src="{{ ISSO_SERVER }}/js/embed.min.js">
</script>
{% endif %}

</head>

Dans pelicanconf.py

ISSO_SERVER="https://isso.mondomaine.tld/"

On finalise par inclure les commentaires dans les articles dans templates/article.html

{% if ISSO_SERVER %}
    <div class="comments">
        <hr />
        <h2>Commentaires</h2>
        <section id="isso-thread"></section>
        <noscript>malheureusement les commentaires utilisent javascript</noscript>
    </div>
{% endif %}

Bim ! On fait tourner Isso dans une jail FreeBSD avec les flux gérés par HAProxy !

by Pierre Boesch at February 27, 2018 11:00 PM

February 24, 2018

Pierre Boesch

Pelican - Workflow avec git

Ce blog est construit autour de différentes solutions dont Pelican qui en est le moteur. Lorsque j'ai commencé à me renseigner sur Pelican (documentation, blogposts, etc…) il s'est trouvé que la plupart des articles détaillaient seulement son installation et l'écriture d'un article : ce que fait très la documentation officielle. Le plus gros problème, de mon point de vue, c'est qu'il manque leur workflow. Je vais essayer de détailler au mieux le mien…

Pelican

Pelican est un générateur de site statique écrit en Python couplé à des templates Jinja pour générer les pages HTML. Le contenu peut être écrit en Markdown ou en reStructuredText. L'intérêt par rapport, par exemple, à WordPress ? On se passe de PHP et de base de données tel que MySQL : on gagne alors en sécurité, fiabilité et rapidité. Il n'y a pas de traitement côté serveur pour générer les pages, tout le site n'est qu'un ensemble de pages HTML.

Après cette courte explication, je vais détailler rapidement comment initier un premier projet.

Installation

Certaines commandes seront à exécuter avec sudo.

Pelican requiert Python 2.7.x ou Python 3.3+, idéalement python3. J'utilise également pip et les virtualenv.

On commence par récupérer pip, créer un venv et se placer dedans.

apt install python3-pip -y
pip3 install virtualenv # c'est mieux avec --user mais bon :)
virtualenv ~/.virtualenvs/pelican
cd ~/.virtualenvs/pelican
source bin/activate

On peut enfin installer Pelican, Markdown et créer son projet.

pip install pelican markdown
mkdir blog && cd blog

La commande suivante permet de générer les premiers fichiers nécessaires au lancement de Pelican

pelican-quickstart
[]
> Do you want to upload your website using SSH? (y/N) y

De mon côté, je choisis de transférer mes fichiers via rsync/ssh.

Les fichiers suivants sont générés :

├── content
├── develop_server.sh
├── fabfile.py
├── Makefile
├── output
├── pelicanconf.py
├── publishconf.py

Compilation

Le dossier content contient les pages bruts en Markdown.

Le Makefile va permettre, entre autre, de générer le HTML et lancer un serveur web local (port 8000) et/ou d'envoyer le contenu de output vers son serveur.

make devserver # générer les pages html et lance un serveur web local
make rsync_upload # envoyer les pages va rsync/ssh
make # affiche l'aide

Sur FreeBSD, il faudra gnu-make pour exploiter le Makefile.

pkg install gmake
gmake devserver

Le contenu généré se retrouve organisé dans le dossier output et comme expliqué au-dessus c'est ce dossier qui contient le rendu HTML à héberger.

On vérifie que le serveur local tourne

curl -I 127.0.0.1:8000
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.6.4

Bien :) On utilise son navigateur web favoris (Firefox ?) pour vérifier que le rendu est bien celui escompté.

Une dernière chose essentielle est le fichier de configuration principale : pelicanconf.py.

Ce fichier de configuration contient les variables de votre projet afin de le personnaliser. Les réponses données suite à la commande pelican-quickstart ont servies à alimenter ce fichier. Une partie du mien :

#!/usr/bin/env python
# -*- coding: utf-8 -*- #
from __future__ import unicode_literals

# Main stuff
AUTHOR = 'Pierre Boesch'
AUTHOR_DESCRIPTION = 'Mon blog'
SITENAME = 'Pierre Boesch'
SITEURL = ''
SITEDESCRIPTION = 'Page personnelle'
FAVICON = '/favicon.ico'

# Content generation
PATH = 'content'
STATIC_PATHS = ['images', 'pdf', 'static'] # les dossiers qui n'auront pas de .md
EXTRA_PATH_METADATA = {
      'static/robots.txt': {'path': 'robots.txt'},
      'static/favicon.ico': {'path': 'favicon.ico'},
} # les fichiers à poser directement à la racine

# Artcile/Archives
AUTHOR_SAVE_AS = ''
AUTHOR_URL = ''
ARTICLE_URL = '{date:%Y}/{date:%m}/{slug}/' # les "permaliens" de wordpress
ARTICLE_SAVE_AS = ARTICLE_URL + 'index.html'
YEAR_ARCHIVE_SAVE_AS = 'archives/{date:%Y}/index.html'
DEFAULT_PAGINATION = 5

Il ne reste plus qu'à définir un workflow et de publier le tout… Je ne passerai pas en revu l'utilisation de thèmes, écriture d'articles, format Markdown, etc… tout est très bien expliqué dans la documentation officielle.

Workflow

arborescence

Dans un premier temps, j'ai décidé d'organiser le contenu de la façon suivante :

content
├── articles
│   └── article1.md
│   └── article2.md
├── images
│   ├── image.png
├── pages
│   └── page.md
├── pdf
│   └── fichier.pdf
└── static
    ├── favicon.ico
    └── robots.txt
  • articles : articles en markdown (ce que vous êtes en train de lire…)
  • images : toutes les images
  • pages : les pages statiques du blog (À propos par exemple)
  • pdf : les pdfs
  • static : tous les fichiers qui ne devraient pas bouger Pour les dossiers "statiques" il faudra les définir en utilisant la variable EXTRA_PATH_METADATA (comme déjà dit c'est très bien expliqué dans la documentation de Pelican).

versionning

Je gère les sources via git sur un repo privé. De cette façon, je peux récupérer les sources rapidement sur n'importe quel poste et versionner chaque modification.

On initie son projet actuel comme un nouveau repo :

git init
git add .
git commit -m "first commit"
git remote add origin ssh://git@monrepo-git.com/namespace/monblog.git
git push -u origin master

Le .gitignore qui va bien :

*.pid
*cache*
output

Pour le thème, le même principe peut être appliqué.

Pour résumer l'idée : lorsque je suis sur un nouveau poste et dans un virtualenv, j'ai seulement besoin de cloner le repo pelican du blog et le thème.

les brouillons

Il est possible de mettre un status draft aux articles lors de l'édition. Avec ce status, Pelican ne génèrera pas le html et ne sera pas dans le dossier output et donc publié. Donc la prévualisation de l'article est difficile.

Une solution simple, utilisant git, et de créer une branche draft pour gérer les… brouillons. Quand je commence un article, je bascule sur la branche draft. Les articles sont stockés dans le répertoire habituel, si j'ai besoin d'une prévualisation il me suffit d'exécuter make devserver. Une fois l'article terminé :

git checkout master
git checkout draft -- content/articles/article-draft.md
git commit
git push

publication

Le Makefile contient les informations de connexion SSH vers le serveur.

SSH_HOST=mon_host
SSH_PORT=22
SSH_USER=mon_user
SSH_TARGET_DIR=/usr/local/www/mon_blog

Pour publier :

make clean
make publish
make ssh_upload

Il reste à mettre en en place une configuration basique nginx (ou Apache) d'un virtualhost pour servir les pages HTML, et le tour est joué.

server {
  listen 80;
  server_name www.pboesch.fr;

  access_log /var/log/nginx/access_pboesch.log combined;
  error_log /var/log/nginx/error_pboesch.log;

  root /usr/local/www/pboesch/;
  index index.html;

  location / {
    try_files $uri $uri/ =404;
  }
}

Terminé \o/.

by Pierre Boesch at February 24, 2018 11:00 PM